Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit783af51

Browse files
committed
Back-patch fix for subselect in targetlist of Append node.
1 parent0e0832b commit783af51

File tree

1 file changed

+52
-41
lines changed

1 file changed

+52
-41
lines changed

‎src/backend/optimizer/plan/setrefs.c

Lines changed: 52 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,18 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.62 2000/04/12 17:15:22 momjian Exp $
12+
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.62.2.1 2000/09/23 23:41:05 tgl Exp $
1313
*
1414
*-------------------------------------------------------------------------
1515
*/
1616
#include<sys/types.h>
1717

1818
#include"postgres.h"
1919

20-
#include"nodes/makefuncs.h"
2120
#include"nodes/nodeFuncs.h"
2221
#include"optimizer/clauses.h"
2322
#include"optimizer/planmain.h"
2423
#include"optimizer/tlist.h"
25-
#include"optimizer/var.h"
2624

2725
typedefstruct
2826
{
@@ -37,6 +35,7 @@ typedef struct
3735
List*subplanTargetList;
3836
}replace_vars_with_subplan_refs_context;
3937

38+
staticvoidfix_expr_references(Plan*plan,Node*node);
4039
staticvoidset_join_references(Join*join);
4140
staticvoidset_uppernode_references(Plan*plan,Indexsubvarno);
4241
staticNode*join_references_mutator(Node*node,
@@ -88,34 +87,39 @@ set_plan_references(Plan *plan)
8887
switch (nodeTag(plan))
8988
{
9089
caseT_SeqScan:
91-
/* nothing special */
90+
fix_expr_references(plan, (Node*)plan->targetlist);
91+
fix_expr_references(plan, (Node*)plan->qual);
9292
break;
9393
caseT_IndexScan:
94-
fix_opids((Node*) ((IndexScan*)plan)->indxqual);
95-
fix_opids((Node*) ((IndexScan*)plan)->indxqualorig);
96-
plan->subPlan=
97-
nconc(plan->subPlan,
98-
pull_subplans((Node*) ((IndexScan*)plan)->indxqual));
99-
plan->subPlan=
100-
nconc(plan->subPlan,
101-
pull_subplans((Node*) ((IndexScan*)plan)->indxqualorig));
94+
fix_expr_references(plan, (Node*)plan->targetlist);
95+
fix_expr_references(plan, (Node*)plan->qual);
96+
fix_expr_references(plan,
97+
(Node*) ((IndexScan*)plan)->indxqual);
98+
fix_expr_references(plan,
99+
(Node*) ((IndexScan*)plan)->indxqualorig);
100+
break;
101+
caseT_TidScan:
102+
fix_expr_references(plan, (Node*)plan->targetlist);
103+
fix_expr_references(plan, (Node*)plan->qual);
102104
break;
103105
caseT_NestLoop:
104106
set_join_references((Join*)plan);
107+
fix_expr_references(plan, (Node*)plan->targetlist);
108+
fix_expr_references(plan, (Node*)plan->qual);
105109
break;
106110
caseT_MergeJoin:
107111
set_join_references((Join*)plan);
108-
fix_opids((Node*)((MergeJoin*)plan)->mergeclauses);
109-
plan->subPlan=
110-
nconc(plan->subPlan,
111-
pull_subplans((Node*) ((MergeJoin*)plan)->mergeclauses));
112+
fix_expr_references(plan,(Node*)plan->targetlist);
113+
fix_expr_references(plan, (Node*)plan->qual);
114+
fix_expr_references(plan,
115+
(Node*) ((MergeJoin*)plan)->mergeclauses);
112116
break;
113117
caseT_HashJoin:
114118
set_join_references((Join*)plan);
115-
fix_opids((Node*)((HashJoin*)plan)->hashclauses);
116-
plan->subPlan=
117-
nconc(plan->subPlan,
118-
pull_subplans((Node*) ((HashJoin*)plan)->hashclauses));
119+
fix_expr_references(plan,(Node*)plan->targetlist);
120+
fix_expr_references(plan, (Node*)plan->qual);
121+
fix_expr_references(plan,
122+
(Node*) ((HashJoin*)plan)->hashclauses);
119123
break;
120124
caseT_Material:
121125
caseT_Sort:
@@ -127,12 +131,17 @@ set_plan_references(Plan *plan)
127131
* targetlists or quals (because they just return their
128132
* unmodified input tuples). The optimizer is lazy about
129133
* creating really valid targetlists for them.Best to just
130-
* leave the targetlist alone.
134+
* leave the targetlist alone. In particular, we do not want
135+
* to pull a subplan list for them, since we will likely end
136+
* up with duplicate list entries for subplans that also appear
137+
* in lower levels of the plan tree!
131138
*/
132139
break;
133140
caseT_Agg:
134141
caseT_Group:
135142
set_uppernode_references(plan, (Index)0);
143+
fix_expr_references(plan, (Node*)plan->targetlist);
144+
fix_expr_references(plan, (Node*)plan->qual);
136145
break;
137146
caseT_Result:
138147

@@ -144,37 +153,25 @@ set_plan_references(Plan *plan)
144153
*/
145154
if (plan->lefttree!=NULL)
146155
set_uppernode_references(plan, (Index)OUTER);
147-
fix_opids(((Result*)plan)->resconstantqual);
148-
plan->subPlan=
149-
nconc(plan->subPlan,
150-
pull_subplans(((Result*)plan)->resconstantqual));
156+
fix_expr_references(plan, (Node*)plan->targetlist);
157+
fix_expr_references(plan, (Node*)plan->qual);
158+
fix_expr_references(plan, ((Result*)plan)->resconstantqual);
151159
break;
152160
caseT_Append:
161+
/*
162+
* Append, like Sort et al, doesn't actually evaluate its
163+
* targetlist or quals, and we haven't bothered to give it
164+
* its own tlist copy. So, don't fix targetlist/qual.
165+
*/
153166
foreach(pl, ((Append*)plan)->appendplans)
154167
set_plan_references((Plan*)lfirst(pl));
155168
break;
156-
caseT_TidScan:
157-
/* nothing special */
158-
break;
159169
default:
160170
elog(ERROR,"set_plan_references: unknown plan type %d",
161171
nodeTag(plan));
162172
break;
163173
}
164174

165-
/*
166-
* For all plan types, fix operators in targetlist and qual
167-
* expressions, and find subplans therein.
168-
*/
169-
fix_opids((Node*)plan->targetlist);
170-
fix_opids((Node*)plan->qual);
171-
plan->subPlan=
172-
nconc(plan->subPlan,
173-
pull_subplans((Node*)plan->targetlist));
174-
plan->subPlan=
175-
nconc(plan->subPlan,
176-
pull_subplans((Node*)plan->qual));
177-
178175
/*
179176
* Now recurse into subplans, if any
180177
*
@@ -202,6 +199,20 @@ set_plan_references(Plan *plan)
202199
}
203200
}
204201

202+
/*
203+
* fix_expr_references
204+
* Do final cleanup on expressions (targetlists or quals).
205+
*
206+
* This consists of looking up operator opcode info for Oper nodes
207+
* and adding subplans to the Plan node's list of contained subplans.
208+
*/
209+
staticvoid
210+
fix_expr_references(Plan*plan,Node*node)
211+
{
212+
fix_opids(node);
213+
plan->subPlan=nconc(plan->subPlan,pull_subplans(node));
214+
}
215+
205216
/*
206217
* set_join_references
207218
* Modifies the target list of a join node to reference its subplans,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp