@@ -711,12 +711,20 @@ func getPartitionIntervalFromTable(ctx sessionctx.Context, tbInfo *model.TableIn
711
711
}
712
712
713
713
// 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 {
715
715
a := pAst .Definitions
716
716
m := pModel .Definitions
717
717
if len (pAst .Definitions ) != len (pModel .Definitions ) {
718
718
return dbterror .ErrGeneralUnsupportedDDL .GenWithStackByArgs ("INTERVAL partitioning: number of partitions generated != partition defined (%d != %d)" , len (a ), len (m ))
719
719
}
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
+ }
720
728
for i := range pAst .Definitions {
721
729
// Allow options to differ! (like Placement Rules)
722
730
// Allow names to differ!
@@ -739,16 +747,19 @@ func comparePartitionAstAndModel(ctx sessionctx.Context, pAst *ast.PartitionOpti
739
747
if len (lessThan ) > 1 && lessThan [:1 ] == "'" && lessThan [len (lessThan )- 1 :] == "'" {
740
748
lessThan = driver .UnwrapFromSingleQuotes (lessThan )
741
749
}
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
746
753
}
747
- cmp , err := expression . EvalAstExpr ( ctx , cmpExpr )
754
+ generatedExprVal , err := evalFn ( generatedExpr )
748
755
if err != nil {
749
756
return err
750
757
}
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 {
752
763
return dbterror .ErrGeneralUnsupportedDDL .GenWithStackByArgs (fmt .Sprintf ("INTERVAL partitioning: LESS THAN for partition %s differs between generated and defined" , m [i ].Name .O ))
753
764
}
754
765
}
@@ -923,7 +934,7 @@ func generatePartitionDefinitionsFromInterval(ctx sessionctx.Context, partOption
923
934
// Seems valid, so keep the defined so that the user defined names are kept etc.
924
935
partOptions .Definitions = definedPartDefs
925
936
} else if len (tbInfo .Partition .Definitions ) > 0 {
926
- err := comparePartitionAstAndModel (ctx , partOptions , tbInfo .Partition )
937
+ err := comparePartitionAstAndModel (ctx , partOptions , tbInfo .Partition , partCol )
927
938
if err != nil {
928
939
return err
929
940
}
@@ -997,6 +1008,12 @@ func GeneratePartDefsFromInterval(ctx sessionctx.Context, tp ast.AlterTableType,
997
1008
if err != nil {
998
1009
return err
999
1010
}
1011
+ if partCol != nil {
1012
+ lastVal , err = lastVal .ConvertTo (ctx .GetSessionVars ().StmtCtx .TypeCtx (), & partCol .FieldType )
1013
+ if err != nil {
1014
+ return err
1015
+ }
1016
+ }
1000
1017
var partDefs []* ast.PartitionDefinition
1001
1018
if len (partitionOptions .Definitions ) != 0 {
1002
1019
partDefs = partitionOptions .Definitions
@@ -1040,7 +1057,17 @@ func GeneratePartDefsFromInterval(ctx sessionctx.Context, tp ast.AlterTableType,
1040
1057
if err != nil {
1041
1058
return err
1042
1059
}
1060
+ << << << < HEAD:ddl / partition .go
1043
1061
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
+ >> >> >> > 522 cd038678 (ddl : fix issue of alter last partition failed when partition column is datetime (#48815 )):pkg / ddl / partition .go
1044
1071
if err != nil {
1045
1072
return err
1046
1073
}
0 commit comments