diff --git a/expression/builtin_compare.go b/expression/builtin_compare.go index 70626720e6e83..78c27b677c366 100644 --- a/expression/builtin_compare.go +++ b/expression/builtin_compare.go @@ -48,16 +48,12 @@ var ( _ builtinFunc = &builtinGreatestRealSig{} _ builtinFunc = &builtinGreatestDecimalSig{} _ builtinFunc = &builtinGreatestStringSig{} - _ builtinFunc = &builtinGreatestDurationSig{} _ builtinFunc = &builtinGreatestTimeSig{} - _ builtinFunc = &builtinGreatestCmpStringAsTimeSig{} _ builtinFunc = &builtinLeastIntSig{} _ builtinFunc = &builtinLeastRealSig{} _ builtinFunc = &builtinLeastDecimalSig{} _ builtinFunc = &builtinLeastStringSig{} _ builtinFunc = &builtinLeastTimeSig{} - _ builtinFunc = &builtinLeastDurationSig{} - _ builtinFunc = &builtinLeastCmpStringAsTimeSig{} _ builtinFunc = &builtinIntervalIntSig{} _ builtinFunc = &builtinIntervalRealSig{} @@ -408,7 +404,7 @@ func ResolveType4Between(args [3]Expression) types.EvalType { } // resolveType4Extremum gets compare type for GREATEST and LEAST and BETWEEN (mainly for datetime). -func resolveType4Extremum(args []Expression) (_ types.EvalType, cmpStringAsDatetime bool) { +func resolveType4Extremum(args []Expression) types.EvalType { aggType := aggregateType(args) var temporalItem *types.FieldType @@ -425,11 +421,10 @@ func resolveType4Extremum(args []Expression) (_ types.EvalType, cmpStringAsDatet if !types.IsTypeTemporal(aggType.Tp) && temporalItem != nil { aggType.Tp = temporalItem.Tp - cmpStringAsDatetime = true } // TODO: String charset, collation checking are needed. } - return aggType.EvalType(), cmpStringAsDatetime + return aggType.EvalType() } // unsupportedJSONComparison reports warnings while there is a JSON type in least/greatest function's arguments @@ -451,9 +446,12 @@ func (c *greatestFunctionClass) getFunction(ctx sessionctx.Context, args []Expre if err = c.verifyArgs(args); err != nil { return nil, err } - tp, cmpStringAsDatetime := resolveType4Extremum(args) - if cmpStringAsDatetime { - // Args are temporal and string mixed, we cast all args as string and parse it to temporal mannualy to compare. + tp := resolveType4Extremum(args) + cmpAsDatetime := false + if tp == types.ETDatetime || tp == types.ETTimestamp { + cmpAsDatetime = true + tp = types.ETString + } else if tp == types.ETDuration { tp = types.ETString } else if tp == types.ETJson { unsupportedJSONComparison(ctx, args) @@ -467,6 +465,9 @@ func (c *greatestFunctionClass) getFunction(ctx sessionctx.Context, args []Expre if err != nil { return nil, err } + if cmpAsDatetime { + tp = types.ETDatetime + } switch tp { case types.ETInt: // adjust unsigned flag @@ -486,16 +487,8 @@ func (c *greatestFunctionClass) getFunction(ctx sessionctx.Context, args []Expre sig = &builtinGreatestDecimalSig{bf} sig.setPbCode(tipb.ScalarFuncSig_GreatestDecimal) case types.ETString: - if cmpStringAsDatetime { - sig = &builtinGreatestCmpStringAsTimeSig{bf} - sig.setPbCode(tipb.ScalarFuncSig_GreatestCmpStringAsTime) - } else { - sig = &builtinGreatestStringSig{bf} - sig.setPbCode(tipb.ScalarFuncSig_GreatestString) - } - case types.ETDuration: - sig = &builtinGreatestDurationSig{bf} - sig.setPbCode(tipb.ScalarFuncSig_GreatestDuration) + sig = &builtinGreatestStringSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_GreatestString) case types.ETDatetime, types.ETTimestamp: sig = &builtinGreatestTimeSig{bf} sig.setPbCode(tipb.ScalarFuncSig_GreatestTime) @@ -637,19 +630,19 @@ func (b *builtinGreatestStringSig) evalString(row chunk.Row) (max string, isNull return } -type builtinGreatestCmpStringAsTimeSig struct { +type builtinGreatestTimeSig struct { baseBuiltinFunc } -func (b *builtinGreatestCmpStringAsTimeSig) Clone() builtinFunc { - newSig := &builtinGreatestCmpStringAsTimeSig{} +func (b *builtinGreatestTimeSig) Clone() builtinFunc { + newSig := &builtinGreatestTimeSig{} newSig.cloneFrom(&b.baseBuiltinFunc) return newSig } -// evalString evals a builtinGreatestCmpStringAsTimeSig. +// evalString evals a builtinGreatestTimeSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_greatest -func (b *builtinGreatestCmpStringAsTimeSig) evalString(row chunk.Row) (strRes string, isNull bool, err error) { +func (b *builtinGreatestTimeSig) evalString(row chunk.Row) (strRes string, isNull bool, err error) { sc := b.ctx.GetSessionVars().StmtCtx for i := 0; i < len(b.args); i++ { v, isNull, err := b.args[i].EvalString(b.ctx, row) @@ -672,52 +665,6 @@ func (b *builtinGreatestCmpStringAsTimeSig) evalString(row chunk.Row) (strRes st return strRes, false, nil } -type builtinGreatestTimeSig struct { - baseBuiltinFunc -} - -func (b *builtinGreatestTimeSig) Clone() builtinFunc { - newSig := &builtinGreatestTimeSig{} - newSig.cloneFrom(&b.baseBuiltinFunc) - return newSig -} - -func (b *builtinGreatestTimeSig) evalTime(row chunk.Row) (res types.Time, isNull bool, err error) { - for i := 0; i < len(b.args); i++ { - v, isNull, err := b.args[i].EvalTime(b.ctx, row) - if isNull || err != nil { - return types.ZeroTime, true, err - } - if i == 0 || v.Compare(res) > 0 { - res = v - } - } - return res, false, nil -} - -type builtinGreatestDurationSig struct { - baseBuiltinFunc -} - -func (b *builtinGreatestDurationSig) Clone() builtinFunc { - newSig := &builtinGreatestDurationSig{} - newSig.cloneFrom(&b.baseBuiltinFunc) - return newSig -} - -func (b *builtinGreatestDurationSig) evalDuration(row chunk.Row) (res types.Duration, isNull bool, err error) { - for i := 0; i < len(b.args); i++ { - v, isNull, err := b.args[i].EvalDuration(b.ctx, row) - if isNull || err != nil { - return types.Duration{}, true, err - } - if i == 0 || v.Compare(res) > 0 { - res = v - } - } - return res, false, nil -} - type leastFunctionClass struct { baseFunctionClass } @@ -726,9 +673,12 @@ func (c *leastFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi if err = c.verifyArgs(args); err != nil { return nil, err } - tp, cmpStringAsDatetime := resolveType4Extremum(args) - if cmpStringAsDatetime { - // Args are temporal and string mixed, we cast all args as string and parse it to temporal mannualy to compare. + tp := resolveType4Extremum(args) + cmpAsDatetime := false + if tp == types.ETDatetime || tp == types.ETTimestamp { + cmpAsDatetime = true + tp = types.ETString + } else if tp == types.ETDuration { tp = types.ETString } else if tp == types.ETJson { unsupportedJSONComparison(ctx, args) @@ -742,6 +692,9 @@ func (c *leastFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi if err != nil { return nil, err } + if cmpAsDatetime { + tp = types.ETDatetime + } switch tp { case types.ETInt: // adjust unsigned flag @@ -761,16 +714,8 @@ func (c *leastFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi sig = &builtinLeastDecimalSig{bf} sig.setPbCode(tipb.ScalarFuncSig_LeastDecimal) case types.ETString: - if cmpStringAsDatetime { - sig = &builtinLeastCmpStringAsTimeSig{bf} - sig.setPbCode(tipb.ScalarFuncSig_LeastCmpStringAsTime) - } else { - sig = &builtinLeastStringSig{bf} - sig.setPbCode(tipb.ScalarFuncSig_LeastString) - } - case types.ETDuration: - sig = &builtinLeastDurationSig{bf} - sig.setPbCode(tipb.ScalarFuncSig_LeastDuration) + sig = &builtinLeastStringSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_LeastString) case types.ETDatetime, types.ETTimestamp: sig = &builtinLeastTimeSig{bf} sig.setPbCode(tipb.ScalarFuncSig_LeastTime) @@ -899,19 +844,19 @@ func (b *builtinLeastStringSig) evalString(row chunk.Row) (min string, isNull bo return } -type builtinLeastCmpStringAsTimeSig struct { +type builtinLeastTimeSig struct { baseBuiltinFunc } -func (b *builtinLeastCmpStringAsTimeSig) Clone() builtinFunc { - newSig := &builtinLeastCmpStringAsTimeSig{} +func (b *builtinLeastTimeSig) Clone() builtinFunc { + newSig := &builtinLeastTimeSig{} newSig.cloneFrom(&b.baseBuiltinFunc) return newSig } -// evalString evals a builtinLeastCmpStringAsTimeSig. +// evalString evals a builtinLeastTimeSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#functionleast -func (b *builtinLeastCmpStringAsTimeSig) evalString(row chunk.Row) (strRes string, isNull bool, err error) { +func (b *builtinLeastTimeSig) evalString(row chunk.Row) (strRes string, isNull bool, err error) { sc := b.ctx.GetSessionVars().StmtCtx for i := 0; i < len(b.args); i++ { v, isNull, err := b.args[i].EvalString(b.ctx, row) @@ -934,52 +879,6 @@ func (b *builtinLeastCmpStringAsTimeSig) evalString(row chunk.Row) (strRes strin return strRes, false, nil } -type builtinLeastTimeSig struct { - baseBuiltinFunc -} - -func (b *builtinLeastTimeSig) Clone() builtinFunc { - newSig := &builtinLeastTimeSig{} - newSig.cloneFrom(&b.baseBuiltinFunc) - return newSig -} - -func (b *builtinLeastTimeSig) evalTime(row chunk.Row) (res types.Time, isNull bool, err error) { - for i := 0; i < len(b.args); i++ { - v, isNull, err := b.args[i].EvalTime(b.ctx, row) - if isNull || err != nil { - return types.ZeroTime, true, err - } - if i == 0 || v.Compare(res) < 0 { - res = v - } - } - return res, false, nil -} - -type builtinLeastDurationSig struct { - baseBuiltinFunc -} - -func (b *builtinLeastDurationSig) Clone() builtinFunc { - newSig := &builtinLeastDurationSig{} - newSig.cloneFrom(&b.baseBuiltinFunc) - return newSig -} - -func (b *builtinLeastDurationSig) evalDuration(row chunk.Row) (res types.Duration, isNull bool, err error) { - for i := 0; i < len(b.args); i++ { - v, isNull, err := b.args[i].EvalDuration(b.ctx, row) - if isNull || err != nil { - return types.Duration{}, true, err - } - if i == 0 || v.Compare(res) < 0 { - res = v - } - } - return res, false, nil -} - type intervalFunctionClass struct { baseFunctionClass } diff --git a/expression/builtin_compare_test.go b/expression/builtin_compare_test.go index 16cb7f906448b..f1aa15ee1a783 100644 --- a/expression/builtin_compare_test.go +++ b/expression/builtin_compare_test.go @@ -322,7 +322,7 @@ func (s *testEvaluatorSuite) TestGreatestLeastFunc(c *C) { }, { []interface{}{duration, duration}, - duration, duration, false, false, + "12:59:59", "12:59:59", false, false, }, { []interface{}{"123", nil, "123"}, diff --git a/expression/builtin_compare_vec.go b/expression/builtin_compare_vec.go index c5ab81c1f83e0..043f77cfa193a 100644 --- a/expression/builtin_compare_vec.go +++ b/expression/builtin_compare_vec.go @@ -628,11 +628,11 @@ func vecCompareInt(isUnsigned0, isUnsigned1 bool, largs, rargs, result *chunk.Co } } -func (b *builtinGreatestCmpStringAsTimeSig) vectorized() bool { +func (b *builtinGreatestTimeSig) vectorized() bool { return true } -func (b *builtinGreatestCmpStringAsTimeSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGreatestTimeSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { sc := b.ctx.GetSessionVars().StmtCtx n := input.NumRows() @@ -713,11 +713,11 @@ func (b *builtinGreatestRealSig) vecEvalReal(input *chunk.Chunk, result *chunk.C return nil } -func (b *builtinLeastCmpStringAsTimeSig) vectorized() bool { +func (b *builtinLeastTimeSig) vectorized() bool { return true } -func (b *builtinLeastCmpStringAsTimeSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeastTimeSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { sc := b.ctx.GetSessionVars().StmtCtx n := input.NumRows() @@ -814,131 +814,3 @@ func (b *builtinGreatestStringSig) vecEvalString(input *chunk.Chunk, result *chu } return nil } - -func (b *builtinGreatestTimeSig) vectorized() bool { - return true -} - -func (b *builtinGreatestTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk.Column) error { - n := input.NumRows() - buf, err := b.bufAllocator.get(types.ETDatetime, n) - if err != nil { - return err - } - defer b.bufAllocator.put(buf) - - result.ResizeTime(n, false) - for argIdx := 0; argIdx < len(b.args); argIdx++ { - if err := b.args[argIdx].VecEvalTime(b.ctx, input, buf); err != nil { - return err - } - result.MergeNulls(buf) - resTimes := result.Times() - argTimes := buf.Times() - for rowIdx := 0; rowIdx < n; rowIdx++ { - if result.IsNull(rowIdx) { - continue - } - if argIdx == 0 || argTimes[rowIdx].Compare(resTimes[rowIdx]) > 0 { - resTimes[rowIdx] = argTimes[rowIdx] - } - } - } - return nil -} - -func (b *builtinLeastTimeSig) vectorized() bool { - return true -} - -func (b *builtinLeastTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk.Column) error { - n := input.NumRows() - buf, err := b.bufAllocator.get(types.ETDatetime, n) - if err != nil { - return err - } - defer b.bufAllocator.put(buf) - - result.ResizeTime(n, false) - for argIdx := 0; argIdx < len(b.args); argIdx++ { - if err := b.args[argIdx].VecEvalTime(b.ctx, input, buf); err != nil { - return err - } - result.MergeNulls(buf) - resTimes := result.Times() - argTimes := buf.Times() - for rowIdx := 0; rowIdx < n; rowIdx++ { - if result.IsNull(rowIdx) { - continue - } - if argIdx == 0 || argTimes[rowIdx].Compare(resTimes[rowIdx]) < 0 { - resTimes[rowIdx] = argTimes[rowIdx] - } - } - } - return nil -} - -func (b *builtinGreatestDurationSig) vectorized() bool { - return true -} - -func (b *builtinGreatestDurationSig) vecEvalDuration(input *chunk.Chunk, result *chunk.Column) error { - n := input.NumRows() - buf, err := b.bufAllocator.get(types.ETDatetime, n) - if err != nil { - return err - } - defer b.bufAllocator.put(buf) - - result.ResizeGoDuration(n, false) - for argIdx := 0; argIdx < len(b.args); argIdx++ { - if err := b.args[argIdx].VecEvalDuration(b.ctx, input, buf); err != nil { - return err - } - result.MergeNulls(buf) - resDurations := result.GoDurations() - argDurations := buf.GoDurations() - for rowIdx := 0; rowIdx < n; rowIdx++ { - if result.IsNull(rowIdx) { - continue - } - if argIdx == 0 || argDurations[rowIdx] > resDurations[rowIdx] { - resDurations[rowIdx] = argDurations[rowIdx] - } - } - } - return nil -} - -func (b *builtinLeastDurationSig) vectorized() bool { - return true -} - -func (b *builtinLeastDurationSig) vecEvalDuration(input *chunk.Chunk, result *chunk.Column) error { - n := input.NumRows() - buf, err := b.bufAllocator.get(types.ETDatetime, n) - if err != nil { - return err - } - defer b.bufAllocator.put(buf) - - result.ResizeGoDuration(n, false) - for argIdx := 0; argIdx < len(b.args); argIdx++ { - if err := b.args[argIdx].VecEvalDuration(b.ctx, input, buf); err != nil { - return err - } - result.MergeNulls(buf) - resDurations := result.GoDurations() - argDurations := buf.GoDurations() - for rowIdx := 0; rowIdx < n; rowIdx++ { - if result.IsNull(rowIdx) { - continue - } - if argIdx == 0 || argDurations[rowIdx] < resDurations[rowIdx] { - resDurations[rowIdx] = argDurations[rowIdx] - } - } - } - return nil -} diff --git a/expression/builtin_compare_vec_test.go b/expression/builtin_compare_vec_test.go index c2fcfb1f93b5d..27f10fae05c60 100644 --- a/expression/builtin_compare_vec_test.go +++ b/expression/builtin_compare_vec_test.go @@ -126,16 +126,15 @@ var vecBuiltinCompareCases = map[string][]vecExprBenchCase{ {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETReal, types.ETReal, types.ETReal}}, {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETString}}, {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETString, types.ETString}}, - {retEvalType: types.ETDatetime, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime}}, - {retEvalType: types.ETDatetime, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime, types.ETDatetime}}, - {retEvalType: types.ETDuration, childrenTypes: []types.EvalType{types.ETDuration, types.ETDuration, types.ETDuration}}, + {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime}}, + {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime, types.ETDatetime}}, }, ast.Least: { {retEvalType: types.ETDecimal, childrenTypes: []types.EvalType{types.ETDecimal, types.ETDecimal, types.ETDecimal}}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETInt, types.ETInt, types.ETInt}}, {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETReal, types.ETReal, types.ETReal}}, {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETString}}, - {retEvalType: types.ETDatetime, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime, types.ETDatetime}}, + {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime, types.ETDatetime}}, {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETString, types.ETString}}, }, ast.Interval: { diff --git a/expression/integration_test.go b/expression/integration_test.go index a333053d416ac..178a0055780a0 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -3604,43 +3604,6 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { tk.MustQuery("SELECT a/b FROM t;").Check(testkit.Rows("0.0000", "0.8264")) } -func (s *testIntegrationSuite) TestGreatestTimeType(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - - tk.MustExec("drop table if exists t1;") - tk.MustExec("create table t1(c_time time(5), c_dt datetime(4), c_ts timestamp(3), c_d date, c_str varchar(100));") - tk.MustExec("insert into t1 values('-800:10:10', '2021-10-10 10:10:10.1234', '2021-10-10 10:10:10.1234', '2021-10-11', '2021-10-10 10:10:10.1234');") - - for i := 0; i < 2; i++ { - if i == 0 { - tk.MustExec("set @@tidb_enable_vectorized_expression = off;") - } else { - tk.MustExec("set @@tidb_enable_vectorized_expression = on;") - } - tk.MustQuery("select greatest(c_time, c_time) from t1;").Check(testkit.Rows("-800:10:10.00000")) - tk.MustQuery("select greatest(c_dt, c_dt) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.1234")) - tk.MustQuery("select greatest(c_ts, c_ts) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.123")) - tk.MustQuery("select greatest(c_d, c_d) from t1;").Check(testkit.Rows("2021-10-11")) - tk.MustQuery("select greatest(c_str, c_str) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.1234")) - - tk.MustQuery("select least(c_time, c_time) from t1;").Check(testkit.Rows("-800:10:10.00000")) - tk.MustQuery("select least(c_dt, c_dt) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.1234")) - tk.MustQuery("select least(c_ts, c_ts) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.123")) - tk.MustQuery("select least(c_d, c_d) from t1;").Check(testkit.Rows("2021-10-11")) - tk.MustQuery("select least(c_str, c_str) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.1234")) - - tk.MustQuery("select greatest(c_time, cast('10:01:01' as time)) from t1;").Check(testkit.Rows("10:01:01.00000")) - tk.MustQuery("select least(c_time, cast('10:01:01' as time)) from t1;").Check(testkit.Rows("-800:10:10.00000")) - - tk.MustQuery("select greatest(c_d, cast('1999-10-10' as date)) from t1;").Check(testkit.Rows("2021-10-11")) - tk.MustQuery("select least(c_d, cast('1999-10-10' as date)) from t1;").Check(testkit.Rows("1999-10-10")) - - tk.MustQuery("select greatest(c_dt, cast('1999-10-10 10:10:10.1234' as datetime)) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.1234")) - tk.MustQuery("select least(c_dt, cast('1999-10-10 10:10:10.1234' as datetime)) from t1;").Check(testkit.Rows("1999-10-10 10:10:10")) - } -} - func (s *testIntegrationSuite) TestCompareBuiltin(c *C) { defer s.cleanEnv(c) tk := testkit.NewTestKit(c, s.store) @@ -4677,7 +4640,7 @@ func (s *testIntegrationSuite) TestInPredicate4UnsignedInt(c *C) { r.Check(testkit.Rows("5", "6", "7", "8", "9223372036854775810", "18446744073709551615")) // for issue #4473 - tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t") tk.MustExec("create table t1 (some_id smallint(5) unsigned,key (some_id) )") tk.MustExec("insert into t1 values (1),(2)") r = tk.MustQuery(`select some_id from t1 where some_id not in(2,-1);`) diff --git a/go.mod b/go.mod index f9125eeacb766..f5595c25edb66 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,7 @@ require ( github.com/pingcap/parser v0.0.0-20210623034316-5ee95ed0081f github.com/pingcap/sysutil v0.0.0-20210221112134-a07bda3bde99 github.com/pingcap/tidb-tools v4.0.9-0.20201127090955-2707c97b3853+incompatible - github.com/pingcap/tipb v0.0.0-20211105090418-71142a4d40e3 + github.com/pingcap/tipb v0.0.0-20211025074540-e1c7362eeeb4 github.com/prometheus/client_golang v1.5.1 github.com/prometheus/client_model v0.2.0 github.com/prometheus/common v0.9.1 diff --git a/go.sum b/go.sum index 0f1a1246122d3..348da90510518 100644 --- a/go.sum +++ b/go.sum @@ -475,8 +475,8 @@ github.com/pingcap/sysutil v0.0.0-20210221112134-a07bda3bde99/go.mod h1:EB/852NM github.com/pingcap/tidb-dashboard v0.0.0-20210312062513-eef5d6404638/go.mod h1:OzFN8H0EDMMqeulPhPMw2i2JaiZWOKFQ7zdRPhENNgo= github.com/pingcap/tidb-tools v4.0.9-0.20201127090955-2707c97b3853+incompatible h1:ceznmu/lLseGHP/jKyOa/3u/5H3wtLLLqkH2V3ssSjg= github.com/pingcap/tidb-tools v4.0.9-0.20201127090955-2707c97b3853+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= -github.com/pingcap/tipb v0.0.0-20211105090418-71142a4d40e3 h1:xnp/Qkk5gELlB8TaY6oro0JNXMBXTafNVxU/vbrNU8I= -github.com/pingcap/tipb v0.0.0-20211105090418-71142a4d40e3/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs= +github.com/pingcap/tipb v0.0.0-20211025074540-e1c7362eeeb4 h1:9Ef4j3DLmUidURfob0tf94v+sqvozqdCTr7e5hi19qU= +github.com/pingcap/tipb v0.0.0-20211025074540-e1c7362eeeb4/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=