From 77c97ef631d93310b4b93aaf1ee98eefba1aef4d Mon Sep 17 00:00:00 2001 From: Arenatlx <314806019@qq.com> Date: Thu, 25 Jul 2024 17:54:13 +0800 Subject: [PATCH] planner: move logical cte table into logicalop pkg. (#54905) ref pingcap/tidb#51664, ref pingcap/tidb#52714 --- pkg/planner/core/BUILD.bazel | 1 - pkg/planner/core/collect_column_stats_usage.go | 3 ++- pkg/planner/core/core_init.go | 1 + pkg/planner/core/find_best_task.go | 3 ++- pkg/planner/core/logical_plan_builder.go | 4 ++-- pkg/planner/core/logical_plans.go | 2 +- pkg/planner/core/operator/logicalop/BUILD.bazel | 1 + .../core/{ => operator/logicalop}/logical_cte_table.go | 10 +++++----- pkg/planner/util/utilfuncp/func_pointer_misc.go | 4 ++++ 9 files changed, 18 insertions(+), 11 deletions(-) rename pkg/planner/core/{ => operator/logicalop}/logical_cte_table.go (93%) diff --git a/pkg/planner/core/BUILD.bazel b/pkg/planner/core/BUILD.bazel index 3447fe09bf362..c6c2d7f77f212 100644 --- a/pkg/planner/core/BUILD.bazel +++ b/pkg/planner/core/BUILD.bazel @@ -24,7 +24,6 @@ go_library( "logical_aggregation.go", "logical_apply.go", "logical_cte.go", - "logical_cte_table.go", "logical_datasource.go", "logical_expand.go", "logical_index_scan.go", diff --git a/pkg/planner/core/collect_column_stats_usage.go b/pkg/planner/core/collect_column_stats_usage.go index a3f951c526826..dde44d6ff5ff0 100644 --- a/pkg/planner/core/collect_column_stats_usage.go +++ b/pkg/planner/core/collect_column_stats_usage.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/tidb/pkg/infoschema" "github.com/pingcap/tidb/pkg/parser/model" "github.com/pingcap/tidb/pkg/planner/core/base" + "github.com/pingcap/tidb/pkg/planner/core/operator/logicalop" "github.com/pingcap/tidb/pkg/sessionctx/variable" "github.com/pingcap/tidb/pkg/statistics/asyncload" "github.com/pingcap/tidb/pkg/util/filter" @@ -320,7 +321,7 @@ func (c *columnStatsUsageCollector) collectFromPlan(lp base.LogicalPlan) { c.addPredicateColumn(col) } } - case *LogicalCTETable: + case *logicalop.LogicalCTETable: // Schema change from seedPlan to self. for i, col := range x.Schema().Columns { c.updateColMap(col, []*expression.Column{x.SeedSchema.Columns[i]}) diff --git a/pkg/planner/core/core_init.go b/pkg/planner/core/core_init.go index e0d5c4c2b02f1..60159c1d165da 100644 --- a/pkg/planner/core/core_init.go +++ b/pkg/planner/core/core_init.go @@ -35,6 +35,7 @@ func init() { utilfuncp.GetStreamAggs = getStreamAggs utilfuncp.GetHashAggs = getHashAggs utilfuncp.PruneByItems = pruneByItems + utilfuncp.FindBestTask4LogicalCTETable = findBestTask4LogicalCTETable utilfuncp.ExhaustPhysicalPlans4LogicalMaxOneRow = exhaustPhysicalPlans4LogicalMaxOneRow utilfuncp.AppendCandidate4PhysicalOptimizeOp = appendCandidate4PhysicalOptimizeOp diff --git a/pkg/planner/core/find_best_task.go b/pkg/planner/core/find_best_task.go index 95ebf8610527c..21b975359f60b 100644 --- a/pkg/planner/core/find_best_task.go +++ b/pkg/planner/core/find_best_task.go @@ -2927,7 +2927,8 @@ func findBestTask4LogicalCTE(p *LogicalCTE, prop *property.PhysicalProperty, cou return t, 1, nil } -func findBestTask4LogicalCTETable(p *LogicalCTETable, prop *property.PhysicalProperty, _ *base.PlanCounterTp, _ *optimizetrace.PhysicalOptimizeOp) (t base.Task, cntPlan int64, err error) { +func findBestTask4LogicalCTETable(lp base.LogicalPlan, prop *property.PhysicalProperty, _ *base.PlanCounterTp, _ *optimizetrace.PhysicalOptimizeOp) (t base.Task, cntPlan int64, err error) { + p := lp.(*logicalop.LogicalCTETable) if !prop.IsSortItemEmpty() { return base.InvalidTask, 0, nil } diff --git a/pkg/planner/core/logical_plan_builder.go b/pkg/planner/core/logical_plan_builder.go index 0b528a82acce9..3ca10667ae05b 100644 --- a/pkg/planner/core/logical_plan_builder.go +++ b/pkg/planner/core/logical_plan_builder.go @@ -650,7 +650,7 @@ func (b *PlanBuilder) buildJoin(ctx context.Context, joinNode *ast.Join) (base.L } // The recursive part in CTE must not be on the right side of a LEFT JOIN. - if lc, ok := rightPlan.(*LogicalCTETable); ok && joinNode.Tp == ast.LeftJoin { + if lc, ok := rightPlan.(*logicalop.LogicalCTETable); ok && joinNode.Tp == ast.LeftJoin { return nil, plannererrors.ErrCTERecursiveForbiddenJoinOrder.GenWithStackByArgs(lc.Name) } @@ -4261,7 +4261,7 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName } cte.recursiveRef = true - p := LogicalCTETable{Name: cte.def.Name.String(), IDForStorage: cte.storageID, SeedStat: cte.seedStat, SeedSchema: cte.seedLP.Schema()}.Init(b.ctx, b.getSelectOffset()) + p := logicalop.LogicalCTETable{Name: cte.def.Name.String(), IDForStorage: cte.storageID, SeedStat: cte.seedStat, SeedSchema: cte.seedLP.Schema()}.Init(b.ctx, b.getSelectOffset()) p.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) p.SetOutputNames(cte.seedLP.OutputNames()) return p, nil diff --git a/pkg/planner/core/logical_plans.go b/pkg/planner/core/logical_plans.go index 9368447e44f85..40fb5b1691aa5 100644 --- a/pkg/planner/core/logical_plans.go +++ b/pkg/planner/core/logical_plans.go @@ -46,7 +46,7 @@ var ( _ base.LogicalPlan = &LogicalShow{} _ base.LogicalPlan = &LogicalShowDDLJobs{} _ base.LogicalPlan = &LogicalCTE{} - _ base.LogicalPlan = &LogicalCTETable{} + _ base.LogicalPlan = &logicalop.LogicalCTETable{} _ base.LogicalPlan = &LogicalSequence{} ) diff --git a/pkg/planner/core/operator/logicalop/BUILD.bazel b/pkg/planner/core/operator/logicalop/BUILD.bazel index 23670c4961183..50ae9aee48c65 100644 --- a/pkg/planner/core/operator/logicalop/BUILD.bazel +++ b/pkg/planner/core/operator/logicalop/BUILD.bazel @@ -4,6 +4,7 @@ go_library( name = "logicalop", srcs = [ "base_logical_plan.go", + "logical_cte_table.go", "logical_max_one_row.go", "logical_schema_producer.go", ], diff --git a/pkg/planner/core/logical_cte_table.go b/pkg/planner/core/operator/logicalop/logical_cte_table.go similarity index 93% rename from pkg/planner/core/logical_cte_table.go rename to pkg/planner/core/operator/logicalop/logical_cte_table.go index 9c9e95089b244..6a0909ab42bea 100644 --- a/pkg/planner/core/logical_cte_table.go +++ b/pkg/planner/core/operator/logicalop/logical_cte_table.go @@ -12,20 +12,20 @@ // See the License for the specific language governing permissions and // limitations under the License. -package core +package logicalop import ( "github.com/pingcap/tidb/pkg/expression" "github.com/pingcap/tidb/pkg/planner/core/base" - "github.com/pingcap/tidb/pkg/planner/core/operator/logicalop" "github.com/pingcap/tidb/pkg/planner/property" "github.com/pingcap/tidb/pkg/planner/util/optimizetrace" + "github.com/pingcap/tidb/pkg/planner/util/utilfuncp" "github.com/pingcap/tidb/pkg/util/plancodec" ) // LogicalCTETable is for CTE table type LogicalCTETable struct { - logicalop.LogicalSchemaProducer + LogicalSchemaProducer SeedStat *property.StatsInfo Name string @@ -37,7 +37,7 @@ type LogicalCTETable struct { // Init only assigns type and context. func (p LogicalCTETable) Init(ctx base.PlanContext, offset int) *LogicalCTETable { - p.BaseLogicalPlan = logicalop.NewBaseLogicalPlan(ctx, plancodec.TypeCTETable, &p, offset) + p.BaseLogicalPlan = NewBaseLogicalPlan(ctx, plancodec.TypeCTETable, &p, offset) return &p } @@ -51,7 +51,7 @@ func (p LogicalCTETable) Init(ctx base.PlanContext, offset int) *LogicalCTETable // FindBestTask implements the base.LogicalPlan.<3rd> interface. func (p *LogicalCTETable) FindBestTask(prop *property.PhysicalProperty, _ *base.PlanCounterTp, _ *optimizetrace.PhysicalOptimizeOp) (t base.Task, cntPlan int64, err error) { - return findBestTask4LogicalCTETable(p, prop, nil, nil) + return utilfuncp.FindBestTask4LogicalCTETable(p, prop, nil, nil) } // BuildKeyInfo inherits BaseLogicalPlan.LogicalPlan.<4th> implementation. diff --git a/pkg/planner/util/utilfuncp/func_pointer_misc.go b/pkg/planner/util/utilfuncp/func_pointer_misc.go index 77149c26e7c25..7781cee5ab416 100644 --- a/pkg/planner/util/utilfuncp/func_pointer_misc.go +++ b/pkg/planner/util/utilfuncp/func_pointer_misc.go @@ -92,3 +92,7 @@ var PruneByItems func(p base.LogicalPlan, old []*util.ByItems, opt *optimizetrac // ExhaustPhysicalPlans4LogicalMaxOneRow will be called by LogicalMaxOneRow in logicalOp pkg. var ExhaustPhysicalPlans4LogicalMaxOneRow func(p base.LogicalPlan, prop *property.PhysicalProperty) ( []base.PhysicalPlan, bool, error) + +// FindBestTask4LogicalCTETable will be called by LogicalCTETable in logicalOp pkg. +var FindBestTask4LogicalCTETable func(lp base.LogicalPlan, prop *property.PhysicalProperty, _ *base.PlanCounterTp, + _ *optimizetrace.PhysicalOptimizeOp) (t base.Task, cntPlan int64, err error)