Skip to content

Commit bc40fd7

Browse files
authored
planner: Do not allow variables in create view (#57474) (#57538)
close #53176
1 parent 82376c7 commit bc40fd7

File tree

7 files changed

+58
-4
lines changed

7 files changed

+58
-4
lines changed

errors.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,11 @@ error = '''
901901
View's SELECT contains a '%s' clause
902902
'''
903903

904+
["ddl:1351"]
905+
error = '''
906+
View's SELECT contains a variable or parameter
907+
'''
908+
904909
["ddl:1353"]
905910
error = '''
906911
In definition of view, derived table or common table expression, SELECT list and column names list have different column counts

pkg/planner/core/planbuilder.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4923,6 +4923,32 @@ func convertValueListToData(valueList []ast.ExprNode, handleColInfos []*model.Co
49234923
return data, nil
49244924
}
49254925

4926+
type userVariableChecker struct {
4927+
hasUserVariables bool
4928+
}
4929+
4930+
func (e *userVariableChecker) Enter(in ast.Node) (ast.Node, bool) {
4931+
if _, ok := in.(*ast.VariableExpr); ok {
4932+
e.hasUserVariables = true
4933+
return in, true
4934+
}
4935+
return in, false
4936+
}
4937+
4938+
func (*userVariableChecker) Leave(in ast.Node) (ast.Node, bool) {
4939+
return in, true
4940+
}
4941+
4942+
// Check for UserVariables
4943+
func checkForUserVariables(in ast.Node) error {
4944+
v := &userVariableChecker{hasUserVariables: false}
4945+
_, ok := in.Accept(v)
4946+
if !ok || v.hasUserVariables {
4947+
return dbterror.ErrViewSelectVariable
4948+
}
4949+
return nil
4950+
}
4951+
49264952
func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (base.Plan, error) {
49274953
var authErr error
49284954
switch v := node.(type) {
@@ -5070,6 +5096,10 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (base.Plan
50705096
v.ReferTable.Name.L, "", authErr)
50715097
}
50725098
case *ast.CreateViewStmt:
5099+
err := checkForUserVariables(v.Select)
5100+
if err != nil {
5101+
return nil, err
5102+
}
50735103
b.isCreateView = true
50745104
b.capFlag |= canExpandAST | renameView
50755105
b.renamingViewName = v.ViewName.Schema.L + "." + v.ViewName.Name.L

pkg/util/dbterror/ddl_terror.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ var (
229229
ErrErrorOnRename = ClassDDL.NewStd(mysql.ErrErrorOnRename)
230230
// ErrViewSelectClause returns error for create view with select into clause
231231
ErrViewSelectClause = ClassDDL.NewStd(mysql.ErrViewSelectClause)
232+
// ErrViewSelectVariable returns error for create view with select into clause
233+
ErrViewSelectVariable = ClassDDL.NewStd(mysql.ErrViewSelectVariable)
232234

233235
// ErrNotAllowedTypeInPartition returns not allowed type error when creating table partition with unsupported expression type.
234236
ErrNotAllowedTypeInPartition = ClassDDL.NewStd(mysql.ErrFieldTypeNotAllowedAsPartitionField)

tests/integrationtest/r/ddl/ddl_error.result

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,11 @@ Error 1450 (HY000): Changing schema from 'ddl__ddl_error' to 'ddl__ddl_error2' i
1111
rename table ddl__ddl_error.view_1 to ddl__ddl_error2.view_1;
1212
Error 1450 (HY000): Changing schema from 'ddl__ddl_error' to 'ddl__ddl_error2' is not allowed.
1313
rename table ddl__ddl_error.view_1 to ddl__ddl_error.view_1000;
14+
create view sql_mode_view as select @@sql_mode;
15+
Error 1351 (HY000): View's SELECT contains a variable or parameter
16+
create view sql_mode_view as select @@global.sql_mode;
17+
Error 1351 (HY000): View's SELECT contains a variable or parameter
18+
create view sql_mode_view as select @a;
19+
Error 1351 (HY000): View's SELECT contains a variable or parameter
20+
create view sql_mode_view as select 1 where @a = 4;
21+
Error 1351 (HY000): View's SELECT contains a variable or parameter

tests/integrationtest/r/executor/ddl.result

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,9 +314,9 @@ create view v7 (c,d,e) as select * from t1;
314314
Error 1353 (HY000): In definition of view, derived table or common table expression, SELECT list and column names list have different column counts
315315
drop view v1,v2,v3,v4,v5,v6;
316316
create view v1 (c,d) as select a,b+@@global.max_user_connections from t1;
317+
Error 1351 (HY000): View's SELECT contains a variable or parameter
317318
create view v1 (c,d) as select a,b from t1 where a = @@global.max_user_connections;
318-
Error 1050 (42S01): Table 'executor__ddl.v1' already exists
319-
drop view v1;
319+
Error 1351 (HY000): View's SELECT contains a variable or parameter
320320
create view v1 (c,d,e) as select a,b from t1 ;
321321
Error 1353 (HY000): In definition of view, derived table or common table expression, SELECT list and column names list have different column counts
322322
create view v1 (c) as select a,b from t1 ;

tests/integrationtest/t/ddl/ddl_error.test

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,12 @@ rename table ddl__ddl_error.view_1 to ddl__ddl_error2.view_1;
1313
rename table ddl__ddl_error.view_1 to ddl__ddl_error2.view_1;
1414
rename table ddl__ddl_error.view_1 to ddl__ddl_error.view_1000;
1515

16+
# issue 53176
17+
-- error 1351
18+
create view sql_mode_view as select @@sql_mode;
19+
-- error 1351
20+
create view sql_mode_view as select @@global.sql_mode;
21+
-- error 1351
22+
create view sql_mode_view as select @a;
23+
-- error 1351
24+
create view sql_mode_view as select 1 where @a = 4;

tests/integrationtest/t/executor/ddl.test

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,10 +258,10 @@ create view v6 (c,d) as select * from t1;
258258
-- error 1353
259259
create view v7 (c,d,e) as select * from t1;
260260
drop view v1,v2,v3,v4,v5,v6;
261+
-- error 1351
261262
create view v1 (c,d) as select a,b+@@global.max_user_connections from t1;
262-
-- error 1050
263+
-- error 1351
263264
create view v1 (c,d) as select a,b from t1 where a = @@global.max_user_connections;
264-
drop view v1;
265265
-- error 1353
266266
create view v1 (c,d,e) as select a,b from t1 ;
267267
-- error 1353

0 commit comments

Comments
 (0)