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.
This commit is contained in:
Tom Lane 2004-02-27 21:42:00 +00:00
parent f46a80c362
commit f5d8f0bb19
1 changed files with 8 additions and 3 deletions

View 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);