diff options
Diffstat (limited to 'src/backend/executor/nodeHashjoin.c')
-rw-r--r-- | src/backend/executor/nodeHashjoin.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index 53215be6e91..294f481cdf5 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeHashjoin.c,v 1.65 2004/09/17 18:28:53 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeHashjoin.c,v 1.66 2004/09/22 19:13:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -128,6 +128,17 @@ ExecHashJoin(HashJoinState *node) (void) ExecProcNode((PlanState *) hashNode); /* + * If the inner relation is completely empty, and we're not doing + * an outer join, we can quit without scanning the outer relation. + */ + if (!hashtable->hashNonEmpty && node->js.jointype != JOIN_LEFT) + { + ExecHashTableDestroy(hashtable); + node->hj_HashTable = NULL; + return NULL; + } + + /* * Open temp files for outer batches, if needed. Note that file * buffers are palloc'd in regular executor context. */ @@ -138,10 +149,8 @@ ExecHashJoin(HashJoinState *node) } /* - * Now get an outer tuple and probe into the hash table for matches + * run the hash join process */ - outerTupleSlot = node->js.ps.ps_OuterTupleSlot; - for (;;) { /* @@ -226,7 +235,7 @@ ExecHashJoin(HashJoinState *node) * Only the joinquals determine MatchedOuter status, but all * quals must pass to actually return the tuple. */ - if (ExecQual(joinqual, econtext, false)) + if (joinqual == NIL || ExecQual(joinqual, econtext, false)) { node->hj_MatchedOuter = true; |