aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/executor/nodeHash.c3
-rw-r--r--src/backend/executor/nodeHashjoin.c39
-rw-r--r--src/backend/nodes/copyfuncs.c3
-rw-r--r--src/backend/nodes/outfuncs.c4
-rw-r--r--src/backend/optimizer/plan/createplan.c18
-rw-r--r--src/backend/optimizer/plan/setrefs.c20
-rw-r--r--src/backend/optimizer/plan/subselect.c6
7 files changed, 29 insertions, 64 deletions
diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c
index b925517d7b1..6b13dab7645 100644
--- a/src/backend/executor/nodeHash.c
+++ b/src/backend/executor/nodeHash.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/nodeHash.c,v 1.79 2003/08/04 02:39:59 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/nodeHash.c,v 1.80 2003/11/25 21:00:52 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -113,6 +113,7 @@ ExecInitHash(Hash *node, EState *estate)
hashstate->ps.plan = (Plan *) node;
hashstate->ps.state = estate;
hashstate->hashtable = NULL;
+ hashstate->hashkeys = NIL; /* will be set by parent HashJoin */
/*
* Miscellaneous initialization
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c
index 112155bdd37..be0543ac613 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.58 2003/11/25 21:00:52 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -308,7 +308,8 @@ ExecInitHashJoin(HashJoin *node, EState *estate)
HashJoinState *hjstate;
Plan *outerNode;
Hash *hashNode;
- List *hclauses;
+ List *lclauses;
+ List *rclauses;
List *hoperators;
List *hcl;
@@ -410,31 +411,31 @@ ExecInitHashJoin(HashJoin *node, EState *estate)
hjstate->hj_CurTuple = (HashJoinTuple) NULL;
/*
- * The planner already made a list of the inner hashkeys for us, but
- * we also need a list of the outer hashkeys, as well as a list of the
- * hash operator OIDs. Both lists of exprs must then be prepared for
- * execution.
+ * Deconstruct the hash clauses into outer and inner argument values,
+ * so that we can evaluate those subexpressions separately. Also make
+ * a list of the hash operator OIDs, in preparation for looking up the
+ * hash functions to use.
*/
- hjstate->hj_InnerHashKeys = (List *)
- ExecInitExpr((Expr *) hashNode->hashkeys,
- innerPlanState(hjstate));
- ((HashState *) innerPlanState(hjstate))->hashkeys =
- hjstate->hj_InnerHashKeys;
-
- hclauses = NIL;
+ lclauses = NIL;
+ rclauses = NIL;
hoperators = NIL;
- foreach(hcl, node->hashclauses)
+ foreach(hcl, hjstate->hashclauses)
{
- OpExpr *hclause = (OpExpr *) lfirst(hcl);
+ FuncExprState *fstate = (FuncExprState *) lfirst(hcl);
+ OpExpr *hclause;
+ Assert(IsA(fstate, FuncExprState));
+ hclause = (OpExpr *) fstate->xprstate.expr;
Assert(IsA(hclause, OpExpr));
- hclauses = lappend(hclauses, get_leftop((Expr *) hclause));
+ lclauses = lappend(lclauses, lfirst(fstate->args));
+ rclauses = lappend(rclauses, lsecond(fstate->args));
hoperators = lappendo(hoperators, hclause->opno);
}
- hjstate->hj_OuterHashKeys = (List *)
- ExecInitExpr((Expr *) hclauses,
- (PlanState *) hjstate);
+ hjstate->hj_OuterHashKeys = lclauses;
+ hjstate->hj_InnerHashKeys = rclauses;
hjstate->hj_HashOperators = hoperators;
+ /* child Hash node needs to evaluate inner hash keys, too */
+ ((HashState *) innerPlanState(hjstate))->hashkeys = rclauses;
hjstate->js.ps.ps_OuterTupleSlot = NULL;
hjstate->js.ps.ps_TupFromTlist = false;
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 6cf8450567a..54dc63654eb 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -15,7 +15,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.267 2003/11/12 21:15:52 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.268 2003/11/25 21:00:53 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -551,7 +551,6 @@ _copyHash(Hash *from)
/*
* copy remainder of node
*/
- COPY_NODE_FIELD(hashkeys);
return newnode;
}
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index cb875bd6769..b9dc382484e 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.220 2003/11/12 21:15:52 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.221 2003/11/25 21:00:53 tgl Exp $
*
* NOTES
* Every node type that can appear in stored rules' parsetrees *must*
@@ -531,8 +531,6 @@ _outHash(StringInfo str, Hash *node)
WRITE_NODE_TYPE("HASH");
_outPlanInfo(str, (Plan *) node);
-
- WRITE_NODE_FIELD(hashkeys);
}
/*****************************************************************************
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index a5efcb339e0..c455946ae38 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.159 2003/11/12 21:15:53 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.160 2003/11/25 21:00:53 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -97,7 +97,7 @@ static HashJoin *make_hashjoin(List *tlist,
List *hashclauses,
Plan *lefttree, Plan *righttree,
JoinType jointype);
-static Hash *make_hash(List *tlist, List *hashkeys, Plan *lefttree);
+static Hash *make_hash(List *tlist, Plan *lefttree);
static MergeJoin *make_mergejoin(List *tlist,
List *joinclauses, List *otherclauses,
List *mergeclauses,
@@ -1067,8 +1067,6 @@ create_hashjoin_plan(Query *root,
List *hashclauses;
HashJoin *join_plan;
Hash *hash_plan;
- List *innerhashkeys;
- List *hcl;
/* Get the join qual clauses (in plain expression form) */
if (IS_OUTER_JOIN(best_path->jpath.jointype))
@@ -1102,14 +1100,6 @@ create_hashjoin_plan(Query *root,
otherclauses = order_qual_clauses(root, otherclauses);
hashclauses = order_qual_clauses(root, hashclauses);
- /*
- * Extract the inner hash keys (right-hand operands of the
- * hashclauses) to put in the Hash node.
- */
- innerhashkeys = NIL;
- foreach(hcl, hashclauses)
- innerhashkeys = lappend(innerhashkeys, get_rightop(lfirst(hcl)));
-
/* We don't want any excess columns in the hashed tuples */
disuse_physical_tlist(inner_plan, best_path->jpath.innerjoinpath);
@@ -1117,7 +1107,6 @@ create_hashjoin_plan(Query *root,
* Build the hash node and hash join node.
*/
hash_plan = make_hash(inner_plan->targetlist,
- innerhashkeys,
inner_plan);
join_plan = make_hashjoin(tlist,
joinclauses,
@@ -1728,7 +1717,7 @@ make_hashjoin(List *tlist,
}
static Hash *
-make_hash(List *tlist, List *hashkeys, Plan *lefttree)
+make_hash(List *tlist, Plan *lefttree)
{
Hash *node = makeNode(Hash);
Plan *plan = &node->plan;
@@ -1744,7 +1733,6 @@ make_hash(List *tlist, List *hashkeys, Plan *lefttree)
plan->qual = NIL;
plan->lefttree = lefttree;
plan->righttree = NULL;
- node->hashkeys = hashkeys;
return node;
}
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c
index ec21c1a8d3b..2952e8f0773 100644
--- a/src/backend/optimizer/plan/setrefs.c
+++ b/src/backend/optimizer/plan/setrefs.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.97 2003/08/08 21:41:50 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.98 2003/11/25 21:00:54 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -167,24 +167,6 @@ set_plan_references(Plan *plan, List *rtable)
(Node *) ((HashJoin *) plan)->hashclauses);
break;
case T_Hash:
-
- /*
- * Hash does not evaluate its targetlist or quals, so don't
- * touch those (see comments below). But we do need to fix
- * its hashkeys. The hashkeys are a little bizarre because
- * they need to match the hashclauses of the parent HashJoin
- * node, so we use join_references to fix them.
- */
- ((Hash *) plan)->hashkeys =
- join_references(((Hash *) plan)->hashkeys,
- rtable,
- NIL,
- plan->lefttree->targetlist,
- (Index) 0,
- targetlist_has_non_vars(plan->lefttree->targetlist));
- fix_expr_references(plan,
- (Node *) ((Hash *) plan)->hashkeys);
- break;
case T_Material:
case T_Sort:
case T_Unique:
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index 11612f408c9..dab4cf3233a 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/subselect.c,v 1.83 2003/10/18 16:52:15 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/subselect.c,v 1.84 2003/11/25 21:00:54 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1013,10 +1013,6 @@ finalize_plan(Plan *plan, List *rtable,
break;
case T_Hash:
- finalize_primnode((Node *) ((Hash *) plan)->hashkeys,
- &context);
- break;
-
case T_Agg:
case T_SeqScan:
case T_Material: