From 9765c6a9a398deae8ab6fe524db51368d3726f1d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 25 Nov 2003 19:17:16 +0000 Subject: [PATCH] Band-aid solution for problems with SubPlans used in hash join clauses, per report from Andrew Holm-Hansen. The difficulty arises from the fact that the planner allowed a Hash node's hashkeys to share substructure with the parent HashJoin node's hashclauses, plus some rather bizarre choices about who initializes what during executor startup. A cleaner but more invasive solution is to not store hashkeys separately in the plan tree at all, but let the HashJoin node deconstruct hashclauses during executor startup. I plan to fix it that way in HEAD. --- src/backend/executor/nodeHashjoin.c | 4 ++-- src/backend/optimizer/plan/createplan.c | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index 112155bdd37..3d43b7d02b0 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.57 2003/09/25 06:57:59 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.57.2.1 2003/11/25 19:17:16 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -417,7 +417,7 @@ ExecInitHashJoin(HashJoin *node, EState *estate) */ hjstate->hj_InnerHashKeys = (List *) ExecInitExpr((Expr *) hashNode->hashkeys, - innerPlanState(hjstate)); + (PlanState *) hjstate); ((HashState *) innerPlanState(hjstate))->hashkeys = hjstate->hj_InnerHashKeys; diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index e3ad5bc6554..08db46c942a 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.157 2003/08/27 12:44:12 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.157.2.1 2003/11/25 19:17:16 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1093,12 +1093,14 @@ create_hashjoin_plan(Query *root, hashclauses = order_qual_clauses(root, hashclauses); /* - * Extract the inner hash keys (right-hand operands of the - * hashclauses) to put in the Hash node. + * Extract the inner hash keys (right-hand operands of the hashclauses) + * to put in the Hash node. Must do a deep copy in case there are + * subplans in the hash keys. */ innerhashkeys = NIL; foreach(hcl, hashclauses) - innerhashkeys = lappend(innerhashkeys, get_rightop(lfirst(hcl))); + innerhashkeys = lappend(innerhashkeys, + copyObject(get_rightop(lfirst(hcl)))); /* We don't want any excess columns in the hashed tuples */ disuse_physical_tlist(inner_plan, best_path->jpath.innerjoinpath);