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

Commitbbd6eb5

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

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
staticboolqual_is_pushdown_safe(Query*subquery,Indexrti,Node*qual,
5959
bool*differentTypes);
60-
staticvoidsubquery_push_qual(Query*subquery,
61-
RangeTblEntry*rte,Indexrti,Node*qual);
60+
staticvoidsubquery_push_qual(Query*subquery,List*rtable,
61+
Indexrti,Node*qual);
6262
staticvoidrecurse_push_qual(Node*setOp,Query*topquery,
63-
RangeTblEntry*rte,Indexrti,Node*qual);
63+
List*rtable,Indexrti,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
staticvoid
783-
subquery_push_qual(Query*subquery,RangeTblEntry*rte,Indexrti,Node*qual)
783+
subquery_push_qual(Query*subquery,List*rtable,Indexrti,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
staticvoid
820821
recurse_push_qual(Node*setOp,Query*topquery,
821-
RangeTblEntry*rte,Indexrti,Node*qual)
822+
List*rtable,Indexrti,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
elseif (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
staticboolis_simple_subquery(Query*subquery);
4747
staticboolhas_nullable_targetlist(Query*subquery);
4848
staticvoidresolvenew_in_jointree(Node*jtnode,intvarno,
49-
RangeTblEntry*rte,List*subtlist);
49+
List*rtable,List*subtlist);
5050
staticreduce_outer_joins_state*reduce_outer_joins_pass1(Node*jtnode);
5151
staticvoidreduce_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
staticvoid
479483
resolvenew_in_jointree(Node*jtnode,intvarno,
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
elseif (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+
AttrNumberattnum;
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
elseif (node&&IsA(node,Var)&&
663663
((Var*)node)->varattno==InvalidAttrNumber)
664664
{
665-
RangeTblEntry*rte;
666-
AttrNumbernfields;
667-
AttrNumbernf;
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-
Oidvartype;
676-
int32vartypmod;
665+
intrtindex= ((Var*)node)->varno;
666+
intsublevels_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)

[8]ページ先頭

©2009-2025 Movatter.jp