From 31bbfcef82b2dcfbb230ada7421eb7f9e4a67c7c Mon Sep 17 00:00:00 2001 From: wjHuang Date: Sat, 9 Jan 2021 13:19:14 +0800 Subject: [PATCH] executor: refine maxOneRow (#22194) Signed-off-by: wjhuang2016 --- errors.toml | 5 +++++ executor/errors.go | 17 +++++++++-------- executor/executor.go | 23 +++++++++++------------ executor/executor_test.go | 2 +- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/errors.toml b/errors.toml index ece8fae9df..1848a80016 100644 --- a/errors.toml +++ b/errors.toml @@ -491,6 +491,11 @@ error = ''' Deadlock found when trying to get lock; try restarting transaction ''' +["executor:1242"] +error = ''' +Subquery returns more than 1 row +''' + ["executor:1295"] error = ''' This command is not supported in the prepared statement protocol yet diff --git a/executor/errors.go b/executor/errors.go index d648b56b81..afc6427690 100644 --- a/executor/errors.go +++ b/executor/errors.go @@ -20,14 +20,15 @@ import ( // Error instances. var ( - ErrGetStartTS = dbterror.ClassExecutor.NewStd(mysql.ErrGetStartTS) - ErrUnknownPlan = dbterror.ClassExecutor.NewStd(mysql.ErrUnknownPlan) - ErrPrepareMulti = dbterror.ClassExecutor.NewStd(mysql.ErrPrepareMulti) - ErrPrepareDDL = dbterror.ClassExecutor.NewStd(mysql.ErrPrepareDDL) - ErrResultIsEmpty = dbterror.ClassExecutor.NewStd(mysql.ErrResultIsEmpty) - ErrBuildExecutor = dbterror.ClassExecutor.NewStd(mysql.ErrBuildExecutor) - ErrBatchInsertFail = dbterror.ClassExecutor.NewStd(mysql.ErrBatchInsertFail) - ErrUnsupportedPs = dbterror.ClassExecutor.NewStd(mysql.ErrUnsupportedPs) + ErrGetStartTS = dbterror.ClassExecutor.NewStd(mysql.ErrGetStartTS) + ErrUnknownPlan = dbterror.ClassExecutor.NewStd(mysql.ErrUnknownPlan) + ErrPrepareMulti = dbterror.ClassExecutor.NewStd(mysql.ErrPrepareMulti) + ErrPrepareDDL = dbterror.ClassExecutor.NewStd(mysql.ErrPrepareDDL) + ErrResultIsEmpty = dbterror.ClassExecutor.NewStd(mysql.ErrResultIsEmpty) + ErrBuildExecutor = dbterror.ClassExecutor.NewStd(mysql.ErrBuildExecutor) + ErrBatchInsertFail = dbterror.ClassExecutor.NewStd(mysql.ErrBatchInsertFail) + ErrUnsupportedPs = dbterror.ClassExecutor.NewStd(mysql.ErrUnsupportedPs) + ErrSubqueryMoreThan1Row = dbterror.ClassExecutor.NewStd(mysql.ErrSubqueryNo1Row) ErrCantCreateUserWithGrant = dbterror.ClassExecutor.NewStd(mysql.ErrCantCreateUserWithGrant) ErrPasswordNoMatch = dbterror.ClassExecutor.NewStd(mysql.ErrPasswordNoMatch) diff --git a/executor/executor.go b/executor/executor.go index c28cdaeab5..63f65f3d81 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -1152,17 +1152,16 @@ func init() { return nil, err } chk := newFirstChunk(exec) - for { - err = Next(ctx, exec, chk) - if err != nil { - return nil, err - } - if chk.NumRows() == 0 { - return nil, nil - } - row := chk.GetRow(0).GetDatumRow(retTypes(exec)) - return row, err + + err = Next(ctx, exec, chk) + if err != nil { + return nil, err } + if chk.NumRows() == 0 { + return nil, nil + } + row := chk.GetRow(0).GetDatumRow(retTypes(exec)) + return row, err } } @@ -1393,7 +1392,7 @@ func (e *MaxOneRowExec) Next(ctx context.Context, req *chunk.Chunk) error { } return nil } else if num != 1 { - return errors.New("subquery returns more than 1 row") + return ErrSubqueryMoreThan1Row } childChunk := newFirstChunk(e.children[0]) @@ -1402,7 +1401,7 @@ func (e *MaxOneRowExec) Next(ctx context.Context, req *chunk.Chunk) error { return err } if childChunk.NumRows() != 0 { - return errors.New("subquery returns more than 1 row") + return ErrSubqueryMoreThan1Row } return nil diff --git a/executor/executor_test.go b/executor/executor_test.go index 1e0c3676ef..8216cf9833 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -4150,7 +4150,7 @@ func (s *testSuite3) TestMaxOneRow(c *C) { c.Assert(err, IsNil) err = rs.Next(context.TODO(), rs.NewChunk()) - c.Assert(err.Error(), Equals, "subquery returns more than 1 row") + c.Assert(err.Error(), Equals, "[executor:1242]Subquery returns more than 1 row") err = rs.Close() c.Assert(err, IsNil)