mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
Fire per-statement triggers on partitioned tables.
Even though no actual tuples are ever inserted into a partitioned table (the actual tuples are in the partitions, not the partitioned table itself), we still need to have a ResultRelInfo for the partitioned table, or per-statement triggers won't get fired. Amit Langote, per a report from Rajkumar Raghuwanshi. Reviewed by me. Discussion: http://postgr.es/m/CAKcux6%3DwYospCRY2J4XEFuVy0L41S%3Dfic7rmkbsU-GXhhSbmBg%40mail.gmail.com
This commit is contained in:
@ -6437,6 +6437,7 @@ make_modifytable(PlannerInfo *root,
|
||||
node->partitioned_rels = partitioned_rels;
|
||||
node->resultRelations = resultRelations;
|
||||
node->resultRelIndex = -1; /* will be set correctly in setrefs.c */
|
||||
node->rootResultRelIndex = -1; /* will be set correctly in setrefs.c */
|
||||
node->plans = subplans;
|
||||
if (!onconflict)
|
||||
{
|
||||
|
@ -240,6 +240,7 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
|
||||
glob->finalrowmarks = NIL;
|
||||
glob->resultRelations = NIL;
|
||||
glob->nonleafResultRelations = NIL;
|
||||
glob->rootResultRelations = NIL;
|
||||
glob->relationOids = NIL;
|
||||
glob->invalItems = NIL;
|
||||
glob->nParamExec = 0;
|
||||
@ -408,6 +409,7 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
|
||||
Assert(glob->finalrowmarks == NIL);
|
||||
Assert(glob->resultRelations == NIL);
|
||||
Assert(glob->nonleafResultRelations == NIL);
|
||||
Assert(glob->rootResultRelations == NIL);
|
||||
top_plan = set_plan_references(root, top_plan);
|
||||
/* ... and the subplans (both regular subplans and initplans) */
|
||||
Assert(list_length(glob->subplans) == list_length(glob->subroots));
|
||||
@ -434,6 +436,7 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
|
||||
result->rtable = glob->finalrtable;
|
||||
result->resultRelations = glob->resultRelations;
|
||||
result->nonleafResultRelations = glob->nonleafResultRelations;
|
||||
result->rootResultRelations = glob->rootResultRelations;
|
||||
result->subplans = glob->subplans;
|
||||
result->rewindPlanIDs = glob->rewindPlanIDs;
|
||||
result->rowMarks = glob->finalrowmarks;
|
||||
|
@ -882,11 +882,22 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset)
|
||||
/*
|
||||
* If the main target relation is a partitioned table, the
|
||||
* following list contains the RT indexes of partitioned child
|
||||
* relations, which are not included in the above list.
|
||||
* relations including the root, which are not included in the
|
||||
* above list. We also keep RT indexes of the roots separately
|
||||
* to be identitied as such during the executor initialization.
|
||||
*/
|
||||
root->glob->nonleafResultRelations =
|
||||
list_concat(root->glob->nonleafResultRelations,
|
||||
list_copy(splan->partitioned_rels));
|
||||
if (splan->partitioned_rels != NIL)
|
||||
{
|
||||
root->glob->nonleafResultRelations =
|
||||
list_concat(root->glob->nonleafResultRelations,
|
||||
list_copy(splan->partitioned_rels));
|
||||
/* Remember where this root will be in the global list. */
|
||||
splan->rootResultRelIndex =
|
||||
list_length(root->glob->rootResultRelations);
|
||||
root->glob->rootResultRelations =
|
||||
lappend_int(root->glob->rootResultRelations,
|
||||
linitial_int(splan->partitioned_rels));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case T_Append:
|
||||
|
Reference in New Issue
Block a user