Skip to content

Commit 9f172ce

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 fd3ed9d commit 9f172ce

31 files changed

+480
-4
lines changed

Diff for: internal/compiler/output_columns.go

+29-4
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
412412
case *ast.SelectStmt:
413413
list = astutils.Search(n.FromClause, func(node ast.Node) bool {
414414
switch node.(type) {
415-
case *ast.RangeVar, *ast.RangeSubselect, *ast.FuncName:
415+
case *ast.RangeVar, *ast.RangeSubselect, *ast.RangeFunction:
416416
return true
417417
default:
418418
return false
@@ -437,10 +437,20 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
437437
for _, item := range list.Items {
438438
switch n := item.(type) {
439439

440-
case *ast.FuncName:
440+
case *ast.RangeFunction:
441441
// If the function or table can't be found, don't error out. There
442442
// are many queries that depend on functions unknown to sqlc.
443-
fn, err := qc.GetFunc(n)
443+
var funcCall *ast.FuncCall
444+
switch f := n.Functions.Items[0].(type) {
445+
case *ast.List:
446+
funcCall = f.Items[0].(*ast.FuncCall)
447+
case *ast.FuncCall:
448+
funcCall = f
449+
default:
450+
return nil, fmt.Errorf("sourceTables: unsupported function call type %T", n.Functions.Items[0])
451+
}
452+
453+
fn, err := qc.GetFunc(funcCall.Func)
444454
if err != nil {
445455
continue
446456
}
@@ -450,7 +460,22 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
450460
Name: fn.ReturnType.Name,
451461
})
452462
if err != nil {
453-
continue
463+
if n.Alias == nil || len(n.Alias.Colnames.Items) == 0 {
464+
continue
465+
}
466+
467+
table = &Table{}
468+
for _, colName := range n.Alias.Colnames.Items {
469+
table.Columns = append(table.Columns, &Column{
470+
Name: colName.(*ast.String).Str,
471+
DataType: "any",
472+
})
473+
}
474+
}
475+
if n.Alias != nil {
476+
table.Rel = &ast.TableName{
477+
Name: *n.Alias.Aliasname,
478+
}
454479
}
455480
tables = append(tables, table)
456481

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)