aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/nodeHashjoin.c7
-rw-r--r--src/test/regress/expected/join.out63
-rw-r--r--src/test/regress/sql/join.sql30
3 files changed, 97 insertions, 3 deletions
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c
index 6c3009fba0f..ea0045bc0f3 100644
--- a/src/backend/executor/nodeHashjoin.c
+++ b/src/backend/executor/nodeHashjoin.c
@@ -1511,10 +1511,11 @@ ExecReScanHashJoin(HashJoinState *node)
/*
* Okay to reuse the hash table; needn't rescan inner, either.
*
- * However, if it's a right/right-anti/full join, we'd better
- * reset the inner-tuple match flags contained in the table.
+ * However, if it's a right/right-anti/right-semi/full join, we'd
+ * better reset the inner-tuple match flags contained in the
+ * table.
*/
- if (HJ_FILL_INNER(node))
+ if (HJ_FILL_INNER(node) || node->js.jointype == JOIN_RIGHT_SEMI)
ExecHashTableResetMatchFlags(node->hj_HashTable);
/*
diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out
index ebf2e3f851a..51aeb1dae66 100644
--- a/src/test/regress/expected/join.out
+++ b/src/test/regress/expected/join.out
@@ -3036,6 +3036,69 @@ where not exists (select 1 from tbl_ra t2 where t2.b = t1.a) and t1.b < 2;
reset enable_hashjoin;
reset enable_nestloop;
--
+-- regression test for bug with hash-right-semi join
+--
+create temp table tbl_rs(a int, b int);
+insert into tbl_rs select i, i from generate_series(1,10)i;
+analyze tbl_rs;
+set enable_nestloop to off;
+set enable_hashagg to off;
+-- ensure we get a hash right semi join with SubPlan in hash clauses
+explain (costs off)
+select * from tbl_rs t1
+where (select a from tbl_rs t2
+ where exists (select 1 from
+ (select (b in (select b from tbl_rs t3)) as c from tbl_rs t4 where t4.a = 1) s
+ where c in (select t1.a = 1 from tbl_rs t5 union all select true))
+ order by a limit 1) >= 0;
+ QUERY PLAN
+--------------------------------------------------------------------------------------
+ Seq Scan on tbl_rs t1
+ Filter: ((SubPlan 3) >= 0)
+ SubPlan 3
+ -> Limit
+ InitPlan 2
+ -> Hash Right Semi Join
+ Hash Cond: (((t1.a = 1)) = (ANY (t4.b = (hashed SubPlan 1).col1)))
+ -> Append
+ -> Seq Scan on tbl_rs t5
+ -> Result
+ -> Hash
+ -> Seq Scan on tbl_rs t4
+ Filter: (a = 1)
+ SubPlan 1
+ -> Seq Scan on tbl_rs t3
+ -> Sort
+ Sort Key: t2.a
+ -> Result
+ One-Time Filter: (InitPlan 2).col1
+ -> Seq Scan on tbl_rs t2
+(20 rows)
+
+-- and check we get the expected results
+select * from tbl_rs t1
+where (select a from tbl_rs t2
+ where exists (select 1 from
+ (select (b in (select b from tbl_rs t3)) as c from tbl_rs t4 where t4.a = 1) s
+ where c in (select t1.a = 1 from tbl_rs t5 union all select true))
+ order by a limit 1) >= 0;
+ a | b
+----+----
+ 1 | 1
+ 2 | 2
+ 3 | 3
+ 4 | 4
+ 5 | 5
+ 6 | 6
+ 7 | 7
+ 8 | 8
+ 9 | 9
+ 10 | 10
+(10 rows)
+
+reset enable_nestloop;
+reset enable_hashagg;
+--
-- regression test for bug #13908 (hash join with skew tuples & nbatch increase)
--
set work_mem to '64kB';
diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql
index 1004fc03551..1e9dafca573 100644
--- a/src/test/regress/sql/join.sql
+++ b/src/test/regress/sql/join.sql
@@ -739,6 +739,36 @@ reset enable_hashjoin;
reset enable_nestloop;
--
+-- regression test for bug with hash-right-semi join
+--
+create temp table tbl_rs(a int, b int);
+insert into tbl_rs select i, i from generate_series(1,10)i;
+analyze tbl_rs;
+
+set enable_nestloop to off;
+set enable_hashagg to off;
+
+-- ensure we get a hash right semi join with SubPlan in hash clauses
+explain (costs off)
+select * from tbl_rs t1
+where (select a from tbl_rs t2
+ where exists (select 1 from
+ (select (b in (select b from tbl_rs t3)) as c from tbl_rs t4 where t4.a = 1) s
+ where c in (select t1.a = 1 from tbl_rs t5 union all select true))
+ order by a limit 1) >= 0;
+
+-- and check we get the expected results
+select * from tbl_rs t1
+where (select a from tbl_rs t2
+ where exists (select 1 from
+ (select (b in (select b from tbl_rs t3)) as c from tbl_rs t4 where t4.a = 1) s
+ where c in (select t1.a = 1 from tbl_rs t5 union all select true))
+ order by a limit 1) >= 0;
+
+reset enable_nestloop;
+reset enable_hashagg;
+
+--
-- regression test for bug #13908 (hash join with skew tuples & nbatch increase)
--