diff --git a/internal/compiler/output_columns.go b/internal/compiler/output_columns.go index 19128f71ae..f3a4b78591 100644 --- a/internal/compiler/output_columns.go +++ b/internal/compiler/output_columns.go @@ -454,6 +454,23 @@ func isTableRequired(n ast.Node, col *Column, prior int) int { return tableNotFound } +type tableVisitor struct { + list ast.List +} + +func (r *tableVisitor) Visit(n ast.Node) astutils.Visitor { + switch n.(type) { + case *ast.RangeVar, *ast.RangeFunction: + r.list.Items = append(r.list.Items, n) + return r + case *ast.RangeSubselect: + r.list.Items = append(r.list.Items, n) + return nil + default: + return r + } +} + // Compute the output columns for a statement. // // Return an error if column references are ambiguous @@ -470,14 +487,9 @@ func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, erro Items: []ast.Node{n.Relation}, } case *ast.SelectStmt: - list = astutils.Search(n.FromClause, func(node ast.Node) bool { - switch node.(type) { - case *ast.RangeVar, *ast.RangeSubselect, *ast.RangeFunction: - return true - default: - return false - } - }) + var tv tableVisitor + astutils.Walk(&tv, n.FromClause) + list = &tv.list case *ast.TruncateStmt: list = astutils.Search(n.Relations, func(node ast.Node) bool { _, ok := node.(*ast.RangeVar) diff --git a/internal/endtoend/testdata/select_star/mysql/go/query.sql.go b/internal/endtoend/testdata/select_star/mysql/go/query.sql.go index c0b9e46bdd..76a4f0e8a5 100644 --- a/internal/endtoend/testdata/select_star/mysql/go/query.sql.go +++ b/internal/endtoend/testdata/select_star/mysql/go/query.sql.go @@ -40,3 +40,30 @@ func (q *Queries) GetAll(ctx context.Context) ([]User, error) { } return items, nil } + +const getIDAll = `-- name: GetIDAll :many +SELECT id FROM (SELECT id FROM users) t +` + +func (q *Queries) GetIDAll(ctx context.Context) ([]int32, error) { + rows, err := q.db.QueryContext(ctx, getIDAll) + if err != nil { + return nil, err + } + defer rows.Close() + var items []int32 + for rows.Next() { + var id int32 + if err := rows.Scan(&id); err != nil { + return nil, err + } + items = append(items, id) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/select_star/mysql/query.sql b/internal/endtoend/testdata/select_star/mysql/query.sql index e2f85e2a9a..4c230627d0 100644 --- a/internal/endtoend/testdata/select_star/mysql/query.sql +++ b/internal/endtoend/testdata/select_star/mysql/query.sql @@ -1,2 +1,5 @@ /* name: GetAll :many */ SELECT * FROM users; + +/* name: GetIDAll :many */ +SELECT * FROM (SELECT id FROM users) t; diff --git a/internal/endtoend/testdata/select_star/postgresql/pgx/v4/go/query.sql.go b/internal/endtoend/testdata/select_star/postgresql/pgx/v4/go/query.sql.go index 3fba9882e7..47c84ec128 100644 --- a/internal/endtoend/testdata/select_star/postgresql/pgx/v4/go/query.sql.go +++ b/internal/endtoend/testdata/select_star/postgresql/pgx/v4/go/query.sql.go @@ -37,3 +37,27 @@ func (q *Queries) GetAll(ctx context.Context) ([]User, error) { } return items, nil } + +const getIDAll = `-- name: GetIDAll :many +SELECT id FROM (SELECT id FROM users) t +` + +func (q *Queries) GetIDAll(ctx context.Context) ([]int32, error) { + rows, err := q.db.Query(ctx, getIDAll) + if err != nil { + return nil, err + } + defer rows.Close() + var items []int32 + for rows.Next() { + var id int32 + if err := rows.Scan(&id); err != nil { + return nil, err + } + items = append(items, id) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/select_star/postgresql/pgx/v4/query.sql b/internal/endtoend/testdata/select_star/postgresql/pgx/v4/query.sql index 237b20193b..0952880cac 100644 --- a/internal/endtoend/testdata/select_star/postgresql/pgx/v4/query.sql +++ b/internal/endtoend/testdata/select_star/postgresql/pgx/v4/query.sql @@ -1,2 +1,5 @@ -- name: GetAll :many SELECT * FROM users; + +/* name: GetIDAll :many */ +SELECT * FROM (SELECT id FROM users) t; \ No newline at end of file diff --git a/internal/endtoend/testdata/select_star/postgresql/pgx/v5/go/query.sql.go b/internal/endtoend/testdata/select_star/postgresql/pgx/v5/go/query.sql.go index 3fba9882e7..47c84ec128 100644 --- a/internal/endtoend/testdata/select_star/postgresql/pgx/v5/go/query.sql.go +++ b/internal/endtoend/testdata/select_star/postgresql/pgx/v5/go/query.sql.go @@ -37,3 +37,27 @@ func (q *Queries) GetAll(ctx context.Context) ([]User, error) { } return items, nil } + +const getIDAll = `-- name: GetIDAll :many +SELECT id FROM (SELECT id FROM users) t +` + +func (q *Queries) GetIDAll(ctx context.Context) ([]int32, error) { + rows, err := q.db.Query(ctx, getIDAll) + if err != nil { + return nil, err + } + defer rows.Close() + var items []int32 + for rows.Next() { + var id int32 + if err := rows.Scan(&id); err != nil { + return nil, err + } + items = append(items, id) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/select_star/postgresql/pgx/v5/query.sql b/internal/endtoend/testdata/select_star/postgresql/pgx/v5/query.sql index 237b20193b..0952880cac 100644 --- a/internal/endtoend/testdata/select_star/postgresql/pgx/v5/query.sql +++ b/internal/endtoend/testdata/select_star/postgresql/pgx/v5/query.sql @@ -1,2 +1,5 @@ -- name: GetAll :many SELECT * FROM users; + +/* name: GetIDAll :many */ +SELECT * FROM (SELECT id FROM users) t; \ No newline at end of file diff --git a/internal/endtoend/testdata/select_star/postgresql/stdlib/go/query.sql.go b/internal/endtoend/testdata/select_star/postgresql/stdlib/go/query.sql.go index c0b9e46bdd..76a4f0e8a5 100644 --- a/internal/endtoend/testdata/select_star/postgresql/stdlib/go/query.sql.go +++ b/internal/endtoend/testdata/select_star/postgresql/stdlib/go/query.sql.go @@ -40,3 +40,30 @@ func (q *Queries) GetAll(ctx context.Context) ([]User, error) { } return items, nil } + +const getIDAll = `-- name: GetIDAll :many +SELECT id FROM (SELECT id FROM users) t +` + +func (q *Queries) GetIDAll(ctx context.Context) ([]int32, error) { + rows, err := q.db.QueryContext(ctx, getIDAll) + if err != nil { + return nil, err + } + defer rows.Close() + var items []int32 + for rows.Next() { + var id int32 + if err := rows.Scan(&id); err != nil { + return nil, err + } + items = append(items, id) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/select_star/postgresql/stdlib/query.sql b/internal/endtoend/testdata/select_star/postgresql/stdlib/query.sql index 237b20193b..0952880cac 100644 --- a/internal/endtoend/testdata/select_star/postgresql/stdlib/query.sql +++ b/internal/endtoend/testdata/select_star/postgresql/stdlib/query.sql @@ -1,2 +1,5 @@ -- name: GetAll :many SELECT * FROM users; + +/* name: GetIDAll :many */ +SELECT * FROM (SELECT id FROM users) t; \ No newline at end of file diff --git a/internal/endtoend/testdata/select_star/sqlite/go/query.sql.go b/internal/endtoend/testdata/select_star/sqlite/go/query.sql.go index c0b9e46bdd..221f2f0e71 100644 --- a/internal/endtoend/testdata/select_star/sqlite/go/query.sql.go +++ b/internal/endtoend/testdata/select_star/sqlite/go/query.sql.go @@ -40,3 +40,30 @@ func (q *Queries) GetAll(ctx context.Context) ([]User, error) { } return items, nil } + +const getIDAll = `-- name: GetIDAll :many +SELECT id FROM (SELECT id FROM users) t +` + +func (q *Queries) GetIDAll(ctx context.Context) ([]int64, error) { + rows, err := q.db.QueryContext(ctx, getIDAll) + if err != nil { + return nil, err + } + defer rows.Close() + var items []int64 + for rows.Next() { + var id int64 + if err := rows.Scan(&id); err != nil { + return nil, err + } + items = append(items, id) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/select_star/sqlite/query.sql b/internal/endtoend/testdata/select_star/sqlite/query.sql index 237b20193b..0952880cac 100644 --- a/internal/endtoend/testdata/select_star/sqlite/query.sql +++ b/internal/endtoend/testdata/select_star/sqlite/query.sql @@ -1,2 +1,5 @@ -- name: GetAll :many SELECT * FROM users; + +/* name: GetIDAll :many */ +SELECT * FROM (SELECT id FROM users) t; \ No newline at end of file