diff --git a/cmd/explaintest/r/cte.result b/cmd/explaintest/r/cte.result index 3c8737d7400b8..0a62e5a4c60dc 100644 --- a/cmd/explaintest/r/cte.result +++ b/cmd/explaintest/r/cte.result @@ -390,7 +390,7 @@ id estRows task access object operator info MergeJoin_28 8000.00 root inner join, left key:test.t1.c1, right key:test.t1.c1 ├─Sort_26(Build) 6400.00 root test.t1.c1 │ └─Selection_24 6400.00 root not(isnull(test.t1.c1)) -│ └─CTEFullScan_25 8000.00 root CTE:dt2 data:CTE_0 +│ └─CTEFullScan_25 8000.00 root CTE:cte1 AS dt2 data:CTE_0 └─Sort_22(Probe) 9990.00 root test.t1.c1 └─TableReader_21 9990.00 root data:Selection_20 └─Selection_20 9990.00 cop[tikv] not(isnull(test.t1.c1)) @@ -415,7 +415,7 @@ id estRows task access object operator info MergeJoin_26 8000.00 root inner join, left key:test.tpk.c1, right key:test.tpk.c1 ├─Sort_24(Build) 6400.00 root test.tpk.c1 │ └─Selection_22 6400.00 root not(isnull(test.tpk.c1)) -│ └─CTEFullScan_23 8000.00 root CTE:dt2 data:CTE_0 +│ └─CTEFullScan_23 8000.00 root CTE:cte1 AS dt2 data:CTE_0 └─TableReader_20(Probe) 10000.00 root data:TableFullScan_19 └─TableFullScan_19 10000.00 cop[tikv] table:dt1 keep order:true, stats:pseudo CTE_0 8000.00 root Non-Recursive CTE @@ -433,7 +433,7 @@ id estRows task access object operator info MergeJoin_32 8000.00 root inner join, left key:test.t1.c1, right key:test.t1.c1 ├─Sort_30(Build) 6400.00 root test.t1.c1 │ └─Selection_28 6400.00 root not(isnull(test.t1.c1)) -│ └─CTEFullScan_29 8000.00 root CTE:dt2 data:CTE_0 +│ └─CTEFullScan_29 8000.00 root CTE:cte1 AS dt2 data:CTE_0 └─Sort_26(Probe) 9990.00 root test.t1.c1 └─TableReader_25 9990.00 root data:Selection_24 └─Selection_24 9990.00 cop[tikv] not(isnull(test.t1.c1)) @@ -459,7 +459,7 @@ id estRows task access object operator info MergeJoin_35 8001.00 root inner join, left key:test.t1.c1, right key:test.t1.c1 ├─Sort_33(Build) 6400.80 root test.t1.c1 │ └─Selection_31 6400.80 root not(isnull(test.t1.c1)) -│ └─CTEFullScan_32 8001.00 root CTE:dt2 data:CTE_0 +│ └─CTEFullScan_32 8001.00 root CTE:cte1 AS dt2 data:CTE_0 └─Sort_29(Probe) 9990.00 root test.t1.c1 └─TableReader_28 9990.00 root data:Selection_27 └─Selection_27 9990.00 cop[tikv] not(isnull(test.t1.c1)) @@ -482,7 +482,7 @@ id estRows task access object operator info MergeJoin_35 8001.00 root inner join, left key:test.t1.c1, right key:test.tpk.c1 ├─Sort_33(Build) 6400.80 root test.tpk.c1 │ └─Selection_31 6400.80 root not(isnull(test.tpk.c1)) -│ └─CTEFullScan_32 8001.00 root CTE:dt2 data:CTE_0 +│ └─CTEFullScan_32 8001.00 root CTE:cte1 AS dt2 data:CTE_0 └─Sort_29(Probe) 9990.00 root test.t1.c1 └─TableReader_28 9990.00 root data:Selection_27 └─Selection_27 9990.00 cop[tikv] not(isnull(test.t1.c1)) @@ -506,7 +506,7 @@ id estRows task access object operator info MergeJoin_32 8000.00 root inner join, left key:test.t1.c1, right key:test.t1.c1 ├─Sort_30(Build) 6400.00 root test.t1.c1 │ └─Selection_28 6400.00 root not(isnull(test.t1.c1)) -│ └─CTEFullScan_29 8000.00 root CTE:dt2 data:CTE_0 +│ └─CTEFullScan_29 8000.00 root CTE:cte1 AS dt2 data:CTE_0 └─Sort_26(Probe) 9990.00 root test.t1.c1 └─TableReader_25 9990.00 root data:Selection_24 └─Selection_24 9990.00 cop[tikv] not(isnull(test.t1.c1)) @@ -532,7 +532,7 @@ id estRows task access object operator info MergeJoin_34 8000.00 root inner join, left key:test.t1.c1, right key:test.tpk.c1 ├─Sort_32(Build) 6400.00 root test.tpk.c1 │ └─Selection_30 6400.00 root not(isnull(test.tpk.c1)) -│ └─CTEFullScan_31 8000.00 root CTE:dt2 data:CTE_0 +│ └─CTEFullScan_31 8000.00 root CTE:cte1 AS dt2 data:CTE_0 └─Sort_28(Probe) 9990.00 root test.t1.c1 └─TableReader_27 9990.00 root data:Selection_26 └─Selection_26 9990.00 cop[tikv] not(isnull(test.t1.c1)) @@ -553,7 +553,7 @@ id estRows task access object operator info Sort_15 64000000.00 root test.t1.c1, test.t1.c1 └─HashJoin_18 64000000.00 root CARTESIAN inner join ├─Selection_22(Build) 6400.00 root eq(test.t1.c1, 1) - │ └─CTEFullScan_23 8000.00 root CTE:dt2 data:CTE_0 + │ └─CTEFullScan_23 8000.00 root CTE:cte1 AS dt2 data:CTE_0 └─TableReader_21(Probe) 10000.00 root data:TableFullScan_20 └─TableFullScan_20 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo CTE_0 8000.00 root Non-Recursive CTE @@ -575,7 +575,7 @@ id estRows task access object operator info Sort_15 64000000.00 root test.t1.c1, test.tpk.c1 └─HashJoin_18 64000000.00 root CARTESIAN inner join ├─Selection_22(Build) 6400.00 root eq(test.tpk.c1, 1) - │ └─CTEFullScan_23 8000.00 root CTE:dt2 data:CTE_0 + │ └─CTEFullScan_23 8000.00 root CTE:cte1 AS dt2 data:CTE_0 └─TableReader_21(Probe) 10000.00 root data:TableFullScan_20 └─TableFullScan_20 10000.00 cop[tikv] table:dt1 keep order:false, stats:pseudo CTE_0 8000.00 root Non-Recursive CTE @@ -599,11 +599,11 @@ id estRows task access object operator info Projection_20 10000.00 root test.tpk1.c1, test.tpk.c1, test.tpk.c1 └─HashJoin_22 10000.00 root inner join, equal:[eq(test.tpk.c1, test.tpk.c1)] ├─Selection_23(Build) 6400.00 root not(isnull(test.tpk.c1)) - │ └─CTEFullScan_24 8000.00 root CTE:dt3 data:CTE_0 + │ └─CTEFullScan_24 8000.00 root CTE:cte1 AS dt3 data:CTE_0 └─MergeJoin_25(Probe) 8000.00 root inner join, left key:test.tpk1.c1, right key:test.tpk.c1 ├─Sort_31(Build) 6400.00 root test.tpk.c1 │ └─Selection_29 6400.00 root not(isnull(test.tpk.c1)) - │ └─CTEFullScan_30 8000.00 root CTE:dt2 data:CTE_0 + │ └─CTEFullScan_30 8000.00 root CTE:cte1 AS dt2 data:CTE_0 └─TableReader_27(Probe) 10000.00 root data:TableFullScan_26 └─TableFullScan_26 10000.00 cop[tikv] table:dt1 keep order:true, stats:pseudo CTE_0 8000.00 root Non-Recursive CTE diff --git a/cmd/explaintest/r/explain_cte.result b/cmd/explaintest/r/explain_cte.result index 16249f475a6b6..e27b336ab78cb 100644 --- a/cmd/explaintest/r/explain_cte.result +++ b/cmd/explaintest/r/explain_cte.result @@ -57,8 +57,8 @@ CTE_1 2.00 root Recursive CTE explain with recursive cte(a) as (select 1 union select a+1 from cte where a < 10) select * from cte t1, cte t2; id estRows task access object operator info HashJoin_20 4.00 root CARTESIAN inner join -├─CTEFullScan_23(Build) 2.00 root CTE:t2 data:CTE_0 -└─CTEFullScan_22(Probe) 2.00 root CTE:t1 data:CTE_0 +├─CTEFullScan_23(Build) 2.00 root CTE:cte AS t2 data:CTE_0 +└─CTEFullScan_22(Probe) 2.00 root CTE:cte AS t1 data:CTE_0 CTE_0 2.00 root Recursive CTE ├─Projection_13(Seed Part) 1.00 root 1->Column#2 │ └─TableDual_14 1.00 root rows:1 @@ -68,8 +68,8 @@ CTE_0 2.00 root Recursive CTE explain with cte(a) as (with recursive cte1(a) as (select 1 union select a + 1 from cte1 where a < 10) select * from cte1) select * from cte t1, cte t2; id estRows task access object operator info HashJoin_26 2.56 root CARTESIAN inner join -├─CTEFullScan_29(Build) 1.60 root CTE:t2 data:CTE_0 -└─CTEFullScan_28(Probe) 1.60 root CTE:t1 data:CTE_0 +├─CTEFullScan_29(Build) 1.60 root CTE:cte AS t2 data:CTE_0 +└─CTEFullScan_28(Probe) 1.60 root CTE:cte AS t1 data:CTE_0 CTE_0 1.60 root Non-Recursive CTE └─Selection_21(Seed Part) 1.60 root 1 └─CTEFullScan_23 2.00 root CTE:cte1 data:CTE_1 @@ -100,7 +100,7 @@ explain with q(a,b) as (select * from t1) select /*+ merge(q) no_merge(q1) */ * id estRows task access object operator info HashJoin_19 40960000.00 root CARTESIAN inner join ├─Selection_23(Build) 6400.00 root eq(test.t1.c1, 2) -│ └─CTEFullScan_24 8000.00 root CTE:q1 data:CTE_0 +│ └─CTEFullScan_24 8000.00 root CTE:q AS q1 data:CTE_0 └─Selection_21(Probe) 6400.00 root eq(test.t1.c1, 1) └─CTEFullScan_22 8000.00 root CTE:q data:CTE_0 CTE_0 8000.00 root Non-Recursive CTE @@ -157,9 +157,9 @@ explain with recursive cte1(c1) as (select c1 from t1 union select c1 + 1 c1 fro id estRows task access object operator info HashJoin_25 6400.80 root inner join, equal:[eq(test.t1.c1, test.t1.c1)] ├─Selection_29(Build) 6400.80 root not(isnull(test.t1.c1)) -│ └─CTEFullScan_30 8001.00 root CTE:dt2 data:CTE_0 +│ └─CTEFullScan_30 8001.00 root CTE:cte1 AS dt2 data:CTE_0 └─Selection_27(Probe) 6400.80 root not(isnull(test.t1.c1)) - └─CTEFullScan_28 8001.00 root CTE:dt1 data:CTE_0 + └─CTEFullScan_28 8001.00 root CTE:cte1 AS dt1 data:CTE_0 CTE_0 8001.00 root Recursive CTE, limit(offset:0, count:1) ├─TableReader_18(Seed Part) 10000.00 root data:TableFullScan_17 │ └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -169,9 +169,9 @@ explain with recursive cte1(c1) as (select c1 from t1 union select c1 + 1 c1 fro id estRows task access object operator info HashJoin_25 6400.80 root inner join, equal:[eq(test.t1.c1, test.t1.c1)] ├─Selection_29(Build) 6400.80 root not(isnull(test.t1.c1)) -│ └─CTEFullScan_30 8001.00 root CTE:dt2 data:CTE_0 +│ └─CTEFullScan_30 8001.00 root CTE:cte1 AS dt2 data:CTE_0 └─Selection_27(Probe) 6400.80 root not(isnull(test.t1.c1)) - └─CTEFullScan_28 8001.00 root CTE:dt1 data:CTE_0 + └─CTEFullScan_28 8001.00 root CTE:cte1 AS dt1 data:CTE_0 CTE_0 8001.00 root Recursive CTE, limit(offset:0, count:0) ├─TableReader_18(Seed Part) 10000.00 root data:TableFullScan_17 │ └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo @@ -401,15 +401,15 @@ id estRows task access object operator info TopN 40.00 root Column#180, Column#181, Column#182, Column#186, offset:0, count:100 └─HashJoin 40.00 root inner join, equal:[eq(Column#170, Column#200)], other cond:gt(case(gt(Column#198, 0), div(Column#208, Column#198), 0.0), case(gt(Column#178, 0), div(Column#188, Column#178), 0.0)) ├─Selection(Build) 40.00 root eq(Column#207, 2002), eq(Column#209, "w"), not(isnull(Column#200)) - │ └─CTEFullScan 50.00 root CTE:t_w_secyear data:CTE_0 + │ └─CTEFullScan 50.00 root CTE:year_total AS t_w_secyear data:CTE_0 └─HashJoin(Probe) 40.00 root inner join, equal:[eq(Column#170, Column#190)] ├─Selection(Build) 40.00 root eq(Column#197, 2001), eq(Column#199, "w"), gt(Column#198, 0), not(isnull(Column#190)) - │ └─CTEFullScan 50.00 root CTE:t_w_firstyear data:CTE_0 + │ └─CTEFullScan 50.00 root CTE:year_total AS t_w_firstyear data:CTE_0 └─HashJoin(Probe) 40.00 root inner join, equal:[eq(Column#170, Column#180)] ├─Selection(Build) 40.00 root eq(Column#187, 2002), eq(Column#189, "s"), not(isnull(Column#180)) - │ └─CTEFullScan 50.00 root CTE:t_s_secyear data:CTE_0 + │ └─CTEFullScan 50.00 root CTE:year_total AS t_s_secyear data:CTE_0 └─Selection(Probe) 40.00 root eq(Column#177, 2001), eq(Column#179, "s"), gt(Column#178, 0), not(isnull(Column#170)) - └─CTEFullScan 50.00 root CTE:t_s_firstyear data:CTE_0 + └─CTEFullScan 50.00 root CTE:year_total AS t_s_firstyear data:CTE_0 CTE_0 50.00 root Non-Recursive CTE └─Union(Seed Part) 50.00 root ├─Projection 25.00 root test.customer.c_customer_id, test.customer.c_first_name, test.customer.c_last_name, test.customer.c_preferred_cust_flag, test.customer.c_birth_country, test.customer.c_login, test.customer.c_email_address, test.date_dim.d_year, Column#73, s->Column#169 @@ -467,9 +467,9 @@ where v1.bench_type =v2.bench_type; id estRows task access object operator info HashJoin 8000.00 root inner join, equal:[eq(test.t1.bench_type, test.t1.bench_type)] ├─Selection(Build) 6400.00 root not(isnull(test.t1.bench_type)) -│ └─CTEFullScan 8000.00 root CTE:v2 data:CTE_2 +│ └─CTEFullScan 8000.00 root CTE:version2 AS v2 data:CTE_2 └─Selection(Probe) 6400.00 root not(isnull(test.t1.bench_type)) - └─CTEFullScan 8000.00 root CTE:v1 data:CTE_1 + └─CTEFullScan 8000.00 root CTE:version1 AS v1 data:CTE_1 CTE_2 8000.00 root Non-Recursive CTE └─Selection(Seed Part) 8000.00 root eq(test.t1.version, "6.0.0"), not(isnull(test.t1.bench_type)) └─CTEFullScan 10000.00 root CTE:all_data data:CTE_0 @@ -492,9 +492,9 @@ HashJoin_33 8000.00 root inner join, equal:[eq(test.tbl.id, test.tbl.id)] CTE_1 10000.00 root Non-Recursive CTE └─HashJoin_25(Seed Part) 10000.00 root inner join, equal:[eq(test.tbl.id, test.tbl.id)] ├─Selection_29(Build) 8000.00 root not(isnull(test.tbl.id)) - │ └─CTEFullScan_30 10000.00 root CTE:b data:CTE_0 + │ └─CTEFullScan_30 10000.00 root CTE:t1 AS b data:CTE_0 └─Selection_27(Probe) 8000.00 root not(isnull(test.tbl.id)) - └─CTEFullScan_28 10000.00 root CTE:a data:CTE_0 + └─CTEFullScan_28 10000.00 root CTE:t1 AS a data:CTE_0 CTE_0 10000.00 root Non-Recursive CTE └─TableReader_22(Seed Part) 10000.00 root data:TableFullScan_21 └─TableFullScan_21 10000.00 cop[tikv] table:tbl keep order:false, stats:pseudo diff --git a/planner/core/access_object.go b/planner/core/access_object.go index c57f7edc06b90..c9994efe3de86 100644 --- a/planner/core/access_object.go +++ b/planner/core/access_object.go @@ -493,5 +493,8 @@ func (p *PhysicalIndexMergeReader) accessObject(sctx sessionctx.Context) AccessO // AccessObject implements physicalScan interface. func (p *PhysicalCTE) AccessObject() AccessObject { - return OtherAccessObject(fmt.Sprintf("CTE:%s", p.cteAsName.L)) + if p.cteName == p.cteAsName { + return OtherAccessObject(fmt.Sprintf("CTE:%s", p.cteName.L)) + } + return OtherAccessObject(fmt.Sprintf("CTE:%s AS %s", p.cteName.L, p.cteAsName.L)) } diff --git a/planner/core/find_best_task.go b/planner/core/find_best_task.go index 5e1a365f1f1ac..ad66f366b9842 100644 --- a/planner/core/find_best_task.go +++ b/planner/core/find_best_task.go @@ -2265,7 +2265,7 @@ func (p *LogicalCTE) findBestTask(prop *property.PhysicalProperty, _ *PlanCounte return invalidTask, 1, nil } // The physical plan has been build when derive stats. - pcte := PhysicalCTE{SeedPlan: p.cte.seedPartPhysicalPlan, RecurPlan: p.cte.recursivePartPhysicalPlan, CTE: p.cte, cteAsName: p.cteAsName}.Init(p.ctx, p.stats) + pcte := PhysicalCTE{SeedPlan: p.cte.seedPartPhysicalPlan, RecurPlan: p.cte.recursivePartPhysicalPlan, CTE: p.cte, cteAsName: p.cteAsName, cteName: p.cteName}.Init(p.ctx, p.stats) pcte.SetSchema(p.schema) t = &rootTask{pcte, false} if prop.CanAddEnforcer { diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index e25548ca541db..462448cfa4fbe 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -4262,7 +4262,7 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName LimitEnd: limitEnd, pushDownPredicates: make([]expression.Expression, 0), ColumnMap: make(map[string]*expression.Column)} } var p LogicalPlan - lp := LogicalCTE{cteAsName: tn.Name, cte: cte.cteClass, seedStat: cte.seedStat, isOuterMostCTE: !b.buildingCTE}.Init(b.ctx, b.getSelectOffset()) + lp := LogicalCTE{cteAsName: tn.Name, cteName: tn.Name, cte: cte.cteClass, seedStat: cte.seedStat, isOuterMostCTE: !b.buildingCTE}.Init(b.ctx, b.getSelectOffset()) prevSchema := cte.seedLP.Schema().Clone() lp.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) diff --git a/planner/core/logical_plans.go b/planner/core/logical_plans.go index e7550c0ea0abd..5d2f22ac86abd 100644 --- a/planner/core/logical_plans.go +++ b/planner/core/logical_plans.go @@ -1959,6 +1959,7 @@ type LogicalCTE struct { cte *CTEClass cteAsName model.CIStr + cteName model.CIStr seedStat *property.StatsInfo isOuterMostCTE bool } diff --git a/planner/core/physical_plans.go b/planner/core/physical_plans.go index 68a6940bd4b5e..976660cd21769 100644 --- a/planner/core/physical_plans.go +++ b/planner/core/physical_plans.go @@ -2142,6 +2142,7 @@ type PhysicalCTE struct { RecurPlan PhysicalPlan CTE *CTEClass cteAsName model.CIStr + cteName model.CIStr } // PhysicalCTETable is for CTE table.