From 4c14f78284c3df648771188a3e53e729bf639dd1 Mon Sep 17 00:00:00 2001 From: Shenghui Wu <793703860@qq.com> Date: Wed, 14 Apr 2021 17:37:52 +0800 Subject: [PATCH] cherry pick #23989 to release-4.0 Signed-off-by: ti-srebot --- expression/constant_propagation.go | 6 +++--- expression/integration_test.go | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/expression/constant_propagation.go b/expression/constant_propagation.go index d44fa533283fe..e25b64983316b 100644 --- a/expression/constant_propagation.go +++ b/expression/constant_propagation.go @@ -533,6 +533,9 @@ func (s *propOuterJoinConstSolver) deriveConds(outerCol, innerCol *Column, schem // 'expression(..., outerCol, ...)' does not reference columns outside children schemas of join node. // Derived new expressions must be appended into join condition, not filter condition. func (s *propOuterJoinConstSolver) propagateColumnEQ() { + if s.nullSensitive { + return + } visited := make([]bool, 2*len(s.joinConds)+len(s.filterConds)) s.unionSet = disjointset.NewIntSet(len(s.columns)) var outerCol, innerCol *Column @@ -553,9 +556,6 @@ func (s *propOuterJoinConstSolver) propagateColumnEQ() { // `select *, t1.a in (select t2.b from t t2) from t t1` // rows with t2.b is null would impact whether LeftOuterSemiJoin should output 0 or null if there // is no row satisfying t2.b = t1.a - if s.nullSensitive { - continue - } childCol := s.innerSchema.RetrieveColumn(innerCol) if !mysql.HasNotNullFlag(childCol.RetType.Flag) { notNullExpr := BuildNotNullExpr(s.ctx, childCol) diff --git a/expression/integration_test.go b/expression/integration_test.go index 614f06a51b838..34c3f0a37c83d 100755 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -8080,3 +8080,17 @@ func (s *testIntegrationSerialSuite) TestIssue19116(c *C) { tk.MustQuery("select coercibility(1);").Check(testkit.Rows("5")) tk.MustQuery("select coercibility(1=1);").Check(testkit.Rows("5")) } + +func (s *testIntegrationSuite) TestIssue23889(c *C) { + defer s.cleanEnv(c) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists test_decimal,test_t;") + tk.MustExec("create table test_decimal(col_decimal decimal(10,0));") + tk.MustExec("insert into test_decimal values(null),(8);") + tk.MustExec("create table test_t(a int(11), b decimal(32,0));") + tk.MustExec("insert into test_t values(1,4),(2,4),(5,4),(7,4),(9,4);") + + tk.MustQuery("SELECT ( test_decimal . `col_decimal` , test_decimal . `col_decimal` ) IN ( select * from test_t ) as field1 FROM test_decimal;").Check( + testkit.Rows("", "0")) +}