From 51bf61905171b87b4e1463da727fdff39dbeddd7 Mon Sep 17 00:00:00 2001 From: Zhuhe Fang Date: Wed, 31 Mar 2021 19:33:24 +0800 Subject: [PATCH] planner: fix set not null flag for outer join (#23727) --- executor/executor_test.go | 9 +++++---- executor/index_lookup_merge_join_test.go | 2 +- planner/core/rule_column_pruning.go | 19 +------------------ 3 files changed, 7 insertions(+), 23 deletions(-) diff --git a/executor/executor_test.go b/executor/executor_test.go index 4c9b94dcba..925fa48815 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -7974,17 +7974,18 @@ func (s *testSuiteP1) TestIssue22941(c *C) { PRIMARY KEY (mid), KEY ind_bm_parent (ParentId,mid) )`) - + // mp should have more columns than m tk.MustExec(`CREATE TABLE mp ( mpid bigint(20) unsigned NOT NULL DEFAULT '0', mid varchar(50) DEFAULT NULL COMMENT '模块主键', + sid int, PRIMARY KEY (mpid) );`) - tk.MustExec(`insert into mp values("1","1");`) + tk.MustExec(`insert into mp values("1","1","0");`) tk.MustExec(`insert into m values("0", "0");`) - rs := tk.MustQuery(`SELECT ( SELECT COUNT(1) FROM m WHERE ParentId = c.mid ) expand, bmp.mpid, bmp.mpid IS NULL,bmp.mpid IS NOT NULL FROM m c LEFT JOIN mp bmp ON c.mid = bmp.mid WHERE c.ParentId = '0'`) - rs.Check(testkit.Rows("1 1 0")) + rs := tk.MustQuery(`SELECT ( SELECT COUNT(1) FROM m WHERE ParentId = c.mid ) expand, bmp.mpid, bmp.mpid IS NULL,bmp.mpid IS NOT NULL, sid FROM m c LEFT JOIN mp bmp ON c.mid = bmp.mid WHERE c.ParentId = '0'`) + rs.Check(testkit.Rows("1 1 0 ")) rs = tk.MustQuery(`SELECT bmp.mpid, bmp.mpid IS NULL,bmp.mpid IS NOT NULL FROM m c LEFT JOIN mp bmp ON c.mid = bmp.mid WHERE c.ParentId = '0'`) rs.Check(testkit.Rows(" 1 0")) diff --git a/executor/index_lookup_merge_join_test.go b/executor/index_lookup_merge_join_test.go index 4f2bd6e148..559330fcd8 100644 --- a/executor/index_lookup_merge_join_test.go +++ b/executor/index_lookup_merge_join_test.go @@ -10,7 +10,7 @@ import ( "github.com/pingcap/tidb/util/testkit" ) -func (s *testSuite9) TestIndexLookupMergeJoinHang(c *C) { +func (s *testSuiteJoin2) TestIndexLookupMergeJoinHang(c *C) { c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/IndexMergeJoinMockOOM", `return(true)`), IsNil) defer func() { c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/IndexMergeJoinMockOOM"), IsNil) diff --git a/planner/core/rule_column_pruning.go b/planner/core/rule_column_pruning.go index ef9a5b888d..5ca2600b73 100644 --- a/planner/core/rule_column_pruning.go +++ b/planner/core/rule_column_pruning.go @@ -303,24 +303,7 @@ func (p *LogicalJoin) extractUsedCols(parentUsedCols []*expression.Column) (left } func (p *LogicalJoin) mergeSchema() { - lChild := p.children[0] - rChild := p.children[1] - if p.JoinType == SemiJoin || p.JoinType == AntiSemiJoin { - p.schema = lChild.Schema().Clone() - } else if p.JoinType == LeftOuterSemiJoin || p.JoinType == AntiLeftOuterSemiJoin { - joinCol := p.schema.Columns[len(p.schema.Columns)-1] - p.schema = lChild.Schema().Clone() - p.schema.Append(joinCol) - } else { - p.schema = expression.MergeSchema(lChild.Schema(), rChild.Schema()) - switch p.JoinType { - case LeftOuterJoin: - resetNotNullFlag(p.schema, p.children[1].Schema().Len(), p.schema.Len()) - case RightOuterJoin: - resetNotNullFlag(p.schema, 0, p.children[0].Schema().Len()) - default: - } - } + p.schema = buildLogicalJoinSchema(p.JoinType, p) } // PruneColumns implements LogicalPlan interface.