From dcfa02ceb33d2abae7dc75475de4451e4c346a7a Mon Sep 17 00:00:00 2001 From: tiancaiamao Date: Fri, 12 Jun 2020 15:11:55 +0800 Subject: [PATCH] cherry pick #17971 to release-4.0 Signed-off-by: sre-bot --- table/tables/partition.go | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/table/tables/partition.go b/table/tables/partition.go index f0ce74db15463..e4a76ad6dda1d 100644 --- a/table/tables/partition.go +++ b/table/tables/partition.go @@ -163,7 +163,7 @@ type ForRangePruning struct { } // dataForRangePruning extracts the less than parts from 'partition p0 less than xx ... partitoin p1 less than ...' -func dataForRangePruning(pi *model.PartitionInfo) (*ForRangePruning, error) { +func dataForRangePruning(sctx sessionctx.Context, pi *model.PartitionInfo) (*ForRangePruning, error) { var maxValue bool var unsigned bool lessThan := make([]int64, len(pi.Definitions)) @@ -182,7 +182,12 @@ func dataForRangePruning(pi *model.PartitionInfo) (*ForRangePruning, error) { unsigned = true } if err != nil { - return nil, errors.WithStack(err) + val, ok := fixOldVersionPartitionInfo(sctx, pi.Definitions[i].LessThan[0]) + if !ok { + logutil.BgLogger().Error("wrong partition definition", zap.String("less than", pi.Definitions[i].LessThan[0])) + return nil, errors.WithStack(err) + } + lessThan[i] = val } } } @@ -193,6 +198,20 @@ func dataForRangePruning(pi *model.PartitionInfo) (*ForRangePruning, error) { }, nil } +func fixOldVersionPartitionInfo(sctx sessionctx.Context, str string) (int64, bool) { + // less than value should be calculate to integer before persistent. + // Old version TiDB may not do it and store the raw expression. + tmp, err := parseSimpleExprWithNames(parser.New(), sctx, str, nil, nil) + if err != nil { + return 0, false + } + ret, isNull, err := tmp.EvalInt(sctx, chunk.Row{}) + if err != nil || isNull { + return 0, false + } + return ret, true +} + // rangePartitionString returns the partition string for a range typed partition. func rangePartitionString(pi *model.PartitionInfo) string { // partition by range expr @@ -240,7 +259,7 @@ func generateRangePartitionExpr(ctx sessionctx.Context, pi *model.PartitionInfo, switch len(pi.Columns) { case 0: - tmp, err := dataForRangePruning(pi) + tmp, err := dataForRangePruning(ctx, pi) if err != nil { return nil, errors.Trace(err) }