From 62288367f8a2f740cb6168450380e1ca765b10bc Mon Sep 17 00:00:00 2001 From: Vitalii Solodilov Date: Sat, 26 Nov 2022 15:26:26 +0700 Subject: [PATCH] sqlite: supported between expr (#1958) --- .../testdata/between_args/sqlite/go/db.go | 31 +++++ .../testdata/between_args/sqlite/go/models.go | 12 ++ .../between_args/sqlite/go/query.sql.go | 112 ++++++++++++++++++ .../testdata/between_args/sqlite/query.sql | 19 +++ .../testdata/between_args/sqlite/sqlc.json | 12 ++ internal/engine/sqlite/convert.go | 13 ++ 6 files changed, 199 insertions(+) create mode 100644 internal/endtoend/testdata/between_args/sqlite/go/db.go create mode 100644 internal/endtoend/testdata/between_args/sqlite/go/models.go create mode 100644 internal/endtoend/testdata/between_args/sqlite/go/query.sql.go create mode 100644 internal/endtoend/testdata/between_args/sqlite/query.sql create mode 100644 internal/endtoend/testdata/between_args/sqlite/sqlc.json diff --git a/internal/endtoend/testdata/between_args/sqlite/go/db.go b/internal/endtoend/testdata/between_args/sqlite/go/db.go new file mode 100644 index 0000000000..eea4166ec6 --- /dev/null +++ b/internal/endtoend/testdata/between_args/sqlite/go/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +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/between_args/sqlite/go/models.go b/internal/endtoend/testdata/between_args/sqlite/go/models.go new file mode 100644 index 0000000000..2517f9c2f6 --- /dev/null +++ b/internal/endtoend/testdata/between_args/sqlite/go/models.go @@ -0,0 +1,12 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 + +package querytest + +import () + +type Product struct { + Name string + Price int64 +} diff --git a/internal/endtoend/testdata/between_args/sqlite/go/query.sql.go b/internal/endtoend/testdata/between_args/sqlite/go/query.sql.go new file mode 100644 index 0000000000..a75b30673a --- /dev/null +++ b/internal/endtoend/testdata/between_args/sqlite/go/query.sql.go @@ -0,0 +1,112 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.16.0 +// source: query.sql + +package querytest + +import ( + "context" +) + +const getBetweenPrices = `-- name: GetBetweenPrices :many +SELECT name, price +FROM products +WHERE price BETWEEN ? AND ? +` + +type GetBetweenPricesParams struct { + Price int64 + Price_2 int64 +} + +func (q *Queries) GetBetweenPrices(ctx context.Context, arg GetBetweenPricesParams) ([]Product, error) { + rows, err := q.db.QueryContext(ctx, getBetweenPrices, arg.Price, arg.Price_2) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Product + for rows.Next() { + var i Product + if err := rows.Scan(&i.Name, &i.Price); 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 +} + +const getBetweenPricesTable = `-- name: GetBetweenPricesTable :many +SELECT name, price +FROM products +WHERE products.price BETWEEN ? AND ? +` + +type GetBetweenPricesTableParams struct { + Price int64 + Price_2 int64 +} + +func (q *Queries) GetBetweenPricesTable(ctx context.Context, arg GetBetweenPricesTableParams) ([]Product, error) { + rows, err := q.db.QueryContext(ctx, getBetweenPricesTable, arg.Price, arg.Price_2) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Product + for rows.Next() { + var i Product + if err := rows.Scan(&i.Name, &i.Price); 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 +} + +const getBetweenPricesTableAlias = `-- name: GetBetweenPricesTableAlias :many +SELECT name, price +FROM products as p +WHERE p.price BETWEEN ? AND ? +` + +type GetBetweenPricesTableAliasParams struct { + Price int64 + Price_2 int64 +} + +func (q *Queries) GetBetweenPricesTableAlias(ctx context.Context, arg GetBetweenPricesTableAliasParams) ([]Product, error) { + rows, err := q.db.QueryContext(ctx, getBetweenPricesTableAlias, arg.Price, arg.Price_2) + if err != nil { + return nil, err + } + defer rows.Close() + var items []Product + for rows.Next() { + var i Product + if err := rows.Scan(&i.Name, &i.Price); 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/between_args/sqlite/query.sql b/internal/endtoend/testdata/between_args/sqlite/query.sql new file mode 100644 index 0000000000..f2984f9822 --- /dev/null +++ b/internal/endtoend/testdata/between_args/sqlite/query.sql @@ -0,0 +1,19 @@ +CREATE TABLE products ( + name TEXT NOT NULL, + price INT NOT NULL +); + +-- name: GetBetweenPrices :many +SELECT * +FROM products +WHERE price BETWEEN ? AND ?; + +-- name: GetBetweenPricesTable :many +SELECT * +FROM products +WHERE products.price BETWEEN ? AND ?; + +-- name: GetBetweenPricesTableAlias :many +SELECT * +FROM products as p +WHERE p.price BETWEEN ? AND ?; diff --git a/internal/endtoend/testdata/between_args/sqlite/sqlc.json b/internal/endtoend/testdata/between_args/sqlite/sqlc.json new file mode 100644 index 0000000000..6f0ca7541c --- /dev/null +++ b/internal/endtoend/testdata/between_args/sqlite/sqlc.json @@ -0,0 +1,12 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "sqlite", + "name": "querytest", + "schema": "query.sql", + "queries": "query.sql" + } + ] +} diff --git a/internal/engine/sqlite/convert.go b/internal/engine/sqlite/convert.go index fe957af979..e902b1b633 100644 --- a/internal/engine/sqlite/convert.go +++ b/internal/engine/sqlite/convert.go @@ -767,6 +767,16 @@ func (c *cc) convertUpdate_stmtContext(n *parser.Update_stmtContext) ast.Node { } } +func (c *cc) convertBetweenExpr(n *parser.Expr_betweenContext) ast.Node { + return &ast.BetweenExpr{ + Expr: c.convert(n.Expr(0)), + Left: c.convert(n.Expr(1)), + Right: c.convert(n.Expr(2)), + Location: n.GetStart().GetStart(), + Not: n.NOT_() != nil, + } +} + func (c *cc) convert(node node) ast.Node { switch n := node.(type) { @@ -815,6 +825,9 @@ func (c *cc) convert(node node) ast.Node { case *parser.Expr_in_selectContext: return c.convertInSelectNode(n) + case *parser.Expr_betweenContext: + return c.convertBetweenExpr(n) + case *parser.Factored_select_stmtContext: // TODO: need to handle this return todo(n)