diff --git a/internal/endtoend/testdata/select_exists/sqlite/go/db.go b/internal/endtoend/testdata/select_exists/sqlite/go/db.go new file mode 100644 index 0000000000..8c5b31f933 --- /dev/null +++ b/internal/endtoend/testdata/select_exists/sqlite/go/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.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/select_exists/sqlite/go/models.go b/internal/endtoend/testdata/select_exists/sqlite/go/models.go new file mode 100644 index 0000000000..7c16100f10 --- /dev/null +++ b/internal/endtoend/testdata/select_exists/sqlite/go/models.go @@ -0,0 +1,11 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import () + +type Bar struct { + ID int64 +} diff --git a/internal/endtoend/testdata/select_exists/sqlite/go/query.sql.go b/internal/endtoend/testdata/select_exists/sqlite/go/query.sql.go new file mode 100644 index 0000000000..18f4bc6090 --- /dev/null +++ b/internal/endtoend/testdata/select_exists/sqlite/go/query.sql.go @@ -0,0 +1,29 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 +// source: query.sql + +package querytest + +import ( + "context" +) + +const barExists = `-- name: BarExists :one +SELECT + EXISTS ( + SELECT + 1 + FROM + bar + where + id = ? + ) +` + +func (q *Queries) BarExists(ctx context.Context, id int64) (int64, error) { + row := q.db.QueryRowContext(ctx, barExists, id) + var column_1 int64 + err := row.Scan(&column_1) + return column_1, err +} diff --git a/internal/endtoend/testdata/select_exists/sqlite/query.sql b/internal/endtoend/testdata/select_exists/sqlite/query.sql new file mode 100644 index 0000000000..f0ad7f354f --- /dev/null +++ b/internal/endtoend/testdata/select_exists/sqlite/query.sql @@ -0,0 +1,12 @@ +CREATE TABLE bar (id int not null primary key autoincrement); + +-- name: BarExists :one +SELECT + EXISTS ( + SELECT + 1 + FROM + bar + where + id = ? + ); diff --git a/internal/endtoend/testdata/select_exists/sqlite/sqlc.json b/internal/endtoend/testdata/select_exists/sqlite/sqlc.json new file mode 100644 index 0000000000..9a3cd68bda --- /dev/null +++ b/internal/endtoend/testdata/select_exists/sqlite/sqlc.json @@ -0,0 +1,12 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "name": "querytest", + "engine": "sqlite", + "schema": "query.sql", + "queries": "query.sql" + } + ] +} diff --git a/internal/endtoend/testdata/select_not_exists/sqlite/go/db.go b/internal/endtoend/testdata/select_not_exists/sqlite/go/db.go new file mode 100644 index 0000000000..8c5b31f933 --- /dev/null +++ b/internal/endtoend/testdata/select_not_exists/sqlite/go/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.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/select_not_exists/sqlite/go/models.go b/internal/endtoend/testdata/select_not_exists/sqlite/go/models.go new file mode 100644 index 0000000000..7c16100f10 --- /dev/null +++ b/internal/endtoend/testdata/select_not_exists/sqlite/go/models.go @@ -0,0 +1,11 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 + +package querytest + +import () + +type Bar struct { + ID int64 +} diff --git a/internal/endtoend/testdata/select_not_exists/sqlite/go/query.sql.go b/internal/endtoend/testdata/select_not_exists/sqlite/go/query.sql.go new file mode 100644 index 0000000000..0d85fc420a --- /dev/null +++ b/internal/endtoend/testdata/select_not_exists/sqlite/go/query.sql.go @@ -0,0 +1,29 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.18.0 +// source: query.sql + +package querytest + +import ( + "context" +) + +const barNotExists = `-- name: BarNotExists :one +SELECT + NOT EXISTS ( + SELECT + 1 + FROM + bar + WHERE + id = ? + ) +` + +func (q *Queries) BarNotExists(ctx context.Context) (interface{}, error) { + row := q.db.QueryRowContext(ctx, barNotExists) + var column_1 interface{} + err := row.Scan(&column_1) + return column_1, err +} diff --git a/internal/endtoend/testdata/select_not_exists/sqlite/query.sql b/internal/endtoend/testdata/select_not_exists/sqlite/query.sql new file mode 100644 index 0000000000..473b8461e4 --- /dev/null +++ b/internal/endtoend/testdata/select_not_exists/sqlite/query.sql @@ -0,0 +1,13 @@ +CREATE TABLE bar (id integer not null primary key autoincrement); + +-- name: BarNotExists :one +SELECT + NOT EXISTS ( + SELECT + 1 + FROM + bar + WHERE + id = ? + ); + diff --git a/internal/endtoend/testdata/select_not_exists/sqlite/sqlc.json b/internal/endtoend/testdata/select_not_exists/sqlite/sqlc.json new file mode 100644 index 0000000000..9a3cd68bda --- /dev/null +++ b/internal/endtoend/testdata/select_not_exists/sqlite/sqlc.json @@ -0,0 +1,12 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "name": "querytest", + "engine": "sqlite", + "schema": "query.sql", + "queries": "query.sql" + } + ] +} diff --git a/internal/engine/sqlite/convert.go b/internal/engine/sqlite/convert.go index 43771cebb7..a3a75b56e7 100644 --- a/internal/engine/sqlite/convert.go +++ b/internal/engine/sqlite/convert.go @@ -20,9 +20,9 @@ type node interface { GetParser() antlr.Parser } -func todo(n node) *ast.TODO { +func todo(funcname string, n node) *ast.TODO { if debug.Active { - log.Printf("sqlite.convert: Unknown node type %T\n", n) + log.Printf("sqlite.%s: Unknown node type %T\n", funcname, n) } return &ast.TODO{} } @@ -92,7 +92,7 @@ func (c *cc) convertAlter_table_stmtContext(n *parser.Alter_table_stmtContext) a return stmt } - return todo(n) + return todo("convertAlter_table_stmtContext", n) } func (c *cc) convertAttach_stmtContext(n *parser.Attach_stmtContext) ast.Node { @@ -179,7 +179,7 @@ func (c *cc) convertDelete_stmtContext(n *parser.Delete_stmtContext) ast.Node { return delete } - return todo(n) + return todo("convertDelete_stmtContext", n) } func (c *cc) convertDrop_stmtContext(n *parser.Drop_stmtContext) ast.Node { @@ -196,7 +196,7 @@ func (c *cc) convertDrop_stmtContext(n *parser.Drop_stmtContext) ast.Node { Tables: []*ast.TableName{&name}, } } - return todo(n) + return todo("convertDrop_stmtContext", n) } func (c *cc) convertFuncContext(n *parser.Expr_functionContext) ast.Node { @@ -239,7 +239,7 @@ func (c *cc) convertFuncContext(n *parser.Expr_functionContext) ast.Node { } } - return todo(n) + return todo("convertFuncContext", n) } func (c *cc) convertExprContext(n *parser.ExprContext) ast.Node { @@ -445,7 +445,7 @@ func (c *cc) convertOrderby_stmtContext(n parser.IOrder_by_stmtContext) ast.Node } return list } - return todo(n) + return todo("convertOrderby_stmtContext", n) } func (c *cc) convertLimit_stmtContext(n parser.ILimit_stmtContext) (ast.Node, ast.Node) { @@ -572,7 +572,7 @@ func (c *cc) convertLiteral(n *parser.Expr_literalContext) ast.Node { } } } - return todo(n) + return todo("convertLiteral", n) } func (c *cc) convertMathOperationNode(n *parser.Expr_math_opContext) ast.Node { @@ -624,41 +624,11 @@ func (c *cc) convertParam(n *parser.Expr_bindContext) ast.Node { } } - return todo(n) + return todo("convertParam", n) } func (c *cc) convertInSelectNode(n *parser.Expr_in_selectContext) ast.Node { - if n.IN_() == nil && n.EXISTS_() == nil { - return c.convert(n.Select_stmt()) - } - - lexpr := c.convert(n.Expr(0)) - rexprs := []ast.Node{} - for i, expr := range n.AllExpr()[1:] { - if i == 0 { - continue - } - e := c.convert(expr) - switch t := e.(type) { - case *ast.List: - rexprs = append(rexprs, t.Items...) - default: - rexprs = append(rexprs, t) - } - } - - var subquery ast.Node = nil - if n.Select_stmt() != nil { - subquery = c.convert(n.Select_stmt()) - } - - return &ast.In{ - Expr: lexpr, - List: rexprs, - Not: n.NOT_() != nil, - Sel: subquery, - Location: n.GetStart().GetStart(), - } + return c.convert(n.Select_stmt()) } func (c *cc) convertReturning_caluseContext(n parser.IReturning_clauseContext) *ast.List { @@ -930,7 +900,7 @@ func (c *cc) convert(node node) ast.Node { case *parser.Factored_select_stmtContext: // TODO: need to handle this - return todo(n) + return todo("convert(case=parser.Factored_select_stmtContext)", n) case *parser.Insert_stmtContext: return c.convertInsert_stmtContext(n) @@ -948,6 +918,6 @@ func (c *cc) convert(node node) ast.Node { return c.convertUpdate_stmtContext(n) default: - return todo(n) + return todo("convert(case=default)", n) } }