Skip to content

Commit d101194

Browse files
AilinKidterry1purcell
authored andcommitted
planner: move loical plan functionality AppendCandidate4PhysicalOptimizeOp to util (pingcap#53198)
ref pingcap#51664, ref pingcap#52714
1 parent bdec335 commit d101194

12 files changed

+89
-40
lines changed

pkg/planner/core/BUILD.bazel

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ go_library(
66
"access_object.go",
77
"collect_column_stats_usage.go",
88
"common_plans.go",
9+
"core_init.go",
910
"debugtrace.go",
1011
"encode.go",
1112
"exhaust_physical_plans.go",
@@ -125,6 +126,7 @@ go_library(
125126
"//pkg/planner/util/fixcontrol",
126127
"//pkg/planner/util/optimizetrace",
127128
"//pkg/planner/util/tablesampler",
129+
"//pkg/planner/util/utilfuncp",
128130
"//pkg/privilege",
129131
"//pkg/sessionctx",
130132
"//pkg/sessionctx/stmtctx",

pkg/planner/core/core_init.go

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright 2024 PingCAP, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package core
16+
17+
import (
18+
"github.com/pingcap/tidb/pkg/expression"
19+
"github.com/pingcap/tidb/pkg/planner/cardinality"
20+
plannerutil "github.com/pingcap/tidb/pkg/planner/util"
21+
"github.com/pingcap/tidb/pkg/planner/util/utilfuncp"
22+
"github.com/pingcap/tidb/pkg/statistics"
23+
"github.com/pingcap/tidb/pkg/util/set"
24+
"go.uber.org/atomic"
25+
)
26+
27+
func init() {
28+
// For code refactor init.
29+
utilfuncp.HasMaxOneRowUtil = HasMaxOneRow
30+
utilfuncp.AppendCandidate4PhysicalOptimizeOp = appendCandidate4PhysicalOptimizeOp
31+
32+
// For mv index init.
33+
cardinality.GetTblInfoForUsedStatsByPhysicalID = getTblInfoForUsedStatsByPhysicalID
34+
cardinality.CollectFilters4MVIndex = collectFilters4MVIndex
35+
cardinality.BuildPartialPaths4MVIndex = buildPartialPaths4MVIndex
36+
statistics.PrepareCols4MVIndex = PrepareIdxColsAndUnwrapArrayType
37+
38+
// For basic optimizer init.
39+
expression.EvalSimpleAst = evalAstExpr
40+
expression.BuildSimpleExpr = buildSimpleExpr
41+
expression.DecodeKeyFromString = decodeKeyFromString
42+
plannerutil.EvalAstExprWithPlanCtx = evalAstExprWithPlanCtx
43+
plannerutil.RewriteAstExprWithPlanCtx = rewriteAstExprWithPlanCtx
44+
DefaultDisabledLogicalRulesList = new(atomic.Value)
45+
DefaultDisabledLogicalRulesList.Store(set.NewStringSet())
46+
}

pkg/planner/core/find_best_task.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"github.com/pingcap/tidb/pkg/planner/util"
3737
"github.com/pingcap/tidb/pkg/planner/util/fixcontrol"
3838
"github.com/pingcap/tidb/pkg/planner/util/optimizetrace"
39+
"github.com/pingcap/tidb/pkg/planner/util/utilfuncp"
3940
"github.com/pingcap/tidb/pkg/statistics"
4041
"github.com/pingcap/tidb/pkg/types"
4142
tidbutil "github.com/pingcap/tidb/pkg/util"
@@ -103,7 +104,7 @@ func (p *LogicalTableDual) FindBestTask(prop *property.PhysicalProperty, planCou
103104
}.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset())
104105
dual.SetSchema(p.schema)
105106
planCounter.Dec(1)
106-
appendCandidate4PhysicalOptimizeOp(opt, p, dual, prop)
107+
utilfuncp.AppendCandidate4PhysicalOptimizeOp(opt, p, dual, prop)
107108
rt := &RootTask{}
108109
rt.SetPlan(dual)
109110
rt.SetEmpty(p.RowCount == 0)
@@ -239,7 +240,7 @@ func (p *baseLogicalPlan) enumeratePhysicalPlans4Task(
239240
bestTask = curTask
240241
break
241242
}
242-
appendCandidate4PhysicalOptimizeOp(opt, p, curTask.Plan(), prop)
243+
utilfuncp.AppendCandidate4PhysicalOptimizeOp(opt, p, curTask.Plan(), prop)
243244
// Get the most efficient one.
244245
if curIsBetter, err := compareTaskCost(curTask, bestTask, opt); err != nil {
245246
return nil, 0, err
@@ -579,7 +580,7 @@ func (p *baseLogicalPlan) FindBestTask(prop *property.PhysicalProperty, planCoun
579580
bestTask = curTask
580581
goto END
581582
}
582-
appendCandidate4PhysicalOptimizeOp(opt, p, curTask.Plan(), prop)
583+
utilfuncp.AppendCandidate4PhysicalOptimizeOp(opt, p, curTask.Plan(), prop)
583584
if curIsBetter, err := compareTaskCost(curTask, bestTask, opt); err != nil {
584585
return nil, 0, err
585586
} else if curIsBetter {
@@ -639,7 +640,7 @@ func (p *LogicalMemTable) FindBestTask(prop *property.PhysicalProperty, planCoun
639640
}.Init(p.SCtx(), p.StatsInfo(), p.QueryBlockOffset())
640641
memTable.SetSchema(p.schema)
641642
planCounter.Dec(1)
642-
appendCandidate4PhysicalOptimizeOp(opt, p, memTable, prop)
643+
utilfuncp.AppendCandidate4PhysicalOptimizeOp(opt, p, memTable, prop)
643644
rt := &RootTask{}
644645
rt.SetPlan(memTable)
645646
return rt, 1, nil
@@ -2926,7 +2927,7 @@ func appendCandidate(lp base.LogicalPlan, task base.Task, prop *property.Physica
29262927
if task == nil || task.Invalid() {
29272928
return
29282929
}
2929-
appendCandidate4PhysicalOptimizeOp(opt, lp, task.Plan(), prop)
2930+
utilfuncp.AppendCandidate4PhysicalOptimizeOp(opt, lp, task.Plan(), prop)
29302931
}
29312932

29322933
// PushDownNot here can convert condition 'not (a != 1)' to 'a = 1'. When we build range from conds, the condition like

pkg/planner/core/indexmerge_path.go

-6
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,6 @@ import (
4343
"golang.org/x/exp/maps"
4444
)
4545

46-
func init() {
47-
cardinality.CollectFilters4MVIndex = collectFilters4MVIndex
48-
cardinality.BuildPartialPaths4MVIndex = buildPartialPaths4MVIndex
49-
statistics.PrepareCols4MVIndex = PrepareIdxColsAndUnwrapArrayType
50-
}
51-
5246
// generateIndexMergePath generates IndexMerge AccessPaths on this DataSource.
5347
func (ds *DataSource) generateIndexMergePath() error {
5448
if ds.SCtx().GetSessionVars().StmtCtx.EnableOptimizerDebugTrace {

pkg/planner/core/optimizer.go

-11
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import (
4040
"github.com/pingcap/tidb/pkg/parser/mysql"
4141
"github.com/pingcap/tidb/pkg/planner/core/base"
4242
"github.com/pingcap/tidb/pkg/planner/property"
43-
plannerutil "github.com/pingcap/tidb/pkg/planner/util"
4443
"github.com/pingcap/tidb/pkg/planner/util/debugtrace"
4544
"github.com/pingcap/tidb/pkg/planner/util/optimizetrace"
4645
"github.com/pingcap/tidb/pkg/privilege"
@@ -1172,16 +1171,6 @@ func existsCartesianProduct(p base.LogicalPlan) bool {
11721171
// DefaultDisabledLogicalRulesList indicates the logical rules which should be banned.
11731172
var DefaultDisabledLogicalRulesList *atomic.Value
11741173

1175-
func init() {
1176-
expression.EvalSimpleAst = evalAstExpr
1177-
expression.BuildSimpleExpr = buildSimpleExpr
1178-
expression.DecodeKeyFromString = decodeKeyFromString
1179-
plannerutil.EvalAstExprWithPlanCtx = evalAstExprWithPlanCtx
1180-
plannerutil.RewriteAstExprWithPlanCtx = rewriteAstExprWithPlanCtx
1181-
DefaultDisabledLogicalRulesList = new(atomic.Value)
1182-
DefaultDisabledLogicalRulesList.Store(set.NewStringSet())
1183-
}
1184-
11851174
func disableReuseChunkIfNeeded(sctx base.PlanContext, plan base.PhysicalPlan) {
11861175
if !sctx.GetSessionVars().IsAllocValid() {
11871176
return

pkg/planner/core/plan.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,14 @@ import (
2727
"github.com/pingcap/tidb/pkg/planner/util"
2828
"github.com/pingcap/tidb/pkg/planner/util/costusage"
2929
"github.com/pingcap/tidb/pkg/planner/util/optimizetrace"
30+
"github.com/pingcap/tidb/pkg/planner/util/utilfuncp"
3031
"github.com/pingcap/tidb/pkg/sessionctx"
3132
"github.com/pingcap/tidb/pkg/types"
3233
"github.com/pingcap/tidb/pkg/util/execdetails"
3334
"github.com/pingcap/tidb/pkg/util/size"
3435
"github.com/pingcap/tidb/pkg/util/tracing"
3536
)
3637

37-
func init() {
38-
util.HasMaxOneRowUtil = HasMaxOneRow
39-
}
40-
4138
// AsSctx converts PlanContext to sessionctx.Context.
4239
func AsSctx(pctx base.PlanContext) (sessionctx.Context, error) {
4340
sctx, ok := pctx.(sessionctx.Context)
@@ -479,7 +476,7 @@ func (p *baseLogicalPlan) BuildKeyInfo(_ *expression.Schema, _ []*expression.Sch
479476
for i := range p.children {
480477
childMaxOneRow[i] = p.children[i].MaxOneRow()
481478
}
482-
p.maxOneRow = util.HasMaxOneRowUtil(p.self, childMaxOneRow)
479+
p.maxOneRow = utilfuncp.HasMaxOneRowUtil(p.self, childMaxOneRow)
483480
}
484481

485482
// BuildKeyInfo implements LogicalPlan BuildKeyInfo interface.

pkg/planner/core/stats.go

-5
Original file line numberDiff line numberDiff line change
@@ -217,11 +217,6 @@ func (ds *DataSource) getGroupNDVs(colGroups [][]*expression.Column) []property.
217217
return ndvs
218218
}
219219

220-
func init() {
221-
// To handle cycle import, we have to define this function here.
222-
cardinality.GetTblInfoForUsedStatsByPhysicalID = getTblInfoForUsedStatsByPhysicalID
223-
}
224-
225220
// getTblInfoForUsedStatsByPhysicalID get table name, partition name and HintedTable that will be used to record used stats.
226221
func getTblInfoForUsedStatsByPhysicalID(sctx base.PlanContext, id int64) (fullName string, tblInfo *model.TableInfo) {
227222
fullName = "tableID " + strconv.FormatInt(id, 10)

pkg/planner/memo/BUILD.bazel

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ go_library(
1616
"//pkg/planner/core/base",
1717
"//pkg/planner/pattern",
1818
"//pkg/planner/property",
19-
"//pkg/planner/util",
19+
"//pkg/planner/util/utilfuncp",
2020
],
2121
)
2222

pkg/planner/memo/group.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
"github.com/pingcap/tidb/pkg/planner/core/base"
2525
"github.com/pingcap/tidb/pkg/planner/pattern"
2626
"github.com/pingcap/tidb/pkg/planner/property"
27-
"github.com/pingcap/tidb/pkg/planner/util"
27+
"github.com/pingcap/tidb/pkg/planner/util/utilfuncp"
2828
)
2929

3030
// ExploreMark is uses to mark whether a Group or GroupExpr has
@@ -223,5 +223,5 @@ func (g *Group) BuildKeyInfo() {
223223
g.Prop.Schema.Keys = childSchema[0].Keys
224224
}
225225
e.ExprNode.BuildKeyInfo(g.Prop.Schema, childSchema)
226-
g.Prop.MaxOneRow = e.ExprNode.MaxOneRow() || util.HasMaxOneRowUtil(e.ExprNode, childMaxOneRow)
226+
g.Prop.MaxOneRow = e.ExprNode.MaxOneRow() || utilfuncp.HasMaxOneRowUtil(e.ExprNode, childMaxOneRow)
227227
}

pkg/planner/util/BUILD.bazel

-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ go_library(
55
srcs = [
66
"byitem.go",
77
"expression.go",
8-
"func_pointer_misc.go",
98
"handle_cols.go",
109
"misc.go",
1110
"null_misc.go",
@@ -20,7 +19,6 @@ go_library(
2019
"//pkg/parser/model",
2120
"//pkg/parser/mysql",
2221
"//pkg/planner/context",
23-
"//pkg/planner/core/base",
2422
"//pkg/sessionctx/stmtctx",
2523
"//pkg/tablecodec",
2624
"//pkg/types",
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
load("@io_bazel_rules_go//go:def.bzl", "go_library")
2+
3+
go_library(
4+
name = "utilfuncp",
5+
srcs = ["func_pointer_misc.go"],
6+
importpath = "github.com/pingcap/tidb/pkg/planner/util/utilfuncp",
7+
visibility = ["//visibility:public"],
8+
deps = [
9+
"//pkg/planner/core/base",
10+
"//pkg/planner/property",
11+
"//pkg/planner/util/optimizetrace",
12+
],
13+
)

pkg/planner/util/func_pointer_misc.go renamed to pkg/planner/util/utilfuncp/func_pointer_misc.go

+17-3
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,28 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
package util
15+
package utilfuncp
1616

17-
import "github.com/pingcap/tidb/pkg/planner/core/base"
17+
import (
18+
"github.com/pingcap/tidb/pkg/planner/core/base"
19+
"github.com/pingcap/tidb/pkg/planner/property"
20+
"github.com/pingcap/tidb/pkg/planner/util/optimizetrace"
21+
)
1822

1923
// this file is used for passing function pointer at init(){} to avoid some import cycles.
2024

2125
// HasMaxOneRowUtil is used in baseLogicalPlan implementation of LogicalPlan interface, while
2226
// the original HasMaxOneRowUtil has some dependency of original core pkg: like Datasource which
2327
// hasn't been moved out of core pkg, so associative func pointer is introduced.
24-
// todo: (1) arenatlx, remove this func pointer when concrete Logical Operators moved out.
28+
// todo: (1) arenatlx, remove this func pointer when concrete Logical Operators moved out of core.
2529
var HasMaxOneRowUtil func(p base.LogicalPlan, childMaxOneRow []bool) bool
30+
31+
// AppendCandidate4PhysicalOptimizeOp is used in all logicalOp's findBestTask to trace the physical
32+
// optimizing steps. Since we try to move baseLogicalPlan out of core, then other concrete logical
33+
// operators, this appendCandidate4PhysicalOptimizeOp will make logicalOp/pkg back import core/pkg;
34+
// if we move appendCandidate4PhysicalOptimizeOp together with baseLogicalPlan to logicalOp/pkg, it
35+
// will heavily depend on concrete other logical operators inside, which are still defined in core/pkg
36+
// too.
37+
// todo: (2) arenatlx, remove this func pointer when concrete Logical Operators moved out of core.
38+
var AppendCandidate4PhysicalOptimizeOp func(pop *optimizetrace.PhysicalOptimizeOp, lp base.LogicalPlan,
39+
pp base.PhysicalPlan, prop *property.PhysicalProperty)

0 commit comments

Comments
 (0)