88 *
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.291 2009/07/20 02:42:27 adunstan Exp $
11+ * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.292 2009/07/28 02:56:30 tgl Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -152,6 +152,7 @@ typedef struct NewConstraint
152152 char * name ; /* Constraint name, or NULL if none */
153153 ConstrType contype ; /* CHECK or FOREIGN */
154154 Oid refrelid ; /* PK rel, if FOREIGN */
155+ Oid refindid ; /* OID of PK's index, if FOREIGN */
155156 Oid conid ; /* OID of pg_constraint entry, if FOREIGN */
156157 Node * qual ; /* Check expr or FkConstraint struct */
157158 List * qualstate ; /* Execution state for CHECK */
@@ -247,9 +248,10 @@ static Oid transformFkeyCheckAttrs(Relation pkrel,
247248 Oid * opclasses );
248249static void checkFkeyPermissions (Relation rel , int16 * attnums , int natts );
249250static void validateForeignKeyConstraint (FkConstraint * fkconstraint ,
250- Relation rel , Relation pkrel , Oid constraintOid );
251+ Relation rel , Relation pkrel ,
252+ Oid pkindOid , Oid constraintOid );
251253static void createForeignKeyTriggers (Relation rel , FkConstraint * fkconstraint ,
252- Oid constraintOid );
254+ Oid constraintOid , Oid indexOid );
253255static void ATController (Relation rel , List * cmds , bool recurse );
254256static void ATPrepCmd (List * * wqueue , Relation rel , AlterTableCmd * cmd ,
255257 bool recurse , bool recursing );
@@ -2915,6 +2917,7 @@ ATRewriteTables(List **wqueue)
29152917 refrel = heap_open (con -> refrelid , RowShareLock );
29162918
29172919 validateForeignKeyConstraint (fkconstraint , rel , refrel ,
2920+ con -> refindid ,
29182921 con -> conid );
29192922
29202923 heap_close (refrel , NoLock );
@@ -4819,6 +4822,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
48194822 numfks ,
48204823 InvalidOid , /* not a domain
48214824 * constraint */
4825+ indexOid ,
48224826 RelationGetRelid (pkrel ),
48234827 pkattnum ,
48244828 pfeqoperators ,
@@ -4828,7 +4832,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
48284832 fkconstraint -> fk_upd_action ,
48294833 fkconstraint -> fk_del_action ,
48304834 fkconstraint -> fk_matchtype ,
4831- indexOid ,
48324835 NULL , /* no check constraint */
48334836 NULL ,
48344837 NULL ,
@@ -4838,7 +4841,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
48384841 /*
48394842 * Create the triggers that will enforce the constraint.
48404843 */
4841- createForeignKeyTriggers (rel , fkconstraint , constrOid );
4844+ createForeignKeyTriggers (rel , fkconstraint , constrOid , indexOid );
48424845
48434846 /*
48444847 * Tell Phase 3 to check that the constraint is satisfied by existing rows
@@ -4852,6 +4855,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
48524855 newcon -> name = fkconstraint -> constr_name ;
48534856 newcon -> contype = CONSTR_FOREIGN ;
48544857 newcon -> refrelid = RelationGetRelid (pkrel );
4858+ newcon -> refindid = indexOid ;
48554859 newcon -> conid = constrOid ;
48564860 newcon -> qual = (Node * ) fkconstraint ;
48574861
@@ -5141,6 +5145,7 @@ static void
51415145validateForeignKeyConstraint (FkConstraint * fkconstraint ,
51425146 Relation rel ,
51435147 Relation pkrel ,
5148+ Oid pkindOid ,
51445149 Oid constraintOid )
51455150{
51465151 HeapScanDesc scan ;
@@ -5156,6 +5161,7 @@ validateForeignKeyConstraint(FkConstraint *fkconstraint,
51565161 trig .tgenabled = TRIGGER_FIRES_ON_ORIGIN ;
51575162 trig .tgisconstraint = TRUE;
51585163 trig .tgconstrrelid = RelationGetRelid (pkrel );
5164+ trig .tgconstrindid = pkindOid ;
51595165 trig .tgconstraint = constraintOid ;
51605166 trig .tgdeferrable = FALSE;
51615167 trig .tginitdeferred = FALSE;
@@ -5209,7 +5215,7 @@ validateForeignKeyConstraint(FkConstraint *fkconstraint,
52095215
52105216static void
52115217CreateFKCheckTrigger (RangeVar * myRel , FkConstraint * fkconstraint ,
5212- Oid constraintOid , bool on_insert )
5218+ Oid constraintOid , Oid indexOid , bool on_insert )
52135219{
52145220 CreateTrigStmt * fk_trigger ;
52155221
@@ -5237,7 +5243,7 @@ CreateFKCheckTrigger(RangeVar *myRel, FkConstraint *fkconstraint,
52375243 fk_trigger -> constrrel = fkconstraint -> pktable ;
52385244 fk_trigger -> args = NIL ;
52395245
5240- (void ) CreateTrigger (fk_trigger , constraintOid , false);
5246+ (void ) CreateTrigger (fk_trigger , constraintOid , indexOid , false);
52415247
52425248 /* Make changes-so-far visible */
52435249 CommandCounterIncrement ();
@@ -5248,7 +5254,7 @@ CreateFKCheckTrigger(RangeVar *myRel, FkConstraint *fkconstraint,
52485254 */
52495255static void
52505256createForeignKeyTriggers (Relation rel , FkConstraint * fkconstraint ,
5251- Oid constraintOid )
5257+ Oid constraintOid , Oid indexOid )
52525258{
52535259 RangeVar * myRel ;
52545260 CreateTrigStmt * fk_trigger ;
@@ -5267,8 +5273,8 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
52675273 * Build and execute a CREATE CONSTRAINT TRIGGER statement for the CHECK
52685274 * action for both INSERTs and UPDATEs on the referencing table.
52695275 */
5270- CreateFKCheckTrigger (myRel , fkconstraint , constraintOid , true);
5271- CreateFKCheckTrigger (myRel , fkconstraint , constraintOid , false);
5276+ CreateFKCheckTrigger (myRel , fkconstraint , constraintOid , indexOid , true);
5277+ CreateFKCheckTrigger (myRel , fkconstraint , constraintOid , indexOid , false);
52725278
52735279 /*
52745280 * Build and execute a CREATE CONSTRAINT TRIGGER statement for the ON
@@ -5316,7 +5322,7 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
53165322 }
53175323 fk_trigger -> args = NIL ;
53185324
5319- (void ) CreateTrigger (fk_trigger , constraintOid , false);
5325+ (void ) CreateTrigger (fk_trigger , constraintOid , indexOid , false);
53205326
53215327 /* Make changes-so-far visible */
53225328 CommandCounterIncrement ();
@@ -5367,7 +5373,7 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
53675373 }
53685374 fk_trigger -> args = NIL ;
53695375
5370- (void ) CreateTrigger (fk_trigger , constraintOid , false);
5376+ (void ) CreateTrigger (fk_trigger , constraintOid , indexOid , false);
53715377}
53725378
53735379/*
0 commit comments