From 353646c208d600d597a8e6c21c08225076179f1a Mon Sep 17 00:00:00 2001 From: Timothy Studd Date: Sat, 13 Nov 2021 07:06:33 -0800 Subject: [PATCH] fix(engine/mysql): Fix MySQL parser for query without trailing semicolon --- .../testdata/missing_semicolon/mysql/go/db.go | 29 +++++++++++++++++++ .../missing_semicolon/mysql/go/models.go | 13 +++++++++ .../missing_semicolon/mysql/go/query.sql.go | 24 +++++++++++++++ .../missing_semicolon/mysql/query.sql | 11 +++++++ .../missing_semicolon/mysql/sqlc.json | 12 ++++++++ internal/engine/dolphin/parse.go | 7 ++++- 6 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 internal/endtoend/testdata/missing_semicolon/mysql/go/db.go create mode 100644 internal/endtoend/testdata/missing_semicolon/mysql/go/models.go create mode 100644 internal/endtoend/testdata/missing_semicolon/mysql/go/query.sql.go create mode 100644 internal/endtoend/testdata/missing_semicolon/mysql/query.sql create mode 100644 internal/endtoend/testdata/missing_semicolon/mysql/sqlc.json diff --git a/internal/endtoend/testdata/missing_semicolon/mysql/go/db.go b/internal/endtoend/testdata/missing_semicolon/mysql/go/db.go new file mode 100644 index 0000000000..6a99519302 --- /dev/null +++ b/internal/endtoend/testdata/missing_semicolon/mysql/go/db.go @@ -0,0 +1,29 @@ +// Code generated by sqlc. DO NOT EDIT. + +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/missing_semicolon/mysql/go/models.go b/internal/endtoend/testdata/missing_semicolon/mysql/go/models.go new file mode 100644 index 0000000000..47c8f4ca8d --- /dev/null +++ b/internal/endtoend/testdata/missing_semicolon/mysql/go/models.go @@ -0,0 +1,13 @@ +// Code generated by sqlc. DO NOT EDIT. + +package querytest + +import ( + "database/sql" +) + +type Author struct { + ID int32 + Name string + Bio sql.NullString +} diff --git a/internal/endtoend/testdata/missing_semicolon/mysql/go/query.sql.go b/internal/endtoend/testdata/missing_semicolon/mysql/go/query.sql.go new file mode 100644 index 0000000000..9e703568ac --- /dev/null +++ b/internal/endtoend/testdata/missing_semicolon/mysql/go/query.sql.go @@ -0,0 +1,24 @@ +// Code generated by sqlc. DO NOT EDIT. +// source: query.sql + +package querytest + +import ( + "context" +) + +const setAuthor = `-- name: SetAuthor :exec +UPDATE authors +SET name = ? +WHERE id = ? +` + +type SetAuthorParams struct { + Name string + ID int32 +} + +func (q *Queries) SetAuthor(ctx context.Context, arg SetAuthorParams) error { + _, err := q.db.ExecContext(ctx, setAuthor, arg.Name, arg.ID) + return err +} diff --git a/internal/endtoend/testdata/missing_semicolon/mysql/query.sql b/internal/endtoend/testdata/missing_semicolon/mysql/query.sql new file mode 100644 index 0000000000..b3440e7330 --- /dev/null +++ b/internal/endtoend/testdata/missing_semicolon/mysql/query.sql @@ -0,0 +1,11 @@ +-- https://github.com/kyleconroy/sqlc/issues/1198 +CREATE TABLE authors ( + id INT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + bio text +); + +-- name: SetAuthor :exec +UPDATE authors +SET name = ? +WHERE id = ? diff --git a/internal/endtoend/testdata/missing_semicolon/mysql/sqlc.json b/internal/endtoend/testdata/missing_semicolon/mysql/sqlc.json new file mode 100644 index 0000000000..534b7e24e9 --- /dev/null +++ b/internal/endtoend/testdata/missing_semicolon/mysql/sqlc.json @@ -0,0 +1,12 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "mysql", + "name": "querytest", + "schema": "query.sql", + "queries": "query.sql" + } + ] +} diff --git a/internal/engine/dolphin/parse.go b/internal/engine/dolphin/parse.go index d17996b230..5bcf524a24 100644 --- a/internal/engine/dolphin/parse.go +++ b/internal/engine/dolphin/parse.go @@ -69,11 +69,16 @@ func (p *Parser) Parse(r io.Reader) ([]ast.Statement, error) { text := stmtNodes[i].Text() loc := strings.Index(string(blob), text) + stmtLen := len(text) + if text[stmtLen-1] == ';' { + stmtLen -= 1 // Subtract one to remove semicolon + } + stmts = append(stmts, ast.Statement{ Raw: &ast.RawStmt{ Stmt: out, StmtLocation: loc, - StmtLen: len(text) - 1, // Subtract one to remove semicolon + StmtLen: stmtLen, }, }) }