diff --git a/go/vt/schema/ddl_strategy.go b/go/vt/schema/ddl_strategy.go index 88400d423fd..32cad30764f 100644 --- a/go/vt/schema/ddl_strategy.go +++ b/go/vt/schema/ddl_strategy.go @@ -20,6 +20,7 @@ import ( "fmt" "regexp" "strconv" + "strings" "time" "github.com/google/shlex" @@ -115,6 +116,14 @@ func ParseDDLStrategy(strategyVariable string) (*DDLStrategySetting, error) { if _, err := setting.RetainArtifactsDuration(); err != nil { return nil, err } + + switch setting.Strategy { + case DDLStrategyVitess, DDLStrategyOnline: + if opts := setting.RuntimeOptions(); len(opts) > 0 { + return nil, fmt.Errorf("invalid flags for vitess strategy: %s", strings.Join(opts, " ")) + } + } + return setting, nil } diff --git a/go/vt/schema/ddl_strategy_test.go b/go/vt/schema/ddl_strategy_test.go index 8ad6ff592dc..a853bdca539 100644 --- a/go/vt/schema/ddl_strategy_test.go +++ b/go/vt/schema/ddl_strategy_test.go @@ -183,7 +183,7 @@ func TestParseDDLStrategy(t *testing.T) { cutOverThreshold time.Duration expireArtifacts time.Duration runtimeOptions string - err error + expectError string }{ { strategyVariable: "direct", @@ -317,10 +317,29 @@ func TestParseDDLStrategy(t *testing.T) { runtimeOptions: "", analyzeTable: true, }, + + { + strategyVariable: "vitess --alow-concrrnt", // intentional typo + strategy: DDLStrategyVitess, + options: "", + runtimeOptions: "", + expectError: "invalid flags", + }, + { + strategyVariable: "vitess --declarative --max-load=Threads_running=100", + strategy: DDLStrategyVitess, + options: "--declarative --max-load=Threads_running=100", + runtimeOptions: "--max-load=Threads_running=100", + expectError: "invalid flags", + }, } for _, ts := range tt { t.Run(ts.strategyVariable, func(t *testing.T) { setting, err := ParseDDLStrategy(ts.strategyVariable) + if ts.expectError != "" { + assert.ErrorContains(t, err, ts.expectError) + return + } assert.NoError(t, err) assert.Equal(t, ts.strategy, setting.Strategy) assert.Equal(t, ts.options, setting.Options)