Skip to content

Commit 7234229

Browse files
committed
feat: Allow use of table and column aliases for table functions returning unknown types
Signed-off-by: Andrew Haines <[email protected]>
1 parent 5096a9f commit 7234229

File tree

31 files changed

+480
-4
lines changed

31 files changed

+480
-4
lines changed

internal/compiler/output_columns.go

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
437437
case *ast.SelectStmt:
438438
list = astutils.Search(n.FromClause, func(node ast.Node) bool {
439439
switch node.(type) {
440-
case *ast.RangeVar, *ast.RangeSubselect, *ast.FuncName:
440+
case *ast.RangeVar, *ast.RangeSubselect, *ast.RangeFunction:
441441
return true
442442
default:
443443
return false
@@ -462,10 +462,20 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
462462
for _, item := range list.Items {
463463
switch n := item.(type) {
464464

465-
case *ast.FuncName:
465+
case *ast.RangeFunction:
466466
// If the function or table can't be found, don't error out. There
467467
// are many queries that depend on functions unknown to sqlc.
468-
fn, err := qc.GetFunc(n)
468+
var funcCall *ast.FuncCall
469+
switch f := n.Functions.Items[0].(type) {
470+
case *ast.List:
471+
funcCall = f.Items[0].(*ast.FuncCall)
472+
case *ast.FuncCall:
473+
funcCall = f
474+
default:
475+
return nil, fmt.Errorf("sourceTables: unsupported function call type %T", n.Functions.Items[0])
476+
}
477+
478+
fn, err := qc.GetFunc(funcCall.Func)
469479
if err != nil {
470480
continue
471481
}
@@ -475,7 +485,22 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
475485
Name: fn.ReturnType.Name,
476486
})
477487
if err != nil {
478-
continue
488+
if n.Alias == nil || len(n.Alias.Colnames.Items) == 0 {
489+
continue
490+
}
491+
492+
table = &Table{}
493+
for _, colName := range n.Alias.Colnames.Items {
494+
table.Columns = append(table.Columns, &Column{
495+
Name: colName.(*ast.String).Str,
496+
DataType: "any",
497+
})
498+
}
499+
}
500+
if n.Alias != nil {
501+
table.Rel = &ast.TableName{
502+
Name: *n.Alias.Aliasname,
503+
}
479504
}
480505
tables = append(tables, table)
481506

internal/endtoend/testdata/unnest/postgresql/pgx/v4/go/querier.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/unnest/postgresql/pgx/v4/go/query.sql.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/unnest/postgresql/pgx/v4/query.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@ SELECT
44
unnest(@vampire_id::uuid[]) AS vampire_id
55
RETURNING
66
*;
7+
8+
-- name: GetVampireIDs :many
9+
SELECT vampires.id::uuid FROM unnest(@vampire_id::uuid[]) AS vampires (id);

internal/endtoend/testdata/unnest/postgresql/pgx/v5/go/querier.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/unnest/postgresql/pgx/v5/go/query.sql.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/unnest/postgresql/pgx/v5/query.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@ SELECT
44
unnest(@vampire_id::uuid[]) AS vampire_id
55
RETURNING
66
*;
7+
8+
-- name: GetVampireIDs :many
9+
SELECT vampires.id::uuid FROM unnest(@vampire_id::uuid[]) AS vampires (id);

internal/endtoend/testdata/unnest/postgresql/stdlib/go/querier.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/unnest/postgresql/stdlib/go/query.sql.go

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/unnest/postgresql/stdlib/query.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@ SELECT
44
unnest(@vampire_id::uuid[]) AS vampire_id
55
RETURNING
66
*;
7+
8+
-- name: GetVampireIDs :many
9+
SELECT vampires.id::uuid FROM unnest(@vampire_id::uuid[]) AS vampires (id);

internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/db.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/models.go

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/querier.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/query.sql.go

Lines changed: 41 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-- name: GetValues :many
2+
SELECT id, index::bigint, value::text
3+
FROM array_values AS x, unnest(values) WITH ORDINALITY AS y (value, index);
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CREATE TABLE array_values (
2+
id bigserial PRIMARY KEY,
3+
values text[] NOT NULL
4+
);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"engine": "postgresql",
7+
"sql_package": "pgx/v4",
8+
"name": "querytest",
9+
"schema": "schema.sql",
10+
"queries": "query.sql",
11+
"emit_interface": true
12+
}
13+
]
14+
}

internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/db.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/models.go

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/querier.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)