|
8 | 8 | * |
9 | 9 | * |
10 | 10 | * IDENTIFICATION |
11 | | - * $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.57 2003/09/2506:57:59 petere Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.58 2003/11/2521:00:52 tgl Exp $ |
12 | 12 | * |
13 | 13 | *------------------------------------------------------------------------- |
14 | 14 | */ |
@@ -308,7 +308,8 @@ ExecInitHashJoin(HashJoin *node, EState *estate) |
308 | 308 | HashJoinState*hjstate; |
309 | 309 | Plan*outerNode; |
310 | 310 | Hash*hashNode; |
311 | | -List*hclauses; |
| 311 | +List*lclauses; |
| 312 | +List*rclauses; |
312 | 313 | List*hoperators; |
313 | 314 | List*hcl; |
314 | 315 |
|
@@ -410,31 +411,31 @@ ExecInitHashJoin(HashJoin *node, EState *estate) |
410 | 411 | hjstate->hj_CurTuple= (HashJoinTuple)NULL; |
411 | 412 |
|
412 | 413 | /* |
413 | | - *The planner already made a list of theinnerhashkeys for us, but |
414 | | - *we also need a list of the outer hashkeys, as well as a list of the |
415 | | - * hash operator OIDs.Both lists of exprs must then be prepared for |
416 | | - *execution. |
| 414 | + *Deconstruct the hash clauses into outer andinnerargument values, |
| 415 | + *so that we can evaluate those subexpressions separately. Also make |
| 416 | + *a list of thehash operator OIDs, in preparation for looking up the |
| 417 | + *hash functions to use. |
417 | 418 | */ |
418 | | -hjstate->hj_InnerHashKeys= (List*) |
419 | | -ExecInitExpr((Expr*)hashNode->hashkeys, |
420 | | -innerPlanState(hjstate)); |
421 | | -((HashState*)innerPlanState(hjstate))->hashkeys= |
422 | | -hjstate->hj_InnerHashKeys; |
423 | | - |
424 | | -hclauses=NIL; |
| 419 | +lclauses=NIL; |
| 420 | +rclauses=NIL; |
425 | 421 | hoperators=NIL; |
426 | | -foreach(hcl,node->hashclauses) |
| 422 | +foreach(hcl,hjstate->hashclauses) |
427 | 423 | { |
428 | | -OpExpr*hclause= (OpExpr*)lfirst(hcl); |
| 424 | +FuncExprState*fstate= (FuncExprState*)lfirst(hcl); |
| 425 | +OpExpr*hclause; |
429 | 426 |
|
| 427 | +Assert(IsA(fstate,FuncExprState)); |
| 428 | +hclause= (OpExpr*)fstate->xprstate.expr; |
430 | 429 | Assert(IsA(hclause,OpExpr)); |
431 | | -hclauses=lappend(hclauses,get_leftop((Expr*)hclause)); |
| 430 | +lclauses=lappend(lclauses,lfirst(fstate->args)); |
| 431 | +rclauses=lappend(rclauses,lsecond(fstate->args)); |
432 | 432 | hoperators=lappendo(hoperators,hclause->opno); |
433 | 433 | } |
434 | | -hjstate->hj_OuterHashKeys= (List*) |
435 | | -ExecInitExpr((Expr*)hclauses, |
436 | | - (PlanState*)hjstate); |
| 434 | +hjstate->hj_OuterHashKeys=lclauses; |
| 435 | +hjstate->hj_InnerHashKeys=rclauses; |
437 | 436 | hjstate->hj_HashOperators=hoperators; |
| 437 | +/* child Hash node needs to evaluate inner hash keys, too */ |
| 438 | +((HashState*)innerPlanState(hjstate))->hashkeys=rclauses; |
438 | 439 |
|
439 | 440 | hjstate->js.ps.ps_OuterTupleSlot=NULL; |
440 | 441 | hjstate->js.ps.ps_TupFromTlist= false; |
|