Skip to content

Commit d9432f4

Browse files
elianddbclaude
andcommitted
Prevent user and system variables in column default values
Added validation to prevent user variables (@var) and system variables (@@var) from being used in column default expressions, matching MySQL behavior that throws Error 3772. - Added ErrColumnDefaultUserVariable error for user/system variable validation - Extended validateColumnDefault function to check for UserVar and SystemVar expressions - Added tests for both user and system variable validation in column defaults 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 90ba90c commit d9432f4

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

enginetest/queries/column_default_queries.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,4 +940,23 @@ var ColumnDefaultTests = []ScriptTest{
940940
},
941941
},
942942
},
943+
{
944+
Name: "User variables not allowed in column default expressions",
945+
SetUpScript: []string{"SET @test_var = 1"},
946+
Assertions: []ScriptTestAssertion{
947+
{
948+
Query: "CREATE TABLE t999(pk BIGINT PRIMARY KEY, v1 BIGINT DEFAULT (@test_var))",
949+
ExpectedErr: sql.ErrColumnDefaultUserVariable,
950+
},
951+
},
952+
},
953+
{
954+
Name: "System variables not allowed in column default expressions",
955+
Assertions: []ScriptTestAssertion{
956+
{
957+
Query: "CREATE TABLE t999(pk BIGINT PRIMARY KEY, v1 VARCHAR(100) DEFAULT (@@session.sql_mode))",
958+
ExpectedErr: sql.ErrColumnDefaultUserVariable,
959+
},
960+
},
961+
},
943962
}

sql/analyzer/resolve_column_defaults.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ func validateColumnDefault(ctx *sql.Context, col *sql.Column, colDefault *sql.Co
233233
var err error
234234
sql.Inspect(colDefault.Expr, func(e sql.Expression) bool {
235235
switch e.(type) {
236+
case *expression.UserVar, *expression.SystemVar:
237+
err = sql.ErrColumnDefaultUserVariable.New(col.Name)
238+
return false
236239
case sql.FunctionExpression, *expression.UnresolvedFunction:
237240
var funcName string
238241
switch expr := e.(type) {

sql/errors.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ var (
156156
// ErrDropColumnReferencedInDefault is returned when a column cannot be dropped as it is referenced by another column's default value.
157157
ErrDropColumnReferencedInDefault = errors.NewKind(`cannot drop column "%s" as default value of column "%s" references it`)
158158

159+
// ErrColumnDefaultUserVariable is returned when a default/generated column expression contains user or system variables.
160+
ErrColumnDefaultUserVariable = errors.NewKind(`Default value expression of column '%s' cannot refer user or system variables.`)
161+
159162
// ErrTriggersNotSupported is returned when attempting to create a trigger on a database that doesn't support them
160163
ErrTriggersNotSupported = errors.NewKind(`database "%s" doesn't support triggers`)
161164

0 commit comments

Comments
 (0)