Skip to content

Commit 4a6e3a6

Browse files
committed
Old planner() becomes union_planner(); new planner() makes initialization
of some global variables to support subselects and calls union_planner(). Calls to SS_replace_correlation_vars() and SS_process_sublinks() in query_planner() before planning. Get rid of #ifdef INDEXSCAN_PATCH in createplan.c.
1 parent a3f1c36 commit 4a6e3a6

File tree

6 files changed

+625
-20
lines changed

6 files changed

+625
-20
lines changed

src/backend/optimizer/plan/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# Makefile for optimizer/plan
55
#
66
# IDENTIFICATION
7-
# $Header: /cvsroot/pgsql/src/backend/optimizer/plan/Makefile,v 1.5 1997/12/20 00:24:31 scrappy Exp $
7+
# $Header: /cvsroot/pgsql/src/backend/optimizer/plan/Makefile,v 1.6 1998/02/13 03:36:51 vadim Exp $
88
#
99
#-------------------------------------------------------------------------
1010

@@ -15,7 +15,7 @@ INCLUDE_OPT = -I../..
1515

1616
CFLAGS+=$(INCLUDE_OPT)
1717

18-
OBJS = createplan.o initsplan.o planmain.o planner.o setrefs.o
18+
OBJS = createplan.o initsplan.o planmain.o planner.o setrefs.o subselect.o
1919

2020
# not ready yet: predmig.o xfunc.o
2121

src/backend/optimizer/plan/createplan.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.25 1998/02/10 04:01:09 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.26 1998/02/13 03:36:54 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -685,13 +685,11 @@ fix_indxqual_references(Node *clause, Path *index_path)
685685
else if (IsA(clause, Const))
686686
{
687687
return (clause);
688-
#ifdef INDEXSCAN_PATCH
689688
}
690689
else if (IsA(clause, Param))
691690
{
692691
/* Function parameter used as index scan arg. DZ - 27-8-1996 */
693692
return (clause);
694-
#endif
695693
}
696694
else if (is_opclause(clause) &&
697695
is_funcclause((Node *) get_leftop((Expr *) clause)) &&

src/backend/optimizer/plan/planmain.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.18 1998/02/10 04:01:12 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.19 1998/02/13 03:36:57 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -22,7 +22,9 @@
2222
#include "nodes/makefuncs.h"
2323

2424
#include "optimizer/planmain.h"
25+
#include "optimizer/subselect.h"
2526
#include "optimizer/internal.h"
27+
#include "optimizer/prep.h"
2628
#include "optimizer/paths.h"
2729
#include "optimizer/clauses.h"
2830
#include "optimizer/keys.h"
@@ -72,7 +74,18 @@ query_planner(Query *root,
7274
List *var_only_tlist = NIL;
7375
List *level_tlist = NIL;
7476
Plan *subplan = NULL;
75-
77+
78+
if ( PlannerQueryLevel > 1 )
79+
{
80+
/* should copy be made ? */
81+
tlist = (List *) SS_replace_correlation_vars ((Node*)tlist);
82+
qual = (List *) SS_replace_correlation_vars ((Node*)qual);
83+
}
84+
if (root->hasSubLinks)
85+
qual = (List *) SS_process_sublinks ((Node*) qual);
86+
87+
qual = cnfify((Expr *) qual, true);
88+
7689
/*
7790
* A command without a target list or qualification is an error,
7891
* except for "delete foo".
@@ -145,7 +158,7 @@ query_planner(Query *root,
145158
if (constant_qual != NULL)
146159
{
147160
return ((Plan *) make_result(tlist,
148-
(Node *) constant_qual,
161+
(Node *) constant_qual,
149162
(Plan *) scan));
150163
}
151164
else

src/backend/optimizer/plan/planner.c

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.21 1998/01/15 18:59:48 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.22 1998/02/13 03:36:59 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
1414
#include <sys/types.h>
15+
#include <string.h>
1516

1617
#include "postgres.h"
1718

@@ -30,6 +31,7 @@
3031
#include "optimizer/plancat.h"
3132
#include "optimizer/prep.h"
3233
#include "optimizer/planmain.h"
34+
#include "optimizer/subselect.h"
3335
#include "optimizer/paths.h"
3436
#include "optimizer/cost.h"
3537

@@ -56,10 +58,32 @@ extern Plan *make_groupPlan(List **tlist, bool tuplePerGroup,
5658
*
5759
*****************************************************************************/
5860

61+
Plan*
62+
planner(Query *parse)
63+
{
64+
Plan *result_plan;
65+
66+
PlannerQueryLevel = 1;
67+
PlannerVarParam = NULL;
68+
PlannerParamVar = NULL;
69+
PlannerInitPlan = NULL;
70+
PlannerPlanId = 0;
71+
72+
result_plan = union_planner (parse);
73+
74+
Assert (PlannerQueryLevel == 1);
75+
if ( PlannerPlanId > 0 )
76+
{
77+
result_plan->initPlan = PlannerInitPlan;
78+
(void) SS_finalize_plan (result_plan);
79+
}
80+
result_plan->nParamExec = length (PlannerParamVar);
81+
82+
return (result_plan);
83+
}
5984

6085
/*
61-
* planner--
62-
* Main query optimizer routine.
86+
* union_planner--
6387
*
6488
* Invokes the planner on union queries if there are any left,
6589
* recursing if necessary to get them all, then processes normal plans.
@@ -68,14 +92,13 @@ extern Plan *make_groupPlan(List **tlist, bool tuplePerGroup,
6892
*
6993
*/
7094
Plan *
71-
planner(Query *parse)
95+
union_planner(Query *parse)
7296
{
7397
List *tlist = parse->targetList;
7498
List *rangetable = parse->rtable;
7599

76100
Plan *result_plan = (Plan *) NULL;
77101

78-
List *primary_qual;
79102
Index rt_index;
80103

81104

@@ -100,17 +123,25 @@ planner(Query *parse)
100123
}
101124
else
102125
{
126+
List **vpm = NULL;
127+
103128
tlist = preprocess_targetlist(tlist,
104129
parse->commandType,
105130
parse->resultRelation,
106131
parse->rtable);
107-
108-
primary_qual = cnfify((Expr *) parse->qual, true);
109-
132+
if ( parse->rtable != NULL )
133+
{
134+
vpm = (List **) palloc (length (parse->rtable) * sizeof (List*));
135+
memset (vpm, 0, length (parse->rtable) * sizeof (List*));
136+
}
137+
PlannerVarParam = lcons (vpm, PlannerVarParam);
110138
result_plan = query_planner(parse,
111-
parse->commandType,
112-
tlist,
113-
primary_qual);
139+
parse->commandType,
140+
tlist,
141+
(List*) parse->qual);
142+
PlannerVarParam = lnext (PlannerVarParam);
143+
if ( vpm != NULL )
144+
pfree (vpm);
114145
}
115146

116147
/*

src/backend/optimizer/plan/setrefs.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.17 1998/02/10 04:01:13 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.18 1998/02/13 03:37:02 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -405,7 +405,21 @@ replace_clause_joinvar_refs(Expr *clause,
405405
leftvar,
406406
rightvar));
407407
}
408+
else if (is_subplan(clause))
409+
{
410+
((Expr*) clause)->args =
411+
replace_subclause_joinvar_refs(((Expr*) clause)->args,
412+
outer_tlist,
413+
inner_tlist);
414+
((SubPlan*) ((Expr*) clause)->oper)->sublink->oper =
415+
replace_subclause_joinvar_refs(((SubPlan*) ((Expr*) clause)->oper)->sublink->oper,
416+
outer_tlist,
417+
inner_tlist);
418+
return ((List*) clause);
419+
}
408420
/* shouldn't reach here */
421+
elog (ERROR, "replace_clause_joinvar_refs: unsupported clause %d",
422+
nodeTag (clause));
409423
return NULL;
410424
}
411425

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