From 86cd94afbad21e111ff768b8f7474a9489d38e87 Mon Sep 17 00:00:00 2001 From: tangenta Date: Thu, 30 Jun 2022 16:50:39 +0800 Subject: [PATCH] planner: don't push down predicates over table dual (#35669) close pingcap/tidb#35527 --- planner/core/plan_test.go | 11 +++++++++++ planner/core/rule_predicate_push_down.go | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/planner/core/plan_test.go b/planner/core/plan_test.go index ed05bcce2c429..e9ec780bbfd13 100644 --- a/planner/core/plan_test.go +++ b/planner/core/plan_test.go @@ -892,3 +892,14 @@ func TestIssue34863(t *testing.T) { tk.MustQuery("select count(*) from c right join o on c.c_id=o.c_id;").Check(testkit.Rows("5")) tk.MustQuery("select count(o.c_id) from c right join o on c.c_id=o.c_id;").Check(testkit.Rows("5")) } + +// https://github.com/pingcap/tidb/issues/35527. +func TestTableDualAsSubQuery(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("CREATE VIEW v0(c0) AS SELECT NULL;") + tk.MustQuery("SELECT v0.c0 FROM v0 WHERE (v0.c0 IS NULL) LIKE(NULL);").Check(testkit.Rows()) + tk.MustQuery("SELECT v0.c0 FROM (SELECT null as c0) v0 WHERE (v0.c0 IS NULL) like (NULL);").Check(testkit.Rows()) +} diff --git a/planner/core/rule_predicate_push_down.go b/planner/core/rule_predicate_push_down.go index d0b9553d55085..59a29d788d65a 100644 --- a/planner/core/rule_predicate_push_down.go +++ b/planner/core/rule_predicate_push_down.go @@ -417,6 +417,11 @@ func (p *LogicalProjection) PredicatePushDown(predicates []expression.Expression return predicates, child } } + if len(p.children) == 1 { + if _, isDual := p.children[0].(*LogicalTableDual); isDual { + return predicates, p + } + } for _, cond := range predicates { newFilter := expression.ColumnSubstitute(cond, p.Schema(), p.Exprs) if !expression.HasGetSetVarFunc(newFilter) {