Skip to content

Commit 734e06e

Browse files
haineskyleconroy
andauthored
feat: Allow use of table and column aliases for table functions returning unknown types (#2156)
Signed-off-by: Andrew Haines <andrew@haines.org.nz> Co-authored-by: Kyle Conroy <kyle@conroy.org>
1 parent b09ddb7 commit 734e06e

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
@@ -469,7 +469,7 @@ func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, erro
469469
case *ast.SelectStmt:
470470
list = astutils.Search(n.FromClause, func(node ast.Node) bool {
471471
switch node.(type) {
472-
case *ast.RangeVar, *ast.RangeSubselect, *ast.FuncName:
472+
case *ast.RangeVar, *ast.RangeSubselect, *ast.RangeFunction:
473473
return true
474474
default:
475475
return false
@@ -494,10 +494,20 @@ func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, erro
494494
for _, item := range list.Items {
495495
switch n := item.(type) {
496496

497-
case *ast.FuncName:
497+
case *ast.RangeFunction:
498498
// If the function or table can't be found, don't error out. There
499499
// are many queries that depend on functions unknown to sqlc.
500-
fn, err := qc.GetFunc(n)
500+
var funcCall *ast.FuncCall
501+
switch f := n.Functions.Items[0].(type) {
502+
case *ast.List:
503+
funcCall = f.Items[0].(*ast.FuncCall)
504+
case *ast.FuncCall:
505+
funcCall = f
506+
default:
507+
return nil, fmt.Errorf("sourceTables: unsupported function call type %T", n.Functions.Items[0])
508+
}
509+
510+
fn, err := qc.GetFunc(funcCall.Func)
501511
if err != nil {
502512
continue
503513
}
@@ -507,7 +517,22 @@ func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, erro
507517
Name: fn.ReturnType.Name,
508518
})
509519
if err != nil {
510-
continue
520+
if n.Alias == nil || len(n.Alias.Colnames.Items) == 0 {
521+
continue
522+
}
523+
524+
table = &Table{}
525+
for _, colName := range n.Alias.Colnames.Items {
526+
table.Columns = append(table.Columns, &Column{
527+
Name: colName.(*ast.String).Str,
528+
DataType: "any",
529+
})
530+
}
531+
}
532+
if n.Alias != nil {
533+
table.Rel = &ast.TableName{
534+
Name: *n.Alias.Aliasname,
535+
}
511536
}
512537
tables = append(tables, table)
513538

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)