mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
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.
This commit is contained in:
parent
054b78ba38
commit
a5713ec427
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/executor/nodeHashjoin.c,v 1.64 2004/08/29 05:06:42 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/executor/nodeHashjoin.c,v 1.65 2004/09/17 18:28:53 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -603,12 +603,14 @@ ExecHashJoinNewBatch(HashJoinState *hjstate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can skip over any batches that are empty on either side. Release
|
* Normally we can skip over any batches that are empty on either side
|
||||||
* associated temp files right away.
|
* --- but for JOIN_LEFT, can only skip when left side is empty.
|
||||||
|
* Release associated temp files right away.
|
||||||
*/
|
*/
|
||||||
while (newbatch <= nbatch &&
|
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]);
|
BufFileClose(hashtable->innerBatchFile[newbatch - 1]);
|
||||||
hashtable->innerBatchFile[newbatch - 1] = NULL;
|
hashtable->innerBatchFile[newbatch - 1] = NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user