From a1615de1cf96227211d8d63d0a01da42f50c26bd Mon Sep 17 00:00:00 2001 From: Reminiscent Date: Mon, 14 Dec 2020 15:09:03 +0800 Subject: [PATCH 1/3] planner: fix the fail when we compare multi fields in subquery --- planner/core/expression_rewriter.go | 2 ++ planner/core/expression_rewriter_test.go | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index d61eb5344e985..4d226b1f50223 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -530,6 +530,7 @@ func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, v *ast. er.handleEQAll(lexpr, rexpr, np) } else { // `a = any(subq)` will be rewriten as `a in (subq)`. + er.asScalar = true er.buildSemiApplyFromEqualSubq(np, lexpr, rexpr, false) if er.err != nil { return v, true @@ -538,6 +539,7 @@ func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, v *ast. } else if v.Op == opcode.NE { if v.All { // `a != all(subq)` will be rewriten as `a not in (subq)`. + er.asScalar = true er.buildSemiApplyFromEqualSubq(np, lexpr, rexpr, true) if er.err != nil { return v, true diff --git a/planner/core/expression_rewriter_test.go b/planner/core/expression_rewriter_test.go index 2f2801697fe0f..815af80592165 100644 --- a/planner/core/expression_rewriter_test.go +++ b/planner/core/expression_rewriter_test.go @@ -343,3 +343,23 @@ func (s *testExpressionRewriterSuite) TestIssue17652(c *C) { tk.MustQuery("select ifnull(max(x), 0) from t").Check( testkit.Rows("9999999703771440633")) } + +func (s *testExpressionRewriterSuite) TestCompareMultiFieldsInSubquery(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + tk.MustExec("use test;") + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("CREATE TABLE t1(c1 int, c2 int);") + tk.MustExec("CREATE TABLE t2(c1 int, c2 int);") + tk.MustExec("INSERT INTO t1 VALUES (0, 0), (NULL, NULL);") + tk.MustExec("INSERT INTO t2 VALUES (0, 0), (NULL, NULL);") + // issue #13551 and #21674 + tk.MustQuery("SELECT * FROM t2 WHERE (SELECT c1, c2 FROM t2 LIMIT 1) = ANY (SELECT c1, c2 FROM t1);").Check(testkit.Rows("0 0", " ")) + tk.MustQuery("SELECT * FROM t2 WHERE (SELECT c1, c2 FROM t2 order by c1 LIMIT 1) = ANY (SELECT c1, c2 FROM t1);").Check(testkit.Rows()) +} From e6601bac787b0ee4dac35166cc1b757ba0bd79b0 Mon Sep 17 00:00:00 2001 From: Reminiscent Date: Mon, 14 Dec 2020 15:11:32 +0800 Subject: [PATCH 2/3] add more test cases --- planner/core/expression_rewriter_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/planner/core/expression_rewriter_test.go b/planner/core/expression_rewriter_test.go index 815af80592165..6ce933aea5df0 100644 --- a/planner/core/expression_rewriter_test.go +++ b/planner/core/expression_rewriter_test.go @@ -361,5 +361,6 @@ func (s *testExpressionRewriterSuite) TestCompareMultiFieldsInSubquery(c *C) { tk.MustExec("INSERT INTO t2 VALUES (0, 0), (NULL, NULL);") // issue #13551 and #21674 tk.MustQuery("SELECT * FROM t2 WHERE (SELECT c1, c2 FROM t2 LIMIT 1) = ANY (SELECT c1, c2 FROM t1);").Check(testkit.Rows("0 0", " ")) + tk.MustQuery("SELECT * FROM t2 WHERE (SELECT c1 FROM t2 LIMIT 1) = ANY (SELECT c1 FROM t1);").Check(testkit.Rows("0 0", " ")) tk.MustQuery("SELECT * FROM t2 WHERE (SELECT c1, c2 FROM t2 order by c1 LIMIT 1) = ANY (SELECT c1, c2 FROM t1);").Check(testkit.Rows()) } From 0cb92155532d1ea1f7c9f081d9fcb115b8897ad1 Mon Sep 17 00:00:00 2001 From: Reminiscent Date: Tue, 15 Dec 2020 14:22:21 +0800 Subject: [PATCH 3/3] add more test cases --- planner/core/expression_rewriter_test.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/planner/core/expression_rewriter_test.go b/planner/core/expression_rewriter_test.go index 6ce933aea5df0..874aba58f7686 100644 --- a/planner/core/expression_rewriter_test.go +++ b/planner/core/expression_rewriter_test.go @@ -354,13 +354,26 @@ func (s *testExpressionRewriterSuite) TestCompareMultiFieldsInSubquery(c *C) { store.Close() }() tk.MustExec("use test;") - tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("drop table if exists t1, t2, t3, t4;") tk.MustExec("CREATE TABLE t1(c1 int, c2 int);") tk.MustExec("CREATE TABLE t2(c1 int, c2 int);") + tk.MustExec("CREATE TABLE t3(c1 int, c2 int);") + tk.MustExec("CREATE TABLE t4(c1 int, c2 int);") tk.MustExec("INSERT INTO t1 VALUES (0, 0), (NULL, NULL);") tk.MustExec("INSERT INTO t2 VALUES (0, 0), (NULL, NULL);") + tk.MustExec("INSERT INTO t3 VALUES (1, 2);") // issue #13551 and #21674 tk.MustQuery("SELECT * FROM t2 WHERE (SELECT c1, c2 FROM t2 LIMIT 1) = ANY (SELECT c1, c2 FROM t1);").Check(testkit.Rows("0 0", " ")) tk.MustQuery("SELECT * FROM t2 WHERE (SELECT c1 FROM t2 LIMIT 1) = ANY (SELECT c1 FROM t1);").Check(testkit.Rows("0 0", " ")) tk.MustQuery("SELECT * FROM t2 WHERE (SELECT c1, c2 FROM t2 order by c1 LIMIT 1) = ANY (SELECT c1, c2 FROM t1);").Check(testkit.Rows()) + + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1 FROM t3 LIMIT 1) != ALL(SELECT c1 FROM t4);").Check(testkit.Rows("1 2")) + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1, c2 FROM t3 LIMIT 1) != ALL(SELECT c1, c2 FROM t4);").Check(testkit.Rows("1 2")) + tk.MustExec("INSERT INTO t4 VALUES (1, 3);") + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1 FROM t3 LIMIT 1) != ALL(SELECT c1 FROM t4);").Check(testkit.Rows()) + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1, c2 FROM t3 LIMIT 1) != ALL(SELECT c1, c2 FROM t4);").Check(testkit.Rows("1 2")) + tk.MustExec("INSERT INTO t4 VALUES (1, 2);") + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1 FROM t3 LIMIT 1) != ALL(SELECT c1 FROM t4);").Check(testkit.Rows()) + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1, c2 FROM t3 LIMIT 1) != ALL(SELECT c1, c2 FROM t4);").Check(testkit.Rows()) + }