From b2b679506abdb32fc0ee9e64bb118d17bd32c92c Mon Sep 17 00:00:00 2001 From: Ti Chi Robot Date: Thu, 31 Oct 2024 23:56:04 +0800 Subject: [PATCH] planner: merge FullSchema and FullNames of subplans when rewriting "in (subquery)" to inner join (#54334) (#57036) close pingcap/tidb#53766 --- cmd/explaintest/r/planner_issue.result | 5 +++++ cmd/explaintest/t/planner_issue.test | 6 ++++++ planner/core/expression_rewriter.go | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/cmd/explaintest/r/planner_issue.result b/cmd/explaintest/r/planner_issue.result index 9bf55a7187a37..a51fd56bd77a1 100644 --- a/cmd/explaintest/r/planner_issue.result +++ b/cmd/explaintest/r/planner_issue.result @@ -27,3 +27,8 @@ IndexReader 250.00 root index:Selection select * from t1 use index (ia) where a like 'xxx_'; a xxx +drop table if exists t0, t1; +CREATE TABLE t0(c0 int); +CREATE TABLE t1(c0 int); +SELECT t0.c0, t1.c0 FROM t0 NATURAL JOIN t1 WHERE '1' AND (t0.c0 IN (SELECT c0 FROM t0)); +c0 c0 diff --git a/cmd/explaintest/t/planner_issue.test b/cmd/explaintest/t/planner_issue.test index 8f42e7e872937..7e7845cb44ba3 100644 --- a/cmd/explaintest/t/planner_issue.test +++ b/cmd/explaintest/t/planner_issue.test @@ -8,3 +8,9 @@ select *,length(a) from t1 where a like '测试 %'; select *,length(a) from t1 where a like '测试'; explain format = brief select * from t1 use index (ia) where a like 'xxx_'; select * from t1 use index (ia) where a like 'xxx_'; + +# TestIssue53766 +drop table if exists t0, t1; +CREATE TABLE t0(c0 int); +CREATE TABLE t1(c0 int); +SELECT t0.c0, t1.c0 FROM t0 NATURAL JOIN t1 WHERE '1' AND (t0.c0 IN (SELECT c0 FROM t0)); diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index 28be5f3a85316..2fe3f1a607658 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -1008,6 +1008,11 @@ func (er *expressionRewriter) handleInSubquery(ctx context.Context, v *ast.Patte copy(join.names, er.p.OutputNames()) copy(join.names[er.p.Schema().Len():], agg.OutputNames()) join.AttachOnConds(expression.SplitCNFItems(checkCondition)) + // set FullSchema and FullNames for this join + if left, ok := er.p.(*LogicalJoin); ok && left.fullSchema != nil { + join.fullSchema = left.fullSchema + join.fullNames = left.fullNames + } // Set join hint for this join. if er.b.TableHints() != nil { join.setPreferredJoinTypeAndOrder(er.b.TableHints())