From 896b89a0231ef30b5473d15cdf03988093627aa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Thu, 12 Jul 2018 15:54:57 +0200 Subject: [PATCH 1/2] Rows.AddRow(): enforce conversion to driver.Value when building row --- rows.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/rows.go b/rows.go index 836f49b..6477ed6 100644 --- a/rows.go +++ b/rows.go @@ -126,6 +126,17 @@ func (r *Rows) AddRow(values ...driver.Value) *Rows { row := make([]driver.Value, len(r.cols)) for i, v := range values { + // Convert user-friendly values (such as int or driver.Valuer) + // to database/sql native value (driver.Value such as int64) + var err error + v, err = driver.DefaultParameterConverter.ConvertValue(v) + if err != nil { + panic(fmt.Errorf( + "row #%d, column #%d (%q) type %T: %s", + len(r.rows)+1, i, r.cols[i], values[i], err, + )) + } + row[i] = v } From 92e5f46c1cb6e98e03894bb6967301fe6fe8b1cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Thu, 12 Jul 2018 16:03:36 +0200 Subject: [PATCH 2/2] tests/NullInt.Scan: remove support for int{,8,16,32} Those types are not driver.Value, but int was necessary because sqlmock was not properly using pure driver.Value before. Now that I fixed the issue in previous commit, we can remove the old hack. --- stubs_test.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/stubs_test.go b/stubs_test.go index fcd8b29..fa38fb4 100644 --- a/stubs_test.go +++ b/stubs_test.go @@ -23,20 +23,6 @@ func (ni *NullInt) Scan(value interface{}) error { switch v := value.(type) { case nil: ni.Integer, ni.Valid = 0, false - - // FIXME int, int8, int16, int32 types are handled here but that should not - // be necessary: only int64 is a driver.Value - // Unfortunately, the sqlmock testsuite currently relies on that because - // sqlmock doesn't properly limits itself internally to pure driver.Value. - case int: - ni.Integer, ni.Valid = v, true - case int8: - ni.Integer, ni.Valid = int(v), true - case int16: - ni.Integer, ni.Valid = int(v), true - case int32: - ni.Integer, ni.Valid = int(v), true - case int64: const maxUint = ^uint(0) const minUint = 0