From a4820c69d231c0b0dc451a0a47765200b43f06d4 Mon Sep 17 00:00:00 2001 From: xuedinge <781408517@qq.com> Date: Wed, 23 Sep 2026 18:45:54 +0800 Subject: [PATCH] fix(golang): respect the engine on global type overrides Filter global overrides before parsing them for a generation request. Rules without an engine continue to apply to single-engine configs, and matching rules retain their existing order and precedence. Add v1 and v2 end-to-end cases with PostgreSQL, MySQL and SQLite sharing column names and database types. Check model fields, query parameters, imports and struct tags against committed generated output. Fixes #4624. Developed and validated with AI assistance. --- internal/codegen/golang/opts/options.go | 4 ++ .../testdata/overrides_engine/v1/mysql/db.go | 31 +++++++++++ .../overrides_engine/v1/mysql/models.go | 15 ++++++ .../overrides_engine/v1/mysql/query.sql.go | 28 ++++++++++ .../testdata/overrides_engine/v1/pg/db.go | 31 +++++++++++ .../testdata/overrides_engine/v1/pg/models.go | 15 ++++++ .../overrides_engine/v1/pg/query.sql.go | 28 ++++++++++ .../testdata/overrides_engine/v1/sqlc.yaml | 45 ++++++++++++++++ .../testdata/overrides_engine/v1/sqlite/db.go | 31 +++++++++++ .../overrides_engine/v1/sqlite/models.go | 11 ++++ .../overrides_engine/v1/sqlite/query.sql.go | 27 ++++++++++ .../testdata/overrides_engine/v2/mysql/db.go | 31 +++++++++++ .../overrides_engine/v2/mysql/models.go | 15 ++++++ .../overrides_engine/v2/mysql/query.sql.go | 28 ++++++++++ .../testdata/overrides_engine/v2/pg/db.go | 31 +++++++++++ .../testdata/overrides_engine/v2/pg/models.go | 15 ++++++ .../overrides_engine/v2/pg/query.sql.go | 28 ++++++++++ .../testdata/overrides_engine/v2/query.sql | 3 ++ .../testdata/overrides_engine/v2/schema.sql | 5 ++ .../testdata/overrides_engine/v2/sqlc.yaml | 53 +++++++++++++++++++ .../testdata/overrides_engine/v2/sqlite/db.go | 31 +++++++++++ .../overrides_engine/v2/sqlite/models.go | 11 ++++ .../overrides_engine/v2/sqlite/query.sql.go | 27 ++++++++++ 23 files changed, 544 insertions(+) create mode 100644 internal/endtoend/testdata/overrides_engine/v1/mysql/db.go create mode 100644 internal/endtoend/testdata/overrides_engine/v1/mysql/models.go create mode 100644 internal/endtoend/testdata/overrides_engine/v1/mysql/query.sql.go create mode 100644 internal/endtoend/testdata/overrides_engine/v1/pg/db.go create mode 100644 internal/endtoend/testdata/overrides_engine/v1/pg/models.go create mode 100644 internal/endtoend/testdata/overrides_engine/v1/pg/query.sql.go create mode 100644 internal/endtoend/testdata/overrides_engine/v1/sqlc.yaml create mode 100644 internal/endtoend/testdata/overrides_engine/v1/sqlite/db.go create mode 100644 internal/endtoend/testdata/overrides_engine/v1/sqlite/models.go create mode 100644 internal/endtoend/testdata/overrides_engine/v1/sqlite/query.sql.go create mode 100644 internal/endtoend/testdata/overrides_engine/v2/mysql/db.go create mode 100644 internal/endtoend/testdata/overrides_engine/v2/mysql/models.go create mode 100644 internal/endtoend/testdata/overrides_engine/v2/mysql/query.sql.go create mode 100644 internal/endtoend/testdata/overrides_engine/v2/pg/db.go create mode 100644 internal/endtoend/testdata/overrides_engine/v2/pg/models.go create mode 100644 internal/endtoend/testdata/overrides_engine/v2/pg/query.sql.go create mode 100644 internal/endtoend/testdata/overrides_engine/v2/query.sql create mode 100644 internal/endtoend/testdata/overrides_engine/v2/schema.sql create mode 100644 internal/endtoend/testdata/overrides_engine/v2/sqlc.yaml create mode 100644 internal/endtoend/testdata/overrides_engine/v2/sqlite/db.go create mode 100644 internal/endtoend/testdata/overrides_engine/v2/sqlite/models.go create mode 100644 internal/endtoend/testdata/overrides_engine/v2/sqlite/query.sql.go diff --git a/internal/codegen/golang/opts/options.go b/internal/codegen/golang/opts/options.go index 646bf1e066..3f342ea1f0 100644 --- a/internal/codegen/golang/opts/options.go +++ b/internal/codegen/golang/opts/options.go @@ -5,6 +5,7 @@ import ( "fmt" "maps" "path/filepath" + "slices" "github.com/sqlc-dev/sqlc/internal/plugin" ) @@ -153,6 +154,9 @@ func parseGlobalOpts(req *plugin.GenerateRequest) (*GlobalOptions, error) { if err := json.Unmarshal(req.GlobalOptions, &options); err != nil { return nil, fmt.Errorf("unmarshalling global options: %w", err) } + options.Overrides = slices.DeleteFunc(options.Overrides, func(o Override) bool { + return o.Engine != "" && o.Engine != req.GetSettings().GetEngine() + }) for i := range options.Overrides { if err := options.Overrides[i].parse(req); err != nil { return nil, err diff --git a/internal/endtoend/testdata/overrides_engine/v1/mysql/db.go b/internal/endtoend/testdata/overrides_engine/v1/mysql/db.go new file mode 100644 index 0000000000..8d745411c0 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v1/mysql/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package mysql + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...any) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...any) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...any) *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/overrides_engine/v1/mysql/models.go b/internal/endtoend/testdata/overrides_engine/v1/mysql/models.go new file mode 100644 index 0000000000..eb70e855b8 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v1/mysql/models.go @@ -0,0 +1,15 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package mysql + +import ( + "database/sql" +) + +type Entry struct { + ID int32 + Value sql.NullString `backend:"mysql"` + Code []byte `backend:"mysql"` +} diff --git a/internal/endtoend/testdata/overrides_engine/v1/mysql/query.sql.go b/internal/endtoend/testdata/overrides_engine/v1/mysql/query.sql.go new file mode 100644 index 0000000000..8325e7d1fe --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v1/mysql/query.sql.go @@ -0,0 +1,28 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 +// source: query.sql + +package mysql + +import ( + "context" + "database/sql" +) + +const findEntry = `-- name: FindEntry :one +SELECT id, value, code FROM entries +WHERE value = ? AND code = ? +` + +type FindEntryParams struct { + Value sql.NullString `backend:"mysql"` + Code []byte `backend:"mysql"` +} + +func (q *Queries) FindEntry(ctx context.Context, arg FindEntryParams) (Entry, error) { + row := q.db.QueryRowContext(ctx, findEntry, arg.Value, arg.Code) + var i Entry + err := row.Scan(&i.ID, &i.Value, &i.Code) + return i, err +} diff --git a/internal/endtoend/testdata/overrides_engine/v1/pg/db.go b/internal/endtoend/testdata/overrides_engine/v1/pg/db.go new file mode 100644 index 0000000000..6614d155e5 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v1/pg/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package pg + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...any) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...any) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...any) *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/overrides_engine/v1/pg/models.go b/internal/endtoend/testdata/overrides_engine/v1/pg/models.go new file mode 100644 index 0000000000..d543e260e0 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v1/pg/models.go @@ -0,0 +1,15 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package pg + +import ( + "encoding/json" +) + +type Entry struct { + ID int32 + Value string `backend:"postgresql"` + Code json.RawMessage `backend:"postgresql"` +} diff --git a/internal/endtoend/testdata/overrides_engine/v1/pg/query.sql.go b/internal/endtoend/testdata/overrides_engine/v1/pg/query.sql.go new file mode 100644 index 0000000000..b186bff3e3 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v1/pg/query.sql.go @@ -0,0 +1,28 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 +// source: query.sql + +package pg + +import ( + "context" + "encoding/json" +) + +const findEntry = `-- name: FindEntry :one +SELECT id, value, code FROM entries +WHERE value = $1 AND code = $2 +` + +type FindEntryParams struct { + Value string `backend:"postgresql"` + Code json.RawMessage `backend:"postgresql"` +} + +func (q *Queries) FindEntry(ctx context.Context, arg FindEntryParams) (Entry, error) { + row := q.db.QueryRowContext(ctx, findEntry, arg.Value, arg.Code) + var i Entry + err := row.Scan(&i.ID, &i.Value, &i.Code) + return i, err +} diff --git a/internal/endtoend/testdata/overrides_engine/v1/sqlc.yaml b/internal/endtoend/testdata/overrides_engine/v1/sqlc.yaml new file mode 100644 index 0000000000..ea56880a62 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v1/sqlc.yaml @@ -0,0 +1,45 @@ +version: "1" +overrides: + - db_type: text + engine: postgresql + go_type: string + go_struct_tag: 'backend:"postgresql"' + - db_type: text + engine: mysql + go_type: "database/sql.NullString" + go_struct_tag: 'backend:"mysql"' + - db_type: text + engine: sqlite + go_type: + type: byte + slice: true + go_struct_tag: 'backend:"sqlite"' + - column: entries.code + engine: postgresql + go_type: + import: encoding/json + type: RawMessage + - column: entries.code + engine: mysql + go_type: + type: byte + slice: true + - column: entries.code + engine: sqlite + go_type: string +packages: + - engine: postgresql + schema: ../v2/schema.sql + queries: ../v2/query.sql + name: pg + path: pg + - engine: mysql + schema: ../v2/schema.sql + queries: ../v2/query.sql + name: mysql + path: mysql + - engine: sqlite + schema: ../v2/schema.sql + queries: ../v2/query.sql + name: sqlite + path: sqlite diff --git a/internal/endtoend/testdata/overrides_engine/v1/sqlite/db.go b/internal/endtoend/testdata/overrides_engine/v1/sqlite/db.go new file mode 100644 index 0000000000..be3742276e --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v1/sqlite/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package sqlite + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...any) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...any) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...any) *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/overrides_engine/v1/sqlite/models.go b/internal/endtoend/testdata/overrides_engine/v1/sqlite/models.go new file mode 100644 index 0000000000..031862d729 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v1/sqlite/models.go @@ -0,0 +1,11 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package sqlite + +type Entry struct { + ID int64 + Value []byte `backend:"sqlite"` + Code string `backend:"sqlite"` +} diff --git a/internal/endtoend/testdata/overrides_engine/v1/sqlite/query.sql.go b/internal/endtoend/testdata/overrides_engine/v1/sqlite/query.sql.go new file mode 100644 index 0000000000..fb70006c88 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v1/sqlite/query.sql.go @@ -0,0 +1,27 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 +// source: query.sql + +package sqlite + +import ( + "context" +) + +const findEntry = `-- name: FindEntry :one +SELECT id, value, code FROM entries +WHERE value = ?1 AND code = ?2 +` + +type FindEntryParams struct { + Value []byte `backend:"sqlite"` + Code string `backend:"sqlite"` +} + +func (q *Queries) FindEntry(ctx context.Context, arg FindEntryParams) (Entry, error) { + row := q.db.QueryRowContext(ctx, findEntry, arg.Value, arg.Code) + var i Entry + err := row.Scan(&i.ID, &i.Value, &i.Code) + return i, err +} diff --git a/internal/endtoend/testdata/overrides_engine/v2/mysql/db.go b/internal/endtoend/testdata/overrides_engine/v2/mysql/db.go new file mode 100644 index 0000000000..8d745411c0 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/mysql/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package mysql + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...any) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...any) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...any) *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/overrides_engine/v2/mysql/models.go b/internal/endtoend/testdata/overrides_engine/v2/mysql/models.go new file mode 100644 index 0000000000..eb70e855b8 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/mysql/models.go @@ -0,0 +1,15 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package mysql + +import ( + "database/sql" +) + +type Entry struct { + ID int32 + Value sql.NullString `backend:"mysql"` + Code []byte `backend:"mysql"` +} diff --git a/internal/endtoend/testdata/overrides_engine/v2/mysql/query.sql.go b/internal/endtoend/testdata/overrides_engine/v2/mysql/query.sql.go new file mode 100644 index 0000000000..8325e7d1fe --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/mysql/query.sql.go @@ -0,0 +1,28 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 +// source: query.sql + +package mysql + +import ( + "context" + "database/sql" +) + +const findEntry = `-- name: FindEntry :one +SELECT id, value, code FROM entries +WHERE value = ? AND code = ? +` + +type FindEntryParams struct { + Value sql.NullString `backend:"mysql"` + Code []byte `backend:"mysql"` +} + +func (q *Queries) FindEntry(ctx context.Context, arg FindEntryParams) (Entry, error) { + row := q.db.QueryRowContext(ctx, findEntry, arg.Value, arg.Code) + var i Entry + err := row.Scan(&i.ID, &i.Value, &i.Code) + return i, err +} diff --git a/internal/endtoend/testdata/overrides_engine/v2/pg/db.go b/internal/endtoend/testdata/overrides_engine/v2/pg/db.go new file mode 100644 index 0000000000..6614d155e5 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/pg/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package pg + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...any) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...any) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...any) *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/overrides_engine/v2/pg/models.go b/internal/endtoend/testdata/overrides_engine/v2/pg/models.go new file mode 100644 index 0000000000..d543e260e0 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/pg/models.go @@ -0,0 +1,15 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package pg + +import ( + "encoding/json" +) + +type Entry struct { + ID int32 + Value string `backend:"postgresql"` + Code json.RawMessage `backend:"postgresql"` +} diff --git a/internal/endtoend/testdata/overrides_engine/v2/pg/query.sql.go b/internal/endtoend/testdata/overrides_engine/v2/pg/query.sql.go new file mode 100644 index 0000000000..b186bff3e3 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/pg/query.sql.go @@ -0,0 +1,28 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 +// source: query.sql + +package pg + +import ( + "context" + "encoding/json" +) + +const findEntry = `-- name: FindEntry :one +SELECT id, value, code FROM entries +WHERE value = $1 AND code = $2 +` + +type FindEntryParams struct { + Value string `backend:"postgresql"` + Code json.RawMessage `backend:"postgresql"` +} + +func (q *Queries) FindEntry(ctx context.Context, arg FindEntryParams) (Entry, error) { + row := q.db.QueryRowContext(ctx, findEntry, arg.Value, arg.Code) + var i Entry + err := row.Scan(&i.ID, &i.Value, &i.Code) + return i, err +} diff --git a/internal/endtoend/testdata/overrides_engine/v2/query.sql b/internal/endtoend/testdata/overrides_engine/v2/query.sql new file mode 100644 index 0000000000..09e6a55fc5 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/query.sql @@ -0,0 +1,3 @@ +-- name: FindEntry :one +SELECT id, value, code FROM entries +WHERE value = sqlc.arg(value) AND code = sqlc.arg(code); diff --git a/internal/endtoend/testdata/overrides_engine/v2/schema.sql b/internal/endtoend/testdata/overrides_engine/v2/schema.sql new file mode 100644 index 0000000000..3d66f2ec20 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/schema.sql @@ -0,0 +1,5 @@ +CREATE TABLE entries ( + id integer NOT NULL, + value text NOT NULL, + code text NOT NULL +); diff --git a/internal/endtoend/testdata/overrides_engine/v2/sqlc.yaml b/internal/endtoend/testdata/overrides_engine/v2/sqlc.yaml new file mode 100644 index 0000000000..0be9e6e949 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/sqlc.yaml @@ -0,0 +1,53 @@ +version: "2" +overrides: + go: + overrides: + - db_type: text + engine: postgresql + go_type: string + go_struct_tag: 'backend:"postgresql"' + - db_type: text + engine: mysql + go_type: "database/sql.NullString" + go_struct_tag: 'backend:"mysql"' + - db_type: text + engine: sqlite + go_type: + type: byte + slice: true + go_struct_tag: 'backend:"sqlite"' + - column: entries.code + engine: postgresql + go_type: + import: encoding/json + type: RawMessage + - column: entries.code + engine: mysql + go_type: + type: byte + slice: true + - column: entries.code + engine: sqlite + go_type: string +sql: + - engine: postgresql + schema: schema.sql + queries: query.sql + gen: + go: + package: pg + out: pg + - engine: mysql + schema: schema.sql + queries: query.sql + gen: + go: + package: mysql + out: mysql + - engine: sqlite + schema: schema.sql + queries: query.sql + gen: + go: + package: sqlite + out: sqlite diff --git a/internal/endtoend/testdata/overrides_engine/v2/sqlite/db.go b/internal/endtoend/testdata/overrides_engine/v2/sqlite/db.go new file mode 100644 index 0000000000..be3742276e --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/sqlite/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package sqlite + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...any) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...any) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...any) *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/overrides_engine/v2/sqlite/models.go b/internal/endtoend/testdata/overrides_engine/v2/sqlite/models.go new file mode 100644 index 0000000000..031862d729 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/sqlite/models.go @@ -0,0 +1,11 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package sqlite + +type Entry struct { + ID int64 + Value []byte `backend:"sqlite"` + Code string `backend:"sqlite"` +} diff --git a/internal/endtoend/testdata/overrides_engine/v2/sqlite/query.sql.go b/internal/endtoend/testdata/overrides_engine/v2/sqlite/query.sql.go new file mode 100644 index 0000000000..fb70006c88 --- /dev/null +++ b/internal/endtoend/testdata/overrides_engine/v2/sqlite/query.sql.go @@ -0,0 +1,27 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 +// source: query.sql + +package sqlite + +import ( + "context" +) + +const findEntry = `-- name: FindEntry :one +SELECT id, value, code FROM entries +WHERE value = ?1 AND code = ?2 +` + +type FindEntryParams struct { + Value []byte `backend:"sqlite"` + Code string `backend:"sqlite"` +} + +func (q *Queries) FindEntry(ctx context.Context, arg FindEntryParams) (Entry, error) { + row := q.db.QueryRowContext(ctx, findEntry, arg.Value, arg.Code) + var i Entry + err := row.Scan(&i.ID, &i.Value, &i.Code) + return i, err +}