From 3547b6a20189a13577dfa1212e0a4fcc5f2e813f Mon Sep 17 00:00:00 2001 From: Steven Kabbes Date: Mon, 22 Aug 2022 19:01:53 -0700 Subject: [PATCH 1/2] fix(validate): sqlc.arg & sqlc.narg are not "missing" --- internal/sql/validate/func_call.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/sql/validate/func_call.go b/internal/sql/validate/func_call.go index 8ba6d6359d..2dfe793694 100644 --- a/internal/sql/validate/func_call.go +++ b/internal/sql/validate/func_call.go @@ -56,6 +56,10 @@ func (v *funcCallVisitor) Visit(node ast.Node) astutils.Visitor { } return nil } + + // If we have sqlc.arg or sqlc.narg, there is no need to resolve the function call. + // It won't resolve anyway, sinc it is not a real function. + return nil } fun, err := v.catalog.ResolveFuncCall(call) From bebf98d1bd279a1c5c4736ffcb74925a8e525f26 Mon Sep 17 00:00:00 2001 From: Steven Kabbes Date: Mon, 22 Aug 2022 19:22:02 -0700 Subject: [PATCH 2/2] testdata: add test for strict_null_checks & sqlc.narg --- .../postgresql/stdlib/go_strict/db.go | 31 +++++ .../postgresql/stdlib/go_strict/models.go | 14 +++ .../postgresql/stdlib/go_strict/query.sql.go | 119 ++++++++++++++++++ .../sqlc_narg/postgresql/stdlib/sqlc.json | 26 +++- 4 files changed, 185 insertions(+), 5 deletions(-) create mode 100644 internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/go_strict/db.go create mode 100644 internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/go_strict/models.go create mode 100644 internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/go_strict/query.sql.go diff --git a/internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/go_strict/db.go b/internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/go_strict/db.go new file mode 100644 index 0000000000..0c161db8d9 --- /dev/null +++ b/internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/go_strict/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.15.0 + +package querytest_strict + +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/sqlc_narg/postgresql/stdlib/go_strict/models.go b/internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/go_strict/models.go new file mode 100644 index 0000000000..c982437bac --- /dev/null +++ b/internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/go_strict/models.go @@ -0,0 +1,14 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.15.0 + +package querytest_strict + +import ( + "database/sql" +) + +type Foo struct { + Bar string + MaybeBar sql.NullString +} diff --git a/internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/go_strict/query.sql.go b/internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/go_strict/query.sql.go new file mode 100644 index 0000000000..c6b8867ada --- /dev/null +++ b/internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/go_strict/query.sql.go @@ -0,0 +1,119 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.15.0 +// source: query.sql + +package querytest_strict + +import ( + "context" + "database/sql" +) + +const identOnNonNullable = `-- name: IdentOnNonNullable :many +SELECT bar FROM foo WHERE bar = $1 +` + +func (q *Queries) IdentOnNonNullable(ctx context.Context, bar sql.NullString) ([]string, error) { + rows, err := q.db.QueryContext(ctx, identOnNonNullable, bar) + if err != nil { + return nil, err + } + defer rows.Close() + var items []string + for rows.Next() { + var bar string + if err := rows.Scan(&bar); err != nil { + return nil, err + } + items = append(items, bar) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const identOnNullable = `-- name: IdentOnNullable :many +SELECT maybe_bar FROM foo WHERE maybe_bar = $1 +` + +func (q *Queries) IdentOnNullable(ctx context.Context, maybeBar sql.NullString) ([]sql.NullString, error) { + rows, err := q.db.QueryContext(ctx, identOnNullable, maybeBar) + if err != nil { + return nil, err + } + defer rows.Close() + var items []sql.NullString + for rows.Next() { + var maybe_bar sql.NullString + if err := rows.Scan(&maybe_bar); err != nil { + return nil, err + } + items = append(items, maybe_bar) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const stringOnNonNullable = `-- name: StringOnNonNullable :many +SELECT bar FROM foo WHERE bar = $1 +` + +func (q *Queries) StringOnNonNullable(ctx context.Context, bar sql.NullString) ([]string, error) { + rows, err := q.db.QueryContext(ctx, stringOnNonNullable, bar) + if err != nil { + return nil, err + } + defer rows.Close() + var items []string + for rows.Next() { + var bar string + if err := rows.Scan(&bar); err != nil { + return nil, err + } + items = append(items, bar) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const stringOnNullable = `-- name: StringOnNullable :many +SELECT maybe_bar FROM foo WHERE maybe_bar = $1 +` + +func (q *Queries) StringOnNullable(ctx context.Context, maybeBar sql.NullString) ([]sql.NullString, error) { + rows, err := q.db.QueryContext(ctx, stringOnNullable, maybeBar) + if err != nil { + return nil, err + } + defer rows.Close() + var items []sql.NullString + for rows.Next() { + var maybe_bar sql.NullString + if err := rows.Scan(&maybe_bar); err != nil { + return nil, err + } + items = append(items, maybe_bar) + } + 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/sqlc_narg/postgresql/stdlib/sqlc.json b/internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/sqlc.json index de427d069f..0dcd7ce649 100644 --- a/internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/sqlc.json +++ b/internal/endtoend/testdata/sqlc_narg/postgresql/stdlib/sqlc.json @@ -1,12 +1,28 @@ { - "version": "1", - "packages": [ + "version": "2", + "sql": [ { "engine": "postgresql", - "path": "go", - "name": "querytest", "schema": "query.sql", - "queries": "query.sql" + "queries": "query.sql", + "gen": { + "go": { + "package": "querytest", + "out": "go" + } + } + }, + { + "engine": "postgresql", + "schema": "query.sql", + "queries": "query.sql", + "strict_function_checks": true, + "gen": { + "go": { + "package": "querytest_strict", + "out": "go_strict" + } + } } ] }