From b2b94d0471e871e448aa4b9df97ce15238c687a9 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Fri, 5 Mar 2021 18:28:28 +0530 Subject: [PATCH] empty statement error code change in sql parsing Signed-off-by: Harshit Gangal --- go/mysql/conn.go | 5 +++-- go/mysql/sql_error.go | 1 + go/test/endtoend/vtgate/unsharded/main_test.go | 5 +++-- go/vt/sqlparser/parse_test.go | 4 ++-- go/vt/sqlparser/parser.go | 7 +------ go/vt/vterrors/state.go | 1 + go/vt/vttablet/tabletserver/query_engine_test.go | 5 +---- 7 files changed, 12 insertions(+), 16 deletions(-) diff --git a/go/mysql/conn.go b/go/mysql/conn.go index 36058714826..666c0a397d8 100644 --- a/go/mysql/conn.go +++ b/go/mysql/conn.go @@ -1188,6 +1188,8 @@ func (c *Conn) handleComPing() bool { return true } +var errEmptyStatement = NewSQLError(EREmptyQuery, SSClientError, "Query was empty") + func (c *Conn) handleComQuery(handler Handler, data []byte) (kontinue bool) { c.startWriterBuffering() defer func() { @@ -1214,8 +1216,7 @@ func (c *Conn) handleComQuery(handler Handler, data []byte) (kontinue bool) { } if len(queries) == 0 { - err := NewSQLError(EREmptyQuery, SSClientError, "Query was empty") - return c.writeErrorPacketFromErrorAndLog(err) + return c.writeErrorPacketFromErrorAndLog(errEmptyStatement) } for index, sql := range queries { diff --git a/go/mysql/sql_error.go b/go/mysql/sql_error.go index 1ab1d51dec7..e3c8ff6594b 100644 --- a/go/mysql/sql_error.go +++ b/go/mysql/sql_error.go @@ -161,6 +161,7 @@ var stateToMysqlCode = map[vterrors.State]struct { vterrors.DataOutOfRange: {num: ERDataOutOfRange, state: SSDataOutOfRange}, vterrors.DbCreateExists: {num: ERDbCreateExists, state: SSUnknownSQLState}, vterrors.DbDropExists: {num: ERDbDropExists, state: SSUnknownSQLState}, + vterrors.EmptyQuery: {num: EREmptyQuery, state: SSClientError}, vterrors.InnodbReadOnly: {num: ERInnodbReadOnly, state: SSUnknownSQLState}, vterrors.LockOrActiveTransaction: {num: ERLockOrActiveTransaction, state: SSUnknownSQLState}, vterrors.NoDB: {num: ERNoDb, state: SSNoDB}, diff --git a/go/test/endtoend/vtgate/unsharded/main_test.go b/go/test/endtoend/vtgate/unsharded/main_test.go index e447c7543ff..07b41093421 100644 --- a/go/test/endtoend/vtgate/unsharded/main_test.go +++ b/go/test/endtoend/vtgate/unsharded/main_test.go @@ -234,8 +234,9 @@ func TestEmptyStatement(t *testing.T) { require.Nil(t, err) defer conn.Close() defer exec(t, conn, `delete from t1`) - execAssertError(t, conn, " \t;", "Query was empty") - execMulti(t, conn, `insert into t1(c1, c2, c3, c4) values (300,100,300,'abc'); ;; insert into t1(c1, c2, c3, c4) values (301,101,301,'abcd');;`) + execAssertError(t, conn, " \t; \n;", "Query was empty") + execMulti(t, conn, `insert into t1(c1, c2, c3, c4) values (300,100,300,'abc'); ;; insert into t1(c1, c2, c3, c4) values (301,101,301,'abcd');;`) + assertMatches(t, conn, `select c1,c2,c3 from t1`, `[[INT64(300) INT64(100) INT64(300)] [INT64(301) INT64(101) INT64(301)]]`) } diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 24495dddae0..f20704f0ebd 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -1957,7 +1957,7 @@ func TestInvalid(t *testing.T) { err: "syntax error", }, { input: "/*!*/", - err: "empty statement", + err: "Query was empty", }} for _, tcase := range invalidSQL { @@ -2263,7 +2263,7 @@ func TestConvert(t *testing.T) { output: "syntax error at position 33", }, { input: "/* a comment */", - output: "empty statement", + output: "Query was empty", }, { input: "set transaction isolation level 12345", output: "syntax error at position 38 near '12345'", diff --git a/go/vt/sqlparser/parser.go b/go/vt/sqlparser/parser.go index 8298cba6f1c..6da9d62bca7 100644 --- a/go/vt/sqlparser/parser.go +++ b/go/vt/sqlparser/parser.go @@ -17,10 +17,8 @@ limitations under the License. package sqlparser import ( - "errors" "fmt" "io" - "runtime/debug" "sync" "vitess.io/vitess/go/vt/log" @@ -97,7 +95,6 @@ func Parse(sql string) (Statement, error) { return nil, vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, tokenizer.LastError.Error()) } if tokenizer.ParseTree == nil { - log.Infof("Empty Statement: %s", debug.Stack()) return nil, ErrEmpty } return tokenizer.ParseTree, nil @@ -111,8 +108,6 @@ func ParseStrictDDL(sql string) (Statement, error) { return nil, tokenizer.LastError } if tokenizer.ParseTree == nil { - log.Infof("Empty Statement DDL: %s", debug.Stack()) - return nil, ErrEmpty } return tokenizer.ParseTree, nil @@ -164,7 +159,7 @@ func parseNext(tokenizer *Tokenizer, strict bool) (Statement, error) { } // ErrEmpty is a sentinel error returned when parsing empty statements. -var ErrEmpty = errors.New("empty statement") +var ErrEmpty = vterrors.NewErrorf(vtrpcpb.Code_INVALID_ARGUMENT, vterrors.EmptyQuery, "Query was empty") // SplitStatement returns the first sql statement up to either a ; or EOF // and the remainder from the given buffer diff --git a/go/vt/vterrors/state.go b/go/vt/vterrors/state.go index b28600be505..7be707e3508 100644 --- a/go/vt/vterrors/state.go +++ b/go/vt/vterrors/state.go @@ -27,6 +27,7 @@ const ( BadFieldError CantUseOptionHere DataOutOfRange + EmptyQuery ForbidSchemaChange NonUniqTable SyntaxError diff --git a/go/vt/vttablet/tabletserver/query_engine_test.go b/go/vt/vttablet/tabletserver/query_engine_test.go index 7c075864975..d74dfbb90b6 100644 --- a/go/vt/vttablet/tabletserver/query_engine_test.go +++ b/go/vt/vttablet/tabletserver/query_engine_test.go @@ -109,10 +109,7 @@ func TestGetPlanPanicDuetoEmptyQuery(t *testing.T) { ctx := context.Background() logStats := tabletenv.NewLogStats(ctx, "GetPlanStats") _, err := qe.GetPlan(ctx, logStats, "", false, false /* inReservedConn */) - want := "empty statement" - if err == nil || !strings.Contains(err.Error(), want) { - t.Errorf("qe.GetPlan: %v, want %s", err, want) - } + require.EqualError(t, err, "Query was empty") } func addSchemaEngineQueries(db *fakesqldb.DB) {