|
8 | 8 | * |
9 | 9 | * |
10 | 10 | * IDENTIFICATION |
11 | | - * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.157 2005/05/10 13:16:26 momjian Exp $ |
| 11 | + * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.158 2005/05/30 06:52:38 neilc Exp $ |
12 | 12 | * |
13 | 13 | *------------------------------------------------------------------------- |
14 | 14 | */ |
@@ -4380,52 +4380,33 @@ validateForeignKeyConstraint(FkConstraint *fkconstraint, |
4380 | 4380 | pfree(trig.tgargs); |
4381 | 4381 | } |
4382 | 4382 |
|
4383 | | -/* |
4384 | | - * Create the triggers that implement an FK constraint. |
4385 | | - */ |
4386 | 4383 | static void |
4387 | | -createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint, |
4388 | | - Oid constrOid) |
| 4384 | +CreateFKCheckTrigger(RangeVar *myRel, FkConstraint *fkconstraint, |
| 4385 | + ObjectAddress *constrobj, ObjectAddress *trigobj, |
| 4386 | + bool on_insert) |
4389 | 4387 | { |
4390 | | - RangeVar *myRel; |
4391 | 4388 | CreateTrigStmt *fk_trigger; |
4392 | 4389 | ListCell *fk_attr; |
4393 | 4390 | ListCell *pk_attr; |
4394 | | - ObjectAddress trigobj, |
4395 | | - constrobj; |
4396 | | - |
4397 | | - /* |
4398 | | - * Reconstruct a RangeVar for my relation (not passed in, |
4399 | | - * unfortunately). |
4400 | | - */ |
4401 | | - myRel = makeRangeVar(get_namespace_name(RelationGetNamespace(rel)), |
4402 | | - pstrdup(RelationGetRelationName(rel))); |
4403 | 4391 |
|
4404 | | - /* |
4405 | | - * Preset objectAddress fields |
4406 | | - */ |
4407 | | - constrobj.classId = ConstraintRelationId; |
4408 | | - constrobj.objectId = constrOid; |
4409 | | - constrobj.objectSubId = 0; |
4410 | | - trigobj.classId = TriggerRelationId; |
4411 | | - trigobj.objectSubId = 0; |
4412 | | - |
4413 | | - /* Make changes-so-far visible */ |
4414 | | - CommandCounterIncrement(); |
4415 | | - |
4416 | | - /* |
4417 | | - * Build and execute a CREATE CONSTRAINT TRIGGER statement for the |
4418 | | - * CHECK action. |
4419 | | - */ |
4420 | 4392 | fk_trigger = makeNode(CreateTrigStmt); |
4421 | 4393 | fk_trigger->trigname = fkconstraint->constr_name; |
4422 | 4394 | fk_trigger->relation = myRel; |
4423 | | - fk_trigger->funcname = SystemFuncName("RI_FKey_check_ins"); |
4424 | 4395 | fk_trigger->before = false; |
4425 | 4396 | fk_trigger->row = true; |
4426 | | - fk_trigger->actions[0] = 'i'; |
4427 | | - fk_trigger->actions[1] = 'u'; |
4428 | | - fk_trigger->actions[2] = '\0'; |
| 4397 | + |
| 4398 | + /* Either ON INSERT or ON UPDATE */ |
| 4399 | + if (on_insert) |
| 4400 | + { |
| 4401 | + fk_trigger->funcname = SystemFuncName("RI_FKey_check_ins"); |
| 4402 | + fk_trigger->actions[0] = 'i'; |
| 4403 | + } |
| 4404 | + else |
| 4405 | + { |
| 4406 | + fk_trigger->funcname = SystemFuncName("RI_FKey_check_upd"); |
| 4407 | + fk_trigger->actions[0] = 'u'; |
| 4408 | + } |
| 4409 | + fk_trigger->actions[1] = '\0'; |
4429 | 4410 |
|
4430 | 4411 | fk_trigger->isconstraint = true; |
4431 | 4412 | fk_trigger->deferrable = fkconstraint->deferrable; |
@@ -4453,13 +4434,54 @@ createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint, |
4453 | 4434 | fk_trigger->args = lappend(fk_trigger->args, lfirst(pk_attr)); |
4454 | 4435 | } |
4455 | 4436 |
|
4456 | | - trigobj.objectId = CreateTrigger(fk_trigger, true); |
| 4437 | + trigobj->objectId = CreateTrigger(fk_trigger, true); |
4457 | 4438 |
|
4458 | 4439 | /* Register dependency from trigger to constraint */ |
4459 | | - recordDependencyOn(&trigobj, &constrobj, DEPENDENCY_INTERNAL); |
| 4440 | + recordDependencyOn(trigobj, constrobj, DEPENDENCY_INTERNAL); |
4460 | 4441 |
|
4461 | 4442 | /* Make changes-so-far visible */ |
4462 | 4443 | CommandCounterIncrement(); |
| 4444 | +} |
| 4445 | + |
| 4446 | +/* |
| 4447 | + * Create the triggers that implement an FK constraint. |
| 4448 | + */ |
| 4449 | +static void |
| 4450 | +createForeignKeyTriggers(Relation rel, FkConstraint *fkconstraint, |
| 4451 | + Oid constrOid) |
| 4452 | +{ |
| 4453 | + RangeVar *myRel; |
| 4454 | + CreateTrigStmt *fk_trigger; |
| 4455 | + ListCell *fk_attr; |
| 4456 | + ListCell *pk_attr; |
| 4457 | + ObjectAddress trigobj, |
| 4458 | + constrobj; |
| 4459 | + |
| 4460 | + /* |
| 4461 | + * Reconstruct a RangeVar for my relation (not passed in, |
| 4462 | + * unfortunately). |
| 4463 | + */ |
| 4464 | + myRel = makeRangeVar(get_namespace_name(RelationGetNamespace(rel)), |
| 4465 | + pstrdup(RelationGetRelationName(rel))); |
| 4466 | + |
| 4467 | + /* |
| 4468 | + * Preset objectAddress fields |
| 4469 | + */ |
| 4470 | + constrobj.classId = ConstraintRelationId; |
| 4471 | + constrobj.objectId = constrOid; |
| 4472 | + constrobj.objectSubId = 0; |
| 4473 | + trigobj.classId = TriggerRelationId; |
| 4474 | + trigobj.objectSubId = 0; |
| 4475 | + |
| 4476 | + /* Make changes-so-far visible */ |
| 4477 | + CommandCounterIncrement(); |
| 4478 | + |
| 4479 | + /* |
| 4480 | + * Build and execute a CREATE CONSTRAINT TRIGGER statement for the |
| 4481 | + * CHECK action for both INSERTs and UPDATEs on the referencing table. |
| 4482 | + */ |
| 4483 | + CreateFKCheckTrigger(myRel, fkconstraint, &constrobj, &trigobj, true); |
| 4484 | + CreateFKCheckTrigger(myRel, fkconstraint, &constrobj, &trigobj, false); |
4463 | 4485 |
|
4464 | 4486 | /* |
4465 | 4487 | * Build and execute a CREATE CONSTRAINT TRIGGER statement for the ON |
|
0 commit comments