Skip to content

Commit 783af51

Browse files
committed
Back-patch fix for subselect in targetlist of Append node.
1 parent 0e0832b commit 783af51

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
typedef struct
2826
{
@@ -37,6 +35,7 @@ typedef struct
3735
List *subplanTargetList;
3836
} replace_vars_with_subplan_refs_context;
3937

38+
static void fix_expr_references(Plan *plan, Node *node);
4039
static void set_join_references(Join *join);
4140
static void set_uppernode_references(Plan *plan, Index subvarno);
4241
static Node *join_references_mutator(Node *node,
@@ -88,34 +87,39 @@ set_plan_references(Plan *plan)
8887
switch (nodeTag(plan))
8988
{
9089
case T_SeqScan:
91-
/* nothing special */
90+
fix_expr_references(plan, (Node *) plan->targetlist);
91+
fix_expr_references(plan, (Node *) plan->qual);
9292
break;
9393
case T_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+
case T_TidScan:
102+
fix_expr_references(plan, (Node *) plan->targetlist);
103+
fix_expr_references(plan, (Node *) plan->qual);
102104
break;
103105
case T_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
case T_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
case T_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
case T_Material:
121125
case T_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
case T_Agg:
134141
case T_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
case T_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
case T_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-
case T_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+
static void
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy