]> granicus.if.org Git - postgresql/commitdiff
Don't crash if subquery appears multiple times in jointree. This should
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 27 Jan 2001 04:42:32 +0000 (04:42 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 27 Jan 2001 04:42:32 +0000 (04:42 +0000)
not happen anyway, but let's try not to get completely confused if it does
(due to rewriter bugs or whatever).

src/backend/optimizer/plan/planner.c

index fbbb5aeac9640bea27426090f35db4310ea0cac7..9faf6b95e801f20bad29871349182caf91eefcde 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.100 2001/01/24 19:42:59 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.101 2001/01/27 04:42:32 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -279,7 +279,13 @@ pull_up_subqueries(Query *parse, Node *jtnode)
                        /*
                         * First, recursively pull up the subquery's subqueries,
                         * so that this routine's processing is complete for its
-                        * jointree and rangetable.
+                        * jointree and rangetable.  NB: if the same subquery is
+                        * referenced from multiple jointree items (which can't happen
+                        * normally, but might after rule rewriting), then we will invoke
+                        * this processing multiple times on that subquery.  OK because
+                        * nothing will happen after the first time.  We do have to be
+                        * careful to copy everything we pull up, however, or risk
+                        * having chunks of structure multiply linked.
                         */
                        subquery->jointree = (FromExpr *)
                                pull_up_subqueries(subquery, (Node *) subquery->jointree);
@@ -288,7 +294,8 @@ pull_up_subqueries(Query *parse, Node *jtnode)
                         * no adjustments will be needed in the subquery's rtable).
                         */
                        rtoffset = length(parse->rtable);
-                       parse->rtable = nconc(parse->rtable, subquery->rtable);
+                       parse->rtable = nconc(parse->rtable,
+                                                                 copyObject(subquery->rtable));
                        /*
                         * Make copies of the subquery's jointree and targetlist
                         * with varnos adjusted to match the merged rangetable.