Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit bbd6eb5

Browse files
committed
Repair some issues with column aliases and RowExpr construction in the
presence of dropped columns. Document the already-presumed fact that eref aliases in relation RTEs are supposed to have entries for dropped columns; cause the user alias structs to have such entries too, so that there's always a one-to-one mapping to the underlying physical attnums. Adjust expandRTE() and related code to handle the case where a column that is part of a JOIN has been dropped. Generalize expandRTE()'s API so that it can be used in a couple of places that formerly rolled their own implementation of the same logic. Fix ruleutils.c to suppress display of aliases for columns that were dropped since the rule was made.
1 parent 040450b commit bbd6eb5

File tree

16 files changed

+464
-356
lines changed

16 files changed

+464
-356
lines changed

src/backend/catalog/dependency.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/catalog/dependency.c,v 1.36 2004/05/26 04:41:06 neilc Exp $
11+
* $PostgreSQL: pgsql/src/backend/catalog/dependency.c,v 1.37 2004/08/19 20:57:40 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -970,10 +970,15 @@ find_expr_references_walker(Node *node,
970970
if (var->varno <= 0 || var->varno > list_length(rtable))
971971
elog(ERROR, "invalid varno %d", var->varno);
972972
rte = rt_fetch(var->varno, rtable);
973+
/*
974+
* A whole-row Var references no specific columns, so adds no new
975+
* dependency.
976+
*/
977+
if (var->varattno == InvalidAttrNumber)
978+
return false;
973979
if (rte->rtekind == RTE_RELATION)
974980
{
975981
/* If it's a plain relation, reference this column */
976-
/* NB: this code works for whole-row Var with attno 0, too */
977982
add_object_address(OCLASS_CLASS, rte->relid, var->varattno,
978983
&context->addrs);
979984
}

src/backend/optimizer/path/allpaths.c

Lines changed: 13 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.118 2004/06/05 01:55:04 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.119 2004/08/19 20:57:40 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -57,10 +57,10 @@ static void compare_tlist_datatypes(List *tlist, List *colTypes,
5757
bool *differentTypes);
5858
static bool qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual,
5959
bool *differentTypes);
60-
static void subquery_push_qual(Query *subquery,
61-
RangeTblEntry *rte, Index rti, Node *qual);
60+
static void subquery_push_qual(Query *subquery, List *rtable,
61+
Index rti, Node *qual);
6262
static void recurse_push_qual(Node *setOp, Query *topquery,
63-
RangeTblEntry *rte, Index rti, Node *qual);
63+
List *rtable, Index rti, Node *qual);
6464

6565

6666
/*
@@ -376,7 +376,7 @@ set_subquery_pathlist(Query *root, RelOptInfo *rel,
376376
if (qual_is_pushdown_safe(subquery, rti, clause, differentTypes))
377377
{
378378
/* Push it down */
379-
subquery_push_qual(subquery, rte, rti, clause);
379+
subquery_push_qual(subquery, root->rtable, rti, clause);
380380
}
381381
else
382382
{
@@ -780,12 +780,13 @@ qual_is_pushdown_safe(Query *subquery, Index rti, Node *qual,
780780
* subquery_push_qual - push down a qual that we have determined is safe
781781
*/
782782
static void
783-
subquery_push_qual(Query *subquery, RangeTblEntry *rte, Index rti, Node *qual)
783+
subquery_push_qual(Query *subquery, List *rtable, Index rti, Node *qual)
784784
{
785785
if (subquery->setOperations != NULL)
786786
{
787787
/* Recurse to push it separately to each component query */
788-
recurse_push_qual(subquery->setOperations, subquery, rte, rti, qual);
788+
recurse_push_qual(subquery->setOperations, subquery,
789+
rtable, rti, qual);
789790
}
790791
else
791792
{
@@ -799,7 +800,7 @@ subquery_push_qual(Query *subquery, RangeTblEntry *rte, Index rti, Node *qual)
799800
* This step also ensures that when we are pushing into a setop tree,
800801
* each component query gets its own copy of the qual.
801802
*/
802-
qual = ResolveNew(qual, rti, 0, rte,
803+
qual = ResolveNew(qual, rti, 0, rtable,
803804
subquery->targetList,
804805
CMD_SELECT, 0);
805806
subquery->havingQual = make_and_qual(subquery->havingQual,
@@ -818,7 +819,7 @@ subquery_push_qual(Query *subquery, RangeTblEntry *rte, Index rti, Node *qual)
818819
*/
819820
static void
820821
recurse_push_qual(Node *setOp, Query *topquery,
821-
RangeTblEntry *rte, Index rti, Node *qual)
822+
List *rtable, Index rti, Node *qual)
822823
{
823824
if (IsA(setOp, RangeTblRef))
824825
{
@@ -827,14 +828,14 @@ recurse_push_qual(Node *setOp, Query *topquery,
827828
Query *subquery = subrte->subquery;
828829

829830
Assert(subquery != NULL);
830-
subquery_push_qual(subquery, rte, rti, qual);
831+
subquery_push_qual(subquery, rtable, rti, qual);
831832
}
832833
else if (IsA(setOp, SetOperationStmt))
833834
{
834835
SetOperationStmt *op = (SetOperationStmt *) setOp;
835836

836-
recurse_push_qual(op->larg, topquery, rte, rti, qual);
837-
recurse_push_qual(op->rarg, topquery, rte, rti, qual);
837+
recurse_push_qual(op->larg, topquery, rtable, rti, qual);
838+
recurse_push_qual(op->rarg, topquery, rtable, rti, qual);
838839
}
839840
else
840841
{

src/backend/optimizer/prep/prepjointree.c

Lines changed: 19 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.20 2004/05/30 23:40:29 neilc Exp $
19+
* $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.21 2004/08/19 20:57:40 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-
RangeTblEntry *rte, List *subtlist);
49+
List *rtable, 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,16 +243,19 @@ 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, rte, subtlist, CMD_SELECT, 0);
246+
varno, 0, parse->rtable,
247+
subtlist, CMD_SELECT, 0);
247248
resolvenew_in_jointree((Node *) parse->jointree, varno,
248-
rte, subtlist);
249+
parse->rtable, subtlist);
249250
Assert(parse->setOperations == NULL);
250251
parse->havingQual =
251252
ResolveNew(parse->havingQual,
252-
varno, 0, rte, subtlist, CMD_SELECT, 0);
253+
varno, 0, parse->rtable,
254+
subtlist, CMD_SELECT, 0);
253255
parse->in_info_list = (List *)
254256
ResolveNew((Node *) parse->in_info_list,
255-
varno, 0, rte, subtlist, CMD_SELECT, 0);
257+
varno, 0, parse->rtable,
258+
subtlist, CMD_SELECT, 0);
256259

257260
foreach(rt, parse->rtable)
258261
{
@@ -261,7 +264,8 @@ pull_up_subqueries(Query *parse, Node *jtnode, bool below_outer_join)
261264
if (otherrte->rtekind == RTE_JOIN)
262265
otherrte->joinaliasvars = (List *)
263266
ResolveNew((Node *) otherrte->joinaliasvars,
264-
varno, 0, rte, subtlist, CMD_SELECT, 0);
267+
varno, 0, parse->rtable,
268+
subtlist, CMD_SELECT, 0);
265269
}
266270

267271
/*
@@ -477,7 +481,7 @@ has_nullable_targetlist(Query *subquery)
477481
*/
478482
static void
479483
resolvenew_in_jointree(Node *jtnode, int varno,
480-
RangeTblEntry *rte, List *subtlist)
484+
List *rtable, List *subtlist)
481485
{
482486
if (jtnode == NULL)
483487
return;
@@ -491,18 +495,20 @@ resolvenew_in_jointree(Node *jtnode, int varno,
491495
ListCell *l;
492496

493497
foreach(l, f->fromlist)
494-
resolvenew_in_jointree(lfirst(l), varno, rte, subtlist);
498+
resolvenew_in_jointree(lfirst(l), varno, rtable, subtlist);
495499
f->quals = ResolveNew(f->quals,
496-
varno, 0, rte, subtlist, CMD_SELECT, 0);
500+
varno, 0, rtable,
501+
subtlist, CMD_SELECT, 0);
497502
}
498503
else if (IsA(jtnode, JoinExpr))
499504
{
500505
JoinExpr *j = (JoinExpr *) jtnode;
501506

502-
resolvenew_in_jointree(j->larg, varno, rte, subtlist);
503-
resolvenew_in_jointree(j->rarg, varno, rte, subtlist);
507+
resolvenew_in_jointree(j->larg, varno, rtable, subtlist);
508+
resolvenew_in_jointree(j->rarg, varno, rtable, subtlist);
504509
j->quals = ResolveNew(j->quals,
505-
varno, 0, rte, subtlist, CMD_SELECT, 0);
510+
varno, 0, rtable,
511+
subtlist, CMD_SELECT, 0);
506512

507513
/*
508514
* We don't bother to update the colvars list, since it won't be

src/backend/optimizer/util/var.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/optimizer/util/var.c,v 1.59 2004/06/01 04:47:46 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/optimizer/util/var.c,v 1.60 2004/08/19 20:57:40 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -515,11 +515,19 @@ flatten_join_alias_vars_mutator(Node *node,
515515
/* Must expand whole-row reference */
516516
RowExpr *rowexpr;
517517
List *fields = NIL;
518+
AttrNumber attnum;
518519
ListCell *l;
519520

521+
attnum = 0;
520522
foreach(l, rte->joinaliasvars)
521523
{
522524
newvar = (Node *) lfirst(l);
525+
attnum++;
526+
/* Ignore dropped columns */
527+
if (get_rte_attribute_is_dropped(context->root->rtable,
528+
var->varno,
529+
attnum))
530+
continue;
523531
/*
524532
* If we are expanding an alias carried down from an upper
525533
* query, must adjust its varlevelsup fields.

src/backend/parser/parse_clause.c

Lines changed: 5 additions & 5 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.133 2004/06/16 01:26:44 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/parser/parse_clause.c,v 1.134 2004/08/19 20:57:40 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -655,8 +655,8 @@ transformFromClauseItem(ParseState *pstate, Node *n, List **containedRels)
655655
elog(ERROR, "unrecognized node type: %d", (int) nodeTag(j->larg));
656656
leftrti = 0; /* keep compiler quiet */
657657
}
658-
rte = rt_fetch(leftrti, pstate->p_rtable);
659-
expandRTE(pstate, rte, &l_colnames, &l_colvars);
658+
expandRTE(pstate->p_rtable, leftrti, 0, false,
659+
&l_colnames, &l_colvars);
660660

661661
if (IsA(j->rarg, RangeTblRef))
662662
rightrti = ((RangeTblRef *) j->rarg)->rtindex;
@@ -667,8 +667,8 @@ transformFromClauseItem(ParseState *pstate, Node *n, List **containedRels)
667667
elog(ERROR, "unrecognized node type: %d", (int) nodeTag(j->rarg));
668668
rightrti = 0; /* keep compiler quiet */
669669
}
670-
rte = rt_fetch(rightrti, pstate->p_rtable);
671-
expandRTE(pstate, rte, &r_colnames, &r_colvars);
670+
expandRTE(pstate->p_rtable, rightrti, 0, false,
671+
&r_colnames, &r_colvars);
672672

673673
/*
674674
* Natural join does not explicitly specify columns; must generate

src/backend/parser/parse_coerce.c

Lines changed: 6 additions & 23 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.120 2004/08/17 18:47:08 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.121 2004/08/19 20:57:40 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -662,29 +662,12 @@ coerce_record_to_complex(ParseState *pstate, Node *node,
662662
else if (node && IsA(node, Var) &&
663663
((Var *) node)->varattno == InvalidAttrNumber)
664664
{
665-
RangeTblEntry *rte;
666-
AttrNumber nfields;
667-
AttrNumber nf;
668-
669-
rte = GetRTEByRangeTablePosn(pstate,
670-
((Var *) node)->varno,
671-
((Var *) node)->varlevelsup);
672-
nfields = list_length(rte->eref->colnames);
673-
for (nf = 1; nf <= nfields; nf++)
674-
{
675-
Oid vartype;
676-
int32 vartypmod;
665+
int rtindex = ((Var *) node)->varno;
666+
int sublevels_up = ((Var *) node)->varlevelsup;
667+
List *rtable;
677668

678-
if (get_rte_attribute_is_dropped(rte, nf))
679-
continue;
680-
get_rte_attribute_type(rte, nf, &vartype, &vartypmod);
681-
args = lappend(args,
682-
makeVar(((Var *) node)->varno,
683-
nf,
684-
vartype,
685-
vartypmod,
686-
((Var *) node)->varlevelsup));
687-
}
669+
rtable = GetLevelNRangeTable(pstate, sublevels_up);
670+
expandRTE(rtable, rtindex, sublevels_up, false, NULL, &args);
688671
}
689672
else
690673
ereport(ERROR,

0 commit comments

Comments
 (0)