aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-09-17 18:29:24 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-09-17 18:29:24 +0000
commitc57bcb7b2c591023ff388aaeb0540536ec929bc4 (patch)
tree55389b3f403fd187b9cf599f9398fe28ed709079
parent1cfe0a407da52a2669a236a17e44a4823b3fa51d (diff)
downloadpostgresql-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.c12
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;