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:
parent
f46a80c362
commit
f5d8f0bb19
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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",
|
errmsg("equality operator for types %s and %s should be merge-joinable, but isn't",
|
||||||
format_type_be(ltype), format_type_be(rtype))));
|
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 */
|
clause = make_opclause(oprid(eq_operator), /* opno */
|
||||||
BOOLOID, /* opresulttype */
|
BOOLOID, /* opresulttype */
|
||||||
false, /* opretset */
|
false, /* opretset */
|
||||||
(Expr *) item1,
|
(Expr *) copyObject(item1),
|
||||||
(Expr *) item2);
|
(Expr *) copyObject(item2));
|
||||||
|
|
||||||
ReleaseSysCache(eq_operator);
|
ReleaseSysCache(eq_operator);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user