From 2bb206fbc97e68f227baf17f5d11d35fecfe6fd6 Mon Sep 17 00:00:00 2001 From: Ewan Chou Date: Sat, 26 Dec 2015 21:57:34 +0800 Subject: [PATCH] table/tables: use types.ToInt64 --- table/tables/tables.go | 13 +++---------- util/types/convert.go | 10 ++++++++++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/table/tables/tables.go b/table/tables/tables.go index 58e0a6b858..9bdf7486cf 100644 --- a/table/tables/tables.go +++ b/table/tables/tables.go @@ -393,16 +393,9 @@ func (t *Table) AddRecord(ctx context.Context, r []interface{}) (recordID int64, var hasRecordID bool for _, col := range t.Cols() { if mysql.HasPriKeyFlag(col.Flag) && t.meta.PKIsHandle { - // The value must have been filled with int64 or uint64 value, or it will not pass null check. - switch x := r[col.Offset].(type) { - case int64: - recordID = x - case uint64: - recordID = int64(x) - case int: - recordID = int64(x) - default: - return 0, errors.Errorf("unexpected type %T, should not happen!", x) + recordID, err = types.ToInt64(r[col.Offset]) + if err != nil { + return 0, errors.Trace(err) } hasRecordID = true break diff --git a/util/types/convert.go b/util/types/convert.go index 55ebd67486..2954e048ee 100644 --- a/util/types/convert.go +++ b/util/types/convert.go @@ -559,6 +559,16 @@ func ToUint64(value interface{}) (uint64, error) { // ToInt64 converts an interface to an int64. func ToInt64(value interface{}) (int64, error) { + switch x := value.(type) { + case int64: + return x, nil + case int: + return int64(x), nil + case uint64: + if int64(x) > 0 { + return int64(x), nil + } + } return convertToInt(value, NewFieldType(mysql.TypeLonglong)) }