From 3991a13d4d48e8ef6c00c0b48909f78858005967 Mon Sep 17 00:00:00 2001 From: Kenan Yao Date: Mon, 14 Jan 2019 21:29:31 +0800 Subject: [PATCH] executor: reset hasMatch flag for each outer row in merge join (#9046) --- executor/merge_join.go | 1 + executor/merge_join_test.go | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/executor/merge_join.go b/executor/merge_join.go index 46bf9bf0b5e53..a02f2684c1d26 100644 --- a/executor/merge_join.go +++ b/executor/merge_join.go @@ -330,6 +330,7 @@ func (e *MergeJoinExec) joinToChunk(ctx context.Context, chk *chunk.Chunk) (hasM e.joiner.onMissMatch(e.outerTable.row, chk) } e.outerTable.row = e.outerTable.iter.Next() + e.outerTable.hasMatch = false e.innerIter4Row.Begin() } diff --git a/executor/merge_join_test.go b/executor/merge_join_test.go index fce712be0dbc1..30a7fdc93f382 100644 --- a/executor/merge_join_test.go +++ b/executor/merge_join_test.go @@ -349,6 +349,27 @@ func (s *testSuite) TestMergeJoin(c *C) { "2 1", "2 2", )) + + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists s") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values(1,1),(1,2)") + tk.MustExec("create table s(a int, b int)") + tk.MustExec("insert into s values(1,1)") + tk.MustQuery("explain select /*+ TIDB_SMJ(t, s) */ a in (select a from s where s.b >= t.b) from t").Check(testkit.Rows( + "Projection_7 10000.00 root 6_aux_0", + "└─MergeJoin_8 10000.00 root left outer semi join, left key:test.t.a, right key:test.s.a, other cond:ge(test.s.b, test.t.b)", + " ├─Sort_12 10000.00 root test.t.a:asc", + " │ └─TableReader_11 10000.00 root data:TableScan_10", + " │ └─TableScan_10 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo", + " └─Sort_16 10000.00 root test.s.a:asc", + " └─TableReader_15 10000.00 root data:TableScan_14", + " └─TableScan_14 10000.00 cop table:s, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("select /*+ TIDB_SMJ(t, s) */ a in (select a from s where s.b >= t.b) from t").Check(testkit.Rows( + "1", + "0", + )) } func (s *testSuite) Test3WaysMergeJoin(c *C) {