Skip to content

Commit 1512228

Browse files
crazycs520ti-chi-bot
authored andcommitted
This is an automated cherry-pick of pingcap#48815
Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
1 parent 5232881 commit 1512228

File tree

3 files changed

+3877
-8
lines changed

3 files changed

+3877
-8
lines changed

ddl/partition.go

+35-8
Original file line numberDiff line numberDiff line change
@@ -711,12 +711,20 @@ func getPartitionIntervalFromTable(ctx sessionctx.Context, tbInfo *model.TableIn
711711
}
712712

713713
// comparePartitionAstAndModel compares a generated *ast.PartitionOptions and a *model.PartitionInfo
714-
func comparePartitionAstAndModel(ctx sessionctx.Context, pAst *ast.PartitionOptions, pModel *model.PartitionInfo) error {
714+
func comparePartitionAstAndModel(ctx sessionctx.Context, pAst *ast.PartitionOptions, pModel *model.PartitionInfo, partCol *model.ColumnInfo) error {
715715
a := pAst.Definitions
716716
m := pModel.Definitions
717717
if len(pAst.Definitions) != len(pModel.Definitions) {
718718
return dbterror.ErrGeneralUnsupportedDDL.GenWithStackByArgs("INTERVAL partitioning: number of partitions generated != partition defined (%d != %d)", len(a), len(m))
719719
}
720+
721+
evalFn := func(expr ast.ExprNode) (types.Datum, error) {
722+
val, err := expression.EvalAstExpr(ctx, ast.NewValueExpr(expr, "", ""))
723+
if err != nil || partCol == nil {
724+
return val, err
725+
}
726+
return val.ConvertTo(ctx.GetSessionVars().StmtCtx.TypeCtx(), &partCol.FieldType)
727+
}
720728
for i := range pAst.Definitions {
721729
// Allow options to differ! (like Placement Rules)
722730
// Allow names to differ!
@@ -739,16 +747,19 @@ func comparePartitionAstAndModel(ctx sessionctx.Context, pAst *ast.PartitionOpti
739747
if len(lessThan) > 1 && lessThan[:1] == "'" && lessThan[len(lessThan)-1:] == "'" {
740748
lessThan = driver.UnwrapFromSingleQuotes(lessThan)
741749
}
742-
cmpExpr := &ast.BinaryOperationExpr{
743-
Op: opcode.EQ,
744-
L: ast.NewValueExpr(lessThan, "", ""),
745-
R: generatedExpr,
750+
lessThanVal, err := evalFn(ast.NewValueExpr(lessThan, "", ""))
751+
if err != nil {
752+
return err
746753
}
747-
cmp, err := expression.EvalAstExpr(ctx, cmpExpr)
754+
generatedExprVal, err := evalFn(generatedExpr)
748755
if err != nil {
749756
return err
750757
}
751-
if cmp.GetInt64() != 1 {
758+
cmp, err := lessThanVal.Compare(ctx.GetSessionVars().StmtCtx.TypeCtx(), &generatedExprVal, collate.GetBinaryCollator())
759+
if err != nil {
760+
return err
761+
}
762+
if cmp != 0 {
752763
return dbterror.ErrGeneralUnsupportedDDL.GenWithStackByArgs(fmt.Sprintf("INTERVAL partitioning: LESS THAN for partition %s differs between generated and defined", m[i].Name.O))
753764
}
754765
}
@@ -923,7 +934,7 @@ func generatePartitionDefinitionsFromInterval(ctx sessionctx.Context, partOption
923934
// Seems valid, so keep the defined so that the user defined names are kept etc.
924935
partOptions.Definitions = definedPartDefs
925936
} else if len(tbInfo.Partition.Definitions) > 0 {
926-
err := comparePartitionAstAndModel(ctx, partOptions, tbInfo.Partition)
937+
err := comparePartitionAstAndModel(ctx, partOptions, tbInfo.Partition, partCol)
927938
if err != nil {
928939
return err
929940
}
@@ -997,6 +1008,12 @@ func GeneratePartDefsFromInterval(ctx sessionctx.Context, tp ast.AlterTableType,
9971008
if err != nil {
9981009
return err
9991010
}
1011+
if partCol != nil {
1012+
lastVal, err = lastVal.ConvertTo(ctx.GetSessionVars().StmtCtx.TypeCtx(), &partCol.FieldType)
1013+
if err != nil {
1014+
return err
1015+
}
1016+
}
10001017
var partDefs []*ast.PartitionDefinition
10011018
if len(partitionOptions.Definitions) != 0 {
10021019
partDefs = partitionOptions.Definitions
@@ -1040,7 +1057,17 @@ func GeneratePartDefsFromInterval(ctx sessionctx.Context, tp ast.AlterTableType,
10401057
if err != nil {
10411058
return err
10421059
}
1060+
<<<<<<< HEAD:ddl/partition.go
10431061
cmp, err := currVal.Compare(ctx.GetSessionVars().StmtCtx, &lastVal, collate.GetBinaryCollator())
1062+
=======
1063+
if partCol != nil {
1064+
currVal, err = currVal.ConvertTo(ctx.GetSessionVars().StmtCtx.TypeCtx(), &partCol.FieldType)
1065+
if err != nil {
1066+
return err
1067+
}
1068+
}
1069+
cmp, err := currVal.Compare(ctx.GetSessionVars().StmtCtx.TypeCtx(), &lastVal, collate.GetBinaryCollator())
1070+
>>>>>>> 522cd038678 (ddl: fix issue of alter last partition failed when partition column is datetime (#48815)):pkg/ddl/partition.go
10441071
if err != nil {
10451072
return err
10461073
}

pkg/ddl/tests/partition/BUILD.bazel

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
load("@io_bazel_rules_go//go:def.bzl", "go_test")
2+
3+
go_test(
4+
name = "partition_test",
5+
timeout = "short",
6+
srcs = [
7+
"db_partition_test.go",
8+
"main_test.go",
9+
],
10+
flaky = True,
11+
shard_count = 48,
12+
deps = [
13+
"//pkg/config",
14+
"//pkg/ddl",
15+
"//pkg/ddl/testutil",
16+
"//pkg/ddl/util/callback",
17+
"//pkg/domain",
18+
"//pkg/errno",
19+
"//pkg/kv",
20+
"//pkg/parser/ast",
21+
"//pkg/parser/model",
22+
"//pkg/parser/mysql",
23+
"//pkg/parser/terror",
24+
"//pkg/session",
25+
"//pkg/sessionctx",
26+
"//pkg/sessionctx/variable",
27+
"//pkg/sessiontxn",
28+
"//pkg/store/mockstore",
29+
"//pkg/table",
30+
"//pkg/table/tables",
31+
"//pkg/tablecodec",
32+
"//pkg/testkit",
33+
"//pkg/testkit/external",
34+
"//pkg/testkit/testsetup",
35+
"//pkg/types",
36+
"//pkg/util/codec",
37+
"//pkg/util/dbterror",
38+
"//pkg/util/logutil",
39+
"@com_github_pingcap_errors//:errors",
40+
"@com_github_pingcap_failpoint//:failpoint",
41+
"@com_github_stretchr_testify//assert",
42+
"@com_github_stretchr_testify//require",
43+
"@org_uber_go_goleak//:goleak",
44+
"@org_uber_go_zap//:zap",
45+
],
46+
)

0 commit comments

Comments
 (0)