diff --git a/mysql/errcode.go b/mysql/errcode.go index f58b5298c9bba..30813c1693824 100644 --- a/mysql/errcode.go +++ b/mysql/errcode.go @@ -893,6 +893,7 @@ const ( // TiDB self-defined errors. ErrMemExceedThreshold = 8001 + ErrForUpdateCantRetry = 8002 // TiKV/PD errors. ErrPDServerTimeout = 9001 diff --git a/mysql/errname.go b/mysql/errname.go index 914662d949e6b..807c89b259ed4 100644 --- a/mysql/errname.go +++ b/mysql/errname.go @@ -888,6 +888,7 @@ var MySQLErrName = map[uint16]string{ ErrInvalidJSONData: "Invalid data type for JSON data", ErrJSONUsedAsKey: "JSON column '%-.192s' cannot be used in key specification.", ErrMemExceedThreshold: "%s holds %dB memory, exceeds threshold %dB.%s", + ErrForUpdateCantRetry: "[%d] can not retry select for update statement", // TiKV/PD errors. ErrPDServerTimeout: "PD server timeout", diff --git a/session/session.go b/session/session.go index e7a591885b90c..41d275a9f3436 100644 --- a/session/session.go +++ b/session/session.go @@ -457,7 +457,7 @@ func (s *session) retry(ctx context.Context, maxCnt uint) error { connID := s.sessionVars.ConnectionID if s.sessionVars.TxnCtx.ForUpdate { - return errors.Errorf("[%d] can not retry select for update statement", connID) + return errForUpdateCantRetry.GenByArgs(connID) } s.sessionVars.RetryInfo.Retrying = true var retryCnt uint diff --git a/session/tidb.go b/session/tidb.go index 4f8e62d005fd0..dd5244f7fd47f 100644 --- a/session/tidb.go +++ b/session/tidb.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/terror" @@ -330,5 +331,18 @@ func IsQuery(sql string) bool { return false } +var ( + errForUpdateCantRetry = terror.ClassSession.New(codeForUpdateCantRetry, + mysql.MySQLErrName[mysql.ErrForUpdateCantRetry]) +) + +const ( + codeForUpdateCantRetry terror.ErrCode = mysql.ErrForUpdateCantRetry +) + func init() { + sessionMySQLErrCodes := map[terror.ErrCode]uint16{ + codeForUpdateCantRetry: mysql.ErrForUpdateCantRetry, + } + terror.ErrClassToMySQLCodes[terror.ClassSession] = sessionMySQLErrCodes } diff --git a/terror/terror.go b/terror/terror.go index 3f2b8c76938df..3bcfa37f774ee 100644 --- a/terror/terror.go +++ b/terror/terror.go @@ -83,6 +83,7 @@ const ( ClassMockTikv ClassJSON ClassTiKV + ClassSession // Add more as needed. ) @@ -110,6 +111,7 @@ var errClz2Str = map[ErrClass]string{ ClassMockTikv: "mocktikv", ClassJSON: "json", ClassTiKV: "tikv", + ClassSession: "session", } // String implements fmt.Stringer interface.