process_implied_equality must copy the substructure of the clauses it
authorTom Lane
Fri, 27 Feb 2004 21:42:00 +0000 (21:42 +0000)
committerTom Lane
Fri, 27 Feb 2004 21:42:00 +0000 (21:42 +0000)
is generating, to avoid problems when subselects are involved.  Per
report from Damon Hart.

src/backend/optimizer/plan/initsplan.c

index c4412030cc0e8756ebdb1e2c6705b111590e0dd1..46fde263456e935f871f8af7de89dc3251e0dbbc 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/optimizer/plan/initsplan.c,v 1.97 2004/01/05 05:07:35 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/optimizer/plan/initsplan.c,v 1.98 2004/02/27 21:42:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -756,11 +756,16 @@ process_implied_equality(Query *root,
                 errmsg("equality operator for types %s and %s should be merge-joinable, but isn't",
                        format_type_be(ltype), format_type_be(rtype))));
 
+   /*
+    * Now we can build the new clause.  Copy to ensure it shares no
+    * substructure with original (this is necessary in case there are
+    * subselects in there...)
+    */
    clause = make_opclause(oprid(eq_operator),  /* opno */
                           BOOLOID,     /* opresulttype */
                           false,       /* opretset */
-                          (Expr *) item1,
-                          (Expr *) item2);
+                          (Expr *) copyObject(item1),
+                          (Expr *) copyObject(item2));
 
    ReleaseSysCache(eq_operator);