Skip to content

Commit c7a10a7

Browse files
committed
feat: Allow use of table and column aliases for table functions returning unknown types
Signed-off-by: Andrew Haines <andrew@haines.org.nz>
1 parent e4b1c18 commit c7a10a7

31 files changed

+480
-4
lines changed

Diff for: internal/compiler/output_columns.go

+29-4
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
430430
case *ast.SelectStmt:
431431
list = astutils.Search(n.FromClause, func(node ast.Node) bool {
432432
switch node.(type) {
433-
case *ast.RangeVar, *ast.RangeSubselect, *ast.FuncName:
433+
case *ast.RangeVar, *ast.RangeSubselect, *ast.RangeFunction:
434434
return true
435435
default:
436436
return false
@@ -455,10 +455,20 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
455455
for _, item := range list.Items {
456456
switch n := item.(type) {
457457

458-
case *ast.FuncName:
458+
case *ast.RangeFunction:
459459
// If the function or table can't be found, don't error out. There
460460
// are many queries that depend on functions unknown to sqlc.
461-
fn, err := qc.GetFunc(n)
461+
var funcCall *ast.FuncCall
462+
switch f := n.Functions.Items[0].(type) {
463+
case *ast.List:
464+
funcCall = f.Items[0].(*ast.FuncCall)
465+
case *ast.FuncCall:
466+
funcCall = f
467+
default:
468+
return nil, fmt.Errorf("sourceTables: unsupported function call type %T", n.Functions.Items[0])
469+
}
470+
471+
fn, err := qc.GetFunc(funcCall.Func)
462472
if err != nil {
463473
continue
464474
}
@@ -468,7 +478,22 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
468478
Name: fn.ReturnType.Name,
469479
})
470480
if err != nil {
471-
continue
481+
if n.Alias == nil || len(n.Alias.Colnames.Items) == 0 {
482+
continue
483+
}
484+
485+
table = &Table{}
486+
for _, colName := range n.Alias.Colnames.Items {
487+
table.Columns = append(table.Columns, &Column{
488+
Name: colName.(*ast.String).Str,
489+
DataType: "any",
490+
})
491+
}
492+
}
493+
if n.Alias != nil {
494+
table.Rel = &ast.TableName{
495+
Name: *n.Alias.Aliasname,
496+
}
472497
}
473498
tables = append(tables, table)
474499

Diff for: internal/endtoend/testdata/unnest/postgresql/pgx/v4/go/querier.go

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

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

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

Diff for: internal/endtoend/testdata/unnest/postgresql/pgx/v4/query.sql

+3
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);

Diff for: internal/endtoend/testdata/unnest/postgresql/pgx/v5/go/querier.go

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

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

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

Diff for: internal/endtoend/testdata/unnest/postgresql/pgx/v5/query.sql

+3
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);

Diff for: internal/endtoend/testdata/unnest/postgresql/stdlib/go/querier.go

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

Diff for: internal/endtoend/testdata/unnest/postgresql/stdlib/go/query.sql.go

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

Diff for: internal/endtoend/testdata/unnest/postgresql/stdlib/query.sql

+3
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);

Diff for: internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/db.go

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

Diff for: internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/models.go

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

Diff for: internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/querier.go

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

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

+41
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,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);
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+
);
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+
}

Diff for: internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/db.go

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

Diff for: internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/models.go

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

Diff for: internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/querier.go

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

0 commit comments

Comments
 (0)