]> granicus.if.org Git - postgresql/commitdiff
Band-aid solution for problems with SubPlans used in hash join clauses,
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 25 Nov 2003 19:17:16 +0000 (19:17 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 25 Nov 2003 19:17:16 +0000 (19:17 +0000)
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
src/backend/optimizer/plan/createplan.c

index 112155bdd376c77f79f07f6d63236876c45eb3ce..3d43b7d02b066eecfe298357787e453fe4b65f7e 100644 (file)
@@ -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;
 
index e3ad5bc65544a19957f36fbedca23dfacc9ed8e1..08db46c942ac242c771d94251c55923bc63646b7 100644 (file)
@@ -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);