* createForeignKeyActionTriggers * Create the referenced-side "action" triggers that implement a foreign * key. */
| 13318 | * key. |
| 13319 | */ |
| 13320 | static void |
| 13321 | createForeignKeyActionTriggers(Relation rel, Oid refRelOid, Constraint *fkconstraint, |
| 13322 | Oid constraintOid, Oid indexOid) |
| 13323 | { |
| 13324 | CreateTrigStmt *fk_trigger; |
| 13325 | |
| 13326 | /* |
| 13327 | * Special for Apache Cloudberry: Ignore foreign keys for now, with warning |
| 13328 | */ |
| 13329 | if (Gp_role == GP_ROLE_DISPATCH || Gp_role == GP_ROLE_UTILITY) |
| 13330 | { |
| 13331 | ereport(WARNING, |
| 13332 | (errcode(ERRCODE_INVALID_TABLE_DEFINITION), |
| 13333 | errmsg("referential integrity (FOREIGN KEY) constraints are not supported in Apache Cloudberry, will not be enforced"))); |
| 13334 | } |
| 13335 | |
| 13336 | /* |
| 13337 | * Build and execute a CREATE CONSTRAINT TRIGGER statement for the ON |
| 13338 | * DELETE action on the referenced table. |
| 13339 | */ |
| 13340 | fk_trigger = makeNode(CreateTrigStmt); |
| 13341 | fk_trigger->replace = false; |
| 13342 | fk_trigger->isconstraint = true; |
| 13343 | fk_trigger->trigname = "RI_ConstraintTrigger_a"; |
| 13344 | fk_trigger->relation = NULL; |
| 13345 | fk_trigger->args = NIL; |
| 13346 | fk_trigger->row = true; |
| 13347 | fk_trigger->timing = TRIGGER_TYPE_AFTER; |
| 13348 | fk_trigger->events = TRIGGER_TYPE_DELETE; |
| 13349 | fk_trigger->columns = NIL; |
| 13350 | fk_trigger->whenClause = NULL; |
| 13351 | fk_trigger->transitionRels = NIL; |
| 13352 | fk_trigger->constrrel = NULL; |
| 13353 | switch (fkconstraint->fk_del_action) |
| 13354 | { |
| 13355 | case FKCONSTR_ACTION_NOACTION: |
| 13356 | fk_trigger->deferrable = fkconstraint->deferrable; |
| 13357 | fk_trigger->initdeferred = fkconstraint->initdeferred; |
| 13358 | fk_trigger->funcname = SystemFuncName("RI_FKey_noaction_del"); |
| 13359 | break; |
| 13360 | case FKCONSTR_ACTION_RESTRICT: |
| 13361 | fk_trigger->deferrable = false; |
| 13362 | fk_trigger->initdeferred = false; |
| 13363 | fk_trigger->funcname = SystemFuncName("RI_FKey_restrict_del"); |
| 13364 | break; |
| 13365 | case FKCONSTR_ACTION_CASCADE: |
| 13366 | fk_trigger->deferrable = false; |
| 13367 | fk_trigger->initdeferred = false; |
| 13368 | fk_trigger->funcname = SystemFuncName("RI_FKey_cascade_del"); |
| 13369 | break; |
| 13370 | case FKCONSTR_ACTION_SETNULL: |
| 13371 | fk_trigger->deferrable = false; |
| 13372 | fk_trigger->initdeferred = false; |
| 13373 | fk_trigger->funcname = SystemFuncName("RI_FKey_setnull_del"); |
| 13374 | break; |
| 13375 | case FKCONSTR_ACTION_SETDEFAULT: |
| 13376 | fk_trigger->deferrable = false; |
| 13377 | fk_trigger->initdeferred = false; |
no test coverage detected