Skip to content

Commit eba90d1

Browse files
authored
fix: Search from Rexpr if not found from Lexpr (#2056)
* fix: Search from Rexpr if not found from Lexpr * regenerated existing testdata * add params_placeholder_in_left_expr test
1 parent 0b38c75 commit eba90d1

File tree

13 files changed

+291
-11
lines changed

13 files changed

+291
-11
lines changed

internal/compiler/resolve.go

+11-5
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,12 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
113113
_, ok := node.(*ast.ColumnRef)
114114
return ok
115115
})
116+
if len(list.Items) == 0 {
117+
list = astutils.Search(n.Rexpr, func(node ast.Node) bool {
118+
_, ok := node.(*ast.ColumnRef)
119+
return ok
120+
})
121+
}
116122

117123
if len(list.Items) == 0 {
118124
// TODO: Move this to database-specific engine package
@@ -135,9 +141,9 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
135141
continue
136142
}
137143

138-
switch left := list.Items[0].(type) {
144+
switch node := list.Items[0].(type) {
139145
case *ast.ColumnRef:
140-
items := stringSlice(left.Fields)
146+
items := stringSlice(node.Fields)
141147
var key, alias string
142148
switch len(items) {
143149
case 1:
@@ -165,7 +171,7 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
165171
return nil, &sqlerr.Error{
166172
Code: "42703",
167173
Message: fmt.Sprintf("table alias \"%s\" does not exist", alias),
168-
Location: left.Location,
174+
Location: node.Location,
169175
}
170176
}
171177
}
@@ -204,14 +210,14 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
204210
return nil, &sqlerr.Error{
205211
Code: "42703",
206212
Message: fmt.Sprintf("column \"%s\" does not exist", key),
207-
Location: left.Location,
213+
Location: node.Location,
208214
}
209215
}
210216
if found > 1 {
211217
return nil, &sqlerr.Error{
212218
Code: "42703",
213219
Message: fmt.Sprintf("column reference \"%s\" is ambiguous", key),
214-
Location: left.Location,
220+
Location: node.Location,
215221
}
216222
}
217223
}

internal/endtoend/testdata/params_duplicate/mysql/go/query.sql.go

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/params_duplicate/postgresql/go/query.sql.go

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/params_placeholder_in_left_expr/mysql/go/db.go

+31
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/params_placeholder_in_left_expr/mysql/go/models.go

+14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/params_placeholder_in_left_expr/mysql/go/query.sql.go

+70
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CREATE TABLE users (
2+
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
3+
name VARCHAR(255)
4+
) ENGINE=InnoDB;
5+
6+
-- name: FindByID :many
7+
SELECT * FROM users WHERE ? = id;
8+
9+
-- name: FindByIDAndName :many
10+
SELECT * FROM users WHERE ? = id AND ? = name;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"engine": "mysql",
7+
"name": "querytest",
8+
"schema": "query.sql",
9+
"queries": "query.sql"
10+
}
11+
]
12+
}

internal/endtoend/testdata/params_placeholder_in_left_expr/postgresql/go/db.go

+31
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/params_placeholder_in_left_expr/postgresql/go/models.go

+14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/params_placeholder_in_left_expr/postgresql/go/query.sql.go

+70
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CREATE TABLE users (
2+
id INT PRIMARY KEY,
3+
name VARCHAR(255)
4+
);
5+
6+
-- name: FindByID :many
7+
SELECT * FROM users WHERE ? = id;
8+
9+
-- name: FindByIDAndName :many
10+
SELECT * FROM users WHERE ? = id AND ? = name;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"engine": "postgresql",
7+
"name": "querytest",
8+
"schema": "query.sql",
9+
"queries": "query.sql"
10+
}
11+
]
12+
}

0 commit comments

Comments
 (0)