Skip to content

Commit 9d48aa8

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 75ee59c commit 9d48aa8

31 files changed

Lines changed: 480 additions & 4 deletions

internal/compiler/output_columns.go

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
404404
case *ast.SelectStmt:
405405
list = astutils.Search(n.FromClause, func(node ast.Node) bool {
406406
switch node.(type) {
407-
case *ast.RangeVar, *ast.RangeSubselect, *ast.FuncName:
407+
case *ast.RangeVar, *ast.RangeSubselect, *ast.RangeFunction:
408408
return true
409409
default:
410410
return false
@@ -429,10 +429,20 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
429429
for _, item := range list.Items {
430430
switch n := item.(type) {
431431

432-
case *ast.FuncName:
432+
case *ast.RangeFunction:
433433
// If the function or table can't be found, don't error out. There
434434
// are many queries that depend on functions unknown to sqlc.
435-
fn, err := qc.GetFunc(n)
435+
var funcCall *ast.FuncCall
436+
switch f := n.Functions.Items[0].(type) {
437+
case *ast.List:
438+
funcCall = f.Items[0].(*ast.FuncCall)
439+
case *ast.FuncCall:
440+
funcCall = f
441+
default:
442+
return nil, fmt.Errorf("sourceTables: unsupported function call type %T", n.Functions.Items[0])
443+
}
444+
445+
fn, err := qc.GetFunc(funcCall.Func)
436446
if err != nil {
437447
continue
438448
}
@@ -442,7 +452,22 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) {
442452
Name: fn.ReturnType.Name,
443453
})
444454
if err != nil {
445-
continue
455+
if n.Alias == nil || len(n.Alias.Colnames.Items) == 0 {
456+
continue
457+
}
458+
459+
table = &Table{}
460+
for _, colName := range n.Alias.Colnames.Items {
461+
table.Columns = append(table.Columns, &Column{
462+
Name: colName.(*ast.String).Str,
463+
DataType: "any",
464+
})
465+
}
466+
}
467+
if n.Alias != nil {
468+
table.Rel = &ast.TableName{
469+
Name: *n.Alias.Aliasname,
470+
}
446471
}
447472
tables = append(tables, table)
448473

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

0 commit comments

Comments
 (0)