Skip to content

Commit 948f511

Browse files
Fixed After and Instead of trigger issues on table (babelfish-for-postgresql#329)
1. If an After trigger exists on table, it is skipped after instead of trigger is fired on same table in Babelfish. 2. Query execution and After trigger is skipped on table in babelfish when it has a disabled Instead of Trigger Task: BABEL-4672 and BABEL-4801 Signed-off-by: Deepakshi Mittal <[email protected]>
1 parent a9b7fdc commit 948f511

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

src/backend/commands/trigger.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4442,11 +4442,12 @@ ExecISInsertTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureSt
44424442
IOTState prevState;
44434443
trigdesc = relinfo->ri_TrigDesc;
44444444
if (trigdesc == NULL)
4445-
return IOT_NOT_REQUIRED;
4446-
if (!trigdesc->trig_insert_instead_statement)
4445+
return IOT_NOT_REQUIRED;
4446+
4447+
if (!trigdesc->trig_insert_instead_statement || !isTsqlInsteadofTriggerExecution(estate, relinfo, TRIGGER_EVENT_INSERT))
44474448
{
44484449
set_iot_state(RelationGetRelid(rel), CMD_INSERT, IOT_NOT_REQUIRED);
4449-
return IOT_NOT_REQUIRED;
4450+
return IOT_NOT_REQUIRED;
44504451
}
44514452

44524453
// if the trigger is already fired or not required
@@ -4471,7 +4472,8 @@ ExecISUpdateTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureSt
44714472
if (trigdesc == NULL)
44724473
return IOT_NOT_REQUIRED;
44734474

4474-
if (!trigdesc->trig_update_instead_statement) {
4475+
if (!trigdesc->trig_update_instead_statement || !isTsqlInsteadofTriggerExecution(estate, relinfo, TRIGGER_EVENT_UPDATE))
4476+
{
44754477
set_iot_state(RelationGetRelid(relinfo->ri_RelationDesc), CMD_UPDATE, IOT_NOT_REQUIRED);
44764478
return IOT_NOT_REQUIRED;
44774479
}
@@ -4498,7 +4500,9 @@ ExecISDeleteTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureSt
44984500

44994501
if (trigdesc == NULL)
45004502
return IOT_NOT_REQUIRED;
4501-
if (!trigdesc->trig_delete_instead_statement) {
4503+
4504+
if (!trigdesc->trig_delete_instead_statement || !isTsqlInsteadofTriggerExecution(estate, relinfo, TRIGGER_EVENT_DELETE))
4505+
{
45024506
set_iot_state(RelationGetRelid(relinfo->ri_RelationDesc), CMD_DELETE, IOT_NOT_REQUIRED);
45034507
return IOT_NOT_REQUIRED;
45044508
}
@@ -4962,7 +4966,11 @@ isTsqlInsteadofTriggerExecution(EState *estate, ResultRelInfo *relinfo, TriggerE
49624966
for (i = 0; i < trigdesc->numtriggers; i++)
49634967
{
49644968
Trigger *trigger = &trigdesc->triggers[i];
4965-
if (TriggerEnabled(estate, relinfo, trigger, event, NULL, NULL, NULL)){
4969+
if (TriggerEnabled(estate, relinfo, trigger, event, NULL, NULL, NULL) &&
4970+
(TRIGGER_TYPE_MATCHES(trigger->tgtype, TRIGGER_TYPE_STATEMENT, TRIGGER_TYPE_INSTEAD, TRIGGER_TYPE_INSERT) ||
4971+
TRIGGER_TYPE_MATCHES(trigger->tgtype, TRIGGER_TYPE_STATEMENT, TRIGGER_TYPE_INSTEAD, TRIGGER_TYPE_UPDATE) ||
4972+
TRIGGER_TYPE_MATCHES(trigger->tgtype, TRIGGER_TYPE_STATEMENT, TRIGGER_TYPE_INSTEAD, TRIGGER_TYPE_DELETE)))
4973+
{
49664974
return !TsqlRecuresiveCheck(relinfo);
49674975
}
49684976
}

0 commit comments

Comments
 (0)