From b2e3ad168ffd99bbb602fa68f81fda7fd423da9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Sun, 19 Jan 2025 15:06:53 +0100 Subject: [PATCH] mysql: Fix GetInt() with negative text result --- mysql/resultset.go | 37 +++++++++++++++++++++++++++++++++++-- mysql/resultset_test.go | 16 +++++++++++++++- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/mysql/resultset.go b/mysql/resultset.go index 876b70752..2982dfaed 100644 --- a/mysql/resultset.go +++ b/mysql/resultset.go @@ -185,12 +185,45 @@ func (r *Resultset) GetUintByName(row int, name string) (uint64, error) { } func (r *Resultset) GetInt(row, column int) (int64, error) { - v, err := r.GetUint(row, column) + d, err := r.GetValue(row, column) if err != nil { return 0, err } - return int64(v), nil + switch v := d.(type) { + case int: + return int64(v), nil + case int8: + return int64(v), nil + case int16: + return int64(v), nil + case int32: + return int64(v), nil + case int64: + return v, nil + case uint: + return int64(v), nil + case uint8: + return int64(v), nil + case uint16: + return int64(v), nil + case uint32: + return int64(v), nil + case uint64: + return int64(v), nil + case float32: + return int64(v), nil + case float64: + return int64(v), nil + case string: + return strconv.ParseInt(v, 10, 64) + case []byte: + return strconv.ParseInt(string(v), 10, 64) + case nil: + return 0, nil + default: + return 0, errors.Errorf("data type is %T", v) + } } func (r *Resultset) GetIntByName(row int, name string) (int64, error) { diff --git a/mysql/resultset_test.go b/mysql/resultset_test.go index ec7da3f93..35549476d 100644 --- a/mysql/resultset_test.go +++ b/mysql/resultset_test.go @@ -1,6 +1,10 @@ package mysql -import "testing" +import ( + "testing" + + "github.com/stretchr/testify/require" +) func TestColumnNumber(t *testing.T) { r := NewResultReserveResultset(0) @@ -8,3 +12,13 @@ func TestColumnNumber(t *testing.T) { // columns. https://github.com/go-mysql-org/go-mysql/issues/964 r.ColumnNumber() } + +// TestGetInt tests GetInt with a negative value +func TestGetIntNeg(t *testing.T) { + r := NewResultset(1) + fv := NewFieldValue(FieldValueTypeString, 0, []uint8("-193")) + r.Values = [][]FieldValue{{fv}} + v, err := r.GetInt(0, 0) + require.NoError(t, err) + require.Equal(t, int64(-193), v) +}