diff --git a/internal/codegen/golang/imports.go b/internal/codegen/golang/imports.go index 6aca91bd0c..4fe6e20512 100644 --- a/internal/codegen/golang/imports.go +++ b/internal/codegen/golang/imports.go @@ -202,6 +202,10 @@ func (i *importer) interfaceImports() fileImports { if uses("uuid.UUID") && !overrideUUID { pkg[ImportSpec{Path: "github.com/google/uuid"}] = struct{}{} } + _, overrideNullUUID := overrideTypes["uuid.NullUUID"] + if uses("uuid.NullUUID") && !overrideNullUUID { + pkg[ImportSpec{Path: "github.com/google/uuid"}] = struct{}{} + } // Custom imports for _, o := range i.Settings.Overrides { @@ -263,6 +267,10 @@ func (i *importer) modelImports() fileImports { if i.usesType("uuid.UUID") && !overrideUUID { pkg[ImportSpec{Path: "github.com/google/uuid"}] = struct{}{} } + _, overrideNullUUID := overrideTypes["uuid.NullUUID"] + if i.usesType("uuid.NullUUID") && !overrideNullUUID { + pkg[ImportSpec{Path: "github.com/google/uuid"}] = struct{}{} + } for _, o := range i.Settings.Overrides { if o.GoBasicType || o.GoTypeName == "" { @@ -408,6 +416,10 @@ func (i *importer) queryImports(filename string) fileImports { if uses("uuid.UUID") && !overrideUUID { pkg[ImportSpec{Path: "github.com/google/uuid"}] = struct{}{} } + _, overrideNullUUID := overrideTypes["uuid.NullUUID"] + if uses("uuid.NullUUID") && !overrideNullUUID { + pkg[ImportSpec{Path: "github.com/google/uuid"}] = struct{}{} + } // Custom imports for _, o := range i.Settings.Overrides { diff --git a/internal/codegen/golang/postgresql_type.go b/internal/codegen/golang/postgresql_type.go index 1e893626df..42b4be0da0 100644 --- a/internal/codegen/golang/postgresql_type.go +++ b/internal/codegen/golang/postgresql_type.go @@ -103,7 +103,10 @@ func postgresType(r *compiler.Result, col *compiler.Column, settings config.Comb return "sql.NullString" case "uuid": - return "uuid.UUID" + if notNull { + return "uuid.UUID" + } + return "uuid.NullUUID" case "inet", "cidr": return "net.IP" diff --git a/internal/endtoend/testdata/go.mod b/internal/endtoend/testdata/go.mod index fd0ed966a2..3304264df2 100644 --- a/internal/endtoend/testdata/go.mod +++ b/internal/endtoend/testdata/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( github.com/gofrs/uuid v4.0.0+incompatible - github.com/google/uuid v1.2.0 + github.com/google/uuid v1.3.0 github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853 github.com/jackc/pgtype v1.6.2 github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904 diff --git a/internal/endtoend/testdata/go.sum b/internal/endtoend/testdata/go.sum index 6b2aed8537..5398eca4f4 100644 --- a/internal/endtoend/testdata/go.sum +++ b/internal/endtoend/testdata/go.sum @@ -16,6 +16,8 @@ github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= diff --git a/internal/endtoend/testdata/ipaddr/pgx/go/db.go b/internal/endtoend/testdata/types_network_address/pgx/go/db.go similarity index 100% rename from internal/endtoend/testdata/ipaddr/pgx/go/db.go rename to internal/endtoend/testdata/types_network_address/pgx/go/db.go diff --git a/internal/endtoend/testdata/ipaddr/pgx/go/models.go b/internal/endtoend/testdata/types_network_address/pgx/go/models.go similarity index 100% rename from internal/endtoend/testdata/ipaddr/pgx/go/models.go rename to internal/endtoend/testdata/types_network_address/pgx/go/models.go diff --git a/internal/endtoend/testdata/ipaddr/pgx/go/query.sql.go b/internal/endtoend/testdata/types_network_address/pgx/go/query.sql.go similarity index 100% rename from internal/endtoend/testdata/ipaddr/pgx/go/query.sql.go rename to internal/endtoend/testdata/types_network_address/pgx/go/query.sql.go diff --git a/internal/endtoend/testdata/ipaddr/pgx/query.sql b/internal/endtoend/testdata/types_network_address/pgx/query.sql similarity index 100% rename from internal/endtoend/testdata/ipaddr/pgx/query.sql rename to internal/endtoend/testdata/types_network_address/pgx/query.sql diff --git a/internal/endtoend/testdata/ipaddr/pgx/sqlc.json b/internal/endtoend/testdata/types_network_address/pgx/sqlc.json similarity index 100% rename from internal/endtoend/testdata/ipaddr/pgx/sqlc.json rename to internal/endtoend/testdata/types_network_address/pgx/sqlc.json diff --git a/internal/endtoend/testdata/ipaddr/stdlib/go/db.go b/internal/endtoend/testdata/types_network_address/stdlib/go/db.go similarity index 100% rename from internal/endtoend/testdata/ipaddr/stdlib/go/db.go rename to internal/endtoend/testdata/types_network_address/stdlib/go/db.go diff --git a/internal/endtoend/testdata/ipaddr/stdlib/go/models.go b/internal/endtoend/testdata/types_network_address/stdlib/go/models.go similarity index 100% rename from internal/endtoend/testdata/ipaddr/stdlib/go/models.go rename to internal/endtoend/testdata/types_network_address/stdlib/go/models.go diff --git a/internal/endtoend/testdata/ipaddr/stdlib/go/query.sql.go b/internal/endtoend/testdata/types_network_address/stdlib/go/query.sql.go similarity index 100% rename from internal/endtoend/testdata/ipaddr/stdlib/go/query.sql.go rename to internal/endtoend/testdata/types_network_address/stdlib/go/query.sql.go diff --git a/internal/endtoend/testdata/ipaddr/stdlib/query.sql b/internal/endtoend/testdata/types_network_address/stdlib/query.sql similarity index 100% rename from internal/endtoend/testdata/ipaddr/stdlib/query.sql rename to internal/endtoend/testdata/types_network_address/stdlib/query.sql diff --git a/internal/endtoend/testdata/ipaddr/stdlib/sqlc.json b/internal/endtoend/testdata/types_network_address/stdlib/sqlc.json similarity index 100% rename from internal/endtoend/testdata/ipaddr/stdlib/sqlc.json rename to internal/endtoend/testdata/types_network_address/stdlib/sqlc.json diff --git a/internal/endtoend/testdata/types_uuid/postgresql/stdlib/go/db.go b/internal/endtoend/testdata/types_uuid/postgresql/stdlib/go/db.go new file mode 100644 index 0000000000..6a99519302 --- /dev/null +++ b/internal/endtoend/testdata/types_uuid/postgresql/stdlib/go/db.go @@ -0,0 +1,29 @@ +// 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_uuid/postgresql/stdlib/go/models.go b/internal/endtoend/testdata/types_uuid/postgresql/stdlib/go/models.go new file mode 100644 index 0000000000..c3076fad07 --- /dev/null +++ b/internal/endtoend/testdata/types_uuid/postgresql/stdlib/go/models.go @@ -0,0 +1,15 @@ +// Code generated by sqlc. DO NOT EDIT. + +package querytest + +import ( + "database/sql" + + "github.com/google/uuid" +) + +type Foo struct { + Description sql.NullString + Bar uuid.NullUUID + Baz uuid.UUID +} diff --git a/internal/endtoend/testdata/types_uuid/postgresql/stdlib/go/query.sql.go b/internal/endtoend/testdata/types_uuid/postgresql/stdlib/go/query.sql.go new file mode 100644 index 0000000000..2077b769b8 --- /dev/null +++ b/internal/endtoend/testdata/types_uuid/postgresql/stdlib/go/query.sql.go @@ -0,0 +1,48 @@ +// Code generated by sqlc. DO NOT EDIT. +// source: query.sql + +package querytest + +import ( + "context" + + "github.com/google/uuid" +) + +const find = `-- name: Find :one +SELECT bar FROM foo WHERE baz = $1 +` + +func (q *Queries) Find(ctx context.Context, baz uuid.UUID) (uuid.NullUUID, error) { + row := q.db.QueryRowContext(ctx, find, baz) + var bar uuid.NullUUID + err := row.Scan(&bar) + return bar, err +} + +const list = `-- name: List :many +SELECT description, bar, baz FROM foo +` + +func (q *Queries) List(ctx context.Context) ([]Foo, error) { + rows, err := q.db.QueryContext(ctx, list) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Foo + for rows.Next() { + var i Foo + if err := rows.Scan(&i.Description, &i.Bar, &i.Baz); 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_uuid/postgresql/stdlib/query.sql b/internal/endtoend/testdata/types_uuid/postgresql/stdlib/query.sql new file mode 100644 index 0000000000..74ab78a3d1 --- /dev/null +++ b/internal/endtoend/testdata/types_uuid/postgresql/stdlib/query.sql @@ -0,0 +1,11 @@ +CREATE TABLE foo ( + description text, + bar uuid, + baz uuid not null +); + +-- name: List :many +SELECT * FROM foo; + +-- name: Find :one +SELECT bar FROM foo WHERE baz = $1; diff --git a/internal/endtoend/testdata/types_uuid/postgresql/stdlib/sqlc.json b/internal/endtoend/testdata/types_uuid/postgresql/stdlib/sqlc.json new file mode 100644 index 0000000000..ac7c2ed829 --- /dev/null +++ b/internal/endtoend/testdata/types_uuid/postgresql/stdlib/sqlc.json @@ -0,0 +1,11 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "name": "querytest", + "schema": "query.sql", + "queries": "query.sql" + } + ] +}