From c00e16bb9b403fa583dfd08840bd00532c265439 Mon Sep 17 00:00:00 2001 From: zaneli Date: Fri, 3 Feb 2023 15:24:27 +0900 Subject: [PATCH] fix: Add import statements even if only pointer types exist --- internal/cmd/shim.go | 2 +- internal/codegen/golang/imports.go | 26 ++++++---- .../postgresql/pgx/v4/go/db.go | 32 +++++++++++++ .../postgresql/pgx/v4/go/models.go | 16 +++++++ .../postgresql/pgx/v4/go/query.sql.go | 48 +++++++++++++++++++ .../postgresql/pgx/v4/query.sql | 7 +++ .../postgresql/pgx/v4/sqlc.json | 14 ++++++ .../postgresql/pgx/v5/go/db.go | 32 +++++++++++++ .../postgresql/pgx/v5/go/models.go | 14 ++++++ .../postgresql/pgx/v5/go/query.sql.go | 46 ++++++++++++++++++ .../postgresql/pgx/v5/query.sql | 7 +++ .../postgresql/pgx/v5/sqlc.json | 13 +++++ 12 files changed, 246 insertions(+), 11 deletions(-) create mode 100644 internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/go/db.go create mode 100644 internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/go/models.go create mode 100644 internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/go/query.sql.go create mode 100644 internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/query.sql create mode 100644 internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/sqlc.json create mode 100644 internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/go/db.go create mode 100644 internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/go/models.go create mode 100644 internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/go/query.sql.go create mode 100644 internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/query.sql create mode 100644 internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/sqlc.json diff --git a/internal/cmd/shim.go b/internal/cmd/shim.go index 0e6f1970f4..66fedd322c 100644 --- a/internal/cmd/shim.go +++ b/internal/cmd/shim.go @@ -86,7 +86,7 @@ func pluginGoCode(s config.SQLGo) *plugin.GoCode { EmitResultStructPointers: s.EmitResultStructPointers, EmitParamsStructPointers: s.EmitParamsStructPointers, EmitMethodsWithDbArgument: s.EmitMethodsWithDBArgument, - EmitPointersForNullTypes: s.EmitPointersForNullTypes, + EmitPointersForNullTypes: s.EmitPointersForNullTypes, EmitEnumValidMethod: s.EmitEnumValidMethod, EmitAllEnumValues: s.EmitAllEnumValues, JsonTagsCaseStyle: s.JSONTagsCaseStyle, diff --git a/internal/codegen/golang/imports.go b/internal/codegen/golang/imports.go index b95779091b..94b68aa14e 100644 --- a/internal/codegen/golang/imports.go +++ b/internal/codegen/golang/imports.go @@ -67,7 +67,7 @@ type importer struct { func (i *importer) usesType(typ string) bool { for _, strct := range i.Structs { for _, f := range strct.Fields { - fType := strings.TrimPrefix(f.Type, "[]") + fType := trimSliceAndPointerPrefix(f.Type) if strings.HasPrefix(fType, typ) { return true } @@ -241,7 +241,7 @@ func (i *importer) interfaceImports() fileImports { } } if !q.Arg.isEmpty() { - argType := strings.TrimPrefix(q.Arg.Type(), "[]") + argType := trimSliceAndPointerPrefix(q.Arg.Type()) if strings.HasPrefix(argType, name) { return true } @@ -302,13 +302,13 @@ func (i *importer) queryImports(filename string) fileImports { if q.hasRetType() { if q.Ret.EmitStruct() { for _, f := range q.Ret.Struct.Fields { - fType := strings.TrimPrefix(f.Type, "[]") + fType := trimSliceAndPointerPrefix(f.Type) if strings.HasPrefix(fType, name) { return true } } } - retType := strings.TrimPrefix(q.Ret.Type(), "[]") + retType := trimSliceAndPointerPrefix(q.Ret.Type()) if strings.HasPrefix(retType, name) { return true } @@ -316,13 +316,13 @@ func (i *importer) queryImports(filename string) fileImports { if !q.Arg.isEmpty() { if q.Arg.EmitStruct() { for _, f := range q.Arg.Struct.Fields { - fType := strings.TrimPrefix(f.Type, "[]") + fType := trimSliceAndPointerPrefix(f.Type) if strings.HasPrefix(fType, name) { return true } } } - argType := strings.TrimPrefix(q.Arg.Type(), "[]") + argType := trimSliceAndPointerPrefix(q.Arg.Type()) if strings.HasPrefix(argType, name) { return true } @@ -415,13 +415,13 @@ func (i *importer) batchImports() fileImports { if q.hasRetType() { if q.Ret.EmitStruct() { for _, f := range q.Ret.Struct.Fields { - fType := strings.TrimPrefix(f.Type, "[]") + fType := trimSliceAndPointerPrefix(f.Type) if strings.HasPrefix(fType, name) { return true } } } - retType := strings.TrimPrefix(q.Ret.Type(), "[]") + retType := trimSliceAndPointerPrefix(q.Ret.Type()) if strings.HasPrefix(retType, name) { return true } @@ -429,13 +429,13 @@ func (i *importer) batchImports() fileImports { if !q.Arg.isEmpty() { if q.Arg.EmitStruct() { for _, f := range q.Arg.Struct.Fields { - fType := strings.TrimPrefix(f.Type, "[]") + fType := trimSliceAndPointerPrefix(f.Type) if strings.HasPrefix(fType, name) { return true } } } - argType := strings.TrimPrefix(q.Arg.Type(), "[]") + argType := trimSliceAndPointerPrefix(q.Arg.Type()) if strings.HasPrefix(argType, name) { return true } @@ -456,3 +456,9 @@ func (i *importer) batchImports() fileImports { return sortedImports(std, pkg) } + +func trimSliceAndPointerPrefix(v string) string { + v = strings.TrimPrefix(v, "[]") + v = strings.TrimPrefix(v, "*") + return v +} diff --git a/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/go/db.go b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/go/db.go new file mode 100644 index 0000000000..5bbef08600 --- /dev/null +++ b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/go/db.go @@ -0,0 +1,32 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package datatype + +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/pointer_type_import/postgresql/pgx/v4/go/models.go b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/go/models.go new file mode 100644 index 0000000000..d08153a5e0 --- /dev/null +++ b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/go/models.go @@ -0,0 +1,16 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package datatype + +import ( + "time" + + "github.com/google/uuid" +) + +type Foo struct { + Bar *time.Time + Baz *uuid.UUID +} diff --git a/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/go/query.sql.go b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/go/query.sql.go new file mode 100644 index 0000000000..59e774b455 --- /dev/null +++ b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/go/query.sql.go @@ -0,0 +1,48 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 +// source: query.sql + +package datatype + +import ( + "context" + "time" + + "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) (*time.Time, error) { + row := q.db.QueryRow(ctx, find, baz) + var bar *time.Time + err := row.Scan(&bar) + return bar, err +} + +const list = `-- name: List :many +SELECT bar, baz FROM foo +` + +func (q *Queries) List(ctx context.Context) ([]Foo, error) { + rows, err := q.db.Query(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.Bar, &i.Baz); 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/pointer_type_import/postgresql/pgx/v4/query.sql b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/query.sql new file mode 100644 index 0000000000..1c3964cb35 --- /dev/null +++ b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/query.sql @@ -0,0 +1,7 @@ +CREATE TABLE foo (bar date, baz uuid); + +-- name: List :many +SELECT * FROM foo; + +-- name: Find :one +SELECT bar FROM foo WHERE baz = $1; diff --git a/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/sqlc.json b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/sqlc.json new file mode 100644 index 0000000000..4928405dc7 --- /dev/null +++ b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v4/sqlc.json @@ -0,0 +1,14 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "postgresql", + "sql_package": "pgx/v4", + "name": "datatype", + "schema": "query.sql", + "queries": "query.sql", + "emit_pointers_for_null_types": true + } + ] +} diff --git a/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/go/db.go b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/go/db.go new file mode 100644 index 0000000000..1e0eb9bb9f --- /dev/null +++ b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/go/db.go @@ -0,0 +1,32 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package datatype + +import ( + "context" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" +) + +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/pointer_type_import/postgresql/pgx/v5/go/models.go b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/go/models.go new file mode 100644 index 0000000000..7c8249c35b --- /dev/null +++ b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/go/models.go @@ -0,0 +1,14 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package datatype + +import ( + "net/netip" +) + +type Foo struct { + Bar *netip.Addr + Baz *netip.Prefix +} diff --git a/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/go/query.sql.go b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/go/query.sql.go new file mode 100644 index 0000000000..648bdfb43d --- /dev/null +++ b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/go/query.sql.go @@ -0,0 +1,46 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 +// source: query.sql + +package datatype + +import ( + "context" + "net/netip" +) + +const find = `-- name: Find :one +SELECT bar FROM foo WHERE baz = $1 +` + +func (q *Queries) Find(ctx context.Context, baz *netip.Prefix) (*netip.Addr, error) { + row := q.db.QueryRow(ctx, find, baz) + var bar *netip.Addr + err := row.Scan(&bar) + return bar, err +} + +const list = `-- name: List :many +SELECT bar, baz FROM foo +` + +func (q *Queries) List(ctx context.Context) ([]Foo, error) { + rows, err := q.db.Query(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.Bar, &i.Baz); 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/pointer_type_import/postgresql/pgx/v5/query.sql b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/query.sql new file mode 100644 index 0000000000..b166c01792 --- /dev/null +++ b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/query.sql @@ -0,0 +1,7 @@ +CREATE TABLE foo (bar inet, baz cidr); + +-- name: List :many +SELECT * FROM foo; + +-- name: Find :one +SELECT bar FROM foo WHERE baz = $1; diff --git a/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/sqlc.json b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/sqlc.json new file mode 100644 index 0000000000..dfe93be76c --- /dev/null +++ b/internal/endtoend/testdata/pointer_type_import/postgresql/pgx/v5/sqlc.json @@ -0,0 +1,13 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "postgresql", + "sql_package": "pgx/v5", + "name": "datatype", + "schema": "query.sql", + "queries": "query.sql" + } + ] +}