From f5d8f0bb19e0d10f3be0a9bec44b097d5d53ffd4 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 27 Feb 2004 21:42:00 +0000
Subject: [PATCH] process_implied_equality must copy the substructure of the
 clauses it is generating, to avoid problems when subselects are involved. 
 Per report from Damon Hart.

---
 src/backend/optimizer/plan/initsplan.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c
index c4412030cc..46fde26345 100644
--- a/src/backend/optimizer/plan/initsplan.c
+++ b/src/backend/optimizer/plan/initsplan.c
@@ -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);
 
-- 
2.24.1