From 9fcbe2af11fb966b30117d8ac3c2971d1be14207 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 22 Sep 2004 19:13:52 +0000 Subject: Arrange for hash join to skip scanning the outer relation if it detects that the inner one is completely empty. Per recent discussion. Also some cosmetic cleanups in nearby code. --- src/backend/executor/nodeHashjoin.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'src/backend/executor/nodeHashjoin.c') 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 $ * *------------------------------------------------------------------------- */ @@ -127,6 +127,17 @@ ExecHashJoin(HashJoinState *node) hashNode->hashtable = hashtable; (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; -- cgit v1.2.3