8
8
*
9
9
*
10
10
* 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 $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -152,6 +152,7 @@ typedef struct NewConstraint
152
152
char * name ; /* Constraint name, or NULL if none */
153
153
ConstrType contype ; /* CHECK or FOREIGN */
154
154
Oid refrelid ; /* PK rel, if FOREIGN */
155
+ Oid refindid ; /* OID of PK's index, if FOREIGN */
155
156
Oid conid ; /* OID of pg_constraint entry, if FOREIGN */
156
157
Node * qual ; /* Check expr or FkConstraint struct */
157
158
List * qualstate ; /* Execution state for CHECK */
@@ -247,9 +248,10 @@ static Oid transformFkeyCheckAttrs(Relation pkrel,
247
248
Oid * opclasses );
248
249
static void checkFkeyPermissions (Relation rel , int16 * attnums , int natts );
249
250
static void validateForeignKeyConstraint (FkConstraint * fkconstraint ,
250
- Relation rel , Relation pkrel , Oid constraintOid );
251
+ Relation rel , Relation pkrel ,
252
+ Oid pkindOid , Oid constraintOid );
251
253
static void createForeignKeyTriggers (Relation rel , FkConstraint * fkconstraint ,
252
- Oid constraintOid );
254
+ Oid constraintOid , Oid indexOid );
253
255
static void ATController (Relation rel , List * cmds , bool recurse );
254
256
static void ATPrepCmd (List * * wqueue , Relation rel , AlterTableCmd * cmd ,
255
257
bool recurse , bool recursing );
@@ -2915,6 +2917,7 @@ ATRewriteTables(List **wqueue)
2915
2917
refrel = heap_open (con -> refrelid , RowShareLock );
2916
2918
2917
2919
validateForeignKeyConstraint (fkconstraint , rel , refrel ,
2920
+ con -> refindid ,
2918
2921
con -> conid );
2919
2922
2920
2923
heap_close (refrel , NoLock );
@@ -4819,6 +4822,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
4819
4822
numfks ,
4820
4823
InvalidOid , /* not a domain
4821
4824
* constraint */
4825
+ indexOid ,
4822
4826
RelationGetRelid (pkrel ),
4823
4827
pkattnum ,
4824
4828
pfeqoperators ,
@@ -4828,7 +4832,6 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
4828
4832
fkconstraint -> fk_upd_action ,
4829
4833
fkconstraint -> fk_del_action ,
4830
4834
fkconstraint -> fk_matchtype ,
4831
- indexOid ,
4832
4835
NULL , /* no check constraint */
4833
4836
NULL ,
4834
4837
NULL ,
@@ -4838,7 +4841,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
4838
4841
/*
4839
4842
* Create the triggers that will enforce the constraint.
4840
4843
*/
4841
- createForeignKeyTriggers (rel , fkconstraint , constrOid );
4844
+ createForeignKeyTriggers (rel , fkconstraint , constrOid , indexOid );
4842
4845
4843
4846
/*
4844
4847
* Tell Phase 3 to check that the constraint is satisfied by existing rows
@@ -4852,6 +4855,7 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel,
4852
4855
newcon -> name = fkconstraint -> constr_name ;
4853
4856
newcon -> contype = CONSTR_FOREIGN ;
4854
4857
newcon -> refrelid = RelationGetRelid (pkrel );
4858
+ newcon -> refindid = indexOid ;
4855
4859
newcon -> conid = constrOid ;
4856
4860
newcon -> qual = (Node * ) fkconstraint ;
4857
4861
@@ -5141,6 +5145,7 @@ static void
5141
5145
validateForeignKeyConstraint (FkConstraint * fkconstraint ,
5142
5146
Relation rel ,
5143
5147
Relation pkrel ,
5148
+ Oid pkindOid ,
5144
5149
Oid constraintOid )
5145
5150
{
5146
5151
HeapScanDesc scan ;
@@ -5156,6 +5161,7 @@ validateForeignKeyConstraint(FkConstraint *fkconstraint,
5156
5161
trig .tgenabled = TRIGGER_FIRES_ON_ORIGIN ;
5157
5162
trig .tgisconstraint = TRUE;
5158
5163
trig .tgconstrrelid = RelationGetRelid (pkrel );
5164
+ trig .tgconstrindid = pkindOid ;
5159
5165
trig .tgconstraint = constraintOid ;
5160
5166
trig .tgdeferrable = FALSE;
5161
5167
trig .tginitdeferred = FALSE;
@@ -5209,7 +5215,7 @@ validateForeignKeyConstraint(FkConstraint *fkconstraint,
5209
5215
5210
5216
static void
5211
5217
CreateFKCheckTrigger (RangeVar * myRel , FkConstraint * fkconstraint ,
5212
- Oid constraintOid , bool on_insert )
5218
+ Oid constraintOid , Oid indexOid , bool on_insert )
5213
5219
{
5214
5220
CreateTrigStmt * fk_trigger ;
5215
5221
@@ -5237,7 +5243,7 @@ CreateFKCheckTrigger(RangeVar *myRel, FkConstraint *fkconstraint,
5237
5243
fk_trigger -> constrrel = fkconstraint -> pktable ;
5238
5244
fk_trigger -> args = NIL ;
5239
5245
5240
- (void ) CreateTrigger (fk_trigger , constraintOid , false);
5246
+ (void ) CreateTrigger (fk_trigger , constraintOid , indexOid , false);
5241
5247
5242
5248
/* Make changes-so-far visible */
5243
5249
CommandCounterIncrement ();
@@ -5248,7 +5254,7 @@ CreateFKCheckTrigger(RangeVar *myRel, FkConstraint *fkconstraint,
5248
5254
*/
5249
5255
static void
5250
5256
createForeignKeyTriggers (Relation rel , FkConstraint * fkconstraint ,
5251
- Oid constraintOid )
5257
+ Oid constraintOid , Oid indexOid )
5252
5258
{
5253
5259
RangeVar * myRel ;
5254
5260
CreateTrigStmt * fk_trigger ;
@@ -5267,8 +5273,8 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
5267
5273
* Build and execute a CREATE CONSTRAINT TRIGGER statement for the CHECK
5268
5274
* action for both INSERTs and UPDATEs on the referencing table.
5269
5275
*/
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);
5272
5278
5273
5279
/*
5274
5280
* Build and execute a CREATE CONSTRAINT TRIGGER statement for the ON
@@ -5316,7 +5322,7 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
5316
5322
}
5317
5323
fk_trigger -> args = NIL ;
5318
5324
5319
- (void ) CreateTrigger (fk_trigger , constraintOid , false);
5325
+ (void ) CreateTrigger (fk_trigger , constraintOid , indexOid , false);
5320
5326
5321
5327
/* Make changes-so-far visible */
5322
5328
CommandCounterIncrement ();
@@ -5367,7 +5373,7 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint,
5367
5373
}
5368
5374
fk_trigger -> args = NIL ;
5369
5375
5370
- (void ) CreateTrigger (fk_trigger , constraintOid , false);
5376
+ (void ) CreateTrigger (fk_trigger , constraintOid , indexOid , false);
5371
5377
}
5372
5378
5373
5379
/*
0 commit comments