mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Fix EvalPlanQualStart to handle partitioned result rels correctly.
The es_root_result_relations array needs to be shallow-copied in the same way as the main es_result_relations array, else EPQ rechecks on partitioned result relations fail, as seen in bug #15677 from Norbert Benkocs. Amit Langote, isolation test case added by me Discussion: https://postgr.es/m/15677-0bf089579b4cd02d@postgresql.org Discussion: https://postgr.es/m/19321.1554567786@sss.pgh.pa.us
This commit is contained in:
@ -2779,7 +2779,7 @@ EvalPlanQualStart(EPQState *epqstate, EState *parentestate, Plan *planTree)
|
||||
* es_param_exec_vals, etc.
|
||||
*
|
||||
* The ResultRelInfo array management is trickier than it looks. We
|
||||
* create a fresh array for the child but copy all the content from the
|
||||
* create fresh arrays for the child but copy all the content from the
|
||||
* parent. This is because it's okay for the child to share any
|
||||
* per-relation state the parent has already created --- but if the child
|
||||
* sets up any ResultRelInfo fields, such as its own junkfilter, that
|
||||
@ -2800,6 +2800,7 @@ EvalPlanQualStart(EPQState *epqstate, EState *parentestate, Plan *planTree)
|
||||
if (parentestate->es_num_result_relations > 0)
|
||||
{
|
||||
int numResultRelations = parentestate->es_num_result_relations;
|
||||
int numRootResultRels = parentestate->es_num_root_result_relations;
|
||||
ResultRelInfo *resultRelInfos;
|
||||
|
||||
resultRelInfos = (ResultRelInfo *)
|
||||
@ -2808,6 +2809,17 @@ EvalPlanQualStart(EPQState *epqstate, EState *parentestate, Plan *planTree)
|
||||
numResultRelations * sizeof(ResultRelInfo));
|
||||
estate->es_result_relations = resultRelInfos;
|
||||
estate->es_num_result_relations = numResultRelations;
|
||||
|
||||
/* Also transfer partitioned root result relations. */
|
||||
if (numRootResultRels > 0)
|
||||
{
|
||||
resultRelInfos = (ResultRelInfo *)
|
||||
palloc(numRootResultRels * sizeof(ResultRelInfo));
|
||||
memcpy(resultRelInfos, parentestate->es_root_result_relations,
|
||||
numRootResultRels * sizeof(ResultRelInfo));
|
||||
estate->es_root_result_relations = resultRelInfos;
|
||||
estate->es_num_root_result_relations = numRootResultRels;
|
||||
}
|
||||
}
|
||||
/* es_result_relation_info must NOT be copied */
|
||||
/* es_trig_target_relations must NOT be copied */
|
||||
|
Reference in New Issue
Block a user