Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -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) {
Expand Down Expand Up @@ -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
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