From 34ae3439431b164a5f8fab50c9bdb5d40d0d22e8 Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Sat, 21 Aug 2021 16:13:33 -0700 Subject: [PATCH 1/2] codgen/golang: pgtype for network address types --- internal/codegen/golang/driver.go | 18 ++++ internal/codegen/golang/imports.go | 12 +++ internal/codegen/golang/postgresql_type.go | 31 ++++++- .../func_return/posgresql/pgx/go/query.sql.go | 5 +- .../endtoend/testdata/macaddr/pgx/go/db.go | 30 ------- .../testdata/macaddr/pgx/go/models.go | 12 --- .../testdata/macaddr/pgx/go/query.sql.go | 57 ------------ .../endtoend/testdata/macaddr/pgx/query.sql | 7 -- .../endtoend/testdata/macaddr/pgx/sqlc.json | 13 --- .../endtoend/testdata/macaddr/stdlib/go/db.go | 29 ------ .../testdata/macaddr/stdlib/go/models.go | 12 --- .../testdata/macaddr/stdlib/go/query.sql.go | 63 ------------- .../testdata/macaddr/stdlib/query.sql | 7 -- .../testdata/macaddr/stdlib/sqlc.json | 11 --- .../types_network_address/pgx/go/models.go | 14 ++- .../types_network_address/pgx/go/query.sql.go | 87 ++++++++++++++++-- .../types_network_address/pgx/query.sql | 31 ++++++- .../types_network_address/stdlib/go/models.go | 12 ++- .../stdlib/go/query.sql.go | 89 +++++++++++++++++-- .../types_network_address/stdlib/query.sql | 31 ++++++- 20 files changed, 302 insertions(+), 269 deletions(-) create mode 100644 internal/codegen/golang/driver.go delete mode 100644 internal/endtoend/testdata/macaddr/pgx/go/db.go delete mode 100644 internal/endtoend/testdata/macaddr/pgx/go/models.go delete mode 100644 internal/endtoend/testdata/macaddr/pgx/go/query.sql.go delete mode 100644 internal/endtoend/testdata/macaddr/pgx/query.sql delete mode 100644 internal/endtoend/testdata/macaddr/pgx/sqlc.json delete mode 100644 internal/endtoend/testdata/macaddr/stdlib/go/db.go delete mode 100644 internal/endtoend/testdata/macaddr/stdlib/go/models.go delete mode 100644 internal/endtoend/testdata/macaddr/stdlib/go/query.sql.go delete mode 100644 internal/endtoend/testdata/macaddr/stdlib/query.sql delete mode 100644 internal/endtoend/testdata/macaddr/stdlib/sqlc.json diff --git a/internal/codegen/golang/driver.go b/internal/codegen/golang/driver.go new file mode 100644 index 0000000000..de2e201b8c --- /dev/null +++ b/internal/codegen/golang/driver.go @@ -0,0 +1,18 @@ +package golang + +import "github.com/kyleconroy/sqlc/internal/config" + +type SQLDriver int + +const ( + SQLDriverPGXV4 SQLDriver = iota + SQLDriverLibPQ +) + +func parseDriver(settings config.CombinedSettings) SQLDriver { + if settings.Go.SQLPackage == "pgx/v4" { + return SQLDriverPGXV4 + } else { + return SQLDriverLibPQ + } +} diff --git a/internal/codegen/golang/imports.go b/internal/codegen/golang/imports.go index 6a5dfd55d4..fb9da7fd57 100644 --- a/internal/codegen/golang/imports.go +++ b/internal/codegen/golang/imports.go @@ -132,6 +132,12 @@ var stdlibTypes = map[string]string{ "net.HardwareAddr": "net", } +var pgtypeTypes = map[string]struct{}{ + "pgtype.CIDR": {}, + "pgtype.Inet": {}, + "pgtype.Macaddr": {}, +} + func buildImports(settings config.CombinedSettings, queries []Query, uses func(string) bool) (map[string]struct{}, map[ImportSpec]struct{}) { pkg := make(map[ImportSpec]struct{}) std := make(map[string]struct{}) @@ -158,6 +164,12 @@ func buildImports(settings config.CombinedSettings, queries []Query, uses func(s } } + for typeName, _ := range pgtypeTypes { + if uses(typeName) { + pkg[ImportSpec{Path: "github.com/jackc/pgtype"}] = struct{}{} + } + } + overrideTypes := map[string]string{} for _, o := range settings.Overrides { if o.GoBasicType || o.GoTypeName == "" { diff --git a/internal/codegen/golang/postgresql_type.go b/internal/codegen/golang/postgresql_type.go index 42b4be0da0..3425fd629e 100644 --- a/internal/codegen/golang/postgresql_type.go +++ b/internal/codegen/golang/postgresql_type.go @@ -12,6 +12,7 @@ import ( func postgresType(r *compiler.Result, col *compiler.Column, settings config.CombinedSettings) string { columnType := col.DataType notNull := col.NotNull || col.IsArray + driver := parseDriver(settings) switch columnType { case "serial", "serial4", "pg_catalog.serial4": @@ -108,11 +109,35 @@ func postgresType(r *compiler.Result, col *compiler.Column, settings config.Comb } return "uuid.NullUUID" - case "inet", "cidr": - return "net.IP" + case "inet": + switch driver { + case SQLDriverPGXV4: + return "pgtype.Inet" + case SQLDriverLibPQ: + return "net.IP" + default: + return "interface{}" + } + + case "cidr": + switch driver { + case SQLDriverPGXV4: + return "pgtype.CIDR" + case SQLDriverLibPQ: + return "net.IP" + default: + return "interface{}" + } case "macaddr", "macaddr8": - return "net.HardwareAddr" + switch driver { + case SQLDriverPGXV4: + return "pgtype.Macaddr" + case SQLDriverLibPQ: + return "net.HardwareAddr" + default: + return "interface{}" + } case "ltree", "lquery", "ltxtquery": // This module implements a data type ltree for representing labels diff --git a/internal/endtoend/testdata/func_return/posgresql/pgx/go/query.sql.go b/internal/endtoend/testdata/func_return/posgresql/pgx/go/query.sql.go index b8775974a0..44d4b34f13 100644 --- a/internal/endtoend/testdata/func_return/posgresql/pgx/go/query.sql.go +++ b/internal/endtoend/testdata/func_return/posgresql/pgx/go/query.sql.go @@ -5,7 +5,8 @@ package querytest import ( "context" - "net" + + "github.com/jackc/pgtype" ) const generateSeries = `-- name: GenerateSeries :many @@ -15,7 +16,7 @@ LIMIT 1 ` type GenerateSeriesParams struct { - Column1 net.IP + Column1 pgtype.Inet Column2 int32 } diff --git a/internal/endtoend/testdata/macaddr/pgx/go/db.go b/internal/endtoend/testdata/macaddr/pgx/go/db.go deleted file mode 100644 index 4559f50a4f..0000000000 --- a/internal/endtoend/testdata/macaddr/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/macaddr/pgx/go/models.go b/internal/endtoend/testdata/macaddr/pgx/go/models.go deleted file mode 100644 index 0681470ceb..0000000000 --- a/internal/endtoend/testdata/macaddr/pgx/go/models.go +++ /dev/null @@ -1,12 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. - -package querytest - -import ( - "net" -) - -type Foo struct { - Bar bool - Addr net.HardwareAddr -} diff --git a/internal/endtoend/testdata/macaddr/pgx/go/query.sql.go b/internal/endtoend/testdata/macaddr/pgx/go/query.sql.go deleted file mode 100644 index ad30e94bee..0000000000 --- a/internal/endtoend/testdata/macaddr/pgx/go/query.sql.go +++ /dev/null @@ -1,57 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// source: query.sql - -package querytest - -import ( - "context" - "net" -) - -const get = `-- name: Get :many -SELECT bar, addr FROM foo LIMIT $1 -` - -func (q *Queries) Get(ctx context.Context, limit int32) ([]Foo, error) { - rows, err := q.db.Query(ctx, get, limit) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Foo - for rows.Next() { - var i Foo - if err := rows.Scan(&i.Bar, &i.Addr); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getAddr = `-- name: GetAddr :many -SELECT addr FROM foo LIMIT $1 -` - -func (q *Queries) GetAddr(ctx context.Context, limit int32) ([]net.HardwareAddr, error) { - rows, err := q.db.Query(ctx, getAddr, limit) - if err != nil { - return nil, err - } - defer rows.Close() - var items []net.HardwareAddr - for rows.Next() { - var addr net.HardwareAddr - if err := rows.Scan(&addr); err != nil { - return nil, err - } - items = append(items, addr) - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} diff --git a/internal/endtoend/testdata/macaddr/pgx/query.sql b/internal/endtoend/testdata/macaddr/pgx/query.sql deleted file mode 100644 index 4b0fa2203e..0000000000 --- a/internal/endtoend/testdata/macaddr/pgx/query.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE foo (bar bool not null, addr macaddr not null); - --- name: Get :many -SELECT bar, addr FROM foo LIMIT $1; - --- name: GetAddr :many -SELECT addr FROM foo LIMIT $1; diff --git a/internal/endtoend/testdata/macaddr/pgx/sqlc.json b/internal/endtoend/testdata/macaddr/pgx/sqlc.json deleted file mode 100644 index 9403bd0279..0000000000 --- a/internal/endtoend/testdata/macaddr/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/macaddr/stdlib/go/db.go b/internal/endtoend/testdata/macaddr/stdlib/go/db.go deleted file mode 100644 index 6a99519302..0000000000 --- a/internal/endtoend/testdata/macaddr/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/macaddr/stdlib/go/models.go b/internal/endtoend/testdata/macaddr/stdlib/go/models.go deleted file mode 100644 index 0681470ceb..0000000000 --- a/internal/endtoend/testdata/macaddr/stdlib/go/models.go +++ /dev/null @@ -1,12 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. - -package querytest - -import ( - "net" -) - -type Foo struct { - Bar bool - Addr net.HardwareAddr -} diff --git a/internal/endtoend/testdata/macaddr/stdlib/go/query.sql.go b/internal/endtoend/testdata/macaddr/stdlib/go/query.sql.go deleted file mode 100644 index ce14bdd56d..0000000000 --- a/internal/endtoend/testdata/macaddr/stdlib/go/query.sql.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// source: query.sql - -package querytest - -import ( - "context" - "net" -) - -const get = `-- name: Get :many -SELECT bar, addr FROM foo LIMIT $1 -` - -func (q *Queries) Get(ctx context.Context, limit int32) ([]Foo, error) { - rows, err := q.db.QueryContext(ctx, get, limit) - if err != nil { - return nil, err - } - defer rows.Close() - var items []Foo - for rows.Next() { - var i Foo - if err := rows.Scan(&i.Bar, &i.Addr); 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 getAddr = `-- name: GetAddr :many -SELECT addr FROM foo LIMIT $1 -` - -func (q *Queries) GetAddr(ctx context.Context, limit int32) ([]net.HardwareAddr, error) { - rows, err := q.db.QueryContext(ctx, getAddr, limit) - if err != nil { - return nil, err - } - defer rows.Close() - var items []net.HardwareAddr - for rows.Next() { - var addr net.HardwareAddr - if err := rows.Scan(&addr); err != nil { - return nil, err - } - items = append(items, addr) - } - 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/macaddr/stdlib/query.sql b/internal/endtoend/testdata/macaddr/stdlib/query.sql deleted file mode 100644 index 4b0fa2203e..0000000000 --- a/internal/endtoend/testdata/macaddr/stdlib/query.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE foo (bar bool not null, addr macaddr not null); - --- name: Get :many -SELECT bar, addr FROM foo LIMIT $1; - --- name: GetAddr :many -SELECT addr FROM foo LIMIT $1; diff --git a/internal/endtoend/testdata/macaddr/stdlib/sqlc.json b/internal/endtoend/testdata/macaddr/stdlib/sqlc.json deleted file mode 100644 index ac7c2ed829..0000000000 --- a/internal/endtoend/testdata/macaddr/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/internal/endtoend/testdata/types_network_address/pgx/go/models.go b/internal/endtoend/testdata/types_network_address/pgx/go/models.go index c9b78920d4..16e1c6001c 100644 --- a/internal/endtoend/testdata/types_network_address/pgx/go/models.go +++ b/internal/endtoend/testdata/types_network_address/pgx/go/models.go @@ -3,11 +3,17 @@ package querytest import ( - "net" + "github.com/jackc/pgtype" ) +type Bar struct { + Addr pgtype.Macaddr + NullableAddr pgtype.Macaddr +} + type Foo struct { - Bar bool - Inet net.IP - Cidr net.IP + 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 index cb2cda6b98..bd6d214a4e 100644 --- a/internal/endtoend/testdata/types_network_address/pgx/go/query.sql.go +++ b/internal/endtoend/testdata/types_network_address/pgx/go/query.sql.go @@ -5,14 +5,86 @@ package querytest import ( "context" + + "github.com/jackc/pgtype" ) -const get = `-- name: Get :many -SELECT bar, "inet", "cidr" FROM foo LIMIT $1 +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) Get(ctx context.Context, limit int32) ([]Foo, error) { - rows, err := q.db.Query(ctx, get, limit) +func (q *Queries) ListFoo(ctx context.Context) ([]Foo, error) { + rows, err := q.db.Query(ctx, listFoo) if err != nil { return nil, err } @@ -20,7 +92,12 @@ func (q *Queries) Get(ctx context.Context, limit int32) ([]Foo, error) { var items []Foo for rows.Next() { var i Foo - if err := rows.Scan(&i.Bar, &i.Inet, &i.Cidr); err != nil { + if err := rows.Scan( + &i.PresentIp, + &i.NullableIp, + &i.PresentCidr, + &i.NullableCidr, + ); err != nil { return nil, err } items = append(items, i) diff --git a/internal/endtoend/testdata/types_network_address/pgx/query.sql b/internal/endtoend/testdata/types_network_address/pgx/query.sql index 11b6b5c820..b1576896a6 100644 --- a/internal/endtoend/testdata/types_network_address/pgx/query.sql +++ b/internal/endtoend/testdata/types_network_address/pgx/query.sql @@ -1,4 +1,29 @@ -CREATE TABLE foo (bar bool not null, "inet" inet not null, "cidr" cidr not null); +CREATE TABLE foo ( + present_ip inet not null, + nullable_ip inet, + present_cidr cidr not null, + nullable_cidr cidr +); --- name: Get :many -SELECT bar, "inet", "cidr" FROM foo LIMIT $1; +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/go/models.go b/internal/endtoend/testdata/types_network_address/stdlib/go/models.go index c9b78920d4..c2c53783e6 100644 --- a/internal/endtoend/testdata/types_network_address/stdlib/go/models.go +++ b/internal/endtoend/testdata/types_network_address/stdlib/go/models.go @@ -6,8 +6,14 @@ import ( "net" ) +type Bar struct { + Addr net.HardwareAddr + NullableAddr net.HardwareAddr +} + type Foo struct { - Bar bool - Inet net.IP - Cidr net.IP + PresentIp net.IP + NullableIp net.IP + PresentCidr net.IP + NullableCidr net.IP } 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 index 1bdc311a36..de686165de 100644 --- a/internal/endtoend/testdata/types_network_address/stdlib/go/query.sql.go +++ b/internal/endtoend/testdata/types_network_address/stdlib/go/query.sql.go @@ -5,14 +5,88 @@ package querytest import ( "context" + "net" ) -const get = `-- name: Get :many -SELECT bar, "inet", "cidr" FROM foo LIMIT $1 +const findBarByAddr = `-- name: FindBarByAddr :one +SELECT addr, nullable_addr FROM bar +WHERE addr = $1 ` -func (q *Queries) Get(ctx context.Context, limit int32) ([]Foo, error) { - rows, err := q.db.QueryContext(ctx, get, limit) +func (q *Queries) FindBarByAddr(ctx context.Context, addr net.HardwareAddr) (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 net.IP) (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 net.IP) (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 } @@ -20,7 +94,12 @@ func (q *Queries) Get(ctx context.Context, limit int32) ([]Foo, error) { var items []Foo for rows.Next() { var i Foo - if err := rows.Scan(&i.Bar, &i.Inet, &i.Cidr); err != nil { + if err := rows.Scan( + &i.PresentIp, + &i.NullableIp, + &i.PresentCidr, + &i.NullableCidr, + ); err != nil { return nil, err } items = append(items, i) diff --git a/internal/endtoend/testdata/types_network_address/stdlib/query.sql b/internal/endtoend/testdata/types_network_address/stdlib/query.sql index 11b6b5c820..b1576896a6 100644 --- a/internal/endtoend/testdata/types_network_address/stdlib/query.sql +++ b/internal/endtoend/testdata/types_network_address/stdlib/query.sql @@ -1,4 +1,29 @@ -CREATE TABLE foo (bar bool not null, "inet" inet not null, "cidr" cidr not null); +CREATE TABLE foo ( + present_ip inet not null, + nullable_ip inet, + present_cidr cidr not null, + nullable_cidr cidr +); --- name: Get :many -SELECT bar, "inet", "cidr" FROM foo LIMIT $1; +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; From e812b2dcdc01e93b6b455f9cd74e0bba58fe01d5 Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Sat, 21 Aug 2021 16:37:54 -0700 Subject: [PATCH 2/2] Use pqtype for lib/pq --- internal/codegen/golang/imports.go | 12 ++++++++++++ internal/codegen/golang/postgresql_type.go | 6 +++--- .../{posgresql => postgresql}/pgx/go/db.go | 0 .../{posgresql => postgresql}/pgx/go/models.go | 0 .../{posgresql => postgresql}/pgx/go/query.sql.go | 0 .../{posgresql => postgresql}/pgx/query.sql | 0 .../{posgresql => postgresql}/pgx/schema.sql | 0 .../{posgresql => postgresql}/pgx/sqlc.json | 0 .../{posgresql => postgresql}/stdlib/go/db.go | 0 .../{posgresql => postgresql}/stdlib/go/models.go | 0 .../stdlib/go/query.sql.go | 5 +++-- .../{posgresql => postgresql}/stdlib/query.sql | 0 .../{posgresql => postgresql}/stdlib/schema.sql | 0 .../{posgresql => postgresql}/stdlib/sqlc.json | 0 internal/endtoend/testdata/go.mod | 1 + internal/endtoend/testdata/go.sum | 2 ++ .../types_network_address/stdlib/go/models.go | 14 +++++++------- .../types_network_address/stdlib/go/query.sql.go | 9 +++++---- 18 files changed, 33 insertions(+), 16 deletions(-) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/pgx/go/db.go (100%) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/pgx/go/models.go (100%) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/pgx/go/query.sql.go (100%) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/pgx/query.sql (100%) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/pgx/schema.sql (100%) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/pgx/sqlc.json (100%) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/stdlib/go/db.go (100%) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/stdlib/go/models.go (100%) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/stdlib/go/query.sql.go (96%) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/stdlib/query.sql (100%) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/stdlib/schema.sql (100%) rename internal/endtoend/testdata/func_return/{posgresql => postgresql}/stdlib/sqlc.json (100%) diff --git a/internal/codegen/golang/imports.go b/internal/codegen/golang/imports.go index fb9da7fd57..0f6dca633e 100644 --- a/internal/codegen/golang/imports.go +++ b/internal/codegen/golang/imports.go @@ -138,6 +138,12 @@ var pgtypeTypes = map[string]struct{}{ "pgtype.Macaddr": {}, } +var pqtypeTypes = map[string]struct{}{ + "pqtype.CIDR": {}, + "pqtype.Inet": {}, + "pqtype.Macaddr": {}, +} + func buildImports(settings config.CombinedSettings, queries []Query, uses func(string) bool) (map[string]struct{}, map[ImportSpec]struct{}) { pkg := make(map[ImportSpec]struct{}) std := make(map[string]struct{}) @@ -170,6 +176,12 @@ func buildImports(settings config.CombinedSettings, queries []Query, uses func(s } } + for typeName, _ := range pqtypeTypes { + if uses(typeName) { + pkg[ImportSpec{Path: "github.com/tabbed/pqtype"}] = struct{}{} + } + } + overrideTypes := map[string]string{} for _, o := range settings.Overrides { if o.GoBasicType || o.GoTypeName == "" { diff --git a/internal/codegen/golang/postgresql_type.go b/internal/codegen/golang/postgresql_type.go index 3425fd629e..c5e0d7fde0 100644 --- a/internal/codegen/golang/postgresql_type.go +++ b/internal/codegen/golang/postgresql_type.go @@ -114,7 +114,7 @@ func postgresType(r *compiler.Result, col *compiler.Column, settings config.Comb case SQLDriverPGXV4: return "pgtype.Inet" case SQLDriverLibPQ: - return "net.IP" + return "pqtype.Inet" default: return "interface{}" } @@ -124,7 +124,7 @@ func postgresType(r *compiler.Result, col *compiler.Column, settings config.Comb case SQLDriverPGXV4: return "pgtype.CIDR" case SQLDriverLibPQ: - return "net.IP" + return "pqtype.CIDR" default: return "interface{}" } @@ -134,7 +134,7 @@ func postgresType(r *compiler.Result, col *compiler.Column, settings config.Comb case SQLDriverPGXV4: return "pgtype.Macaddr" case SQLDriverLibPQ: - return "net.HardwareAddr" + return "pqtype.Macaddr" default: return "interface{}" } diff --git a/internal/endtoend/testdata/func_return/posgresql/pgx/go/db.go b/internal/endtoend/testdata/func_return/postgresql/pgx/go/db.go similarity index 100% rename from internal/endtoend/testdata/func_return/posgresql/pgx/go/db.go rename to internal/endtoend/testdata/func_return/postgresql/pgx/go/db.go diff --git a/internal/endtoend/testdata/func_return/posgresql/pgx/go/models.go b/internal/endtoend/testdata/func_return/postgresql/pgx/go/models.go similarity index 100% rename from internal/endtoend/testdata/func_return/posgresql/pgx/go/models.go rename to internal/endtoend/testdata/func_return/postgresql/pgx/go/models.go diff --git a/internal/endtoend/testdata/func_return/posgresql/pgx/go/query.sql.go b/internal/endtoend/testdata/func_return/postgresql/pgx/go/query.sql.go similarity index 100% rename from internal/endtoend/testdata/func_return/posgresql/pgx/go/query.sql.go rename to internal/endtoend/testdata/func_return/postgresql/pgx/go/query.sql.go diff --git a/internal/endtoend/testdata/func_return/posgresql/pgx/query.sql b/internal/endtoend/testdata/func_return/postgresql/pgx/query.sql similarity index 100% rename from internal/endtoend/testdata/func_return/posgresql/pgx/query.sql rename to internal/endtoend/testdata/func_return/postgresql/pgx/query.sql diff --git a/internal/endtoend/testdata/func_return/posgresql/pgx/schema.sql b/internal/endtoend/testdata/func_return/postgresql/pgx/schema.sql similarity index 100% rename from internal/endtoend/testdata/func_return/posgresql/pgx/schema.sql rename to internal/endtoend/testdata/func_return/postgresql/pgx/schema.sql diff --git a/internal/endtoend/testdata/func_return/posgresql/pgx/sqlc.json b/internal/endtoend/testdata/func_return/postgresql/pgx/sqlc.json similarity index 100% rename from internal/endtoend/testdata/func_return/posgresql/pgx/sqlc.json rename to internal/endtoend/testdata/func_return/postgresql/pgx/sqlc.json diff --git a/internal/endtoend/testdata/func_return/posgresql/stdlib/go/db.go b/internal/endtoend/testdata/func_return/postgresql/stdlib/go/db.go similarity index 100% rename from internal/endtoend/testdata/func_return/posgresql/stdlib/go/db.go rename to internal/endtoend/testdata/func_return/postgresql/stdlib/go/db.go diff --git a/internal/endtoend/testdata/func_return/posgresql/stdlib/go/models.go b/internal/endtoend/testdata/func_return/postgresql/stdlib/go/models.go similarity index 100% rename from internal/endtoend/testdata/func_return/posgresql/stdlib/go/models.go rename to internal/endtoend/testdata/func_return/postgresql/stdlib/go/models.go diff --git a/internal/endtoend/testdata/func_return/posgresql/stdlib/go/query.sql.go b/internal/endtoend/testdata/func_return/postgresql/stdlib/go/query.sql.go similarity index 96% rename from internal/endtoend/testdata/func_return/posgresql/stdlib/go/query.sql.go rename to internal/endtoend/testdata/func_return/postgresql/stdlib/go/query.sql.go index 990f335916..fb51f3daea 100644 --- a/internal/endtoend/testdata/func_return/posgresql/stdlib/go/query.sql.go +++ b/internal/endtoend/testdata/func_return/postgresql/stdlib/go/query.sql.go @@ -5,7 +5,8 @@ package querytest import ( "context" - "net" + + "github.com/tabbed/pqtype" ) const generateSeries = `-- name: GenerateSeries :many @@ -15,7 +16,7 @@ LIMIT 1 ` type GenerateSeriesParams struct { - Column1 net.IP + Column1 pqtype.Inet Column2 int32 } diff --git a/internal/endtoend/testdata/func_return/posgresql/stdlib/query.sql b/internal/endtoend/testdata/func_return/postgresql/stdlib/query.sql similarity index 100% rename from internal/endtoend/testdata/func_return/posgresql/stdlib/query.sql rename to internal/endtoend/testdata/func_return/postgresql/stdlib/query.sql diff --git a/internal/endtoend/testdata/func_return/posgresql/stdlib/schema.sql b/internal/endtoend/testdata/func_return/postgresql/stdlib/schema.sql similarity index 100% rename from internal/endtoend/testdata/func_return/posgresql/stdlib/schema.sql rename to internal/endtoend/testdata/func_return/postgresql/stdlib/schema.sql diff --git a/internal/endtoend/testdata/func_return/posgresql/stdlib/sqlc.json b/internal/endtoend/testdata/func_return/postgresql/stdlib/sqlc.json similarity index 100% rename from internal/endtoend/testdata/func_return/posgresql/stdlib/sqlc.json rename to internal/endtoend/testdata/func_return/postgresql/stdlib/sqlc.json diff --git a/internal/endtoend/testdata/go.mod b/internal/endtoend/testdata/go.mod index 3304264df2..999f37b360 100644 --- a/internal/endtoend/testdata/go.mod +++ b/internal/endtoend/testdata/go.mod @@ -10,6 +10,7 @@ require ( github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904 github.com/kyleconroy/sqlc-testdata v0.0.0-20200512000015-15313bc43553 github.com/lib/pq v1.9.0 + github.com/tabbed/pqtype v0.1.0 // indirect github.com/volatiletech/null/v8 v8.1.2 gopkg.in/guregu/null.v4 v4.0.0 ) diff --git a/internal/endtoend/testdata/go.sum b/internal/endtoend/testdata/go.sum index 5398eca4f4..efdad878f2 100644 --- a/internal/endtoend/testdata/go.sum +++ b/internal/endtoend/testdata/go.sum @@ -110,6 +110,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/tabbed/pqtype v0.1.0 h1:14Up99XVLn1feoYN6yOe6lKcF7159EJ5JqUXntkeFeI= +github.com/tabbed/pqtype v0.1.0/go.mod h1:HLt2kLJPcUhODQkYn3mJkMHXVsuv3Z2n5NZEeKXL0Uk= github.com/volatiletech/inflect v0.0.1 h1:2a6FcMQyhmPZcLa+uet3VJ8gLn/9svWhJxJYwvE8KsU= github.com/volatiletech/inflect v0.0.1/go.mod h1:IBti31tG6phkHitLlr5j7shC5SOo//x0AjDzaJU1PLA= github.com/volatiletech/null/v8 v8.1.2 h1:kiTiX1PpwvuugKwfvUNX/SU/5A2KGZMXfGD0DUHdKEI= diff --git a/internal/endtoend/testdata/types_network_address/stdlib/go/models.go b/internal/endtoend/testdata/types_network_address/stdlib/go/models.go index c2c53783e6..4c295838dc 100644 --- a/internal/endtoend/testdata/types_network_address/stdlib/go/models.go +++ b/internal/endtoend/testdata/types_network_address/stdlib/go/models.go @@ -3,17 +3,17 @@ package querytest import ( - "net" + "github.com/tabbed/pqtype" ) type Bar struct { - Addr net.HardwareAddr - NullableAddr net.HardwareAddr + Addr pqtype.Macaddr + NullableAddr pqtype.Macaddr } type Foo struct { - PresentIp net.IP - NullableIp net.IP - PresentCidr net.IP - NullableCidr net.IP + 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 index de686165de..26d1313f6f 100644 --- a/internal/endtoend/testdata/types_network_address/stdlib/go/query.sql.go +++ b/internal/endtoend/testdata/types_network_address/stdlib/go/query.sql.go @@ -5,7 +5,8 @@ package querytest import ( "context" - "net" + + "github.com/tabbed/pqtype" ) const findBarByAddr = `-- name: FindBarByAddr :one @@ -13,7 +14,7 @@ SELECT addr, nullable_addr FROM bar WHERE addr = $1 ` -func (q *Queries) FindBarByAddr(ctx context.Context, addr net.HardwareAddr) (Bar, error) { +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) @@ -25,7 +26,7 @@ SELECT present_ip, nullable_ip, present_cidr, nullable_cidr FROM foo WHERE present_cidr = $1 ` -func (q *Queries) FindFooByCIDR(ctx context.Context, presentCidr net.IP) (Foo, error) { +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( @@ -42,7 +43,7 @@ SELECT present_ip, nullable_ip, present_cidr, nullable_cidr FROM foo WHERE present_ip = $1 ` -func (q *Queries) FindFooByIP(ctx context.Context, presentIp net.IP) (Foo, error) { +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(