query_tree_mutator should copy RangeTblEntry nodes even when it's not
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 9 Dec 2003 01:56:41 +0000 (01:56 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 9 Dec 2003 01:56:41 +0000 (01:56 +0000)
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.

src/backend/optimizer/util/clauses.c

index 426a10e754be33f6843196d71dff759686ee26c2..16c311a7e296b7ccda3fc0c290578475f29a6cb3 100644 (file)
@@ -2960,36 +2960,31 @@ query_tree_mutator(Query *query,
                RangeTblEntry *rte = (RangeTblEntry *) lfirst(rt);
                RangeTblEntry *newrte;
 
+               FLATCOPY(newrte, rte, RangeTblEntry);
                switch (rte->rtekind)
                {
                        case RTE_RELATION:
                        case RTE_SPECIAL:
-                               /* nothing to do, don't bother to make a copy */
+                               /* we don't bother to copy eref, aliases, etc; OK? */
                                break;
                        case RTE_SUBQUERY:
                                if (!(flags & QTW_IGNORE_RT_SUBQUERIES))
                                {
-                                       FLATCOPY(newrte, rte, RangeTblEntry);
                                        CHECKFLATCOPY(newrte->subquery, rte->subquery, Query);
                                        MUTATE(newrte->subquery, newrte->subquery, Query *);
-                                       rte = newrte;
                                }
                                break;
                        case RTE_JOIN:
                                if (!(flags & QTW_IGNORE_JOINALIASES))
                                {
-                                       FLATCOPY(newrte, rte, RangeTblEntry);
                                        MUTATE(newrte->joinaliasvars, rte->joinaliasvars, List *);
-                                       rte = newrte;
                                }
                                break;
                        case RTE_FUNCTION:
-                               FLATCOPY(newrte, rte, RangeTblEntry);
                                MUTATE(newrte->funcexpr, rte->funcexpr, Node *);
-                               rte = newrte;
                                break;
                }
-               FastAppend(&newrt, rte);
+               FastAppend(&newrt, newrte);
        }
        query->rtable = FastListValue(&newrt);
        return query;