From f65cf5150eb33791e9ccfe5419beeb78c1100043 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Sun, 8 Dec 2019 21:58:32 -0800 Subject: [PATCH] dialect/sqlscan: add interface{} scanning support Summary: Pull Request resolved: https://github.com/facebookincubator/ent/pull/223 Reviewed By: alexsn Differential Revision: D18878581 fbshipit-source-id: 4a60ceea6c092f065e52e6b3bb625487451a815d --- dialect/sql/scan.go | 2 ++ dialect/sql/scan_test.go | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/dialect/sql/scan.go b/dialect/sql/scan.go index 72200dc48..6a437c41a 100644 --- a/dialect/sql/scan.go +++ b/dialect/sql/scan.go @@ -98,6 +98,8 @@ func (r *rowScan) values() []interface{} { // scanType returns rowScan for the given reflect.Type. func scanType(typ reflect.Type, columns []string) (*rowScan, error) { switch k := typ.Kind(); { + case k == reflect.Interface && typ.NumMethod() == 0: + fallthrough // interface{} case k == reflect.String || k >= reflect.Bool && k <= reflect.Float64: return &rowScan{ columns: []reflect.Type{typ}, diff --git a/dialect/sql/scan_test.go b/dialect/sql/scan_test.go index b5efc8575..d6d18ef51 100644 --- a/dialect/sql/scan_test.go +++ b/dialect/sql/scan_test.go @@ -6,6 +6,7 @@ package sql import ( "database/sql" + "database/sql/driver" "testing" "github.com/DATA-DOG/go-sqlmock" @@ -139,6 +140,24 @@ func TestScanInt64(t *testing.T) { require.EqualValues(t, 10, n) } +func TestInterface(t *testing.T) { + mock := sqlmock.NewRows([]string{"age"}). + AddRow("10"). + AddRow("20") + var values []driver.Value + err := ScanSlice(toRows(mock), &values) + require.NoError(t, err) + require.Equal(t, []driver.Value{"10", "20"}, values) + + mock = sqlmock.NewRows([]string{"age"}). + AddRow(10). + AddRow(20) + values = values[:0:0] + err = ScanSlice(toRows(mock), &values) + require.NoError(t, err) + require.Equal(t, []driver.Value{int64(10), int64(20)}, values) +} + func toRows(mrows *sqlmock.Rows) *sql.Rows { db, mock, _ := sqlmock.New() mock.ExpectQuery("").WillReturnRows(mrows)