From 15d9ebd84a958f03318cca4851ed6a1c1bd8a23c Mon Sep 17 00:00:00 2001 From: Andreas Kutschera Date: Sat, 1 Jul 2023 14:13:34 +0200 Subject: [PATCH] fix: count columns aliases only once Alias column names don't exist in the table definition. When we take it from the select target list, we only need to do this once (and not once for every table in a join statement). Refs: #2398 #1886 --- internal/compiler/output_columns.go | 6 ++- .../join_group_order/postgresql/go/db.go | 31 ++++++++++++ .../join_group_order/postgresql/go/models.go | 19 ++++++++ .../postgresql/go/query.sql.go | 47 +++++++++++++++++++ .../join_group_order/postgresql/query.sql | 17 +++++++ .../join_group_order/postgresql/sqlc.yaml | 7 +++ 6 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 internal/endtoend/testdata/join_group_order/postgresql/go/db.go create mode 100644 internal/endtoend/testdata/join_group_order/postgresql/go/models.go create mode 100644 internal/endtoend/testdata/join_group_order/postgresql/go/query.sql.go create mode 100644 internal/endtoend/testdata/join_group_order/postgresql/query.sql create mode 100644 internal/endtoend/testdata/join_group_order/postgresql/sqlc.yaml diff --git a/internal/compiler/output_columns.go b/internal/compiler/output_columns.go index 26a421f025..9804597628 100644 --- a/internal/compiler/output_columns.go +++ b/internal/compiler/output_columns.go @@ -661,6 +661,7 @@ func findColumnForRef(ref *ast.ColumnRef, tables []*Table, selectStatement *ast. } var found int + var foundResTarget *ast.ResTarget for _, t := range tables { if alias != "" && t.Rel.Name != alias { continue @@ -686,7 +687,10 @@ func findColumnForRef(ref *ast.ColumnRef, tables []*Table, selectStatement *ast. continue } if resTarget.Name != nil && *resTarget.Name == name { - found++ + if resTarget != foundResTarget { + found++ + foundResTarget = resTarget + } } } } diff --git a/internal/endtoend/testdata/join_group_order/postgresql/go/db.go b/internal/endtoend/testdata/join_group_order/postgresql/go/db.go new file mode 100644 index 0000000000..8c5b31f933 --- /dev/null +++ b/internal/endtoend/testdata/join_group_order/postgresql/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/join_group_order/postgresql/go/models.go b/internal/endtoend/testdata/join_group_order/postgresql/go/models.go new file mode 100644 index 0000000000..6eab90c5ee --- /dev/null +++ b/internal/endtoend/testdata/join_group_order/postgresql/go/models.go @@ -0,0 +1,19 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import ( + "database/sql" +) + +type Author struct { + ID sql.NullInt32 +} + +type Book struct { + ID sql.NullInt32 + AuthorID sql.NullInt32 + Price sql.NullInt32 +} diff --git a/internal/endtoend/testdata/join_group_order/postgresql/go/query.sql.go b/internal/endtoend/testdata/join_group_order/postgresql/go/query.sql.go new file mode 100644 index 0000000000..8b100385ae --- /dev/null +++ b/internal/endtoend/testdata/join_group_order/postgresql/go/query.sql.go @@ -0,0 +1,47 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 +// source: query.sql + +package querytest + +import ( + "context" + "database/sql" +) + +const listAuthorsByCheapestBook = `-- name: ListAuthorsByCheapestBook :many +SELECT + author_id, min(b.price) as min_price +From books b inner join authors a on a.id = b.author_id +GROUP BY b.author_id +ORDER BY min_price +` + +type ListAuthorsByCheapestBookRow struct { + AuthorID sql.NullInt32 + MinPrice interface{} +} + +func (q *Queries) ListAuthorsByCheapestBook(ctx context.Context) ([]ListAuthorsByCheapestBookRow, error) { + rows, err := q.db.QueryContext(ctx, listAuthorsByCheapestBook) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ListAuthorsByCheapestBookRow + for rows.Next() { + var i ListAuthorsByCheapestBookRow + if err := rows.Scan(&i.AuthorID, &i.MinPrice); 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/join_group_order/postgresql/query.sql b/internal/endtoend/testdata/join_group_order/postgresql/query.sql new file mode 100644 index 0000000000..e77d0cec4b --- /dev/null +++ b/internal/endtoend/testdata/join_group_order/postgresql/query.sql @@ -0,0 +1,17 @@ +-- Example queries for sqlc +CREATE TABLE authors ( + id INT +); + +CREATE TABLE books ( + id INT, + author_id INT, + price INT +); + +-- name: ListAuthorsByCheapestBook :many +SELECT + author_id, min(b.price) as min_price +From books b inner join authors a on a.id = b.author_id +GROUP BY b.author_id +ORDER BY min_price; \ No newline at end of file diff --git a/internal/endtoend/testdata/join_group_order/postgresql/sqlc.yaml b/internal/endtoend/testdata/join_group_order/postgresql/sqlc.yaml new file mode 100644 index 0000000000..c4b3831631 --- /dev/null +++ b/internal/endtoend/testdata/join_group_order/postgresql/sqlc.yaml @@ -0,0 +1,7 @@ +version: 1 +packages: + - path: "go" + name: "querytest" + engine: "postgresql" + schema: "query.sql" + queries: "query.sql" \ No newline at end of file