Skip to content

Commit

Permalink
planner: Do not allow variables in create view (#57474) (#57538)
Browse files Browse the repository at this point in the history
close #53176
  • Loading branch information
ti-chi-bot authored Nov 20, 2024
1 parent 82376c7 commit bc40fd7
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 4 deletions.
5 changes: 5 additions & 0 deletions errors.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
30 changes: 30 additions & 0 deletions pkg/planner/core/planbuilder.go
Original file line number Diff line number Diff line change
Expand Up @@ -4923,6 +4923,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) {
Expand Down Expand Up @@ -5070,6 +5096,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
Expand Down
2 changes: 2 additions & 0 deletions pkg/util/dbterror/ddl_terror.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
8 changes: 8 additions & 0 deletions tests/integrationtest/r/ddl/ddl_error.result
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions tests/integrationtest/r/executor/ddl.result
Original file line number Diff line number Diff line change
Expand Up @@ -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 ;
Expand Down
9 changes: 9 additions & 0 deletions tests/integrationtest/t/ddl/ddl_error.test
Original file line number Diff line number Diff line change
Expand Up @@ -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;
4 changes: 2 additions & 2 deletions tests/integrationtest/t/executor/ddl.test
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit bc40fd7

Please sign in to comment.