From 7a378d5ce9f38a3b72159771bf50520958f3057d Mon Sep 17 00:00:00 2001 From: lzmhhh123 Date: Tue, 9 Jul 2019 14:34:37 +0800 Subject: [PATCH 01/10] fix ci --- executor/analyze_test.go | 2 +- executor/builder.go | 6 ++ executor/disabled_optimize_list.go | 70 +++++++++++++++++++ executor/disabled_optimize_list_test.go | 62 ++++++++++++++++ executor/reload_expr_pushdown_blacklist.go | 14 +++- .../reload_expr_pushdown_blacklist_test.go | 4 ++ expression/integration_test.go | 5 ++ go.mod | 3 +- go.sum | 7 +- planner/core/common_plans.go | 5 ++ planner/core/optimizer.go | 30 +++++++- planner/core/planbuilder.go | 2 + session/bootstrap.go | 17 +++++ session/session.go | 7 +- 14 files changed, 224 insertions(+), 10 deletions(-) create mode 100644 executor/disabled_optimize_list.go create mode 100644 executor/disabled_optimize_list_test.go diff --git a/executor/analyze_test.go b/executor/analyze_test.go index ec3d98e188d42..48b7970f659de 100644 --- a/executor/analyze_test.go +++ b/executor/analyze_test.go @@ -265,7 +265,7 @@ func (s *testSuite1) TestFastAnalyze(c *C) { c.Assert(err, IsNil) tableInfo := table.Meta() tbl := dom.StatsHandle().GetTableStats(tableInfo) - c.Assert(tbl.String(), Equals, "Table:41 Count:20\n"+ + c.Assert(tbl.String(), Equals, "Table:43 Count:20\n"+ "column:1 ndv:20 totColSize:0\n"+ "num: 6 lower_bound: 3 upper_bound: 15 repeats: 1\n"+ "num: 7 lower_bound: 18 upper_bound: 33 repeats: 1\n"+ diff --git a/executor/builder.go b/executor/builder.go index 94aa7fd37fdf4..3853bb367f906 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -108,6 +108,8 @@ func (b *executorBuilder) build(p plannercore.Plan) Executor { return b.buildChecksumTable(v) case *plannercore.ReloadExprPushdownBlacklist: return b.buildReloadExprPushdownBlacklist(v) + case *plannercore.ReloadDisabledOptimizeList: + return b.buildReloadDisabledOptimizeList(v) case *plannercore.AdminPlugins: return b.buildAdminPlugins(v) case *plannercore.DDL: @@ -469,6 +471,10 @@ func (b *executorBuilder) buildReloadExprPushdownBlacklist(v *plannercore.Reload return &ReloadExprPushdownBlacklistExec{baseExecutor{ctx: b.ctx}} } +func (b *executorBuilder) buildReloadDisabledOptimizeList(v *plannercore.ReloadDisabledOptimizeList) Executor { + return &ReloadDisabledOptimizeListExec{baseExecutor{ctx: b.ctx}} +} + func (b *executorBuilder) buildAdminPlugins(v *plannercore.AdminPlugins) Executor { return &AdminPluginsExec{baseExecutor: baseExecutor{ctx: b.ctx}, Action: v.Action, Plugins: v.Plugins} } diff --git a/executor/disabled_optimize_list.go b/executor/disabled_optimize_list.go new file mode 100644 index 0000000000000..ace42ad5471ba --- /dev/null +++ b/executor/disabled_optimize_list.go @@ -0,0 +1,70 @@ +// Copyright 2019 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package executor + +import ( + "context" + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/expression" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/sqlexec" +) + +// ReloadDisabledOptimizeListExec indicates ReloadDisabledOptimizeList executor. +type ReloadDisabledOptimizeListExec struct { + baseExecutor +} + +// Next implements the Executor Next interface. +func (e *ReloadDisabledOptimizeListExec) Next(ctx context.Context, _ *chunk.Chunk) error { + return LoadDisabledOptimizeList(e.ctx) +} + +// LoadDisabledOptimizeList loads the latest data from table mysql.disabled_optimize_list. +func LoadDisabledOptimizeList(ctx sessionctx.Context) (err error) { + sql := "select HIGH_PRIORITY name, type from mysql.disabled_optimize_list" + rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) + if err != nil { + return err + } + newExprPushdownBlacklist := make(map[string]struct{}) + newDisabledLogicalRules := make(map[string]struct{}) + // insertSQL is for compatibility with expr_pushdown_backlist + insertSQL := "insert into mysql.expr_pushdown_blacklist values" + defer func() { + insertLen := len(insertSQL) + insertSQL = insertSQL[:insertLen-1] + if insertSQL[insertLen-2] == ')' { + _, err = ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), insertSQL) + } + }() + for _, row := range rows { + name := strings.ToLower(row.GetString(0)) + if row.GetString(1) == "expr_push_down" { + insertSQL += "(\"" + name + "\")," + newExprPushdownBlacklist[name] = struct{}{} + } else if row.GetString(1) == "logical_rule" { + newDisabledLogicalRules[name] = struct{}{} + } else { + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("type field of mysql.disabled_optimize_list can only be \"expr_push_down\" or \"logical_rule\"")) + } + } + expression.DefaultExprPushdownBlacklist.Store(newExprPushdownBlacklist) + plannercore.DefaultDisabledLogicalRulesList.Store(newDisabledLogicalRules) + return nil +} diff --git a/executor/disabled_optimize_list_test.go b/executor/disabled_optimize_list_test.go new file mode 100644 index 0000000000000..8e05994388b2a --- /dev/null +++ b/executor/disabled_optimize_list_test.go @@ -0,0 +1,62 @@ +// Copyright 2019 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package executor_test + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/tidb/util/testkit" +) + +func (s *testSuite2) TestReloadDisabledOptimizeList(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("create database disabled_optimize_list") + tk.MustExec("use disabled_optimize_list") + tk.MustExec("create table t (a int)") + // test disable expr push down. + tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( + "TableReader_7 3323.33 root data:Selection_6", + "└─Selection_6 3323.33 cop lt(disabled_optimize_list.t.a, 1)", + " └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) + + tk.MustExec("insert into mysql.disabled_optimize_list values('lt', 'expr_push_down')") + tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( + "TableReader_7 3323.33 root data:Selection_6", + "└─Selection_6 3323.33 cop lt(disabled_optimize_list.t.a, 1)", + " └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) + + tk.MustExec("admin reload disabled_optimize_list") + tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( + "Selection_5 8000.00 root lt(disabled_optimize_list.t.a, 1)", + "└─TableReader_7 10000.00 root data:TableScan_6", + " └─TableScan_6 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) + + // test disable logical rule. + tk.MustExec("delete from mysql.disabled_optimize_list where name='lt'") + tk.MustExec("admin reload disabled_optimize_list") + tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( + "TableReader_7 3323.33 root data:Selection_6", + "└─Selection_6 3323.33 cop lt(disabled_optimize_list.t.a, 1)", + " └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) + + tk.MustExec("insert into mysql.disabled_optimize_list values('predicate_push_down', 'logical_rule')") + tk.MustExec("admin reload disabled_optimize_list") + tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( + "Selection_5 8000.00 root lt(disabled_optimize_list.t.a, 1)", + "└─TableReader_7 10000.00 root data:TableScan_6", + " └─TableScan_6 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) + + tk.MustExec("delete from mysql.disabled_optimize_list where name='predicate_push_down'") + tk.MustExec("delete from mysql.expr_pushdown_blacklist where name='lt'") + tk.MustExec("admin reload disabled_optimize_list") +} diff --git a/executor/reload_expr_pushdown_blacklist.go b/executor/reload_expr_pushdown_blacklist.go index e80a9ea9cf65e..1e81bd7d0280e 100644 --- a/executor/reload_expr_pushdown_blacklist.go +++ b/executor/reload_expr_pushdown_blacklist.go @@ -41,9 +41,19 @@ func LoadExprPushdownBlacklist(ctx sessionctx.Context) (err error) { return err } newBlacklist := make(map[string]struct{}) + // insertSQL is for compatibility with disabled_optimize_list + insertSQL := "insert into mysql.disabled_optimize_list values" + defer func() { + insertLen := len(insertSQL) + insertSQL = insertSQL[:insertLen-1] + if insertSQL[insertLen-2] == ')' { + _, err = ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), insertSQL) + } + }() for _, row := range rows { - name := row.GetString(0) - newBlacklist[strings.ToLower(name)] = struct{}{} + name := strings.ToLower(row.GetString(0)) + newBlacklist[name] = struct{}{} + insertSQL += "(\"" + name + "\", \"expr_push_down\")," } expression.DefaultExprPushdownBlacklist.Store(newBlacklist) return nil diff --git a/executor/reload_expr_pushdown_blacklist_test.go b/executor/reload_expr_pushdown_blacklist_test.go index a31c444511aec..d3e6b6f982ddb 100644 --- a/executor/reload_expr_pushdown_blacklist_test.go +++ b/executor/reload_expr_pushdown_blacklist_test.go @@ -39,4 +39,8 @@ func (s *testSuite2) TestReloadExprPushdownBlacklist(c *C) { "Selection_5 8000.00 root lt(expr_pushdown_blacklist.t.a, 1)", "└─TableReader_7 10000.00 root data:TableScan_6", " └─TableScan_6 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) + + tk.MustExec("delete from mysql.expr_pushdown_blacklist where name='lt'") + tk.MustExec("delete from mysql.disabled_optimize_list where name='lt'") + tk.MustExec("admin reload expr_pushdown_blacklist") } diff --git a/expression/integration_test.go b/expression/integration_test.go index f8ed485f7008b..a01a46e8c73dc 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -4405,6 +4405,11 @@ func (s *testIntegrationSuite) TestExprPushdownBlacklist(c *C) { tk.MustQuery(`select * from mysql.expr_pushdown_blacklist`).Check(testkit.Rows()) } +func (s *testIntegrationSuite) TestDisabledOptimizeList(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustQuery(`select * from mysql.disabled_optimize_list`).Check(testkit.Rows()) +} + func (s *testIntegrationSuite) TestIssue10804(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustQuery(`SELECT @@information_schema_stats_expiry`).Check(testkit.Rows(`86400`)) diff --git a/go.mod b/go.mod index 91aa99b647cee..42a4805a003ad 100644 --- a/go.mod +++ b/go.mod @@ -68,7 +68,6 @@ require ( golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e golang.org/x/sys v0.0.0-20190109145017-48ac38b7c8cb golang.org/x/text v0.3.0 - golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect golang.org/x/tools v0.0.0-20190130214255-bb1329dc71a0 google.golang.org/genproto v0.0.0-20190108161440-ae2f86662275 // indirect google.golang.org/grpc v1.17.0 @@ -76,3 +75,5 @@ require ( sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4 sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 ) + +replace github.com/pingcap/parser => github.com/lzmhhh123/parser v0.0.0-20190709035311-1c63a8565044 diff --git a/go.sum b/go.sum index 7757f3e24a50f..f05ba803160c9 100644 --- a/go.sum +++ b/go.sum @@ -115,6 +115,8 @@ github.com/kr/pty v1.0.0/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lzmhhh123/parser v0.0.0-20190709035311-1c63a8565044 h1:kupOk8/RoSZP0QTojff6OSu6TMRFCh5o1HnqLOhlwiU= +github.com/lzmhhh123/parser v0.0.0-20190709035311-1c63a8565044/go.mod h1:jAJeG3IoqLLgSO5YR1JwSt9rI4oTuWjj6hp1Id4d1wQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -164,8 +166,6 @@ github.com/pingcap/kvproto v0.0.0-20190703131923-d9830856b531/go.mod h1:QMdbTAXC github.com/pingcap/log v0.0.0-20190214045112-b37da76f67a7/go.mod h1:xsfkWVaFVV5B8e1K9seWfyJWFrIhbtUTAD8NV1Pq3+w= github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596 h1:t2OQTpPJnrPDGlvA+3FwJptMTt6MEPdzK1Wt99oaefQ= github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596/go.mod h1:WpHUKhNZ18v116SvGrmjkA9CBhYmuUTKL+p8JC9ANEw= -github.com/pingcap/parser v0.0.0-20190708123555-29973f7a22eb h1:jfhJo/D1bWMF+zVaVdmixWG5EnxbnFt99GS2pdxuToo= -github.com/pingcap/parser v0.0.0-20190708123555-29973f7a22eb/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= github.com/pingcap/pd v0.0.0-20190617100349-293d4b5189bf h1:vmlN6DpZI5LtHd8r9YRAsyCeTU2pxRq+WlWn5CZ+ax4= github.com/pingcap/pd v0.0.0-20190617100349-293d4b5189bf/go.mod h1:3DlDlFT7EF64A1bmb/tulZb6wbPSagm5G4p1AlhaEDs= github.com/pingcap/tidb-tools v2.1.3-0.20190321065848-1e8b48f5c168+incompatible h1:MkWCxgZpJBgY2f4HtwWMMFzSBb3+JPzeJgF3VrXE/bU= @@ -277,9 +277,8 @@ golang.org/x/sys v0.0.0-20190109145017-48ac38b7c8cb h1:1w588/yEchbPNpa9sEvOcMZYb golang.org/x/sys v0.0.0-20190109145017-48ac38b7c8cb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 h1:+DCIGbF/swA92ohVg0//6X2IVY3KZs6p9mix0ziNYJM= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190130214255-bb1329dc71a0 h1:iRpjPej1fPzmfoBhMFkp3HdqzF+ytPmAwiQhJGV0zGw= golang.org/x/tools v0.0.0-20190130214255-bb1329dc71a0/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/planner/core/common_plans.go b/planner/core/common_plans.go index 55a63915f9e3b..877520549fcdc 100644 --- a/planner/core/common_plans.go +++ b/planner/core/common_plans.go @@ -133,6 +133,11 @@ type ReloadExprPushdownBlacklist struct { baseSchemaProducer } +// ReloadDisabledOptimizeList reloads the data from disabled_optimize_list table. +type ReloadDisabledOptimizeList struct { + baseSchemaProducer +} + // AdminPluginsAction indicate action will be taken on plugins. type AdminPluginsAction int diff --git a/planner/core/optimizer.go b/planner/core/optimizer.go index d41dadde11710..b45b92471886f 100644 --- a/planner/core/optimizer.go +++ b/planner/core/optimizer.go @@ -65,6 +65,21 @@ var optRuleList = []logicalOptRule{ &joinReOrderSolver{}, } +var optRuleNames = []string{ + "column_prune", + "build_keys", + "decorrelate", + "aggregation_eliminate", + "projection_eliminate", + "max_min_eliminate", + "predicate_push_down", + "outer_join_eliminate", + "partition_processor", + "aggregation_push_down", + "topn_push_down", + "join_reorder", +} + // logicalOptRule means a logical optimizing rule, which contains decorrelate, ppd, column pruning, etc. type logicalOptRule interface { optimize(LogicalPlan) (LogicalPlan, error) @@ -143,7 +158,7 @@ func logicalOptimize(flag uint64, logic LogicalPlan) (LogicalPlan, error) { // The order of flags is same as the order of optRule in the list. // We use a bitmask to record which opt rules should be used. If the i-th bit is 1, it means we should // apply i-th optimizing rule. - if flag&(1<= len(optRuleNames) { + return false + } + _, disabled := DefaultDisabledLogicalRulesList.Load().(map[string]struct{})[optRuleNames[i]] + return disabled +} + func physicalOptimize(logic LogicalPlan) (PhysicalPlan, error) { if _, err := logic.recursiveDeriveStats(); err != nil { return nil, err @@ -190,6 +213,11 @@ func existsCartesianProduct(p LogicalPlan) bool { return false } +// DefaultDisabledLogicalRulesList indicates the logical rules which should be banned. +var DefaultDisabledLogicalRulesList *atomic.Value + func init() { expression.EvalAstExpr = evalAstExpr + DefaultDisabledLogicalRulesList = new(atomic.Value) + DefaultDisabledLogicalRulesList.Store(make(map[string]struct{})) } diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 5a4688b8fe0e6..8a5bbdb0a82a5 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -673,6 +673,8 @@ func (b *PlanBuilder) buildAdmin(as *ast.AdminStmt) (Plan, error) { ret = p case ast.AdminReloadExprPushdownBlacklist: return &ReloadExprPushdownBlacklist{}, nil + case ast.AdminReloadDisabledOptimizeList: + return &ReloadDisabledOptimizeList{}, nil case ast.AdminPluginEnable: return &AdminPlugins{Action: Enable, Plugins: as.Plugins}, nil case ast.AdminPluginDisable: diff --git a/session/bootstrap.go b/session/bootstrap.go index 05bcf34ce4a66..e42b845b9918f 100644 --- a/session/bootstrap.go +++ b/session/bootstrap.go @@ -264,6 +264,12 @@ const ( CreateExprPushdownBlacklist = `CREATE TABLE IF NOT EXISTS mysql.expr_pushdown_blacklist ( name char(100) NOT NULL );` + + // CreateDisabledOptimizeList stores the list of disabled optimizing operations. + CreateDisabledOptimizeList = `CREATE TABLE IF NOT EXISTS mysql.disabled_optimize_list ( + name char(100) NOT NULL, + type char(20) check(type="expr_push_down" or type="logical_rule") NOT NULL + );` ) // bootstrap initiates system DB for a store. @@ -342,6 +348,7 @@ const ( version31 = 31 version32 = 32 version33 = 33 + version34 = 34 ) func checkBootstrapped(s Session) (bool, error) { @@ -533,6 +540,10 @@ func upgrade(s Session) { upgradeToVer33(s) } + if ver < version34 { + upgradeToVer34(s) + } + updateBootstrapVer(s) _, err = s.Execute(context.Background(), "COMMIT") @@ -839,6 +850,10 @@ func upgradeToVer33(s Session) { doReentrantDDL(s, CreateExprPushdownBlacklist) } +func upgradeToVer34(s Session) { + doReentrantDDL(s, CreateDisabledOptimizeList) +} + // updateBootstrapVer updates bootstrap version variable in mysql.TiDB table. func updateBootstrapVer(s Session) { // Update bootstrap version. @@ -899,6 +914,8 @@ func doDDLWorks(s Session) { mustExecute(s, CreateStatsTopNTable) // Create expr_pushdown_blacklist table. mustExecute(s, CreateExprPushdownBlacklist) + // Create disabled_optimize_list table. + mustExecute(s, CreateDisabledOptimizeList) } // doDMLWorks executes DML statements in bootstrap stage. diff --git a/session/session.go b/session/session.go index 0d63d84bf7b16..9184ed1d74522 100644 --- a/session/session.go +++ b/session/session.go @@ -1491,6 +1491,11 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { return nil, err } + err = executor.LoadDisabledOptimizeList(se) + if err != nil { + return nil, err + } + se1, err := createSession(store) if err != nil { return nil, err @@ -1593,7 +1598,7 @@ func createSessionWithDomain(store kv.Storage, dom *domain.Domain) (*session, er const ( notBootstrapped = 0 - currentBootstrapVersion = 33 + currentBootstrapVersion = 34 ) func getStoreBootstrapVersion(store kv.Storage) int64 { From d2fce65fea5c53656bccd0c1ca0e0ddff746819d Mon Sep 17 00:00:00 2001 From: lzmhhh123 Date: Tue, 16 Jul 2019 11:27:45 +0800 Subject: [PATCH 02/10] change disabled_optimize_list to opt_rule_blacklist --- executor/builder.go | 8 ++--- ...optimize_list.go => opt_rule_blacklist.go} | 33 +++++-------------- ...ist_test.go => opt_rule_blacklist_test.go} | 32 +++++++++--------- executor/reload_expr_pushdown_blacklist.go | 10 ------ .../reload_expr_pushdown_blacklist_test.go | 1 - expression/integration_test.go | 4 +-- go.mod | 2 +- go.sum | 2 ++ planner/core/common_plans.go | 4 +-- planner/core/planbuilder.go | 4 +-- session/bootstrap.go | 12 +++---- session/session.go | 2 +- 12 files changed, 45 insertions(+), 69 deletions(-) rename executor/{disabled_optimize_list.go => opt_rule_blacklist.go} (50%) rename executor/{disabled_optimize_list_test.go => opt_rule_blacklist_test.go} (64%) diff --git a/executor/builder.go b/executor/builder.go index 3853bb367f906..a1f9ad5e2ca09 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -108,8 +108,8 @@ func (b *executorBuilder) build(p plannercore.Plan) Executor { return b.buildChecksumTable(v) case *plannercore.ReloadExprPushdownBlacklist: return b.buildReloadExprPushdownBlacklist(v) - case *plannercore.ReloadDisabledOptimizeList: - return b.buildReloadDisabledOptimizeList(v) + case *plannercore.ReloadOptRuleBlacklist: + return b.buildReloadOptRuleBlacklist(v) case *plannercore.AdminPlugins: return b.buildAdminPlugins(v) case *plannercore.DDL: @@ -471,8 +471,8 @@ func (b *executorBuilder) buildReloadExprPushdownBlacklist(v *plannercore.Reload return &ReloadExprPushdownBlacklistExec{baseExecutor{ctx: b.ctx}} } -func (b *executorBuilder) buildReloadDisabledOptimizeList(v *plannercore.ReloadDisabledOptimizeList) Executor { - return &ReloadDisabledOptimizeListExec{baseExecutor{ctx: b.ctx}} +func (b *executorBuilder) buildReloadOptRuleBlacklist(v *plannercore.ReloadOptRuleBlacklist) Executor { + return &ReloadOptRuleBlacklistExec{baseExecutor{ctx: b.ctx}} } func (b *executorBuilder) buildAdminPlugins(v *plannercore.AdminPlugins) Executor { diff --git a/executor/disabled_optimize_list.go b/executor/opt_rule_blacklist.go similarity index 50% rename from executor/disabled_optimize_list.go rename to executor/opt_rule_blacklist.go index ace42ad5471ba..48741d53a0506 100644 --- a/executor/disabled_optimize_list.go +++ b/executor/opt_rule_blacklist.go @@ -18,53 +18,38 @@ import ( "strings" "github.com/pingcap/errors" - "github.com/pingcap/tidb/expression" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/sqlexec" ) -// ReloadDisabledOptimizeListExec indicates ReloadDisabledOptimizeList executor. -type ReloadDisabledOptimizeListExec struct { +// ReloadOptRuleBlacklistExec indicates ReloadOptRuleBlacklist executor. +type ReloadOptRuleBlacklistExec struct { baseExecutor } // Next implements the Executor Next interface. -func (e *ReloadDisabledOptimizeListExec) Next(ctx context.Context, _ *chunk.Chunk) error { - return LoadDisabledOptimizeList(e.ctx) +func (e *ReloadOptRuleBlacklistExec) Next(ctx context.Context, _ *chunk.Chunk) error { + return LoadOptRuleBlacklist(e.ctx) } -// LoadDisabledOptimizeList loads the latest data from table mysql.disabled_optimize_list. -func LoadDisabledOptimizeList(ctx sessionctx.Context) (err error) { - sql := "select HIGH_PRIORITY name, type from mysql.disabled_optimize_list" +// LoadOptRuleBlacklist loads the latest data from table mysql.opt_rule_blacklist. +func LoadOptRuleBlacklist(ctx sessionctx.Context) (err error) { + sql := "select HIGH_PRIORITY name, type from mysql.opt_rule_blacklist" rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) if err != nil { return err } - newExprPushdownBlacklist := make(map[string]struct{}) newDisabledLogicalRules := make(map[string]struct{}) - // insertSQL is for compatibility with expr_pushdown_backlist - insertSQL := "insert into mysql.expr_pushdown_blacklist values" - defer func() { - insertLen := len(insertSQL) - insertSQL = insertSQL[:insertLen-1] - if insertSQL[insertLen-2] == ')' { - _, err = ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), insertSQL) - } - }() for _, row := range rows { name := strings.ToLower(row.GetString(0)) - if row.GetString(1) == "expr_push_down" { - insertSQL += "(\"" + name + "\")," - newExprPushdownBlacklist[name] = struct{}{} - } else if row.GetString(1) == "logical_rule" { + if row.GetString(1) == "logical_rule" { newDisabledLogicalRules[name] = struct{}{} } else { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("type field of mysql.disabled_optimize_list can only be \"expr_push_down\" or \"logical_rule\"")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("type field of mysql.opt_rule_blacklist can only be \"expr_push_down\" or \"logical_rule\"")) } } - expression.DefaultExprPushdownBlacklist.Store(newExprPushdownBlacklist) plannercore.DefaultDisabledLogicalRulesList.Store(newDisabledLogicalRules) return nil } diff --git a/executor/disabled_optimize_list_test.go b/executor/opt_rule_blacklist_test.go similarity index 64% rename from executor/disabled_optimize_list_test.go rename to executor/opt_rule_blacklist_test.go index 8e05994388b2a..86b8e946d0ae5 100644 --- a/executor/disabled_optimize_list_test.go +++ b/executor/opt_rule_blacklist_test.go @@ -18,45 +18,45 @@ import ( "github.com/pingcap/tidb/util/testkit" ) -func (s *testSuite2) TestReloadDisabledOptimizeList(c *C) { +func (s *testSuite2) TestReloadOptRuleBlacklist(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustExec("create database disabled_optimize_list") - tk.MustExec("use disabled_optimize_list") + tk.MustExec("create database opt_rule_blacklist") + tk.MustExec("use opt_rule_blacklist") tk.MustExec("create table t (a int)") // test disable expr push down. tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( "TableReader_7 3323.33 root data:Selection_6", - "└─Selection_6 3323.33 cop lt(disabled_optimize_list.t.a, 1)", + "└─Selection_6 3323.33 cop lt(opt_rule_blacklist.t.a, 1)", " └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - tk.MustExec("insert into mysql.disabled_optimize_list values('lt', 'expr_push_down')") + tk.MustExec("insert into mysql.opt_rule_blacklist values('lt', 'expr_push_down')") tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( "TableReader_7 3323.33 root data:Selection_6", - "└─Selection_6 3323.33 cop lt(disabled_optimize_list.t.a, 1)", + "└─Selection_6 3323.33 cop lt(opt_rule_blacklist.t.a, 1)", " └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - tk.MustExec("admin reload disabled_optimize_list") + tk.MustExec("admin reload opt_rule_blacklist") tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( - "Selection_5 8000.00 root lt(disabled_optimize_list.t.a, 1)", + "Selection_5 8000.00 root lt(opt_rule_blacklist.t.a, 1)", "└─TableReader_7 10000.00 root data:TableScan_6", " └─TableScan_6 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) // test disable logical rule. - tk.MustExec("delete from mysql.disabled_optimize_list where name='lt'") - tk.MustExec("admin reload disabled_optimize_list") + tk.MustExec("delete from mysql.opt_rule_blacklist where name='lt'") + tk.MustExec("admin reload opt_rule_blacklist") tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( "TableReader_7 3323.33 root data:Selection_6", - "└─Selection_6 3323.33 cop lt(disabled_optimize_list.t.a, 1)", + "└─Selection_6 3323.33 cop lt(opt_rule_blacklist.t.a, 1)", " └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - tk.MustExec("insert into mysql.disabled_optimize_list values('predicate_push_down', 'logical_rule')") - tk.MustExec("admin reload disabled_optimize_list") + tk.MustExec("insert into mysql.opt_rule_blacklist values('predicate_push_down', 'logical_rule')") + tk.MustExec("admin reload opt_rule_blacklist") tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( - "Selection_5 8000.00 root lt(disabled_optimize_list.t.a, 1)", + "Selection_5 8000.00 root lt(opt_rule_blacklist.t.a, 1)", "└─TableReader_7 10000.00 root data:TableScan_6", " └─TableScan_6 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - tk.MustExec("delete from mysql.disabled_optimize_list where name='predicate_push_down'") + tk.MustExec("delete from mysql.opt_rule_blacklist where name='predicate_push_down'") tk.MustExec("delete from mysql.expr_pushdown_blacklist where name='lt'") - tk.MustExec("admin reload disabled_optimize_list") + tk.MustExec("admin reload opt_rule_blacklist") } diff --git a/executor/reload_expr_pushdown_blacklist.go b/executor/reload_expr_pushdown_blacklist.go index 1e81bd7d0280e..f83839fb8b62e 100644 --- a/executor/reload_expr_pushdown_blacklist.go +++ b/executor/reload_expr_pushdown_blacklist.go @@ -41,19 +41,9 @@ func LoadExprPushdownBlacklist(ctx sessionctx.Context) (err error) { return err } newBlacklist := make(map[string]struct{}) - // insertSQL is for compatibility with disabled_optimize_list - insertSQL := "insert into mysql.disabled_optimize_list values" - defer func() { - insertLen := len(insertSQL) - insertSQL = insertSQL[:insertLen-1] - if insertSQL[insertLen-2] == ')' { - _, err = ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), insertSQL) - } - }() for _, row := range rows { name := strings.ToLower(row.GetString(0)) newBlacklist[name] = struct{}{} - insertSQL += "(\"" + name + "\", \"expr_push_down\")," } expression.DefaultExprPushdownBlacklist.Store(newBlacklist) return nil diff --git a/executor/reload_expr_pushdown_blacklist_test.go b/executor/reload_expr_pushdown_blacklist_test.go index d3e6b6f982ddb..1f5882f35cfd1 100644 --- a/executor/reload_expr_pushdown_blacklist_test.go +++ b/executor/reload_expr_pushdown_blacklist_test.go @@ -41,6 +41,5 @@ func (s *testSuite2) TestReloadExprPushdownBlacklist(c *C) { " └─TableScan_6 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) tk.MustExec("delete from mysql.expr_pushdown_blacklist where name='lt'") - tk.MustExec("delete from mysql.disabled_optimize_list where name='lt'") tk.MustExec("admin reload expr_pushdown_blacklist") } diff --git a/expression/integration_test.go b/expression/integration_test.go index a01a46e8c73dc..cfca4751ab52f 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -4405,9 +4405,9 @@ func (s *testIntegrationSuite) TestExprPushdownBlacklist(c *C) { tk.MustQuery(`select * from mysql.expr_pushdown_blacklist`).Check(testkit.Rows()) } -func (s *testIntegrationSuite) TestDisabledOptimizeList(c *C) { +func (s *testIntegrationSuite) TestOptRuleBlacklist(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustQuery(`select * from mysql.disabled_optimize_list`).Check(testkit.Rows()) + tk.MustQuery(`select * from mysql.opt_rule_blacklist`).Check(testkit.Rows()) } func (s *testIntegrationSuite) TestIssue10804(c *C) { diff --git a/go.mod b/go.mod index 42a4805a003ad..e6090138bab9c 100644 --- a/go.mod +++ b/go.mod @@ -76,4 +76,4 @@ require ( sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 ) -replace github.com/pingcap/parser => github.com/lzmhhh123/parser v0.0.0-20190709035311-1c63a8565044 +replace github.com/pingcap/parser => github.com/lzmhhh123/parser v0.0.0-20190716031104-9774378c7bb7 diff --git a/go.sum b/go.sum index f05ba803160c9..4d2c525749ad0 100644 --- a/go.sum +++ b/go.sum @@ -117,6 +117,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lzmhhh123/parser v0.0.0-20190709035311-1c63a8565044 h1:kupOk8/RoSZP0QTojff6OSu6TMRFCh5o1HnqLOhlwiU= github.com/lzmhhh123/parser v0.0.0-20190709035311-1c63a8565044/go.mod h1:jAJeG3IoqLLgSO5YR1JwSt9rI4oTuWjj6hp1Id4d1wQ= +github.com/lzmhhh123/parser v0.0.0-20190716031104-9774378c7bb7 h1:BFjIOLXQsSUlU2Km7VvXbsP6/exVF+dKLclwgXsqfHY= +github.com/lzmhhh123/parser v0.0.0-20190716031104-9774378c7bb7/go.mod h1:jAJeG3IoqLLgSO5YR1JwSt9rI4oTuWjj6hp1Id4d1wQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= diff --git a/planner/core/common_plans.go b/planner/core/common_plans.go index 877520549fcdc..6a35207fff1e4 100644 --- a/planner/core/common_plans.go +++ b/planner/core/common_plans.go @@ -133,8 +133,8 @@ type ReloadExprPushdownBlacklist struct { baseSchemaProducer } -// ReloadDisabledOptimizeList reloads the data from disabled_optimize_list table. -type ReloadDisabledOptimizeList struct { +// ReloadOptRuleBlacklist reloads the data from opt_rule_blacklist table. +type ReloadOptRuleBlacklist struct { baseSchemaProducer } diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 8a5bbdb0a82a5..3493c6751157c 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -673,8 +673,8 @@ func (b *PlanBuilder) buildAdmin(as *ast.AdminStmt) (Plan, error) { ret = p case ast.AdminReloadExprPushdownBlacklist: return &ReloadExprPushdownBlacklist{}, nil - case ast.AdminReloadDisabledOptimizeList: - return &ReloadDisabledOptimizeList{}, nil + case ast.AdminReloadOptRuleBlacklist: + return &ReloadOptRuleBlacklist{}, nil case ast.AdminPluginEnable: return &AdminPlugins{Action: Enable, Plugins: as.Plugins}, nil case ast.AdminPluginDisable: diff --git a/session/bootstrap.go b/session/bootstrap.go index e42b845b9918f..6f9b4d8df7894 100644 --- a/session/bootstrap.go +++ b/session/bootstrap.go @@ -265,10 +265,10 @@ const ( name char(100) NOT NULL );` - // CreateDisabledOptimizeList stores the list of disabled optimizing operations. - CreateDisabledOptimizeList = `CREATE TABLE IF NOT EXISTS mysql.disabled_optimize_list ( + // CreateOptRuleBlacklist stores the list of disabled optimizing operations. + CreateOptRuleBlacklist = `CREATE TABLE IF NOT EXISTS mysql.opt_rule_blacklist ( name char(100) NOT NULL, - type char(20) check(type="expr_push_down" or type="logical_rule") NOT NULL + type char(20) check(type="logical_rule") NOT NULL );` ) @@ -851,7 +851,7 @@ func upgradeToVer33(s Session) { } func upgradeToVer34(s Session) { - doReentrantDDL(s, CreateDisabledOptimizeList) + doReentrantDDL(s, CreateOptRuleBlacklist) } // updateBootstrapVer updates bootstrap version variable in mysql.TiDB table. @@ -914,8 +914,8 @@ func doDDLWorks(s Session) { mustExecute(s, CreateStatsTopNTable) // Create expr_pushdown_blacklist table. mustExecute(s, CreateExprPushdownBlacklist) - // Create disabled_optimize_list table. - mustExecute(s, CreateDisabledOptimizeList) + // Create opt_rule_blacklist table. + mustExecute(s, CreateOptRuleBlacklist) } // doDMLWorks executes DML statements in bootstrap stage. diff --git a/session/session.go b/session/session.go index 9184ed1d74522..3f25b27223f4e 100644 --- a/session/session.go +++ b/session/session.go @@ -1491,7 +1491,7 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { return nil, err } - err = executor.LoadDisabledOptimizeList(se) + err = executor.LoadOptRuleBlacklist(se) if err != nil { return nil, err } From c93b17842315aa085688cb63891d50485e026524 Mon Sep 17 00:00:00 2001 From: lzmhhh123 Date: Wed, 17 Jul 2019 20:08:53 +0800 Subject: [PATCH 03/10] fix go.mod --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index e6090138bab9c..bec827e8c3cb2 100644 --- a/go.mod +++ b/go.mod @@ -76,4 +76,4 @@ require ( sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 ) -replace github.com/pingcap/parser => github.com/lzmhhh123/parser v0.0.0-20190716031104-9774378c7bb7 +replace github.com/pingcap/parser => github.com/pingcap/parser v0.0.0-20190716105515-ded7e0436a50 diff --git a/go.sum b/go.sum index 4d2c525749ad0..37e89caa7e3ff 100644 --- a/go.sum +++ b/go.sum @@ -168,6 +168,8 @@ github.com/pingcap/kvproto v0.0.0-20190703131923-d9830856b531/go.mod h1:QMdbTAXC github.com/pingcap/log v0.0.0-20190214045112-b37da76f67a7/go.mod h1:xsfkWVaFVV5B8e1K9seWfyJWFrIhbtUTAD8NV1Pq3+w= github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596 h1:t2OQTpPJnrPDGlvA+3FwJptMTt6MEPdzK1Wt99oaefQ= github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596/go.mod h1:WpHUKhNZ18v116SvGrmjkA9CBhYmuUTKL+p8JC9ANEw= +github.com/pingcap/parser v0.0.0-20190716105515-ded7e0436a50 h1:tcE49c/+/GiFAqNEiO03KDIA3MOD9eu1zgGrtncPm10= +github.com/pingcap/parser v0.0.0-20190716105515-ded7e0436a50/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= github.com/pingcap/pd v0.0.0-20190617100349-293d4b5189bf h1:vmlN6DpZI5LtHd8r9YRAsyCeTU2pxRq+WlWn5CZ+ax4= github.com/pingcap/pd v0.0.0-20190617100349-293d4b5189bf/go.mod h1:3DlDlFT7EF64A1bmb/tulZb6wbPSagm5G4p1AlhaEDs= github.com/pingcap/tidb-tools v2.1.3-0.20190321065848-1e8b48f5c168+incompatible h1:MkWCxgZpJBgY2f4HtwWMMFzSBb3+JPzeJgF3VrXE/bU= From 39f12fa7dea3d15032b4e926bf3a9f64b7857f15 Mon Sep 17 00:00:00 2001 From: lzmhhh123 Date: Wed, 17 Jul 2019 21:46:10 +0800 Subject: [PATCH 04/10] address comment --- executor/opt_rule_blacklist.go | 5 +++-- go.sum | 4 ---- planner/core/optimizer.go | 3 ++- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/executor/opt_rule_blacklist.go b/executor/opt_rule_blacklist.go index 48741d53a0506..81c7d8c916116 100644 --- a/executor/opt_rule_blacklist.go +++ b/executor/opt_rule_blacklist.go @@ -21,6 +21,7 @@ import ( plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/set" "github.com/pingcap/tidb/util/sqlexec" ) @@ -41,11 +42,11 @@ func LoadOptRuleBlacklist(ctx sessionctx.Context) (err error) { if err != nil { return err } - newDisabledLogicalRules := make(map[string]struct{}) + newDisabledLogicalRules := set.NewStringSet() for _, row := range rows { name := strings.ToLower(row.GetString(0)) if row.GetString(1) == "logical_rule" { - newDisabledLogicalRules[name] = struct{}{} + newDisabledLogicalRules.Insert(name) } else { ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("type field of mysql.opt_rule_blacklist can only be \"expr_push_down\" or \"logical_rule\"")) } diff --git a/go.sum b/go.sum index 37e89caa7e3ff..22d4a2ef8337b 100644 --- a/go.sum +++ b/go.sum @@ -115,10 +115,6 @@ github.com/kr/pty v1.0.0/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lzmhhh123/parser v0.0.0-20190709035311-1c63a8565044 h1:kupOk8/RoSZP0QTojff6OSu6TMRFCh5o1HnqLOhlwiU= -github.com/lzmhhh123/parser v0.0.0-20190709035311-1c63a8565044/go.mod h1:jAJeG3IoqLLgSO5YR1JwSt9rI4oTuWjj6hp1Id4d1wQ= -github.com/lzmhhh123/parser v0.0.0-20190716031104-9774378c7bb7 h1:BFjIOLXQsSUlU2Km7VvXbsP6/exVF+dKLclwgXsqfHY= -github.com/lzmhhh123/parser v0.0.0-20190716031104-9774378c7bb7/go.mod h1:jAJeG3IoqLLgSO5YR1JwSt9rI4oTuWjj6hp1Id4d1wQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= diff --git a/planner/core/optimizer.go b/planner/core/optimizer.go index b45b92471886f..cc48c0a1214ef 100644 --- a/planner/core/optimizer.go +++ b/planner/core/optimizer.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/set" "go.uber.org/atomic" ) @@ -219,5 +220,5 @@ var DefaultDisabledLogicalRulesList *atomic.Value func init() { expression.EvalAstExpr = evalAstExpr DefaultDisabledLogicalRulesList = new(atomic.Value) - DefaultDisabledLogicalRulesList.Store(make(map[string]struct{})) + DefaultDisabledLogicalRulesList.Store(set.NewStringSet()) } From cfa215158dea48c7c6073ee633a48313b2079861 Mon Sep 17 00:00:00 2001 From: lzmhhh123 Date: Thu, 18 Jul 2019 13:36:24 +0800 Subject: [PATCH 05/10] add name() field for logical rule --- executor/opt_rule_blacklist_test.go | 19 --------------- go.sum | 2 ++ planner/core/optimizer.go | 25 ++++---------------- planner/core/rule_aggregation_elimination.go | 4 ++++ planner/core/rule_aggregation_push_down.go | 4 ++++ planner/core/rule_build_key_info.go | 4 ++++ planner/core/rule_column_pruning.go | 4 ++++ planner/core/rule_decorrelate.go | 4 ++++ planner/core/rule_eliminate_projection.go | 4 ++++ planner/core/rule_join_elimination.go | 4 ++++ planner/core/rule_join_reorder.go | 4 ++++ planner/core/rule_max_min_eliminate.go | 4 ++++ planner/core/rule_partition_processor.go | 4 ++++ planner/core/rule_predicate_push_down.go | 4 ++++ planner/core/rule_topn_push_down.go | 4 ++++ 15 files changed, 54 insertions(+), 40 deletions(-) diff --git a/executor/opt_rule_blacklist_test.go b/executor/opt_rule_blacklist_test.go index 86b8e946d0ae5..9cfbef4dfc740 100644 --- a/executor/opt_rule_blacklist_test.go +++ b/executor/opt_rule_blacklist_test.go @@ -23,27 +23,8 @@ func (s *testSuite2) TestReloadOptRuleBlacklist(c *C) { tk.MustExec("create database opt_rule_blacklist") tk.MustExec("use opt_rule_blacklist") tk.MustExec("create table t (a int)") - // test disable expr push down. - tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( - "TableReader_7 3323.33 root data:Selection_6", - "└─Selection_6 3323.33 cop lt(opt_rule_blacklist.t.a, 1)", - " └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - - tk.MustExec("insert into mysql.opt_rule_blacklist values('lt', 'expr_push_down')") - tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( - "TableReader_7 3323.33 root data:Selection_6", - "└─Selection_6 3323.33 cop lt(opt_rule_blacklist.t.a, 1)", - " └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - - tk.MustExec("admin reload opt_rule_blacklist") - tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( - "Selection_5 8000.00 root lt(opt_rule_blacklist.t.a, 1)", - "└─TableReader_7 10000.00 root data:TableScan_6", - " └─TableScan_6 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) // test disable logical rule. - tk.MustExec("delete from mysql.opt_rule_blacklist where name='lt'") - tk.MustExec("admin reload opt_rule_blacklist") tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( "TableReader_7 3323.33 root data:Selection_6", "└─Selection_6 3323.33 cop lt(opt_rule_blacklist.t.a, 1)", diff --git a/go.sum b/go.sum index ac21cc365ab48..8369b6dd5184b 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,7 @@ github.com/blacktear23/go-proxyprotocol v0.0.0-20180807104634-af7a81e8dd0d/go.mo github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= @@ -191,6 +192,7 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d h1:GoAlyOgbOEIFd github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7 h1:FUL3b97ZY2EPqg2NbXKuMHs5pXJB9hjj1fDHnF2vl28= github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44 h1:tB9NOR21++IjLyVx3/PCPhWMwqGNCMQEH96A6dMZ/gc= github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v2.18.10+incompatible h1:cy84jW6EVRPa5g9HAHrlbxMSIjBhDSX0OFYyMYminYs= github.com/shirou/gopsutil v2.18.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= diff --git a/planner/core/optimizer.go b/planner/core/optimizer.go index d063a38bba76c..f164dbb5a92a4 100644 --- a/planner/core/optimizer.go +++ b/planner/core/optimizer.go @@ -66,24 +66,10 @@ var optRuleList = []logicalOptRule{ &joinReOrderSolver{}, } -var optRuleNames = []string{ - "column_prune", - "build_keys", - "decorrelate", - "aggregation_eliminate", - "projection_eliminate", - "max_min_eliminate", - "predicate_push_down", - "outer_join_eliminate", - "partition_processor", - "aggregation_push_down", - "topn_push_down", - "join_reorder", -} - // logicalOptRule means a logical optimizing rule, which contains decorrelate, ppd, column pruning, etc. type logicalOptRule interface { optimize(LogicalPlan) (LogicalPlan, error) + name() string } // BuildLogicalPlan used to build logical plan from ast.Node. @@ -155,7 +141,7 @@ func logicalOptimize(flag uint64, logic LogicalPlan) (LogicalPlan, error) { // The order of flags is same as the order of optRule in the list. // We use a bitmask to record which opt rules should be used. If the i-th bit is 1, it means we should // apply i-th optimizing rule. - if flag&(1<= len(optRuleNames) { - return false - } - _, disabled := DefaultDisabledLogicalRulesList.Load().(map[string]struct{})[optRuleNames[i]] +func isLogicalRuleDisabled(r logicalOptRule) bool { + disabled := DefaultDisabledLogicalRulesList.Load().(set.StringSet).Exist(r.name()) return disabled } diff --git a/planner/core/rule_aggregation_elimination.go b/planner/core/rule_aggregation_elimination.go index 95b2f7449e407..84249a61419e3 100644 --- a/planner/core/rule_aggregation_elimination.go +++ b/planner/core/rule_aggregation_elimination.go @@ -155,3 +155,7 @@ func (a *aggregationEliminator) optimize(p LogicalPlan) (LogicalPlan, error) { } return p, nil } + +func (*aggregationEliminator) name() string { + return "aggregation_eliminate" +} diff --git a/planner/core/rule_aggregation_push_down.go b/planner/core/rule_aggregation_push_down.go index 7164ad3b0c189..4cc3556084cb2 100644 --- a/planner/core/rule_aggregation_push_down.go +++ b/planner/core/rule_aggregation_push_down.go @@ -404,3 +404,7 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan) (_ LogicalPlan, e p.SetChildren(newChildren...) return p, nil } + +func (*aggregationPushDownSolver) name() string { + return "aggregation_push_down" +} diff --git a/planner/core/rule_build_key_info.go b/planner/core/rule_build_key_info.go index 92c2e67a99bf0..dca0da8094d15 100644 --- a/planner/core/rule_build_key_info.go +++ b/planner/core/rule_build_key_info.go @@ -218,3 +218,7 @@ func (ds *DataSource) buildKeyInfo() { } } } + +func (*buildKeySolver) name() string { + return "build_keys" +} diff --git a/planner/core/rule_column_pruning.go b/planner/core/rule_column_pruning.go index 1f4873618203f..b2442a566c1f7 100644 --- a/planner/core/rule_column_pruning.go +++ b/planner/core/rule_column_pruning.go @@ -412,3 +412,7 @@ func (p *LogicalWindow) extractUsedCols(parentUsedCols []*expression.Column) []* } return parentUsedCols } + +func (*columnPruner) name() string { + return "column_prune" +} diff --git a/planner/core/rule_decorrelate.go b/planner/core/rule_decorrelate.go index 4b127755582ce..e7c2f734de649 100644 --- a/planner/core/rule_decorrelate.go +++ b/planner/core/rule_decorrelate.go @@ -255,3 +255,7 @@ func (s *decorrelateSolver) optimize(p LogicalPlan) (LogicalPlan, error) { p.SetChildren(newChildren...) return p, nil } + +func (*decorrelateSolver) name() string { + return "decorrelate" +} diff --git a/planner/core/rule_eliminate_projection.go b/planner/core/rule_eliminate_projection.go index 5e72fdafe204b..05ff34c100fc8 100644 --- a/planner/core/rule_eliminate_projection.go +++ b/planner/core/rule_eliminate_projection.go @@ -220,3 +220,7 @@ func (p *LogicalWindow) replaceExprColumns(replace map[string]*expression.Column resolveColumnAndReplace(item.Col, replace) } } + +func (*projectionEliminater) name() string { + return "projection_eliminate" +} diff --git a/planner/core/rule_join_elimination.go b/planner/core/rule_join_elimination.go index 983da726cdd01..42d6d06014180 100644 --- a/planner/core/rule_join_elimination.go +++ b/planner/core/rule_join_elimination.go @@ -208,3 +208,7 @@ func (o *outerJoinEliminator) doOptimize(p LogicalPlan, aggCols []*expression.Co func (o *outerJoinEliminator) optimize(p LogicalPlan) (LogicalPlan, error) { return o.doOptimize(p, nil, nil) } + +func (*outerJoinEliminator) name() string { + return "outer_join_eliminate" +} diff --git a/planner/core/rule_join_reorder.go b/planner/core/rule_join_reorder.go index fac63d725cbb5..4885b887af41c 100644 --- a/planner/core/rule_join_reorder.go +++ b/planner/core/rule_join_reorder.go @@ -166,3 +166,7 @@ func (s *baseSingleGroupJoinOrderSolver) newJoinWithEdges(lChild, rChild Logical func (s *baseSingleGroupJoinOrderSolver) calcJoinCumCost(join LogicalPlan, lNode, rNode *jrNode) float64 { return join.statsInfo().RowCount + lNode.cumCost + rNode.cumCost } + +func (*joinReOrderSolver) name() string { + return "join_reorder" +} diff --git a/planner/core/rule_max_min_eliminate.go b/planner/core/rule_max_min_eliminate.go index cd600872338e6..48f4a7055a010 100644 --- a/planner/core/rule_max_min_eliminate.go +++ b/planner/core/rule_max_min_eliminate.go @@ -82,3 +82,7 @@ func (a *maxMinEliminator) eliminateMaxMin(p LogicalPlan) { a.eliminateMaxMin(child) } } + +func (*maxMinEliminator) name() string { + return "max_min_eliminate" +} diff --git a/planner/core/rule_partition_processor.go b/planner/core/rule_partition_processor.go index f2c3ebc59db63..cdd882c38d73a 100644 --- a/planner/core/rule_partition_processor.go +++ b/planner/core/rule_partition_processor.go @@ -202,3 +202,7 @@ func (s *partitionProcessor) findByName(partitionNames []model.CIStr, partitionN } return false } + +func (*partitionProcessor) name() string { + return "partition_processor" +} diff --git a/planner/core/rule_predicate_push_down.go b/planner/core/rule_predicate_push_down.go index ccf1a0855ccd1..68eb0352417f7 100644 --- a/planner/core/rule_predicate_push_down.go +++ b/planner/core/rule_predicate_push_down.go @@ -518,3 +518,7 @@ func (p *LogicalWindow) PredicatePushDown(predicates []expression.Expression) ([ p.baseLogicalPlan.PredicatePushDown(nil) return predicates, p } + +func (*ppdSolver) name() string { + return "predicate_push_down" +} diff --git a/planner/core/rule_topn_push_down.go b/planner/core/rule_topn_push_down.go index ddebf02121632..7bdb2de0a728c 100644 --- a/planner/core/rule_topn_push_down.go +++ b/planner/core/rule_topn_push_down.go @@ -165,3 +165,7 @@ func (p *LogicalJoin) pushDownTopN(topN *LogicalTopN) LogicalPlan { } return p.self } + +func (*pushDownTopNOptimizer) name() string { + return "topn_push_down" +} From c22340934663648159e802508e7168b605353112 Mon Sep 17 00:00:00 2001 From: lzmhhh123 Date: Thu, 18 Jul 2019 13:43:18 +0800 Subject: [PATCH 06/10] rm expr_push_down in error message --- executor/opt_rule_blacklist.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/executor/opt_rule_blacklist.go b/executor/opt_rule_blacklist.go index 81c7d8c916116..d08425f82f046 100644 --- a/executor/opt_rule_blacklist.go +++ b/executor/opt_rule_blacklist.go @@ -48,7 +48,7 @@ func LoadOptRuleBlacklist(ctx sessionctx.Context) (err error) { if row.GetString(1) == "logical_rule" { newDisabledLogicalRules.Insert(name) } else { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("type field of mysql.opt_rule_blacklist can only be \"expr_push_down\" or \"logical_rule\"")) + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("type field of mysql.opt_rule_blacklist can only be \"logical_rule\"")) } } plannercore.DefaultDisabledLogicalRulesList.Store(newDisabledLogicalRules) From ca79478932da11b7aa68f18242614a22f21796e1 Mon Sep 17 00:00:00 2001 From: lzmhhh123 Date: Thu, 18 Jul 2019 14:11:03 +0800 Subject: [PATCH 07/10] rm useless lines in go.mod --- go.mod | 4 +--- go.sum | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index cdfcc8ea70160..38c6ef31a9d40 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e github.com/pingcap/kvproto v0.0.0-20190703131923-d9830856b531 github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596 - github.com/pingcap/parser v0.0.0-20190710072914-6cd203114f2d + github.com/pingcap/parser v0.0.0-20190716105515-ded7e0436a50 github.com/pingcap/pd v0.0.0-20190712044914-75a1f9f3062b github.com/pingcap/tidb-tools v2.1.3-0.20190321065848-1e8b48f5c168+incompatible github.com/pingcap/tipb v0.0.0-20190428032612-535e1abaa330 @@ -75,5 +75,3 @@ require ( sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4 sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 ) - -replace github.com/pingcap/parser => github.com/pingcap/parser v0.0.0-20190716105515-ded7e0436a50 diff --git a/go.sum b/go.sum index 8369b6dd5184b..2abba3bb052f2 100644 --- a/go.sum +++ b/go.sum @@ -164,6 +164,8 @@ github.com/pingcap/kvproto v0.0.0-20190703131923-d9830856b531/go.mod h1:QMdbTAXC github.com/pingcap/log v0.0.0-20190214045112-b37da76f67a7/go.mod h1:xsfkWVaFVV5B8e1K9seWfyJWFrIhbtUTAD8NV1Pq3+w= github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596 h1:t2OQTpPJnrPDGlvA+3FwJptMTt6MEPdzK1Wt99oaefQ= github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596/go.mod h1:WpHUKhNZ18v116SvGrmjkA9CBhYmuUTKL+p8JC9ANEw= +github.com/pingcap/parser v0.0.0-20190710072914-6cd203114f2d h1:vOZjn1ami1LIjtIj0i5QunGh/sHawbhiBCb1qPx373w= +github.com/pingcap/parser v0.0.0-20190710072914-6cd203114f2d/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= github.com/pingcap/parser v0.0.0-20190716105515-ded7e0436a50 h1:tcE49c/+/GiFAqNEiO03KDIA3MOD9eu1zgGrtncPm10= github.com/pingcap/parser v0.0.0-20190716105515-ded7e0436a50/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= github.com/pingcap/pd v0.0.0-20190712044914-75a1f9f3062b h1:oS9PftxQqgcRouKhhdaB52tXhVLEP7Ng3Qqsd6Z18iY= From e56c0784e8d1c44e572a0ea662e16bb6d7cf4d8e Mon Sep 17 00:00:00 2001 From: lzmhhh123 Date: Thu, 18 Jul 2019 14:14:44 +0800 Subject: [PATCH 08/10] fix tidy --- go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.sum b/go.sum index 2abba3bb052f2..8369b6dd5184b 100644 --- a/go.sum +++ b/go.sum @@ -164,8 +164,6 @@ github.com/pingcap/kvproto v0.0.0-20190703131923-d9830856b531/go.mod h1:QMdbTAXC github.com/pingcap/log v0.0.0-20190214045112-b37da76f67a7/go.mod h1:xsfkWVaFVV5B8e1K9seWfyJWFrIhbtUTAD8NV1Pq3+w= github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596 h1:t2OQTpPJnrPDGlvA+3FwJptMTt6MEPdzK1Wt99oaefQ= github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596/go.mod h1:WpHUKhNZ18v116SvGrmjkA9CBhYmuUTKL+p8JC9ANEw= -github.com/pingcap/parser v0.0.0-20190710072914-6cd203114f2d h1:vOZjn1ami1LIjtIj0i5QunGh/sHawbhiBCb1qPx373w= -github.com/pingcap/parser v0.0.0-20190710072914-6cd203114f2d/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= github.com/pingcap/parser v0.0.0-20190716105515-ded7e0436a50 h1:tcE49c/+/GiFAqNEiO03KDIA3MOD9eu1zgGrtncPm10= github.com/pingcap/parser v0.0.0-20190716105515-ded7e0436a50/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA= github.com/pingcap/pd v0.0.0-20190712044914-75a1f9f3062b h1:oS9PftxQqgcRouKhhdaB52tXhVLEP7Ng3Qqsd6Z18iY= From 862e6b66486292990ab96e9be2176c3b72cea2dc Mon Sep 17 00:00:00 2001 From: lzmhhh123 Date: Mon, 22 Jul 2019 13:52:22 +0800 Subject: [PATCH 09/10] move blacklist test to explain test --- cmd/explaintest/r/black_list.result | 35 +++++++++++++++ cmd/explaintest/t/black_list.test | 27 +++++++++++ executor/opt_rule_blacklist.go | 9 +--- executor/opt_rule_blacklist_test.go | 43 ------------------ .../reload_expr_pushdown_blacklist_test.go | 45 ------------------- session/bootstrap.go | 3 +- 6 files changed, 65 insertions(+), 97 deletions(-) create mode 100644 cmd/explaintest/r/black_list.result create mode 100644 cmd/explaintest/t/black_list.test delete mode 100644 executor/opt_rule_blacklist_test.go delete mode 100644 executor/reload_expr_pushdown_blacklist_test.go diff --git a/cmd/explaintest/r/black_list.result b/cmd/explaintest/r/black_list.result new file mode 100644 index 0000000000000..465490c35bfdb --- /dev/null +++ b/cmd/explaintest/r/black_list.result @@ -0,0 +1,35 @@ +use test; +drop table if exists t; +create table t (a int); +explain select * from t where a < 1; +id count task operator info +TableReader_7 3323.33 root data:Selection_6 +└─Selection_6 3323.33 cop lt(test.t.a, 1) + └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +insert into mysql.opt_rule_blacklist values('predicate_push_down'); +admin reload opt_rule_blacklist; + +explain select * from t where a < 1; +id count task operator info +Selection_5 8000.00 root lt(test.t.a, 1) +└─TableReader_7 10000.00 root data:TableScan_6 + └─TableScan_6 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +delete from mysql.opt_rule_blacklist where name='predicate_push_down'; +admin reload opt_rule_blacklist; + +explain select * from t where a < 1; +id count task operator info +TableReader_7 3323.33 root data:Selection_6 +└─Selection_6 3323.33 cop lt(test.t.a, 1) + └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +insert into mysql.expr_pushdown_blacklist values('lt'); +admin reload expr_pushdown_blacklist; + +explain select * from t where a < 1; +id count task operator info +Selection_5 8000.00 root lt(test.t.a, 1) +└─TableReader_7 10000.00 root data:TableScan_6 + └─TableScan_6 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +delete from mysql.expr_pushdown_blacklist where name='lt'; +admin reload expr_pushdown_blacklist; + diff --git a/cmd/explaintest/t/black_list.test b/cmd/explaintest/t/black_list.test new file mode 100644 index 0000000000000..27a41226295cf --- /dev/null +++ b/cmd/explaintest/t/black_list.test @@ -0,0 +1,27 @@ +use test; +drop table if exists t; +create table t (a int); + +explain select * from t where a < 1; + +insert into mysql.opt_rule_blacklist values('predicate_push_down'); + +admin reload opt_rule_blacklist; + +explain select * from t where a < 1; + +delete from mysql.opt_rule_blacklist where name='predicate_push_down'; + +admin reload opt_rule_blacklist; + +explain select * from t where a < 1; + +insert into mysql.expr_pushdown_blacklist values('lt'); + +admin reload expr_pushdown_blacklist; + +explain select * from t where a < 1; + +delete from mysql.expr_pushdown_blacklist where name='lt'; + +admin reload expr_pushdown_blacklist; \ No newline at end of file diff --git a/executor/opt_rule_blacklist.go b/executor/opt_rule_blacklist.go index d08425f82f046..e8983e8f8628b 100644 --- a/executor/opt_rule_blacklist.go +++ b/executor/opt_rule_blacklist.go @@ -17,7 +17,6 @@ import ( "context" "strings" - "github.com/pingcap/errors" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/chunk" @@ -37,7 +36,7 @@ func (e *ReloadOptRuleBlacklistExec) Next(ctx context.Context, _ *chunk.Chunk) e // LoadOptRuleBlacklist loads the latest data from table mysql.opt_rule_blacklist. func LoadOptRuleBlacklist(ctx sessionctx.Context) (err error) { - sql := "select HIGH_PRIORITY name, type from mysql.opt_rule_blacklist" + sql := "select HIGH_PRIORITY name from mysql.opt_rule_blacklist" rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) if err != nil { return err @@ -45,11 +44,7 @@ func LoadOptRuleBlacklist(ctx sessionctx.Context) (err error) { newDisabledLogicalRules := set.NewStringSet() for _, row := range rows { name := strings.ToLower(row.GetString(0)) - if row.GetString(1) == "logical_rule" { - newDisabledLogicalRules.Insert(name) - } else { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("type field of mysql.opt_rule_blacklist can only be \"logical_rule\"")) - } + newDisabledLogicalRules.Insert(name) } plannercore.DefaultDisabledLogicalRulesList.Store(newDisabledLogicalRules) return nil diff --git a/executor/opt_rule_blacklist_test.go b/executor/opt_rule_blacklist_test.go deleted file mode 100644 index 9cfbef4dfc740..0000000000000 --- a/executor/opt_rule_blacklist_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2019 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor_test - -import ( - . "github.com/pingcap/check" - "github.com/pingcap/tidb/util/testkit" -) - -func (s *testSuite2) TestReloadOptRuleBlacklist(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("create database opt_rule_blacklist") - tk.MustExec("use opt_rule_blacklist") - tk.MustExec("create table t (a int)") - - // test disable logical rule. - tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( - "TableReader_7 3323.33 root data:Selection_6", - "└─Selection_6 3323.33 cop lt(opt_rule_blacklist.t.a, 1)", - " └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - - tk.MustExec("insert into mysql.opt_rule_blacklist values('predicate_push_down', 'logical_rule')") - tk.MustExec("admin reload opt_rule_blacklist") - tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( - "Selection_5 8000.00 root lt(opt_rule_blacklist.t.a, 1)", - "└─TableReader_7 10000.00 root data:TableScan_6", - " └─TableScan_6 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - - tk.MustExec("delete from mysql.opt_rule_blacklist where name='predicate_push_down'") - tk.MustExec("delete from mysql.expr_pushdown_blacklist where name='lt'") - tk.MustExec("admin reload opt_rule_blacklist") -} diff --git a/executor/reload_expr_pushdown_blacklist_test.go b/executor/reload_expr_pushdown_blacklist_test.go deleted file mode 100644 index 1f5882f35cfd1..0000000000000 --- a/executor/reload_expr_pushdown_blacklist_test.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2019 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor_test - -import ( - . "github.com/pingcap/check" - "github.com/pingcap/tidb/util/testkit" -) - -func (s *testSuite2) TestReloadExprPushdownBlacklist(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("create database expr_pushdown_blacklist") - tk.MustExec("use expr_pushdown_blacklist") - tk.MustExec("create table t (a int)") - tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( - "TableReader_7 3323.33 root data:Selection_6", - "└─Selection_6 3323.33 cop lt(expr_pushdown_blacklist.t.a, 1)", - " └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - - tk.MustExec("insert into mysql.expr_pushdown_blacklist values('lt')") - tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( - "TableReader_7 3323.33 root data:Selection_6", - "└─Selection_6 3323.33 cop lt(expr_pushdown_blacklist.t.a, 1)", - " └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - - tk.MustExec("admin reload expr_pushdown_blacklist") - tk.MustQuery("desc select * from t where a < 1").Check(testkit.Rows( - "Selection_5 8000.00 root lt(expr_pushdown_blacklist.t.a, 1)", - "└─TableReader_7 10000.00 root data:TableScan_6", - " └─TableScan_6 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo")) - - tk.MustExec("delete from mysql.expr_pushdown_blacklist where name='lt'") - tk.MustExec("admin reload expr_pushdown_blacklist") -} diff --git a/session/bootstrap.go b/session/bootstrap.go index 6f9b4d8df7894..dca15445ed679 100644 --- a/session/bootstrap.go +++ b/session/bootstrap.go @@ -267,8 +267,7 @@ const ( // CreateOptRuleBlacklist stores the list of disabled optimizing operations. CreateOptRuleBlacklist = `CREATE TABLE IF NOT EXISTS mysql.opt_rule_blacklist ( - name char(100) NOT NULL, - type char(20) check(type="logical_rule") NOT NULL + name char(100) NOT NULL );` ) From 5f5afe9828090297bec3b9fa15ce255c8bf52f84 Mon Sep 17 00:00:00 2001 From: lzmhhh123 Date: Mon, 22 Jul 2019 13:54:16 +0800 Subject: [PATCH 10/10] remove strings.ToLower --- executor/opt_rule_blacklist.go | 3 +-- executor/reload_expr_pushdown_blacklist.go | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/executor/opt_rule_blacklist.go b/executor/opt_rule_blacklist.go index e8983e8f8628b..a6a4d37ec28ef 100644 --- a/executor/opt_rule_blacklist.go +++ b/executor/opt_rule_blacklist.go @@ -15,7 +15,6 @@ package executor import ( "context" - "strings" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" @@ -43,7 +42,7 @@ func LoadOptRuleBlacklist(ctx sessionctx.Context) (err error) { } newDisabledLogicalRules := set.NewStringSet() for _, row := range rows { - name := strings.ToLower(row.GetString(0)) + name := row.GetString(0) newDisabledLogicalRules.Insert(name) } plannercore.DefaultDisabledLogicalRulesList.Store(newDisabledLogicalRules) diff --git a/executor/reload_expr_pushdown_blacklist.go b/executor/reload_expr_pushdown_blacklist.go index f83839fb8b62e..90bbcae1362fa 100644 --- a/executor/reload_expr_pushdown_blacklist.go +++ b/executor/reload_expr_pushdown_blacklist.go @@ -15,7 +15,6 @@ package executor import ( "context" - "strings" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/sessionctx" @@ -42,7 +41,7 @@ func LoadExprPushdownBlacklist(ctx sessionctx.Context) (err error) { } newBlacklist := make(map[string]struct{}) for _, row := range rows { - name := strings.ToLower(row.GetString(0)) + name := row.GetString(0) newBlacklist[name] = struct{}{} } expression.DefaultExprPushdownBlacklist.Store(newBlacklist)