]> granicus.if.org Git - postgresql/commitdiff
Make FKs valid at creation when added as column constraints.
authorSimon Riggs <simon@2ndQuadrant.com>
Tue, 22 Mar 2011 23:10:35 +0000 (23:10 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Tue, 22 Mar 2011 23:10:35 +0000 (23:10 +0000)
Bug report from Alvaro Herrera

src/backend/commands/tablecmds.c
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/nodes/outfuncs.c
src/backend/parser/gram.y
src/backend/parser/parse_utilcmd.c
src/include/nodes/parsenodes.h

index f677a8e8bd08f65396f6e314a6cf8b906d339c4c..596cd864017b3f0c5a2a9db3255eaeb8631ca82e 100644 (file)
@@ -5595,7 +5595,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
                                                                          CONSTRAINT_FOREIGN,
                                                                          fkconstraint->deferrable,
                                                                          fkconstraint->initdeferred,
-                                                                         !fkconstraint->skip_validation,
+                                                                         fkconstraint->initially_valid,
                                                                          RelationGetRelid(rel),
                                                                          fkattnum,
                                                                          numfks,
index b903e457a0bfcbfd01630df51650f571ab5d8fc1..0eac9826a4e5f2e7184bf73ee7944b6ebd37c714 100644 (file)
@@ -2341,6 +2341,7 @@ _copyConstraint(Constraint *from)
        COPY_SCALAR_FIELD(fk_upd_action);
        COPY_SCALAR_FIELD(fk_del_action);
        COPY_SCALAR_FIELD(skip_validation);
+       COPY_SCALAR_FIELD(initially_valid);
 
        return newnode;
 }
index 10b160f537ed7d4d445cc50546e583c74295d861..c811077563569a6140c69336299c6c57cdb5722c 100644 (file)
@@ -2270,6 +2270,7 @@ _equalConstraint(Constraint *a, Constraint *b)
        COMPARE_SCALAR_FIELD(fk_upd_action);
        COMPARE_SCALAR_FIELD(fk_del_action);
        COMPARE_SCALAR_FIELD(skip_validation);
+       COMPARE_SCALAR_FIELD(initially_valid);
 
        return true;
 }
index 46435ab21c378a06f08bf62b01ae8bc74e753d33..47f3523366e130311f798904dd9c56ad3ba96d89 100644 (file)
@@ -2625,6 +2625,7 @@ _outConstraint(StringInfo str, Constraint *node)
                        WRITE_CHAR_FIELD(fk_upd_action);
                        WRITE_CHAR_FIELD(fk_del_action);
                        WRITE_BOOL_FIELD(skip_validation);
+                       WRITE_BOOL_FIELD(initially_valid);
                        break;
 
                case CONSTR_ATTR_DEFERRABLE:
index 7c94aadf3b93d262d756738d0e2d9760eefeea16..27fdccae5b831fea616741a2d5000ceb2502ec9f 100644 (file)
@@ -2621,6 +2621,7 @@ ColConstraintElem:
                                        n->fk_upd_action        = (char) ($5 >> 8);
                                        n->fk_del_action        = (char) ($5 & 0xFF);
                                        n->skip_validation  = FALSE;
+                                       n->initially_valid  = true;
                                        $$ = (Node *)n;
                                }
                ;
@@ -2820,6 +2821,7 @@ ConstraintElem:
                                        n->deferrable           = ($11 & 1) != 0;
                                        n->initdeferred         = ($11 & 2) != 0;
                                        n->skip_validation  = false;
+                                       n->initially_valid  = true;
                                        $$ = (Node *)n;
                                }
                        | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
@@ -2836,6 +2838,7 @@ ConstraintElem:
                                        n->fk_upd_action        = (char) ($10 >> 8);
                                        n->fk_del_action        = (char) ($10 & 0xFF);
                                        n->skip_validation  = true;
+                                       n->initially_valid  = false;
                                        $$ = (Node *)n;
                                }
                ;
index 3dffcded4accae10ba2969537a9f2ac0b6863d0d..eafc3b3053912b8c318f7e434eade1c2d31def6c 100644 (file)
@@ -1696,6 +1696,7 @@ transformFKConstraints(CreateStmtContext *cxt,
                        Constraint *constraint = (Constraint *) lfirst(fkclist);
 
                        constraint->skip_validation = true;
+                       constraint->initially_valid  = true;
                }
        }
 
index b7e7104f44d9ca92ba32606377ac082670783896..41fdb3e6ba15641b267c1b489e2dd0482ece3fe6 100644 (file)
@@ -1536,6 +1536,7 @@ typedef struct Constraint
        char            fk_upd_action;  /* ON UPDATE action */
        char            fk_del_action;  /* ON DELETE action */
        bool            skip_validation;        /* skip validation of existing rows? */
+       bool            initially_valid;        /* start the new constraint as valid */
 } Constraint;
 
 /* ----------------------