planner: fix set not null flag for outer join (#23727)
This commit is contained in:
@ -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"))
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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.
|
||||
|
||||
Reference in New Issue
Block a user