planner: fix set not null flag for outer join (#23727)

This commit is contained in:
Zhuhe Fang
2021-03-31 19:33:24 +08:00
committed by GitHub
parent 6dba91b630
commit 51bf619051
3 changed files with 7 additions and 23 deletions

View File

@ -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 <nil> 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 <nil> 1 0 <nil>"))
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("<nil> 1 0"))

View File

@ -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)

View File

@ -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.