Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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;
 
 /* ----------------------