diff --git a/internal/codegen/golang/imports.go b/internal/codegen/golang/imports.go index 5b76c2fc62..3ec00432a2 100644 --- a/internal/codegen/golang/imports.go +++ b/internal/codegen/golang/imports.go @@ -67,9 +67,7 @@ type importer struct { func (i *importer) usesType(typ string) bool { for _, strct := range i.Structs { for _, f := range strct.Fields { - fType := trimSliceAndPointerPrefix(f.Type) - tType := trimSliceAndPointerPrefix(typ) - if strings.HasPrefix(fType, tType) { + if hasPrefixIgnoringSliceAndPointerPrefix(f.Type, typ) { return true } } @@ -240,13 +238,12 @@ func (i *importer) interfaceImports() fileImports { if usesBatch([]Query{q}) { continue } - if strings.HasPrefix(q.Ret.Type(), name) { + if hasPrefixIgnoringSliceAndPointerPrefix(q.Ret.Type(), name) { return true } } if !q.Arg.isEmpty() { - argType := trimSliceAndPointerPrefix(q.Arg.Type()) - if strings.HasPrefix(argType, name) { + if hasPrefixIgnoringSliceAndPointerPrefix(q.Arg.Type(), name) { return true } } @@ -306,28 +303,24 @@ func (i *importer) queryImports(filename string) fileImports { if q.hasRetType() { if q.Ret.EmitStruct() { for _, f := range q.Ret.Struct.Fields { - fType := trimSliceAndPointerPrefix(f.Type) - if strings.HasPrefix(fType, name) { + if hasPrefixIgnoringSliceAndPointerPrefix(f.Type, name) { return true } } } - retType := trimSliceAndPointerPrefix(q.Ret.Type()) - if strings.HasPrefix(retType, name) { + if hasPrefixIgnoringSliceAndPointerPrefix(q.Ret.Type(), name) { return true } } if !q.Arg.isEmpty() { if q.Arg.EmitStruct() { for _, f := range q.Arg.Struct.Fields { - fType := trimSliceAndPointerPrefix(f.Type) - if strings.HasPrefix(fType, name) { + if hasPrefixIgnoringSliceAndPointerPrefix(f.Type, name) { return true } } } - argType := trimSliceAndPointerPrefix(q.Arg.Type()) - if strings.HasPrefix(argType, name) { + if hasPrefixIgnoringSliceAndPointerPrefix(q.Arg.Type(), name) { return true } } @@ -431,28 +424,24 @@ func (i *importer) batchImports() fileImports { if q.hasRetType() { if q.Ret.EmitStruct() { for _, f := range q.Ret.Struct.Fields { - fType := trimSliceAndPointerPrefix(f.Type) - if strings.HasPrefix(fType, name) { + if hasPrefixIgnoringSliceAndPointerPrefix(f.Type, name) { return true } } } - retType := trimSliceAndPointerPrefix(q.Ret.Type()) - if strings.HasPrefix(retType, name) { + if hasPrefixIgnoringSliceAndPointerPrefix(q.Ret.Type(), name) { return true } } if !q.Arg.isEmpty() { if q.Arg.EmitStruct() { for _, f := range q.Arg.Struct.Fields { - fType := trimSliceAndPointerPrefix(f.Type) - if strings.HasPrefix(fType, name) { + if hasPrefixIgnoringSliceAndPointerPrefix(f.Type, name) { return true } } } - argType := trimSliceAndPointerPrefix(q.Arg.Type()) - if strings.HasPrefix(argType, name) { + if hasPrefixIgnoringSliceAndPointerPrefix(q.Arg.Type(), name) { return true } } @@ -479,6 +468,12 @@ func trimSliceAndPointerPrefix(v string) string { return v } +func hasPrefixIgnoringSliceAndPointerPrefix(s, prefix string) bool { + trimmedS := trimSliceAndPointerPrefix(s) + trimmedPrefix := trimSliceAndPointerPrefix(prefix) + return strings.HasPrefix(trimmedS, trimmedPrefix) +} + func replaceConflictedArg(imports [][]ImportSpec, queries []Query) []Query { m := make(map[string]struct{}) for _, is := range imports { diff --git a/internal/endtoend/testdata/overrides_pointers/mysql/go/query.sql.go b/internal/endtoend/testdata/overrides_pointers/mysql/go/query.sql.go new file mode 100644 index 0000000000..a5722aa935 --- /dev/null +++ b/internal/endtoend/testdata/overrides_pointers/mysql/go/query.sql.go @@ -0,0 +1,26 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 +// source: query.sql + +package override + +import ( + "context" + + t "github.com/jackc/pgtype" +) + +const test = `-- name: test :exec +SELECT other, total, retyped FROM foo WHERE other = ? and retyped = ? +` + +type testParams struct { + Other string + Retyped *t.Text +} + +func (q *Queries) test(ctx context.Context, arg testParams) error { + _, err := q.db.ExecContext(ctx, test, arg.Other, arg.Retyped) + return err +} diff --git a/internal/endtoend/testdata/overrides_pointers/mysql/query.sql b/internal/endtoend/testdata/overrides_pointers/mysql/query.sql index e0ac49d1ec..d2733d752f 100644 --- a/internal/endtoend/testdata/overrides_pointers/mysql/query.sql +++ b/internal/endtoend/testdata/overrides_pointers/mysql/query.sql @@ -1 +1,2 @@ -SELECT 1; +-- name: test :exec +SELECT * FROM foo WHERE other = ? and retyped = ?; \ No newline at end of file diff --git a/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v4/go/query.sql.go b/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v4/go/query.sql.go new file mode 100644 index 0000000000..ecbd21bd52 --- /dev/null +++ b/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v4/go/query.sql.go @@ -0,0 +1,21 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 +// source: query.sql + +package override + +import ( + "context" + + t "github.com/jackc/pgtype" +) + +const test = `-- name: test :exec +UPDATE foo SET langs = $1 +` + +func (q *Queries) test(ctx context.Context, langs *t.Text) error { + _, err := q.db.Exec(ctx, test, langs) + return err +} diff --git a/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v4/query.sql b/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v4/query.sql index e0ac49d1ec..989c99f3c3 100644 --- a/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v4/query.sql +++ b/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v4/query.sql @@ -1 +1,2 @@ -SELECT 1; +-- name: test :exec +UPDATE foo SET langs = $1; \ No newline at end of file diff --git a/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v5/go/query.sql.go b/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v5/go/query.sql.go new file mode 100644 index 0000000000..ecbd21bd52 --- /dev/null +++ b/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v5/go/query.sql.go @@ -0,0 +1,21 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 +// source: query.sql + +package override + +import ( + "context" + + t "github.com/jackc/pgtype" +) + +const test = `-- name: test :exec +UPDATE foo SET langs = $1 +` + +func (q *Queries) test(ctx context.Context, langs *t.Text) error { + _, err := q.db.Exec(ctx, test, langs) + return err +} diff --git a/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v5/query.sql b/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v5/query.sql index e0ac49d1ec..989c99f3c3 100644 --- a/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v5/query.sql +++ b/internal/endtoend/testdata/overrides_pointers/postgresql/pgx/v5/query.sql @@ -1 +1,2 @@ -SELECT 1; +-- name: test :exec +UPDATE foo SET langs = $1; \ No newline at end of file diff --git a/internal/endtoend/testdata/overrides_pointers/postgresql/stdlib/go/query.sql.go b/internal/endtoend/testdata/overrides_pointers/postgresql/stdlib/go/query.sql.go new file mode 100644 index 0000000000..203ddf88e8 --- /dev/null +++ b/internal/endtoend/testdata/overrides_pointers/postgresql/stdlib/go/query.sql.go @@ -0,0 +1,21 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 +// source: query.sql + +package override + +import ( + "context" + + t "github.com/jackc/pgtype" +) + +const test = `-- name: test :exec +UPDATE foo SET langs = $1 +` + +func (q *Queries) test(ctx context.Context, langs *t.Text) error { + _, err := q.db.ExecContext(ctx, test, langs) + return err +} diff --git a/internal/endtoend/testdata/overrides_pointers/postgresql/stdlib/query.sql b/internal/endtoend/testdata/overrides_pointers/postgresql/stdlib/query.sql index e0ac49d1ec..c3da7ccaf2 100644 --- a/internal/endtoend/testdata/overrides_pointers/postgresql/stdlib/query.sql +++ b/internal/endtoend/testdata/overrides_pointers/postgresql/stdlib/query.sql @@ -1 +1,2 @@ -SELECT 1; +-- name: test :exec +UPDATE foo SET langs = $1;