@@ -1328,19 +1328,29 @@ ExecOnConflictUpdate(ModifyTableState *mtstate,
1328
1328
static void
1329
1329
fireBSTriggers (ModifyTableState * node )
1330
1330
{
1331
+ ResultRelInfo * resultRelInfo = node -> resultRelInfo ;
1332
+
1333
+ /*
1334
+ * If the node modifies a partitioned table, we must fire its triggers.
1335
+ * Note that in that case, node->resultRelInfo points to the first leaf
1336
+ * partition, not the root table.
1337
+ */
1338
+ if (node -> rootResultRelInfo != NULL )
1339
+ resultRelInfo = node -> rootResultRelInfo ;
1340
+
1331
1341
switch (node -> operation )
1332
1342
{
1333
1343
case CMD_INSERT :
1334
- ExecBSInsertTriggers (node -> ps .state , node -> resultRelInfo );
1344
+ ExecBSInsertTriggers (node -> ps .state , resultRelInfo );
1335
1345
if (node -> mt_onconflict == ONCONFLICT_UPDATE )
1336
1346
ExecBSUpdateTriggers (node -> ps .state ,
1337
- node -> resultRelInfo );
1347
+ resultRelInfo );
1338
1348
break ;
1339
1349
case CMD_UPDATE :
1340
- ExecBSUpdateTriggers (node -> ps .state , node -> resultRelInfo );
1350
+ ExecBSUpdateTriggers (node -> ps .state , resultRelInfo );
1341
1351
break ;
1342
1352
case CMD_DELETE :
1343
- ExecBSDeleteTriggers (node -> ps .state , node -> resultRelInfo );
1353
+ ExecBSDeleteTriggers (node -> ps .state , resultRelInfo );
1344
1354
break ;
1345
1355
default :
1346
1356
elog (ERROR , "unknown operation" );
@@ -1354,19 +1364,29 @@ fireBSTriggers(ModifyTableState *node)
1354
1364
static void
1355
1365
fireASTriggers (ModifyTableState * node )
1356
1366
{
1367
+ ResultRelInfo * resultRelInfo = node -> resultRelInfo ;
1368
+
1369
+ /*
1370
+ * If the node modifies a partitioned table, we must fire its triggers.
1371
+ * Note that in that case, node->resultRelInfo points to the first leaf
1372
+ * partition, not the root table.
1373
+ */
1374
+ if (node -> rootResultRelInfo != NULL )
1375
+ resultRelInfo = node -> rootResultRelInfo ;
1376
+
1357
1377
switch (node -> operation )
1358
1378
{
1359
1379
case CMD_INSERT :
1360
1380
if (node -> mt_onconflict == ONCONFLICT_UPDATE )
1361
1381
ExecASUpdateTriggers (node -> ps .state ,
1362
- node -> resultRelInfo );
1363
- ExecASInsertTriggers (node -> ps .state , node -> resultRelInfo );
1382
+ resultRelInfo );
1383
+ ExecASInsertTriggers (node -> ps .state , resultRelInfo );
1364
1384
break ;
1365
1385
case CMD_UPDATE :
1366
- ExecASUpdateTriggers (node -> ps .state , node -> resultRelInfo );
1386
+ ExecASUpdateTriggers (node -> ps .state , resultRelInfo );
1367
1387
break ;
1368
1388
case CMD_DELETE :
1369
- ExecASDeleteTriggers (node -> ps .state , node -> resultRelInfo );
1389
+ ExecASDeleteTriggers (node -> ps .state , resultRelInfo );
1370
1390
break ;
1371
1391
default :
1372
1392
elog (ERROR , "unknown operation" );
@@ -1652,6 +1672,12 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
1652
1672
1653
1673
mtstate -> mt_plans = (PlanState * * ) palloc0 (sizeof (PlanState * ) * nplans );
1654
1674
mtstate -> resultRelInfo = estate -> es_result_relations + node -> resultRelIndex ;
1675
+
1676
+ /* If modifying a partitioned table, initialize the root table info */
1677
+ if (node -> rootResultRelIndex >= 0 )
1678
+ mtstate -> rootResultRelInfo = estate -> es_root_result_relations +
1679
+ node -> rootResultRelIndex ;
1680
+
1655
1681
mtstate -> mt_arowmarks = (List * * ) palloc0 (sizeof (List * ) * nplans );
1656
1682
mtstate -> mt_nplans = nplans ;
1657
1683
mtstate -> mt_onconflict = node -> onConflictAction ;
0 commit comments