diff --git a/internal/compiler/output_columns.go b/internal/compiler/output_columns.go index 36cafa3b22..d12e7f9cbb 100644 --- a/internal/compiler/output_columns.go +++ b/internal/compiler/output_columns.go @@ -469,7 +469,7 @@ func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, erro case *ast.SelectStmt: list = astutils.Search(n.FromClause, func(node ast.Node) bool { switch node.(type) { - case *ast.RangeVar, *ast.RangeSubselect, *ast.FuncName: + case *ast.RangeVar, *ast.RangeSubselect, *ast.RangeFunction: return true default: return false @@ -494,10 +494,20 @@ func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, erro for _, item := range list.Items { switch n := item.(type) { - case *ast.FuncName: + case *ast.RangeFunction: // 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) + var funcCall *ast.FuncCall + switch f := n.Functions.Items[0].(type) { + case *ast.List: + funcCall = f.Items[0].(*ast.FuncCall) + case *ast.FuncCall: + funcCall = f + default: + return nil, fmt.Errorf("sourceTables: unsupported function call type %T", n.Functions.Items[0]) + } + + fn, err := qc.GetFunc(funcCall.Func) if err != nil { continue } @@ -507,7 +517,22 @@ func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, erro Name: fn.ReturnType.Name, }) if err != nil { - continue + if n.Alias == nil || len(n.Alias.Colnames.Items) == 0 { + continue + } + + table = &Table{} + for _, colName := range n.Alias.Colnames.Items { + table.Columns = append(table.Columns, &Column{ + Name: colName.(*ast.String).Str, + DataType: "any", + }) + } + } + if n.Alias != nil { + table.Rel = &ast.TableName{ + Name: *n.Alias.Aliasname, + } } tables = append(tables, table) diff --git a/internal/endtoend/testdata/unnest/postgresql/pgx/v4/go/querier.go b/internal/endtoend/testdata/unnest/postgresql/pgx/v4/go/querier.go index 33eece8374..05c261c344 100644 --- a/internal/endtoend/testdata/unnest/postgresql/pgx/v4/go/querier.go +++ b/internal/endtoend/testdata/unnest/postgresql/pgx/v4/go/querier.go @@ -12,6 +12,7 @@ import ( type Querier interface { CreateMemories(ctx context.Context, vampireID []uuid.UUID) ([]Memory, error) + GetVampireIDs(ctx context.Context, vampireID []uuid.UUID) ([]uuid.UUID, error) } var _ Querier = (*Queries)(nil) diff --git a/internal/endtoend/testdata/unnest/postgresql/pgx/v4/go/query.sql.go b/internal/endtoend/testdata/unnest/postgresql/pgx/v4/go/query.sql.go index 9778099cbe..f8a0594a7f 100644 --- a/internal/endtoend/testdata/unnest/postgresql/pgx/v4/go/query.sql.go +++ b/internal/endtoend/testdata/unnest/postgresql/pgx/v4/go/query.sql.go @@ -43,3 +43,27 @@ func (q *Queries) CreateMemories(ctx context.Context, vampireID []uuid.UUID) ([] } return items, nil } + +const getVampireIDs = `-- name: GetVampireIDs :many +SELECT vampires.id::uuid FROM unnest($1::uuid[]) AS vampires (id) +` + +func (q *Queries) GetVampireIDs(ctx context.Context, vampireID []uuid.UUID) ([]uuid.UUID, error) { + rows, err := q.db.Query(ctx, getVampireIDs, vampireID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []uuid.UUID + for rows.Next() { + var vampires_id uuid.UUID + if err := rows.Scan(&vampires_id); err != nil { + return nil, err + } + items = append(items, vampires_id) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/unnest/postgresql/pgx/v4/query.sql b/internal/endtoend/testdata/unnest/postgresql/pgx/v4/query.sql index 86deda3df4..d06a0578b4 100644 --- a/internal/endtoend/testdata/unnest/postgresql/pgx/v4/query.sql +++ b/internal/endtoend/testdata/unnest/postgresql/pgx/v4/query.sql @@ -4,3 +4,6 @@ SELECT unnest(@vampire_id::uuid[]) AS vampire_id RETURNING *; + +-- name: GetVampireIDs :many +SELECT vampires.id::uuid FROM unnest(@vampire_id::uuid[]) AS vampires (id); diff --git a/internal/endtoend/testdata/unnest/postgresql/pgx/v5/go/querier.go b/internal/endtoend/testdata/unnest/postgresql/pgx/v5/go/querier.go index 7684cdbf50..5ba26a06fc 100644 --- a/internal/endtoend/testdata/unnest/postgresql/pgx/v5/go/querier.go +++ b/internal/endtoend/testdata/unnest/postgresql/pgx/v5/go/querier.go @@ -12,6 +12,7 @@ import ( type Querier interface { CreateMemories(ctx context.Context, vampireID []pgtype.UUID) ([]Memory, error) + GetVampireIDs(ctx context.Context, vampireID []pgtype.UUID) ([]pgtype.UUID, error) } var _ Querier = (*Queries)(nil) diff --git a/internal/endtoend/testdata/unnest/postgresql/pgx/v5/go/query.sql.go b/internal/endtoend/testdata/unnest/postgresql/pgx/v5/go/query.sql.go index 592ff7cf21..b24d74bdd2 100644 --- a/internal/endtoend/testdata/unnest/postgresql/pgx/v5/go/query.sql.go +++ b/internal/endtoend/testdata/unnest/postgresql/pgx/v5/go/query.sql.go @@ -43,3 +43,27 @@ func (q *Queries) CreateMemories(ctx context.Context, vampireID []pgtype.UUID) ( } return items, nil } + +const getVampireIDs = `-- name: GetVampireIDs :many +SELECT vampires.id::uuid FROM unnest($1::uuid[]) AS vampires (id) +` + +func (q *Queries) GetVampireIDs(ctx context.Context, vampireID []pgtype.UUID) ([]pgtype.UUID, error) { + rows, err := q.db.Query(ctx, getVampireIDs, vampireID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []pgtype.UUID + for rows.Next() { + var vampires_id pgtype.UUID + if err := rows.Scan(&vampires_id); err != nil { + return nil, err + } + items = append(items, vampires_id) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/unnest/postgresql/pgx/v5/query.sql b/internal/endtoend/testdata/unnest/postgresql/pgx/v5/query.sql index 86deda3df4..d06a0578b4 100644 --- a/internal/endtoend/testdata/unnest/postgresql/pgx/v5/query.sql +++ b/internal/endtoend/testdata/unnest/postgresql/pgx/v5/query.sql @@ -4,3 +4,6 @@ SELECT unnest(@vampire_id::uuid[]) AS vampire_id RETURNING *; + +-- name: GetVampireIDs :many +SELECT vampires.id::uuid FROM unnest(@vampire_id::uuid[]) AS vampires (id); diff --git a/internal/endtoend/testdata/unnest/postgresql/stdlib/go/querier.go b/internal/endtoend/testdata/unnest/postgresql/stdlib/go/querier.go index 33eece8374..05c261c344 100644 --- a/internal/endtoend/testdata/unnest/postgresql/stdlib/go/querier.go +++ b/internal/endtoend/testdata/unnest/postgresql/stdlib/go/querier.go @@ -12,6 +12,7 @@ import ( type Querier interface { CreateMemories(ctx context.Context, vampireID []uuid.UUID) ([]Memory, error) + GetVampireIDs(ctx context.Context, vampireID []uuid.UUID) ([]uuid.UUID, error) } var _ Querier = (*Queries)(nil) diff --git a/internal/endtoend/testdata/unnest/postgresql/stdlib/go/query.sql.go b/internal/endtoend/testdata/unnest/postgresql/stdlib/go/query.sql.go index b5d80f7f89..d8419a11d3 100644 --- a/internal/endtoend/testdata/unnest/postgresql/stdlib/go/query.sql.go +++ b/internal/endtoend/testdata/unnest/postgresql/stdlib/go/query.sql.go @@ -47,3 +47,30 @@ func (q *Queries) CreateMemories(ctx context.Context, vampireID []uuid.UUID) ([] } return items, nil } + +const getVampireIDs = `-- name: GetVampireIDs :many +SELECT vampires.id::uuid FROM unnest($1::uuid[]) AS vampires (id) +` + +func (q *Queries) GetVampireIDs(ctx context.Context, vampireID []uuid.UUID) ([]uuid.UUID, error) { + rows, err := q.db.QueryContext(ctx, getVampireIDs, pq.Array(vampireID)) + if err != nil { + return nil, err + } + defer rows.Close() + var items []uuid.UUID + for rows.Next() { + var vampires_id uuid.UUID + if err := rows.Scan(&vampires_id); err != nil { + return nil, err + } + items = append(items, vampires_id) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/unnest/postgresql/stdlib/query.sql b/internal/endtoend/testdata/unnest/postgresql/stdlib/query.sql index 86deda3df4..d06a0578b4 100644 --- a/internal/endtoend/testdata/unnest/postgresql/stdlib/query.sql +++ b/internal/endtoend/testdata/unnest/postgresql/stdlib/query.sql @@ -4,3 +4,6 @@ SELECT unnest(@vampire_id::uuid[]) AS vampire_id RETURNING *; + +-- name: GetVampireIDs :many +SELECT vampires.id::uuid FROM unnest(@vampire_id::uuid[]) AS vampires (id); diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/db.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/db.go new file mode 100644 index 0000000000..5a2cde8cda --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/db.go @@ -0,0 +1,32 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import ( + "context" + + "github.com/jackc/pgconn" + "github.com/jackc/pgx/v4" +) + +type DBTX interface { + Exec(context.Context, string, ...interface{}) (pgconn.CommandTag, error) + Query(context.Context, string, ...interface{}) (pgx.Rows, error) + QueryRow(context.Context, string, ...interface{}) pgx.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx pgx.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/models.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/models.go new file mode 100644 index 0000000000..6f70ed3841 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/models.go @@ -0,0 +1,12 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import () + +type ArrayValue struct { + ID int64 + Values []string +} diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/querier.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/querier.go new file mode 100644 index 0000000000..989af9d558 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/querier.go @@ -0,0 +1,15 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import ( + "context" +) + +type Querier interface { + GetValues(ctx context.Context) ([]GetValuesRow, error) +} + +var _ Querier = (*Queries)(nil) diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/query.sql.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/query.sql.go new file mode 100644 index 0000000000..d2f8b70c02 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/go/query.sql.go @@ -0,0 +1,41 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 +// source: query.sql + +package querytest + +import ( + "context" +) + +const getValues = `-- name: GetValues :many +SELECT id, index::bigint, value::text +FROM array_values AS x, unnest(values) WITH ORDINALITY AS y (value, index) +` + +type GetValuesRow struct { + ID int64 + Index int64 + Value string +} + +func (q *Queries) GetValues(ctx context.Context) ([]GetValuesRow, error) { + rows, err := q.db.Query(ctx, getValues) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetValuesRow + for rows.Next() { + var i GetValuesRow + if err := rows.Scan(&i.ID, &i.Index, &i.Value); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/query.sql b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/query.sql new file mode 100644 index 0000000000..8bed8bdada --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/query.sql @@ -0,0 +1,3 @@ +-- name: GetValues :many +SELECT id, index::bigint, value::text +FROM array_values AS x, unnest(values) WITH ORDINALITY AS y (value, index); diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/schema.sql b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/schema.sql new file mode 100644 index 0000000000..2a9a261e96 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/schema.sql @@ -0,0 +1,4 @@ +CREATE TABLE array_values ( + id bigserial PRIMARY KEY, + values text[] NOT NULL +); diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/sqlc.json b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/sqlc.json new file mode 100644 index 0000000000..e0530db353 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v4/sqlc.json @@ -0,0 +1,14 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "postgresql", + "sql_package": "pgx/v4", + "name": "querytest", + "schema": "schema.sql", + "queries": "query.sql", + "emit_interface": true + } + ] +} diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/db.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/db.go new file mode 100644 index 0000000000..7bc02a1d7d --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/db.go @@ -0,0 +1,32 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import ( + "context" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" +) + +type DBTX interface { + Exec(context.Context, string, ...interface{}) (pgconn.CommandTag, error) + Query(context.Context, string, ...interface{}) (pgx.Rows, error) + QueryRow(context.Context, string, ...interface{}) pgx.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx pgx.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/models.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/models.go new file mode 100644 index 0000000000..6f70ed3841 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/models.go @@ -0,0 +1,12 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import () + +type ArrayValue struct { + ID int64 + Values []string +} diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/querier.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/querier.go new file mode 100644 index 0000000000..989af9d558 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/querier.go @@ -0,0 +1,15 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import ( + "context" +) + +type Querier interface { + GetValues(ctx context.Context) ([]GetValuesRow, error) +} + +var _ Querier = (*Queries)(nil) diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/query.sql.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/query.sql.go new file mode 100644 index 0000000000..d2f8b70c02 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/go/query.sql.go @@ -0,0 +1,41 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 +// source: query.sql + +package querytest + +import ( + "context" +) + +const getValues = `-- name: GetValues :many +SELECT id, index::bigint, value::text +FROM array_values AS x, unnest(values) WITH ORDINALITY AS y (value, index) +` + +type GetValuesRow struct { + ID int64 + Index int64 + Value string +} + +func (q *Queries) GetValues(ctx context.Context) ([]GetValuesRow, error) { + rows, err := q.db.Query(ctx, getValues) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetValuesRow + for rows.Next() { + var i GetValuesRow + if err := rows.Scan(&i.ID, &i.Index, &i.Value); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/query.sql b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/query.sql new file mode 100644 index 0000000000..8bed8bdada --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/query.sql @@ -0,0 +1,3 @@ +-- name: GetValues :many +SELECT id, index::bigint, value::text +FROM array_values AS x, unnest(values) WITH ORDINALITY AS y (value, index); diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/schema.sql b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/schema.sql new file mode 100644 index 0000000000..2a9a261e96 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/schema.sql @@ -0,0 +1,4 @@ +CREATE TABLE array_values ( + id bigserial PRIMARY KEY, + values text[] NOT NULL +); diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/sqlc.json b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/sqlc.json new file mode 100644 index 0000000000..007fb8530f --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/pgx/v5/sqlc.json @@ -0,0 +1,14 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "postgresql", + "sql_package": "pgx/v5", + "name": "querytest", + "schema": "schema.sql", + "queries": "query.sql", + "emit_interface": true + } + ] +} diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/db.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/db.go new file mode 100644 index 0000000000..8c5b31f933 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/models.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/models.go new file mode 100644 index 0000000000..6f70ed3841 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/models.go @@ -0,0 +1,12 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import () + +type ArrayValue struct { + ID int64 + Values []string +} diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/querier.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/querier.go new file mode 100644 index 0000000000..989af9d558 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/querier.go @@ -0,0 +1,15 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import ( + "context" +) + +type Querier interface { + GetValues(ctx context.Context) ([]GetValuesRow, error) +} + +var _ Querier = (*Queries)(nil) diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/query.sql.go b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/query.sql.go new file mode 100644 index 0000000000..c390f1e295 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/go/query.sql.go @@ -0,0 +1,44 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 +// source: query.sql + +package querytest + +import ( + "context" +) + +const getValues = `-- name: GetValues :many +SELECT id, index::bigint, value::text +FROM array_values AS x, unnest(values) WITH ORDINALITY AS y (value, index) +` + +type GetValuesRow struct { + ID int64 + Index int64 + Value string +} + +func (q *Queries) GetValues(ctx context.Context) ([]GetValuesRow, error) { + rows, err := q.db.QueryContext(ctx, getValues) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetValuesRow + for rows.Next() { + var i GetValuesRow + if err := rows.Scan(&i.ID, &i.Index, &i.Value); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/query.sql b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/query.sql new file mode 100644 index 0000000000..8bed8bdada --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/query.sql @@ -0,0 +1,3 @@ +-- name: GetValues :many +SELECT id, index::bigint, value::text +FROM array_values AS x, unnest(values) WITH ORDINALITY AS y (value, index); diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/schema.sql b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/schema.sql new file mode 100644 index 0000000000..2a9a261e96 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/schema.sql @@ -0,0 +1,4 @@ +CREATE TABLE array_values ( + id bigserial PRIMARY KEY, + values text[] NOT NULL +); diff --git a/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/sqlc.json b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/sqlc.json new file mode 100644 index 0000000000..36f98f9072 --- /dev/null +++ b/internal/endtoend/testdata/unnest_with_ordinality/postgresql/stdlib/sqlc.json @@ -0,0 +1,13 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "postgresql", + "name": "querytest", + "schema": "schema.sql", + "queries": "query.sql", + "emit_interface": true + } + ] +}