diff --git a/internal/codegen/golang/imports.go b/internal/codegen/golang/imports.go index 0f6dca633e..e40bddd779 100644 --- a/internal/codegen/golang/imports.go +++ b/internal/codegen/golang/imports.go @@ -136,6 +136,7 @@ var pgtypeTypes = map[string]struct{}{ "pgtype.CIDR": {}, "pgtype.Inet": {}, "pgtype.Macaddr": {}, + "pgtype.Numeric": {}, } var pqtypeTypes = map[string]struct{}{ diff --git a/internal/codegen/golang/postgresql_type.go b/internal/codegen/golang/postgresql_type.go index c5e0d7fde0..b55386b3fd 100644 --- a/internal/codegen/golang/postgresql_type.go +++ b/internal/codegen/golang/postgresql_type.go @@ -58,6 +58,9 @@ func postgresType(r *compiler.Result, col *compiler.Column, settings config.Comb return "sql.NullFloat64" // TODO: Change to sql.NullFloat32 after updating the go.mod file case "numeric", "pg_catalog.numeric", "money": + if driver == SQLDriverPGXV4 { + return "pgtype.Numeric" + } // Since the Go standard library does not have a decimal type, lib/pq // returns numerics as strings. // diff --git a/internal/endtoend/testdata/datatype/pgx/go/models.go b/internal/endtoend/testdata/datatype/pgx/go/models.go index 0527cfff54..3877de48c1 100644 --- a/internal/endtoend/testdata/datatype/pgx/go/models.go +++ b/internal/endtoend/testdata/datatype/pgx/go/models.go @@ -5,6 +5,8 @@ package datatype import ( "database/sql" "time" + + "github.com/jackc/pgtype" ) type DtCharacter struct { @@ -45,12 +47,24 @@ type DtDatetimeNotNull struct { H time.Time } +type DtNetType struct { + A pgtype.Inet + B pgtype.CIDR + C pgtype.Macaddr +} + +type DtNetTypesNotNull struct { + A pgtype.Inet + B pgtype.CIDR + C pgtype.Macaddr +} + type DtNumeric struct { A int16 B sql.NullInt32 C sql.NullInt64 - D sql.NullString - E sql.NullString + D pgtype.Numeric + E pgtype.Numeric F sql.NullFloat64 G sql.NullFloat64 H int16 @@ -65,8 +79,8 @@ type DtNumericNotNull struct { A int16 B int32 C int64 - D string - E string + D pgtype.Numeric + E pgtype.Numeric F float32 G float64 H int16 diff --git a/internal/endtoend/testdata/datatype/pgx/sql/net-types.sql b/internal/endtoend/testdata/datatype/pgx/sql/net-types.sql new file mode 100644 index 0000000000..6239b6f9f6 --- /dev/null +++ b/internal/endtoend/testdata/datatype/pgx/sql/net-types.sql @@ -0,0 +1,13 @@ +-- Network Address Types +-- https://www.postgresql.org/docs/current/datatype-net-types.html +CREATE TABLE dt_net_types ( + a inet, + b cidr, + c macaddr +); + +CREATE TABLE dt_net_types_not_null ( + a inet NOT NULL, + b cidr NOT NULL, + c macaddr NOT NULL +); diff --git a/internal/endtoend/testdata/datatype/stdlib/go/models.go b/internal/endtoend/testdata/datatype/stdlib/go/models.go index 0527cfff54..5068324852 100644 --- a/internal/endtoend/testdata/datatype/stdlib/go/models.go +++ b/internal/endtoend/testdata/datatype/stdlib/go/models.go @@ -5,6 +5,8 @@ package datatype import ( "database/sql" "time" + + "github.com/tabbed/pqtype" ) type DtCharacter struct { @@ -45,6 +47,18 @@ type DtDatetimeNotNull struct { H time.Time } +type DtNetType struct { + A pqtype.Inet + B pqtype.CIDR + C pqtype.Macaddr +} + +type DtNetTypesNotNull struct { + A pqtype.Inet + B pqtype.CIDR + C pqtype.Macaddr +} + type DtNumeric struct { A int16 B sql.NullInt32 diff --git a/internal/endtoend/testdata/datatype/stdlib/sql/net-types.sql b/internal/endtoend/testdata/datatype/stdlib/sql/net-types.sql new file mode 100644 index 0000000000..6239b6f9f6 --- /dev/null +++ b/internal/endtoend/testdata/datatype/stdlib/sql/net-types.sql @@ -0,0 +1,13 @@ +-- Network Address Types +-- https://www.postgresql.org/docs/current/datatype-net-types.html +CREATE TABLE dt_net_types ( + a inet, + b cidr, + c macaddr +); + +CREATE TABLE dt_net_types_not_null ( + a inet NOT NULL, + b cidr NOT NULL, + c macaddr NOT NULL +); diff --git a/internal/endtoend/testdata/params_location/postgresql/pgx/go/models.go b/internal/endtoend/testdata/params_location/postgresql/pgx/go/models.go index 2a3630d6b8..465cd087e7 100644 --- a/internal/endtoend/testdata/params_location/postgresql/pgx/go/models.go +++ b/internal/endtoend/testdata/params_location/postgresql/pgx/go/models.go @@ -4,11 +4,13 @@ package querytest import ( "database/sql" + + "github.com/jackc/pgtype" ) type Order struct { ID int32 - Price string + Price pgtype.Numeric UserID int32 } diff --git a/internal/endtoend/testdata/params_location/postgresql/pgx/go/query.sql.go b/internal/endtoend/testdata/params_location/postgresql/pgx/go/query.sql.go index 63de450bcb..ba01fa1e28 100644 --- a/internal/endtoend/testdata/params_location/postgresql/pgx/go/query.sql.go +++ b/internal/endtoend/testdata/params_location/postgresql/pgx/go/query.sql.go @@ -6,6 +6,8 @@ package querytest import ( "context" "database/sql" + + "github.com/jackc/pgtype" ) const getUserByID = `-- name: GetUserByID :one @@ -82,10 +84,10 @@ WHERE orders.price > $1 type ListUserOrdersRow struct { ID sql.NullInt32 FirstName sql.NullString - Price string + Price pgtype.Numeric } -func (q *Queries) ListUserOrders(ctx context.Context, minPrice string) ([]ListUserOrdersRow, error) { +func (q *Queries) ListUserOrders(ctx context.Context, minPrice pgtype.Numeric) ([]ListUserOrdersRow, error) { rows, err := q.db.Query(ctx, listUserOrders, minPrice) if err != nil { return nil, err diff --git a/internal/endtoend/testdata/pg_generate_series/postgresql/pgx/go/query.sql.go b/internal/endtoend/testdata/pg_generate_series/postgresql/pgx/go/query.sql.go index 337ba15b5e..575f2dd596 100644 --- a/internal/endtoend/testdata/pg_generate_series/postgresql/pgx/go/query.sql.go +++ b/internal/endtoend/testdata/pg_generate_series/postgresql/pgx/go/query.sql.go @@ -6,6 +6,8 @@ package querytest import ( "context" "time" + + "github.com/jackc/pgtype" ) const generateSeries = `-- name: GenerateSeries :many @@ -17,15 +19,15 @@ type GenerateSeriesParams struct { Column2 time.Time `json:"column_2"` } -func (q *Queries) GenerateSeries(ctx context.Context, arg GenerateSeriesParams) ([]string, error) { +func (q *Queries) GenerateSeries(ctx context.Context, arg GenerateSeriesParams) ([]pgtype.Numeric, error) { rows, err := q.db.Query(ctx, generateSeries, arg.Column1, arg.Column2) if err != nil { return nil, err } defer rows.Close() - var items []string + var items []pgtype.Numeric for rows.Next() { - var generate_series string + var generate_series pgtype.Numeric if err := rows.Scan(&generate_series); err != nil { return nil, err } diff --git a/internal/endtoend/testdata/types_network_address/pgx/go/db.go b/internal/endtoend/testdata/types_network_address/pgx/go/db.go deleted file mode 100644 index 4559f50a4f..0000000000 --- a/internal/endtoend/testdata/types_network_address/pgx/go/db.go +++ /dev/null @@ -1,30 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. - -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/types_network_address/pgx/go/models.go b/internal/endtoend/testdata/types_network_address/pgx/go/models.go deleted file mode 100644 index 16e1c6001c..0000000000 --- a/internal/endtoend/testdata/types_network_address/pgx/go/models.go +++ /dev/null @@ -1,19 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. - -package querytest - -import ( - "github.com/jackc/pgtype" -) - -type Bar struct { - Addr pgtype.Macaddr - NullableAddr pgtype.Macaddr -} - -type Foo struct { - PresentIp pgtype.Inet - NullableIp pgtype.Inet - PresentCidr pgtype.CIDR - NullableCidr pgtype.CIDR -} diff --git a/internal/endtoend/testdata/types_network_address/pgx/go/query.sql.go b/internal/endtoend/testdata/types_network_address/pgx/go/query.sql.go deleted file mode 100644 index bd6d214a4e..0000000000 --- a/internal/endtoend/testdata/types_network_address/pgx/go/query.sql.go +++ /dev/null @@ -1,109 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// source: query.sql - -package querytest - -import ( - "context" - - "github.com/jackc/pgtype" -) - -const findBarByAddr = `-- name: FindBarByAddr :one -SELECT addr, nullable_addr FROM bar -WHERE addr = $1 -` - -func (q *Queries) FindBarByAddr(ctx context.Context, addr pgtype.Macaddr) (Bar, error) { - row := q.db.QueryRow(ctx, findBarByAddr, addr) - var i Bar - err := row.Scan(&i.Addr, &i.NullableAddr) - return i, err -} - -const findFooByCIDR = `-- name: FindFooByCIDR :one -SELECT present_ip, nullable_ip, present_cidr, nullable_cidr FROM foo -WHERE present_cidr = $1 -` - -func (q *Queries) FindFooByCIDR(ctx context.Context, presentCidr pgtype.CIDR) (Foo, error) { - row := q.db.QueryRow(ctx, findFooByCIDR, presentCidr) - var i Foo - err := row.Scan( - &i.PresentIp, - &i.NullableIp, - &i.PresentCidr, - &i.NullableCidr, - ) - return i, err -} - -const findFooByIP = `-- name: FindFooByIP :one -SELECT present_ip, nullable_ip, present_cidr, nullable_cidr FROM foo -WHERE present_ip = $1 -` - -func (q *Queries) FindFooByIP(ctx context.Context, presentIp pgtype.Inet) (Foo, error) { - row := q.db.QueryRow(ctx, findFooByIP, presentIp) - var i Foo - err := row.Scan( - &i.PresentIp, - &i.NullableIp, - &i.PresentCidr, - &i.NullableCidr, - ) - return i, err -} - -const listBar = `-- name: ListBar :many -SELECT addr, nullable_addr FROM bar -` - -func (q *Queries) ListBar(ctx context.Context) ([]Bar, error) { - rows, err := q.db.Query(ctx, listBar) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Bar - for rows.Next() { - var i Bar - if err := rows.Scan(&i.Addr, &i.NullableAddr); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const listFoo = `-- name: ListFoo :many -SELECT present_ip, nullable_ip, present_cidr, nullable_cidr FROM foo -` - -func (q *Queries) ListFoo(ctx context.Context) ([]Foo, error) { - rows, err := q.db.Query(ctx, listFoo) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Foo - for rows.Next() { - var i Foo - if err := rows.Scan( - &i.PresentIp, - &i.NullableIp, - &i.PresentCidr, - &i.NullableCidr, - ); 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/types_network_address/pgx/query.sql b/internal/endtoend/testdata/types_network_address/pgx/query.sql deleted file mode 100644 index b1576896a6..0000000000 --- a/internal/endtoend/testdata/types_network_address/pgx/query.sql +++ /dev/null @@ -1,29 +0,0 @@ -CREATE TABLE foo ( - present_ip inet not null, - nullable_ip inet, - present_cidr cidr not null, - nullable_cidr cidr -); - -CREATE TABLE bar ( - addr macaddr not null, - nullable_addr macaddr -); - --- name: ListFoo :many -SELECT * FROM foo; - --- name: FindFooByIP :one -SELECT * FROM foo -WHERE present_ip = $1; - --- name: FindFooByCIDR :one -SELECT * FROM foo -WHERE present_cidr = $1; - --- name: ListBar :many -SELECT * FROM bar; - --- name: FindBarByAddr :one -SELECT * FROM bar -WHERE addr = $1; diff --git a/internal/endtoend/testdata/types_network_address/pgx/sqlc.json b/internal/endtoend/testdata/types_network_address/pgx/sqlc.json deleted file mode 100644 index 9403bd0279..0000000000 --- a/internal/endtoend/testdata/types_network_address/pgx/sqlc.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "1", - "packages": [ - { - "path": "go", - "engine": "postgresql", - "sql_package": "pgx/v4", - "name": "querytest", - "schema": "query.sql", - "queries": "query.sql" - } - ] -} diff --git a/internal/endtoend/testdata/types_network_address/stdlib/go/db.go b/internal/endtoend/testdata/types_network_address/stdlib/go/db.go deleted file mode 100644 index 6a99519302..0000000000 --- a/internal/endtoend/testdata/types_network_address/stdlib/go/db.go +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. - -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/types_network_address/stdlib/go/models.go b/internal/endtoend/testdata/types_network_address/stdlib/go/models.go deleted file mode 100644 index 4c295838dc..0000000000 --- a/internal/endtoend/testdata/types_network_address/stdlib/go/models.go +++ /dev/null @@ -1,19 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. - -package querytest - -import ( - "github.com/tabbed/pqtype" -) - -type Bar struct { - Addr pqtype.Macaddr - NullableAddr pqtype.Macaddr -} - -type Foo struct { - PresentIp pqtype.Inet - NullableIp pqtype.Inet - PresentCidr pqtype.CIDR - NullableCidr pqtype.CIDR -} diff --git a/internal/endtoend/testdata/types_network_address/stdlib/go/query.sql.go b/internal/endtoend/testdata/types_network_address/stdlib/go/query.sql.go deleted file mode 100644 index 26d1313f6f..0000000000 --- a/internal/endtoend/testdata/types_network_address/stdlib/go/query.sql.go +++ /dev/null @@ -1,115 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// source: query.sql - -package querytest - -import ( - "context" - - "github.com/tabbed/pqtype" -) - -const findBarByAddr = `-- name: FindBarByAddr :one -SELECT addr, nullable_addr FROM bar -WHERE addr = $1 -` - -func (q *Queries) FindBarByAddr(ctx context.Context, addr pqtype.Macaddr) (Bar, error) { - row := q.db.QueryRowContext(ctx, findBarByAddr, addr) - var i Bar - err := row.Scan(&i.Addr, &i.NullableAddr) - return i, err -} - -const findFooByCIDR = `-- name: FindFooByCIDR :one -SELECT present_ip, nullable_ip, present_cidr, nullable_cidr FROM foo -WHERE present_cidr = $1 -` - -func (q *Queries) FindFooByCIDR(ctx context.Context, presentCidr pqtype.CIDR) (Foo, error) { - row := q.db.QueryRowContext(ctx, findFooByCIDR, presentCidr) - var i Foo - err := row.Scan( - &i.PresentIp, - &i.NullableIp, - &i.PresentCidr, - &i.NullableCidr, - ) - return i, err -} - -const findFooByIP = `-- name: FindFooByIP :one -SELECT present_ip, nullable_ip, present_cidr, nullable_cidr FROM foo -WHERE present_ip = $1 -` - -func (q *Queries) FindFooByIP(ctx context.Context, presentIp pqtype.Inet) (Foo, error) { - row := q.db.QueryRowContext(ctx, findFooByIP, presentIp) - var i Foo - err := row.Scan( - &i.PresentIp, - &i.NullableIp, - &i.PresentCidr, - &i.NullableCidr, - ) - return i, err -} - -const listBar = `-- name: ListBar :many -SELECT addr, nullable_addr FROM bar -` - -func (q *Queries) ListBar(ctx context.Context) ([]Bar, error) { - rows, err := q.db.QueryContext(ctx, listBar) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Bar - for rows.Next() { - var i Bar - if err := rows.Scan(&i.Addr, &i.NullableAddr); 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 -} - -const listFoo = `-- name: ListFoo :many -SELECT present_ip, nullable_ip, present_cidr, nullable_cidr FROM foo -` - -func (q *Queries) ListFoo(ctx context.Context) ([]Foo, error) { - rows, err := q.db.QueryContext(ctx, listFoo) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Foo - for rows.Next() { - var i Foo - if err := rows.Scan( - &i.PresentIp, - &i.NullableIp, - &i.PresentCidr, - &i.NullableCidr, - ); 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/types_network_address/stdlib/query.sql b/internal/endtoend/testdata/types_network_address/stdlib/query.sql deleted file mode 100644 index b1576896a6..0000000000 --- a/internal/endtoend/testdata/types_network_address/stdlib/query.sql +++ /dev/null @@ -1,29 +0,0 @@ -CREATE TABLE foo ( - present_ip inet not null, - nullable_ip inet, - present_cidr cidr not null, - nullable_cidr cidr -); - -CREATE TABLE bar ( - addr macaddr not null, - nullable_addr macaddr -); - --- name: ListFoo :many -SELECT * FROM foo; - --- name: FindFooByIP :one -SELECT * FROM foo -WHERE present_ip = $1; - --- name: FindFooByCIDR :one -SELECT * FROM foo -WHERE present_cidr = $1; - --- name: ListBar :many -SELECT * FROM bar; - --- name: FindBarByAddr :one -SELECT * FROM bar -WHERE addr = $1; diff --git a/internal/endtoend/testdata/types_network_address/stdlib/sqlc.json b/internal/endtoend/testdata/types_network_address/stdlib/sqlc.json deleted file mode 100644 index ac7c2ed829..0000000000 --- a/internal/endtoend/testdata/types_network_address/stdlib/sqlc.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": "1", - "packages": [ - { - "path": "go", - "name": "querytest", - "schema": "query.sql", - "queries": "query.sql" - } - ] -} diff --git a/scripts/regenerate/main.go b/scripts/regenerate/main.go index bfc951d338..d48dc63ab7 100644 --- a/scripts/regenerate/main.go +++ b/scripts/regenerate/main.go @@ -19,7 +19,7 @@ func regenerate(dir string) error { } if strings.HasSuffix(path, "sqlc.json") || strings.HasSuffix(path, "sqlc.yaml") { cwd := filepath.Dir(path) - cmd := exec.Command("sqlc-dev", "generate") + cmd := exec.Command("sqlc-dev", "generate", "--experimental") cmd.Dir = cwd failed := cmd.Run() if _, err := os.Stat(filepath.Join(cwd, "stderr.txt")); os.IsNotExist(err) && failed != nil {