diff --git a/internal/compiler/resolve.go b/internal/compiler/resolve.go index f47a01d7a8..abeabefeb7 100644 --- a/internal/compiler/resolve.go +++ b/internal/compiler/resolve.go @@ -49,6 +49,26 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar, } return nil } + indexQueryTable := func(table *Table) error { + columns := make([]*catalog.Column, 0, len(table.Columns)) + for _, column := range table.Columns { + columnType := ast.TypeName{Name: column.DataType} + if column.Type != nil { + columnType = *column.Type + } + columns = append(columns, &catalog.Column{ + Name: column.Name, + Type: columnType, + IsNotNull: column.NotNull, + IsUnsigned: column.Unsigned, + IsArray: column.IsArray, + ArrayDims: column.ArrayDims, + Comment: column.Comment, + Length: column.Length, + }) + } + return indexTable(catalog.Table{Rel: table.Rel, Columns: columns}) + } for _, rv := range rvs { if rv.Relname == nil { @@ -66,8 +86,12 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar, if qc == nil { continue } - // If the table name doesn't exist, first check if it's a CTE - if _, qcerr := qc.GetTable(fqn); qcerr != nil { + // If the table name doesn't exist, first check if it's a CTE. + queryTable, qcerr := qc.GetTable(fqn) + if qcerr != nil { + return nil, err + } + if err := indexQueryTable(queryTable); err != nil { return nil, err } continue diff --git a/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/go/db.go b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/go/db.go new file mode 100644 index 0000000000..2666c1c05d --- /dev/null +++ b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/go/db.go @@ -0,0 +1,32 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package querytest + +import ( + "context" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" +) + +type DBTX interface { + Exec(context.Context, string, ...any) (pgconn.CommandTag, error) + Query(context.Context, string, ...any) (pgx.Rows, error) + QueryRow(context.Context, string, ...any) 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/cte_filter_alias/postgresql/pgx/go/models.go b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/go/models.go new file mode 100644 index 0000000000..66bf1e4293 --- /dev/null +++ b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/go/models.go @@ -0,0 +1,13 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package querytest + +import ( + "github.com/jackc/pgx/v5/pgtype" +) + +type Event struct { + HappenedAt pgtype.Timestamptz +} diff --git a/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/go/query.sql.go b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/go/query.sql.go new file mode 100644 index 0000000000..ebe30a1b9e --- /dev/null +++ b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/go/query.sql.go @@ -0,0 +1,28 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 +// source: query.sql + +package querytest + +import ( + "context" + + "github.com/jackc/pgx/v5/pgtype" +) + +const countRecentEvents = `-- name: CountRecentEvents :one +WITH activity AS ( + SELECT happened_at AS activity_at + FROM events +) +SELECT COUNT(*) FILTER (WHERE activity_at >= $1)::bigint AS recent_events +FROM activity +` + +func (q *Queries) CountRecentEvents(ctx context.Context, activityAt pgtype.Timestamptz) (int64, error) { + row := q.db.QueryRow(ctx, countRecentEvents, activityAt) + var recent_events int64 + err := row.Scan(&recent_events) + return recent_events, err +} diff --git a/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/query.sql b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/query.sql new file mode 100644 index 0000000000..ce202dafba --- /dev/null +++ b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/query.sql @@ -0,0 +1,7 @@ +-- name: CountRecentEvents :one +WITH activity AS ( + SELECT happened_at AS activity_at + FROM events +) +SELECT COUNT(*) FILTER (WHERE activity_at >= $1)::bigint AS recent_events +FROM activity; diff --git a/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/schema.sql b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/schema.sql new file mode 100644 index 0000000000..d913b1f159 --- /dev/null +++ b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/schema.sql @@ -0,0 +1,3 @@ +CREATE TABLE events ( + happened_at timestamptz NOT NULL +); diff --git a/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/sqlc.yaml b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/sqlc.yaml new file mode 100644 index 0000000000..5dc63e3f91 --- /dev/null +++ b/internal/endtoend/testdata/cte_filter_alias/postgresql/pgx/sqlc.yaml @@ -0,0 +1,10 @@ +version: "2" +sql: + - engine: "postgresql" + schema: "schema.sql" + queries: "query.sql" + gen: + go: + package: "querytest" + out: "go" + sql_package: "pgx/v5" diff --git a/internal/endtoend/testdata/cte_update/postgresql/pgx/go/query.sql.go b/internal/endtoend/testdata/cte_update/postgresql/pgx/go/query.sql.go index 3d729de8a8..2866c3736e 100644 --- a/internal/endtoend/testdata/cte_update/postgresql/pgx/go/query.sql.go +++ b/internal/endtoend/testdata/cte_update/postgresql/pgx/go/query.sql.go @@ -23,9 +23,9 @@ from updated_attribute ` type UpdateAttributeParams struct { - FilterValue pgtype.Bool - Value pgtype.Text - ID pgtype.Int8 + FilterValue bool + Value string + ID int64 } type UpdateAttributeRow struct {