Skip to content

Commit 82453ba

Browse files
authored
Merge pull request #3260 from dolthub/elian/g3259
#3259: Fix system variable lookup to only happen on no qualifier
2 parents 3418751 + 2b09092 commit 82453ba

File tree

2 files changed

+70
-3
lines changed

2 files changed

+70
-3
lines changed

enginetest/queries/script_queries.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,67 @@ type ScriptTestAssertion struct {
122122
// Unlike other engine tests, ScriptTests must be self-contained. No other tables are created outside the definition of
123123
// the tests.
124124
var ScriptTests = []ScriptTest{
125+
{
126+
// https://github.com/dolthub/go-mysql-server/issues/3259
127+
Dialect: "mysql",
128+
Name: "Missing column with same name as system variable",
129+
SetUpScript: []string{
130+
"CREATE DATABASE IF NOT EXISTS test_db",
131+
"USE test_db",
132+
"CREATE TABLE A (id INT)",
133+
"CREATE TABLE B (id INT)",
134+
"INSERT INTO A VALUES (1)",
135+
"INSERT INTO B VALUES (2)",
136+
},
137+
Assertions: []ScriptTestAssertion{
138+
{
139+
Query: "SELECT UNIX_TIMESTAMP(A.timestamp) FROM A LIMIT 1",
140+
ExpectedErr: sql.ErrTableColumnNotFound,
141+
},
142+
{
143+
Query: "SELECT A.timestamp FROM A",
144+
ExpectedErr: sql.ErrTableColumnNotFound,
145+
},
146+
{
147+
Query: "SELECT A.version FROM A",
148+
ExpectedErr: sql.ErrTableColumnNotFound,
149+
},
150+
{
151+
Query: "SELECT A.max_connections FROM A",
152+
ExpectedErr: sql.ErrTableColumnNotFound,
153+
},
154+
{
155+
Query: "SELECT UPPER(A.sql_mode) FROM A",
156+
ExpectedErr: sql.ErrTableColumnNotFound,
157+
},
158+
{
159+
Query: "SELECT @@timestamp",
160+
Expected: []sql.Row{{float64(0)}},
161+
SkipResultsCheck: true, // dynamic var
162+
},
163+
{
164+
Query: "SELECT @@version",
165+
Expected: []sql.Row{{""}},
166+
SkipResultsCheck: true, // dynamic var
167+
},
168+
{
169+
Query: "SELECT test_db.A.timestamp FROM A",
170+
ExpectedErr: sql.ErrTableColumnNotFound,
171+
},
172+
{
173+
Query: "SELECT test_db.A.version FROM test_db.A",
174+
ExpectedErr: sql.ErrTableColumnNotFound,
175+
},
176+
{
177+
Query: "SELECT a1.timestamp FROM A a1 JOIN B b1 ON a1.id = b1.id",
178+
ExpectedErr: sql.ErrTableColumnNotFound,
179+
},
180+
{
181+
Query: "SELECT b1.max_connections FROM A a1 JOIN B b1 ON a1.id = b1.id",
182+
ExpectedErr: sql.ErrTableColumnNotFound,
183+
},
184+
},
185+
},
125186
{
126187
// https://github.com/dolthub/dolt/issues/9927
127188
// https://github.com/dolthub/dolt/issues/9053

sql/planbuilder/scalar.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,15 @@ func (b *Builder) buildScalar(inScope *scope, e ast.Expr) (ex sql.Expression) {
126126
if aliasedExpr, ok := inScope.selectAliases[colName]; ok {
127127
return aliasedExpr
128128
}
129-
sysVar, scope, ok := b.buildSysVar(v, ast.SetScope_None)
130-
if ok {
131-
return sysVar
129+
// Only try system variable lookup if there's no table qualifier.
130+
// Qualified names like "A.timestamp" are always column references, never system variables.
131+
var scope ast.SetScope
132+
if tblName == "" && dbName == "" {
133+
var sysVar sql.Expression
134+
sysVar, scope, ok = b.buildSysVar(v, ast.SetScope_None)
135+
if ok {
136+
return sysVar
137+
}
132138
}
133139
var err error
134140
if scope == ast.SetScope_User || scope == ast.SetScope_Persist || scope == ast.SetScope_PersistOnly {

0 commit comments

Comments
 (0)