@@ -1328,19 +1328,29 @@ ExecOnConflictUpdate(ModifyTableState *mtstate,
13281328static void
13291329fireBSTriggers (ModifyTableState * node )
13301330{
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+
13311341 switch (node -> operation )
13321342 {
13331343 case CMD_INSERT :
1334- ExecBSInsertTriggers (node -> ps .state , node -> resultRelInfo );
1344+ ExecBSInsertTriggers (node -> ps .state , resultRelInfo );
13351345 if (node -> mt_onconflict == ONCONFLICT_UPDATE )
13361346 ExecBSUpdateTriggers (node -> ps .state ,
1337- node -> resultRelInfo );
1347+ resultRelInfo );
13381348 break ;
13391349 case CMD_UPDATE :
1340- ExecBSUpdateTriggers (node -> ps .state , node -> resultRelInfo );
1350+ ExecBSUpdateTriggers (node -> ps .state , resultRelInfo );
13411351 break ;
13421352 case CMD_DELETE :
1343- ExecBSDeleteTriggers (node -> ps .state , node -> resultRelInfo );
1353+ ExecBSDeleteTriggers (node -> ps .state , resultRelInfo );
13441354 break ;
13451355 default :
13461356 elog (ERROR , "unknown operation" );
@@ -1354,19 +1364,29 @@ fireBSTriggers(ModifyTableState *node)
13541364static void
13551365fireASTriggers (ModifyTableState * node )
13561366{
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+
13571377 switch (node -> operation )
13581378 {
13591379 case CMD_INSERT :
13601380 if (node -> mt_onconflict == ONCONFLICT_UPDATE )
13611381 ExecASUpdateTriggers (node -> ps .state ,
1362- node -> resultRelInfo );
1363- ExecASInsertTriggers (node -> ps .state , node -> resultRelInfo );
1382+ resultRelInfo );
1383+ ExecASInsertTriggers (node -> ps .state , resultRelInfo );
13641384 break ;
13651385 case CMD_UPDATE :
1366- ExecASUpdateTriggers (node -> ps .state , node -> resultRelInfo );
1386+ ExecASUpdateTriggers (node -> ps .state , resultRelInfo );
13671387 break ;
13681388 case CMD_DELETE :
1369- ExecASDeleteTriggers (node -> ps .state , node -> resultRelInfo );
1389+ ExecASDeleteTriggers (node -> ps .state , resultRelInfo );
13701390 break ;
13711391 default :
13721392 elog (ERROR , "unknown operation" );
@@ -1652,6 +1672,12 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
16521672
16531673 mtstate -> mt_plans = (PlanState * * ) palloc0 (sizeof (PlanState * ) * nplans );
16541674 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+
16551681 mtstate -> mt_arowmarks = (List * * ) palloc0 (sizeof (List * ) * nplans );
16561682 mtstate -> mt_nplans = nplans ;
16571683 mtstate -> mt_onconflict = node -> onConflictAction ;
0 commit comments