Skip to content

Commit

Permalink
mounter(ticdc): enum type default value set explicitly to avoid wrong…
Browse files Browse the repository at this point in the history
… enum value fetched by the encoder (#9262) (#9285)

close #9259
  • Loading branch information
ti-chi-bot committed Aug 2, 2023
1 parent 462cff4 commit 0a98299
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 5 deletions.
7 changes: 6 additions & 1 deletion cdc/entry/mounter.go
Original file line number Diff line number Diff line change
Expand Up @@ -507,7 +507,12 @@ func getDefaultOrZeroValue(col *timodel.ColumnInfo) (types.Datum, any, int, stri
case mysql.TypeEnum:
// For enum type, if no default value and not null is set,
// the default value is the first element of the enum list
d = types.NewDatum(col.FieldType.GetElem(0))
name := col.FieldType.GetElem(0)
enumValue, err := types.ParseEnumName(col.FieldType.GetElems(), name, col.GetCollate())
if err != nil {
return d, nil, 0, "", errors.Trace(err)
}
d = types.NewMysqlEnumDatum(enumValue)
case mysql.TypeString, mysql.TypeVarString, mysql.TypeVarchar:
return d, emptyBytes, sizeOfEmptyBytes, "", nil
default:
Expand Down
13 changes: 12 additions & 1 deletion cdc/entry/mounter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,9 @@ func TestGetDefaultZeroValue(t *testing.T) {
ftTypeEnumNotNull.SetFlag(mysql.NotNullFlag)
ftTypeEnumNotNull.SetElems([]string{"e0", "e1"})

// mysql.TypeEnum + null
ftTypeEnumNull := types.NewFieldType(mysql.TypeEnum)

// mysql.TypeSet + notnull
ftTypeSetNotNull := types.NewFieldType(mysql.TypeSet)
ftTypeSetNotNull.SetFlag(mysql.NotNullFlag)
Expand Down Expand Up @@ -934,7 +937,7 @@ func TestGetDefaultZeroValue(t *testing.T) {
ColInfo: timodel.ColumnInfo{FieldType: *ftTypeEnumNotNull},
// TypeEnum value will be a string and then translate to []byte
// NotNull && no default will choose first element
Res: uint64(0),
Res: uint64(1),
Default: nil,
},
// mysql.TypeEnum + notnull + default
Expand All @@ -948,6 +951,14 @@ func TestGetDefaultZeroValue(t *testing.T) {
Res: "e1",
Default: "e1",
},
// mysql.TypeEnum + null
{
Name: "mysql.TypeEnum + null",
ColInfo: timodel.ColumnInfo{
FieldType: *ftTypeEnumNull,
},
Res: nil,
},
// mysql.TypeSet + notnull
{
Name: "mysql.TypeSet + notnull",
Expand Down
14 changes: 11 additions & 3 deletions cdc/sink/codec/avro/avro.go
Original file line number Diff line number Diff line change
Expand Up @@ -743,17 +743,24 @@ func columnToAvroData(
if v, ok := col.Value.(string); ok {
return v, "string", nil
}
enumVar, err := types.ParseEnumValue(ft.GetElems(), col.Value.(uint64))
elements := ft.GetElems()
number := col.Value.(uint64)
enumVar, err := types.ParseEnumValue(elements, number)
if err != nil {
log.Info("avro encoder parse enum value failed", zap.Strings("elements", elements), zap.Uint64("number", number))
return nil, "", cerror.WrapError(cerror.ErrAvroEncodeFailed, err)
}
return enumVar.Name, "string", nil
case mysql.TypeSet:
if v, ok := col.Value.(string); ok {
return v, "string", nil
}
setVar, err := types.ParseSetValue(ft.GetElems(), col.Value.(uint64))
elements := ft.GetElems()
number := col.Value.(uint64)
setVar, err := types.ParseSetValue(elements, number)
if err != nil {
log.Info("avro encoder parse set value failed",
zap.Strings("elements", elements), zap.Uint64("number", number), zap.Error(err))
return nil, "", cerror.WrapError(cerror.ErrAvroEncodeFailed, err)
}
return setVar.Name, "string", nil
Expand All @@ -765,13 +772,14 @@ func columnToAvroData(
if v, ok := col.Value.(string); ok {
n, err := strconv.ParseInt(v, 10, 32)
if err != nil {
log.Info("avro encoder parse year value failed", zap.String("value", v), zap.Error(err))
return nil, "", cerror.WrapError(cerror.ErrAvroEncodeFailed, err)
}
return int32(n), "int", nil
}
return int32(col.Value.(int64)), "int", nil
default:
log.Error("unknown mysql type", zap.Any("mysqlType", col.Type))
log.Error("unknown mysql type", zap.Any("value", col.Value), zap.Any("mysqlType", col.Type))
return nil, "", cerror.ErrAvroEncodeFailed.GenWithStack("unknown mysql type")
}
}
Expand Down

0 comments on commit 0a98299

Please sign in to comment.