Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit e18e8f8

Browse files
committed
Change expandRTE() and ResolveNew() back to taking just the single
RTE of interest, rather than the whole rangetable list. This makes the API more understandable and avoids duplicate RTE lookups. This patch reverts no-longer-needed portions of my patch of 2004-08-19.
1 parent fb91a83 commit e18e8f8

File tree

11 files changed

+92
-94
lines changed

11 files changed

+92
-94
lines changed

src/backend/optimizer/path/allpaths.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.129 2005/04/28 21:47:13 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.130 2005/06/04 19:19:41 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -58,10 +58,10 @@ static void compare_tlist_datatypes(List *tlist, List *colTypes,
5858
bool *differentTypes);
5959
static bool qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual,
6060
bool *differentTypes);
61-
static void subquery_push_qual(Query *subquery, List *rtable,
62-
Index rti, Node *qual);
61+
static void subquery_push_qual(Query *subquery,
62+
RangeTblEntry *rte, Index rti, Node *qual);
6363
static void recurse_push_qual(Node *setOp, Query *topquery,
64-
List *rtable, Index rti, Node *qual);
64+
RangeTblEntry *rte, Index rti, Node *qual);
6565

6666

6767
/*
@@ -365,7 +365,7 @@ set_subquery_pathlist(Query *root, RelOptInfo *rel,
365365
if (qual_is_pushdown_safe(subquery, rti, clause, differentTypes))
366366
{
367367
/* Push it down */
368-
subquery_push_qual(subquery, root->rtable, rti, clause);
368+
subquery_push_qual(subquery, rte, rti, clause);
369369
}
370370
else
371371
{
@@ -769,13 +769,13 @@ qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual,
769769
* subquery_push_qual - push down a qual that we have determined is safe
770770
*/
771771
static void
772-
subquery_push_qual(Query *subquery, List *rtable, Index rti, Node *qual)
772+
subquery_push_qual(Query *subquery, RangeTblEntry *rte, Index rti, Node *qual)
773773
{
774774
if (subquery->setOperations != NULL)
775775
{
776776
/* Recurse to push it separately to each component query */
777777
recurse_push_qual(subquery->setOperations, subquery,
778-
rtable, rti, qual);
778+
rte, rti, qual);
779779
}
780780
else
781781
{
@@ -789,7 +789,7 @@ subquery_push_qual(Query *subquery, List *rtable, Index rti, Node *qual)
789789
* This step also ensures that when we are pushing into a setop tree,
790790
* each component query gets its own copy of the qual.
791791
*/
792-
qual = ResolveNew(qual, rti, 0, rtable,
792+
qual = ResolveNew(qual, rti, 0, rte,
793793
subquery->targetList,
794794
CMD_SELECT, 0);
795795

@@ -817,7 +817,7 @@ subquery_push_qual(Query *subquery, List *rtable, Index rti, Node *qual)
817817
*/
818818
static void
819819
recurse_push_qual(Node *setOp, Query *topquery,
820-
List *rtable, Index rti, Node *qual)
820+
RangeTblEntry *rte, Index rti, Node *qual)
821821
{
822822
if (IsA(setOp, RangeTblRef))
823823
{
@@ -826,14 +826,14 @@ recurse_push_qual(Node *setOp, Query *topquery,
826826
Query *subquery = subrte->subquery;
827827

828828
Assert(subquery != NULL);
829-
subquery_push_qual(subquery, rtable, rti, qual);
829+
subquery_push_qual(subquery, rte, rti, qual);
830830
}
831831
else if (IsA(setOp, SetOperationStmt))
832832
{
833833
SetOperationStmt *op = (SetOperationStmt *) setOp;
834834

835-
recurse_push_qual(op->larg, topquery, rtable, rti, qual);
836-
recurse_push_qual(op->rarg, topquery, rtable, rti, qual);
835+
recurse_push_qual(op->larg, topquery, rte, rti, qual);
836+
recurse_push_qual(op->rarg, topquery, rte, rti, qual);
837837
}
838838
else
839839
{

src/backend/optimizer/prep/prepjointree.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*
1717
*
1818
* IDENTIFICATION
19-
* $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.27 2005/04/28 21:47:14 tgl Exp $
19+
* $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.28 2005/06/04 19:19:41 tgl Exp $
2020
*
2121
*-------------------------------------------------------------------------
2222
*/
@@ -46,7 +46,7 @@ typedef struct reduce_outer_joins_state
4646
static bool is_simple_subquery(Query *subquery);
4747
static bool has_nullable_targetlist(Query *subquery);
4848
static void resolvenew_in_jointree(Node *jtnode, int varno,
49-
List *rtable, List *subtlist);
49+
RangeTblEntry *rte, List *subtlist);
5050
static reduce_outer_joins_state *reduce_outer_joins_pass1(Node *jtnode);
5151
static void reduce_outer_joins_pass2(Node *jtnode,
5252
reduce_outer_joins_state *state,
@@ -243,18 +243,18 @@ pull_up_subqueries(Query *parse, Node *jtnode, bool below_outer_join)
243243
subtlist = subquery->targetList;
244244
parse->targetList = (List *)
245245
ResolveNew((Node *) parse->targetList,
246-
varno, 0, parse->rtable,
246+
varno, 0, rte,
247247
subtlist, CMD_SELECT, 0);
248248
resolvenew_in_jointree((Node *) parse->jointree, varno,
249-
parse->rtable, subtlist);
249+
rte, subtlist);
250250
Assert(parse->setOperations == NULL);
251251
parse->havingQual =
252252
ResolveNew(parse->havingQual,
253-
varno, 0, parse->rtable,
253+
varno, 0, rte,
254254
subtlist, CMD_SELECT, 0);
255255
parse->in_info_list = (List *)
256256
ResolveNew((Node *) parse->in_info_list,
257-
varno, 0, parse->rtable,
257+
varno, 0, rte,
258258
subtlist, CMD_SELECT, 0);
259259

260260
foreach(rt, parse->rtable)
@@ -264,7 +264,7 @@ pull_up_subqueries(Query *parse, Node *jtnode, bool below_outer_join)
264264
if (otherrte->rtekind == RTE_JOIN)
265265
otherrte->joinaliasvars = (List *)
266266
ResolveNew((Node *) otherrte->joinaliasvars,
267-
varno, 0, parse->rtable,
267+
varno, 0, rte,
268268
subtlist, CMD_SELECT, 0);
269269
}
270270

@@ -492,7 +492,7 @@ has_nullable_targetlist(Query *subquery)
492492
*/
493493
static void
494494
resolvenew_in_jointree(Node *jtnode, int varno,
495-
List *rtable, List *subtlist)
495+
RangeTblEntry *rte, List *subtlist)
496496
{
497497
if (jtnode == NULL)
498498
return;
@@ -506,19 +506,19 @@ resolvenew_in_jointree(Node *jtnode, int varno,
506506
ListCell *l;
507507

508508
foreach(l, f->fromlist)
509-
resolvenew_in_jointree(lfirst(l), varno, rtable, subtlist);
509+
resolvenew_in_jointree(lfirst(l), varno, rte, subtlist);
510510
f->quals = ResolveNew(f->quals,
511-
varno, 0, rtable,
511+
varno, 0, rte,
512512
subtlist, CMD_SELECT, 0);
513513
}
514514
else if (IsA(jtnode, JoinExpr))
515515
{
516516
JoinExpr *j = (JoinExpr *) jtnode;
517517

518-
resolvenew_in_jointree(j->larg, varno, rtable, subtlist);
519-
resolvenew_in_jointree(j->rarg, varno, rtable, subtlist);
518+
resolvenew_in_jointree(j->larg, varno, rte, subtlist);
519+
resolvenew_in_jointree(j->rarg, varno, rte, subtlist);
520520
j->quals = ResolveNew(j->quals,
521-
varno, 0, rtable,
521+
varno, 0, rte,
522522
subtlist, CMD_SELECT, 0);
523523

524524
/*

src/backend/optimizer/util/plancat.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.109 2005/05/30 18:55:49 tgl Exp $
12+
* $PostgreSQL: pgsql/src/backend/optimizer/util/plancat.c,v 1.110 2005/06/04 19:19:42 tgl Exp $
1313
*
1414
*-------------------------------------------------------------------------
1515
*/
@@ -451,7 +451,7 @@ build_physical_tlist(Query *root, RelOptInfo *rel)
451451
break;
452452

453453
case RTE_FUNCTION:
454-
expandRTE(root->rtable, varno, 0, true /* include dropped */,
454+
expandRTE(rte, varno, 0, true /* include dropped */,
455455
NULL, &colvars);
456456
foreach(l, colvars)
457457
{

src/backend/parser/parse_clause.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.140 2005/04/13 16:50:55 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.141 2005/06/04 19:19:42 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -663,7 +663,8 @@ transformFromClauseItem(ParseState *pstate, Node *n, List **containedRels)
663663
elog(ERROR, "unrecognized node type: %d", (int) nodeTag(j->larg));
664664
leftrti = 0; /* keep compiler quiet */
665665
}
666-
expandRTE(pstate->p_rtable, leftrti, 0, false,
666+
rte = rt_fetch(leftrti, pstate->p_rtable);
667+
expandRTE(rte, leftrti, 0, false,
667668
&l_colnames, &l_colvars);
668669

669670
if (IsA(j->rarg, RangeTblRef))
@@ -675,7 +676,8 @@ transformFromClauseItem(ParseState *pstate, Node *n, List **containedRels)
675676
elog(ERROR, "unrecognized node type: %d", (int) nodeTag(j->rarg));
676677
rightrti = 0; /* keep compiler quiet */
677678
}
678-
expandRTE(pstate->p_rtable, rightrti, 0, false,
679+
rte = rt_fetch(rightrti, pstate->p_rtable);
680+
expandRTE(rte, rightrti, 0, false,
679681
&r_colnames, &r_colvars);
680682

681683
/*

src/backend/parser/parse_coerce.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.130 2005/05/30 01:20:49 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.131 2005/06/04 19:19:42 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -695,10 +695,11 @@ coerce_record_to_complex(ParseState *pstate, Node *node,
695695
{
696696
int rtindex = ((Var *) node)->varno;
697697
int sublevels_up = ((Var *) node)->varlevelsup;
698-
List *rtable;
698+
RangeTblEntry *rte;
699699

700-
rtable = GetLevelNRangeTable(pstate, sublevels_up);
701-
expandRTE(rtable, rtindex, sublevels_up, false, NULL, &args);
700+
rte = GetRTEByRangeTablePosn(pstate, rtindex, sublevels_up);
701+
expandRTE(rte, rtindex, sublevels_up, false,
702+
NULL, &args);
702703
}
703704
else
704705
ereport(ERROR,

src/backend/parser/parse_relation.c

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.109 2005/06/03 23:05:28 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.110 2005/06/04 19:19:42 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -445,27 +445,6 @@ GetRTEByRangeTablePosn(ParseState *pstate,
445445
return rt_fetch(varno, pstate->p_rtable);
446446
}
447447

448-
/*
449-
* GetLevelNRangeTable
450-
* Get the rangetable list for the N'th query level up from current.
451-
*/
452-
List *
453-
GetLevelNRangeTable(ParseState *pstate, int sublevels_up)
454-
{
455-
int index = 0;
456-
457-
while (pstate != NULL)
458-
{
459-
if (index == sublevels_up)
460-
return pstate->p_rtable;
461-
index++;
462-
pstate = pstate->parentParseState;
463-
}
464-
465-
elog(ERROR, "rangetable not found (internal error)");
466-
return NIL; /* keep compiler quiet */
467-
}
468-
469448
/*
470449
* scanRTEForColumn
471450
* Search the column names of a single RTE for the given name.
@@ -1202,19 +1181,19 @@ addImplicitRTE(ParseState *pstate, RangeVar *relation)
12021181
* results. If include_dropped is TRUE then empty strings and NULL constants
12031182
* (not Vars!) are returned for dropped columns.
12041183
*
1205-
* The target RTE is the rtindex'th entry of rtable.
1206-
* sublevels_up is the varlevelsup value to use in the created Vars.
1184+
* rtindex and sublevels_up are the varno and varlevelsup values to use
1185+
* in the created Vars. Ordinarily rtindex should match the actual position
1186+
* of the RTE in its rangetable.
12071187
*
12081188
* The output lists go into *colnames and *colvars.
12091189
* If only one of the two kinds of output list is needed, pass NULL for the
12101190
* output pointer for the unwanted one.
12111191
*/
12121192
void
1213-
expandRTE(List *rtable, int rtindex, int sublevels_up,
1193+
expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up,
12141194
bool include_dropped,
12151195
List **colnames, List **colvars)
12161196
{
1217-
RangeTblEntry *rte = rt_fetch(rtindex, rtable);
12181197
int varattno;
12191198

12201199
if (colnames)
@@ -1490,17 +1469,23 @@ expandTupleDesc(TupleDesc tupdesc, Alias *eref,
14901469
* expandRelAttrs -
14911470
* Workhorse for "*" expansion: produce a list of targetentries
14921471
* for the attributes of the rte
1472+
*
1473+
* As with expandRTE, rtindex/sublevels_up determine the varno/varlevelsup
1474+
* fields of the Vars produced. pstate->p_next_resno determines the resnos
1475+
* assigned to the TLEs.
14931476
*/
14941477
List *
1495-
expandRelAttrs(ParseState *pstate, List *rtable, int rtindex, int sublevels_up)
1478+
expandRelAttrs(ParseState *pstate, RangeTblEntry *rte,
1479+
int rtindex, int sublevels_up)
14961480
{
14971481
List *names,
14981482
*vars;
14991483
ListCell *name,
15001484
*var;
15011485
List *te_list = NIL;
15021486

1503-
expandRTE(rtable, rtindex, sublevels_up, false, &names, &vars);
1487+
expandRTE(rte, rtindex, sublevels_up, false,
1488+
&names, &vars);
15041489

15051490
forboth(name, names, var, vars)
15061491
{

src/backend/parser/parse_target.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.134 2005/05/31 01:03:23 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.135 2005/06/04 19:19:42 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -697,7 +697,6 @@ ExpandColumnRefStar(ParseState *pstate, ColumnRef *cref)
697697
RangeTblEntry *rte;
698698
int sublevels_up;
699699
int rtindex;
700-
List *rtable;
701700

702701
switch (numnames)
703702
{
@@ -742,9 +741,8 @@ ExpandColumnRefStar(ParseState *pstate, ColumnRef *cref)
742741
relname));
743742

744743
rtindex = RTERangeTablePosn(pstate, rte, &sublevels_up);
745-
rtable = GetLevelNRangeTable(pstate, sublevels_up);
746744

747-
return expandRelAttrs(pstate, rtable, rtindex, sublevels_up);
745+
return expandRelAttrs(pstate, rte, rtindex, sublevels_up);
748746
}
749747
}
750748

@@ -789,8 +787,7 @@ ExpandAllTables(ParseState *pstate)
789787

790788
found_table = true;
791789
target = list_concat(target,
792-
expandRelAttrs(pstate, pstate->p_rtable,
793-
rtindex, 0));
790+
expandRelAttrs(pstate, rte, rtindex, 0));
794791
}
795792

796793
/* Check for SELECT *; */
@@ -929,8 +926,8 @@ expandRecordVariable(ParseState *pstate, Var *var, int levelsup)
929926
*lvar;
930927
int i;
931928

932-
expandRTE(GetLevelNRangeTable(pstate, netlevelsup),
933-
var->varno, 0, false, &names, &vars);
929+
expandRTE(rte, var->varno, 0, false,
930+
&names, &vars);
934931

935932
tupleDesc = CreateTemplateTupleDesc(list_length(vars), false);
936933
i = 1;

0 commit comments

Comments
 (0)