diff --git a/errors.toml b/errors.toml index 1b79985c72a08..4e21b5886c4da 100644 --- a/errors.toml +++ b/errors.toml @@ -901,6 +901,11 @@ error = ''' View's SELECT contains a '%s' clause ''' +["ddl:1351"] +error = ''' +View's SELECT contains a variable or parameter +''' + ["ddl:1353"] error = ''' In definition of view, derived table or common table expression, SELECT list and column names list have different column counts diff --git a/pkg/planner/core/planbuilder.go b/pkg/planner/core/planbuilder.go index fba6e19c89702..ad4c1455a5a3a 100644 --- a/pkg/planner/core/planbuilder.go +++ b/pkg/planner/core/planbuilder.go @@ -4928,6 +4928,32 @@ func convertValueListToData(valueList []ast.ExprNode, handleColInfos []*model.Co return data, nil } +type userVariableChecker struct { + hasUserVariables bool +} + +func (e *userVariableChecker) Enter(in ast.Node) (ast.Node, bool) { + if _, ok := in.(*ast.VariableExpr); ok { + e.hasUserVariables = true + return in, true + } + return in, false +} + +func (*userVariableChecker) Leave(in ast.Node) (ast.Node, bool) { + return in, true +} + +// Check for UserVariables +func checkForUserVariables(in ast.Node) error { + v := &userVariableChecker{hasUserVariables: false} + _, ok := in.Accept(v) + if !ok || v.hasUserVariables { + return dbterror.ErrViewSelectVariable + } + return nil +} + func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (base.Plan, error) { var authErr error switch v := node.(type) { @@ -5075,6 +5101,10 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (base.Plan v.ReferTable.Name.L, "", authErr) } case *ast.CreateViewStmt: + err := checkForUserVariables(v.Select) + if err != nil { + return nil, err + } b.isCreateView = true b.capFlag |= canExpandAST | renameView b.renamingViewName = v.ViewName.Schema.L + "." + v.ViewName.Name.L diff --git a/pkg/util/dbterror/ddl_terror.go b/pkg/util/dbterror/ddl_terror.go index 11dd9caf781ec..62cac767d37c8 100644 --- a/pkg/util/dbterror/ddl_terror.go +++ b/pkg/util/dbterror/ddl_terror.go @@ -229,6 +229,8 @@ var ( ErrErrorOnRename = ClassDDL.NewStd(mysql.ErrErrorOnRename) // ErrViewSelectClause returns error for create view with select into clause ErrViewSelectClause = ClassDDL.NewStd(mysql.ErrViewSelectClause) + // ErrViewSelectVariable returns error for create view with select into clause + ErrViewSelectVariable = ClassDDL.NewStd(mysql.ErrViewSelectVariable) // ErrNotAllowedTypeInPartition returns not allowed type error when creating table partition with unsupported expression type. ErrNotAllowedTypeInPartition = ClassDDL.NewStd(mysql.ErrFieldTypeNotAllowedAsPartitionField) diff --git a/tests/integrationtest/r/ddl/ddl_error.result b/tests/integrationtest/r/ddl/ddl_error.result index 47027d66d6845..7047194d4a7bf 100644 --- a/tests/integrationtest/r/ddl/ddl_error.result +++ b/tests/integrationtest/r/ddl/ddl_error.result @@ -11,3 +11,11 @@ Error 1450 (HY000): Changing schema from 'ddl__ddl_error' to 'ddl__ddl_error2' i rename table ddl__ddl_error.view_1 to ddl__ddl_error2.view_1; Error 1450 (HY000): Changing schema from 'ddl__ddl_error' to 'ddl__ddl_error2' is not allowed. rename table ddl__ddl_error.view_1 to ddl__ddl_error.view_1000; +create view sql_mode_view as select @@sql_mode; +Error 1351 (HY000): View's SELECT contains a variable or parameter +create view sql_mode_view as select @@global.sql_mode; +Error 1351 (HY000): View's SELECT contains a variable or parameter +create view sql_mode_view as select @a; +Error 1351 (HY000): View's SELECT contains a variable or parameter +create view sql_mode_view as select 1 where @a = 4; +Error 1351 (HY000): View's SELECT contains a variable or parameter diff --git a/tests/integrationtest/r/executor/ddl.result b/tests/integrationtest/r/executor/ddl.result index b7c75847b74b1..edae56411373e 100644 --- a/tests/integrationtest/r/executor/ddl.result +++ b/tests/integrationtest/r/executor/ddl.result @@ -314,9 +314,9 @@ create view v7 (c,d,e) as select * from t1; Error 1353 (HY000): In definition of view, derived table or common table expression, SELECT list and column names list have different column counts drop view v1,v2,v3,v4,v5,v6; create view v1 (c,d) as select a,b+@@global.max_user_connections from t1; +Error 1351 (HY000): View's SELECT contains a variable or parameter create view v1 (c,d) as select a,b from t1 where a = @@global.max_user_connections; -Error 1050 (42S01): Table 'executor__ddl.v1' already exists -drop view v1; +Error 1351 (HY000): View's SELECT contains a variable or parameter create view v1 (c,d,e) as select a,b from t1 ; Error 1353 (HY000): In definition of view, derived table or common table expression, SELECT list and column names list have different column counts create view v1 (c) as select a,b from t1 ; diff --git a/tests/integrationtest/t/ddl/ddl_error.test b/tests/integrationtest/t/ddl/ddl_error.test index 4f1ee2cf2a8ac..c724e4170d107 100644 --- a/tests/integrationtest/t/ddl/ddl_error.test +++ b/tests/integrationtest/t/ddl/ddl_error.test @@ -13,3 +13,12 @@ rename table ddl__ddl_error.view_1 to ddl__ddl_error2.view_1; rename table ddl__ddl_error.view_1 to ddl__ddl_error2.view_1; rename table ddl__ddl_error.view_1 to ddl__ddl_error.view_1000; +# issue 53176 +-- error 1351 +create view sql_mode_view as select @@sql_mode; +-- error 1351 +create view sql_mode_view as select @@global.sql_mode; +-- error 1351 +create view sql_mode_view as select @a; +-- error 1351 +create view sql_mode_view as select 1 where @a = 4; diff --git a/tests/integrationtest/t/executor/ddl.test b/tests/integrationtest/t/executor/ddl.test index 59bdbcc68cfa1..644af24d644a4 100644 --- a/tests/integrationtest/t/executor/ddl.test +++ b/tests/integrationtest/t/executor/ddl.test @@ -258,10 +258,10 @@ create view v6 (c,d) as select * from t1; -- error 1353 create view v7 (c,d,e) as select * from t1; drop view v1,v2,v3,v4,v5,v6; +-- error 1351 create view v1 (c,d) as select a,b+@@global.max_user_connections from t1; --- error 1050 +-- error 1351 create view v1 (c,d) as select a,b from t1 where a = @@global.max_user_connections; -drop view v1; -- error 1353 create view v1 (c,d,e) as select a,b from t1 ; -- error 1353