diff --git a/pkg/planner/core/logical_plan_builder.go b/pkg/planner/core/logical_plan_builder.go index 40b81243284d7..457ecffd53a0d 100644 --- a/pkg/planner/core/logical_plan_builder.go +++ b/pkg/planner/core/logical_plan_builder.go @@ -7731,6 +7731,10 @@ func (b *PlanBuilder) buildRecursiveCTE(ctx context.Context, cte ast.ResultSetNo // Build seed part plan. saveSelect := x.SelectList.Selects x.SelectList.Selects = x.SelectList.Selects[:i] + // We're rebuilding the seed part, so we pop the result we built previously. + for _i := 0; _i < i; _i++ { + b.handleHelper.popMap() + } p, err = b.buildSetOpr(ctx, x) if err != nil { return err diff --git a/tests/integrationtest/r/planner/core/issuetest/planner_issue.result b/tests/integrationtest/r/planner/core/issuetest/planner_issue.result index 265eb9f1aba8a..72bfff299b387 100644 --- a/tests/integrationtest/r/planner/core/issuetest/planner_issue.result +++ b/tests/integrationtest/r/planner/core/issuetest/planner_issue.result @@ -313,3 +313,22 @@ a length(a) select *,length(a) from t2 where a like '测试'; a length(a) 测试 4 +drop view if exists v1; +create view v1(id) as +with recursive cte(a) as (select 1 union select a+1 from cte where a<3) +select * from cte; +create table test2(id int,value int); +insert into test2 values(1,1),(2,2),(3,3),(4,4),(5,5); +update test2 +set value=0 +where test2.id in +( +select * from v1 +); +select * from test2; +id value +1 0 +2 0 +3 0 +4 4 +5 5 diff --git a/tests/integrationtest/t/planner/core/issuetest/planner_issue.test b/tests/integrationtest/t/planner/core/issuetest/planner_issue.test index bb04737801aeb..f41f312cd82e4 100644 --- a/tests/integrationtest/t/planner/core/issuetest/planner_issue.test +++ b/tests/integrationtest/t/planner/core/issuetest/planner_issue.test @@ -169,3 +169,20 @@ explain format = brief select *,length(a) from t2 where a like '测试 %'; explain format = brief select *,length(a) from t2 where a like '测试'; select *,length(a) from t2 where a like '测试 %'; select *,length(a) from t2 where a like '测试'; + +# https://github.com/pingcap/tidb/issues/48969 +drop view if exists v1; +create view v1(id) as +with recursive cte(a) as (select 1 union select a+1 from cte where a<3) +select * from cte; + +create table test2(id int,value int); +insert into test2 values(1,1),(2,2),(3,3),(4,4),(5,5); + +update test2 +set value=0 +where test2.id in +( + select * from v1 +); +select * from test2;