From c090bc227f8ab724e87a87697b0ceff7dc9b10c9 Mon Sep 17 00:00:00 2001 From: Kenan Yao Date: Thu, 25 Mar 2021 17:05:01 +0800 Subject: [PATCH] cherry pick #23535 to release-5.0 Signed-off-by: ti-srebot --- util/ranger/ranger.go | 4 + util/ranger/ranger_test.go | 34 +++++++ util/ranger/testdata/ranger_suite_in.json | 17 ++++ util/ranger/testdata/ranger_suite_out.json | 107 +++++++++++++++++++++ 4 files changed, 162 insertions(+) diff --git a/util/ranger/ranger.go b/util/ranger/ranger.go index a63c77289091b..a414fb7fec75a 100644 --- a/util/ranger/ranger.go +++ b/util/ranger/ranger.go @@ -97,6 +97,10 @@ func convertPoint(sc *stmtctx.StatementContext, point *point, tp *types.FieldTyp // see issue #20101: overflow when converting integer to year } else if tp.Tp == mysql.TypeBit && terror.ErrorEqual(err, types.ErrDataTooLong) { // see issue #19067: we should ignore the types.ErrDataTooLong when we convert value to TypeBit value + } else if tp.Tp == mysql.TypeNewDecimal && terror.ErrorEqual(err, types.ErrOverflow) { + // Ignore the types.ErrOverflow when we convert TypeNewDecimal values. + // A trimmed valid boundary point value would be returned then. Accordingly, the `excl` of the point + // would be adjusted. Impossible ranges would be skipped by the `validInterval` call later. } else { return point, errors.Trace(err) } diff --git a/util/ranger/ranger_test.go b/util/ranger/ranger_test.go index e26624f752381..9ceaa99135380 100644 --- a/util/ranger/ranger_test.go +++ b/util/ranger/ranger_test.go @@ -1701,3 +1701,37 @@ func (s *testRangerSuite) TestPrefixIndexRangeScan(c *C) { c.Assert(got, Equals, tt.resultStr, Commentf("different for expr %s", tt.exprStr)) } } + +func (s *testRangerSuite) TestIndexRangeForDecimal(c *C) { + defer testleak.AfterTest(c)() + dom, store, err := newDomainStoreWithBootstrap(c) + defer func() { + dom.Close() + store.Close() + }() + c.Assert(err, IsNil) + testKit := testkit.NewTestKit(c, store) + testKit.MustExec("use test;") + testKit.MustExec("drop table if exists t1, t2;") + testKit.MustExec("create table t1(a decimal unsigned, key(a));") + testKit.MustExec("insert into t1 values(0),(null);") + testKit.MustExec("create table t2(a int, b decimal unsigned, key idx(a,b));") + testKit.MustExec("insert into t2 values(1,0),(1,null);") + + var input []string + var output []struct { + SQL string + Plan []string + Result []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(testKit.MustQuery("explain format = 'brief' " + tt).Rows()) + output[i].Result = s.testData.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + }) + testKit.MustQuery("explain format = 'brief' " + tt).Check(testkit.Rows(output[i].Plan...)) + testKit.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) + } +} diff --git a/util/ranger/testdata/ranger_suite_in.json b/util/ranger/testdata/ranger_suite_in.json index 20959385d317d..857ad1af8be86 100644 --- a/util/ranger/testdata/ranger_suite_in.json +++ b/util/ranger/testdata/ranger_suite_in.json @@ -84,5 +84,22 @@ "select * from t where a > -1;", "select * from t where a > 3;" ] + }, + { + "name": "TestIndexRangeForDecimal", + "cases": [ + "select * from t1 use index(a) where a in (-1,0);", + "select * from t1 use index(a) where a = -1;", + "select * from t1 use index(a) where a > -1;", + "select * from t1 use index(a) where a < -1;", + "select * from t1 use index(a) where a <= -1;", + "select * from t1 use index(a) where a >= -1;", + "select * from t2 use index(idx) where a = 1 and b in (-1,0);", + "select * from t2 use index(idx) where a = 1 and b = -1;", + "select * from t2 use index(idx) where a = 1 and b > -1;", + "select * from t2 use index(idx) where a = 1 and b < -1;", + "select * from t2 use index(idx) where a = 1 and b <= -1;", + "select * from t2 use index(idx) where a = 1 and b >= -1;" + ] } ] diff --git a/util/ranger/testdata/ranger_suite_out.json b/util/ranger/testdata/ranger_suite_out.json index c0127b7f76e2f..1bbf9170b3c9d 100644 --- a/util/ranger/testdata/ranger_suite_out.json +++ b/util/ranger/testdata/ranger_suite_out.json @@ -553,5 +553,112 @@ "Result": null } ] + }, + { + "Name": "TestIndexRangeForDecimal", + "Cases": [ + { + "SQL": "select * from t1 use index(a) where a in (-1,0);", + "Plan": [ + "IndexReader 10.00 root index:IndexRangeScan", + "└─IndexRangeScan 10.00 cop[tikv] table:t1, index:a(a) range:[0,0], keep order:false, stats:pseudo" + ], + "Result": [ + "0" + ] + }, + { + "SQL": "select * from t1 use index(a) where a = -1;", + "Plan": [ + "TableDual 0.00 root rows:0" + ], + "Result": null + }, + { + "SQL": "select * from t1 use index(a) where a > -1;", + "Plan": [ + "IndexReader 3333.33 root index:IndexRangeScan", + "└─IndexRangeScan 3333.33 cop[tikv] table:t1, index:a(a) range:[0,+inf], keep order:false, stats:pseudo" + ], + "Result": [ + "0" + ] + }, + { + "SQL": "select * from t1 use index(a) where a < -1;", + "Plan": [ + "TableDual 0.00 root rows:0" + ], + "Result": null + }, + { + "SQL": "select * from t1 use index(a) where a <= -1;", + "Plan": [ + "TableDual 0.00 root rows:0" + ], + "Result": null + }, + { + "SQL": "select * from t1 use index(a) where a >= -1;", + "Plan": [ + "IndexReader 3333.33 root index:IndexRangeScan", + "└─IndexRangeScan 3333.33 cop[tikv] table:t1, index:a(a) range:[0,+inf], keep order:false, stats:pseudo" + ], + "Result": [ + "0" + ] + }, + { + "SQL": "select * from t2 use index(idx) where a = 1 and b in (-1,0);", + "Plan": [ + "IndexReader 0.10 root index:IndexRangeScan", + "└─IndexRangeScan 0.10 cop[tikv] table:t2, index:idx(a, b) range:[1 0,1 0], keep order:false, stats:pseudo" + ], + "Result": [ + "1 0" + ] + }, + { + "SQL": "select * from t2 use index(idx) where a = 1 and b = -1;", + "Plan": [ + "TableDual 0.00 root rows:0" + ], + "Result": null + }, + { + "SQL": "select * from t2 use index(idx) where a = 1 and b > -1;", + "Plan": [ + "IndexReader 33.33 root index:IndexRangeScan", + "└─IndexRangeScan 33.33 cop[tikv] table:t2, index:idx(a, b) range:[1 0,1 +inf], keep order:false, stats:pseudo" + ], + "Result": [ + "1 0" + ] + }, + { + "SQL": "select * from t2 use index(idx) where a = 1 and b < -1;", + "Plan": [ + "TableDual 0.00 root rows:0" + ], + "Result": null + }, + { + "SQL": "select * from t2 use index(idx) where a = 1 and b <= -1;", + "Plan": [ + "TableDual 0.00 root rows:0" + ], + "Result": null + }, + { + "SQL": "select * from t2 use index(idx) where a = 1 and b >= -1;", + "Plan": [ + "IndexReader 33.33 root index:IndexRangeScan", + "└─IndexRangeScan 33.33 cop[tikv] table:t2, index:idx(a, b) range:[1 0,1 +inf], keep order:false, stats:pseudo" + ], + "Result": [ + "1 0" + ] + } + ] } ]