diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2004-09-17 18:29:24 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2004-09-17 18:29:24 +0000 |
commit | c57bcb7b2c591023ff388aaeb0540536ec929bc4 (patch) | |
tree | 55389b3f403fd187b9cf599f9398fe28ed709079 | |
parent | 1cfe0a407da52a2669a236a17e44a4823b3fa51d (diff) | |
download | postgresql-c57bcb7b2c591023ff388aaeb0540536ec929bc4.tar.gz postgresql-c57bcb7b2c591023ff388aaeb0540536ec929bc4.zip |
Hashed LEFT JOIN would miss outer tuples with no inner match if the join
was large enough to be batched and the tuples fell into a batch where
there were no inner tuples at all. Thanks to Xiaoyu Wang for finding a
test case that exposed this long-standing bug.
-rw-r--r-- | src/backend/executor/nodeHashjoin.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index f1484c4a054..49abeffce6c 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.41 2002/09/02 02:47:02 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.41.2.1 2004/09/17 18:29:24 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -568,12 +568,14 @@ ExecHashJoinNewBatch(HashJoinState *hjstate) } /* - * We can skip over any batches that are empty on either side. Release - * associated temp files right away. + * Normally we can skip over any batches that are empty on either side + * --- but for JOIN_LEFT, can only skip when left side is empty. + * Release associated temp files right away. */ while (newbatch <= nbatch && - (innerBatchSize[newbatch - 1] == 0L || - outerBatchSize[newbatch - 1] == 0L)) + (outerBatchSize[newbatch - 1] == 0L || + (innerBatchSize[newbatch - 1] == 0L && + hjstate->js.jointype != JOIN_LEFT))) { BufFileClose(hashtable->innerBatchFile[newbatch - 1]); hashtable->innerBatchFile[newbatch - 1] = NULL; |