Skip to content
Snippets Groups Projects
Commit 2d83e7c7 authored by Tom Lane's avatar Tom Lane
Browse files

query_tree_mutator should copy RangeTblEntry nodes even when it's not

planning to modify them itself.  Otherwise we end up with shared RTE
substructure, which breaks inheritance_planner because the rte->inh
flag needs to be independent in each copied subquery.  Per bug report
from Chris Piker.
parent ee719299
No related branches found
No related tags found
No related merge requests found
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.155 2003/11/29 19:51:51 pgsql Exp $ * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.156 2003/12/09 01:56:20 tgl Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -2960,36 +2960,31 @@ query_tree_mutator(Query *query, ...@@ -2960,36 +2960,31 @@ query_tree_mutator(Query *query,
RangeTblEntry *rte = (RangeTblEntry *) lfirst(rt); RangeTblEntry *rte = (RangeTblEntry *) lfirst(rt);
RangeTblEntry *newrte; RangeTblEntry *newrte;
FLATCOPY(newrte, rte, RangeTblEntry);
switch (rte->rtekind) switch (rte->rtekind)
{ {
case RTE_RELATION: case RTE_RELATION:
case RTE_SPECIAL: case RTE_SPECIAL:
/* nothing to do, don't bother to make a copy */ /* we don't bother to copy eref, aliases, etc; OK? */
break; break;
case RTE_SUBQUERY: case RTE_SUBQUERY:
if (!(flags & QTW_IGNORE_RT_SUBQUERIES)) if (!(flags & QTW_IGNORE_RT_SUBQUERIES))
{ {
FLATCOPY(newrte, rte, RangeTblEntry);
CHECKFLATCOPY(newrte->subquery, rte->subquery, Query); CHECKFLATCOPY(newrte->subquery, rte->subquery, Query);
MUTATE(newrte->subquery, newrte->subquery, Query *); MUTATE(newrte->subquery, newrte->subquery, Query *);
rte = newrte;
} }
break; break;
case RTE_JOIN: case RTE_JOIN:
if (!(flags & QTW_IGNORE_JOINALIASES)) if (!(flags & QTW_IGNORE_JOINALIASES))
{ {
FLATCOPY(newrte, rte, RangeTblEntry);
MUTATE(newrte->joinaliasvars, rte->joinaliasvars, List *); MUTATE(newrte->joinaliasvars, rte->joinaliasvars, List *);
rte = newrte;
} }
break; break;
case RTE_FUNCTION: case RTE_FUNCTION:
FLATCOPY(newrte, rte, RangeTblEntry);
MUTATE(newrte->funcexpr, rte->funcexpr, Node *); MUTATE(newrte->funcexpr, rte->funcexpr, Node *);
rte = newrte;
break; break;
} }
FastAppend(&newrt, rte); FastAppend(&newrt, newrte);
} }
query->rtable = FastListValue(&newrt); query->rtable = FastListValue(&newrt);
return query; return query;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment