diff --git a/internal/compiler/output_columns.go b/internal/compiler/output_columns.go index 6cf7736032..56e236cecc 100644 --- a/internal/compiler/output_columns.go +++ b/internal/compiler/output_columns.go @@ -299,10 +299,13 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) { var tables []*Table for _, item := range list.Items { switch n := item.(type) { + case *ast.FuncName: + // If the function or table can't be found, don't error out. There + // are many queries that depend on functions unknown to sqlc. fn, err := qc.GetFunc(n) if err != nil { - return nil, err + continue } table, err := qc.GetTable(&ast.TableName{ Catalog: fn.ReturnType.Catalog, @@ -310,9 +313,10 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) { Name: fn.ReturnType.Name, }) if err != nil { - return nil, err + continue } tables = append(tables, table) + case *ast.RangeSubselect: cols, err := outputColumns(qc, n.Subquery) if err != nil { @@ -345,6 +349,7 @@ func sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, error) { } } tables = append(tables, table) + default: return nil, fmt.Errorf("sourceTable: unsupported list item type: %T", n) } diff --git a/internal/endtoend/testdata/func_return/go/query.sql.go b/internal/endtoend/testdata/func_return/go/query.sql.go index f40859f8e1..990f335916 100644 --- a/internal/endtoend/testdata/func_return/go/query.sql.go +++ b/internal/endtoend/testdata/func_return/go/query.sql.go @@ -5,8 +5,43 @@ package querytest import ( "context" + "net" ) +const generateSeries = `-- name: GenerateSeries :many +SELECT ($1::inet) + i +FROM generate_series(0, $2::int) AS i +LIMIT 1 +` + +type GenerateSeriesParams struct { + Column1 net.IP + Column2 int32 +} + +func (q *Queries) GenerateSeries(ctx context.Context, arg GenerateSeriesParams) ([]int32, error) { + rows, err := q.db.QueryContext(ctx, generateSeries, arg.Column1, arg.Column2) + if err != nil { + return nil, err + } + defer rows.Close() + var items []int32 + for rows.Next() { + var column_1 int32 + if err := rows.Scan(&column_1); err != nil { + return nil, err + } + items = append(items, column_1) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const getUsers = `-- name: GetUsers :many SELECT id, first_name FROM users_func() diff --git a/internal/endtoend/testdata/func_return/query.sql b/internal/endtoend/testdata/func_return/query.sql index f72450421a..cfea2119d0 100644 --- a/internal/endtoend/testdata/func_return/query.sql +++ b/internal/endtoend/testdata/func_return/query.sql @@ -2,3 +2,8 @@ SELECT * FROM users_func() WHERE first_name != ''; + +/* name: GenerateSeries :many */ +SELECT ($1::inet) + i +FROM generate_series(0, $2::int) AS i +LIMIT 1;