executor: refine maxOneRow (#22194)

Signed-off-by: wjhuang2016 <huangwenjun1997@gmail.com>
This commit is contained in:
wjHuang
2021-01-09 13:19:14 +08:00
committed by GitHub
parent c2ee8d37c2
commit 31bbfcef82
4 changed files with 26 additions and 21 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)