From 8c9ae77cd8bf9339253070ca9f79b4e19d90512b Mon Sep 17 00:00:00 2001 From: go-jet Date: Thu, 10 Oct 2019 16:09:44 +0200 Subject: [PATCH] Add QRM error if result set is empty when scanning into struct destination. --- qrm/qrm.go | 2 +- tests/mysql/alltypes_test.go | 15 ++++++++++----- tests/mysql/select_test.go | 21 ++++++++++++++------- tests/postgres/alltypes_test.go | 9 ++++++--- tests/postgres/scan_test.go | 6 ++++-- tests/postgres/select_test.go | 30 ++++++++++++++++++++++++++---- 6 files changed, 61 insertions(+), 22 deletions(-) diff --git a/qrm/qrm.go b/qrm/qrm.go index ebe9084..694f6a1 100644 --- a/qrm/qrm.go +++ b/qrm/qrm.go @@ -38,7 +38,7 @@ func Query(ctx context.Context, db DB, query string, args []interface{}, destPtr } if tempSliceValue.Len() == 0 { - return nil + return sql.ErrNoRows } structValue := reflect.ValueOf(destPtr).Elem() diff --git a/tests/mysql/alltypes_test.go b/tests/mysql/alltypes_test.go index 952ea90..f0f7406 100644 --- a/tests/mysql/alltypes_test.go +++ b/tests/mysql/alltypes_test.go @@ -516,7 +516,8 @@ func TestStringOperators(t *testing.T) { fmt.Println(query.DebugSql()) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -586,7 +587,8 @@ FROM test_sample.all_types; `, "20:34:58", "23:06:06", "22:06:06.011", "21:06:06.011111", "20:16:06", "19:26:06", "18:36:06", "17:46:06", "16:56:56", "15:16:46", "14:26:36") - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -646,7 +648,8 @@ SELECT CAST(? AS DATE), FROM test_sample.all_types; `) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -708,7 +711,8 @@ SELECT all_types.date_time = all_types.date_time, FROM test_sample.all_types; `) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -769,7 +773,8 @@ SELECT all_types.timestamp = all_types.timestamp, CURRENT_TIMESTAMP(2) FROM test_sample.all_types; `) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } diff --git a/tests/mysql/select_test.go b/tests/mysql/select_test.go index c34cfd6..f404e29 100644 --- a/tests/mysql/select_test.go +++ b/tests/mysql/select_test.go @@ -228,7 +228,8 @@ LIMIT ?; testutils.AssertStatementSql(t, query, expectedSQL, int64(1), int64(1), int64(10), int64(1), int64(2), int64(1), int64(12)) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -263,7 +264,8 @@ LIMIT ?; testutils.AssertStatementSql(t, query2, expectedSQL, int64(1), int64(10), int64(1), int64(2), int64(1)) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -305,7 +307,8 @@ OFFSET ?; testutils.AssertStatementSql(t, query2, expectedSQL, int64(1), int64(10), int64(1), int64(2), int64(4), int64(3)) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -510,7 +513,8 @@ SELECT true, 'date'; `) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -530,7 +534,8 @@ LOCK IN SHARE MODE; testutils.AssertDebugStatementSql(t, query, expectedSQL) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -606,7 +611,8 @@ GROUP BY payment.amount, payment.customer_id, payment.payment_date; testutils.AssertStatementSql(t, query, expectedSQL, 100, 100, int64(10)) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -641,7 +647,8 @@ ORDER BY payment.customer_id; testutils.AssertStatementSql(t, query, expectedSQL, int64(10)) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } diff --git a/tests/postgres/alltypes_test.go b/tests/postgres/alltypes_test.go index a613173..9af0394 100644 --- a/tests/postgres/alltypes_test.go +++ b/tests/postgres/alltypes_test.go @@ -170,7 +170,8 @@ func TestExpressionCast(t *testing.T) { //fmt.Println(query.DebugSql()) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -249,7 +250,8 @@ func TestStringOperators(t *testing.T) { //fmt.Println(query.DebugSql()) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -618,7 +620,8 @@ func TestTimeExpression(t *testing.T) { //fmt.Println(query.DebugSql()) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } diff --git a/tests/postgres/scan_test.go b/tests/postgres/scan_test.go index 4a0eba4..d3ec061 100644 --- a/tests/postgres/scan_test.go +++ b/tests/postgres/scan_test.go @@ -50,14 +50,16 @@ func TestScanToInvalidDestination(t *testing.T) { func TestScanToValidDestination(t *testing.T) { t.Run("pointer to struct", func(t *testing.T) { - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) }) t.Run("global query function scan", func(t *testing.T) { queryStr, args := query.Sql() - err := qrm.Query(nil, db, queryStr, args, &struct{}{}) + dest := []struct{}{} + err := qrm.Query(nil, db, queryStr, args, &dest) assert.NilError(t, err) }) diff --git a/tests/postgres/select_test.go b/tests/postgres/select_test.go index 401854d..afb7832 100644 --- a/tests/postgres/select_test.go +++ b/tests/postgres/select_test.go @@ -1,6 +1,7 @@ package postgres import ( + "database/sql" "fmt" "github.com/go-jet/jet/internal/testutils" . "github.com/go-jet/jet/postgres" @@ -162,7 +163,8 @@ LIMIT 12; testutils.AssertDebugStatementSql(t, query, expectedSQL, int64(1), int64(1), int64(10), int64(1), int64(2), int64(1), int64(12)) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -1617,7 +1619,8 @@ SELECT true, 'date'; `) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -1688,7 +1691,8 @@ GROUP BY payment.amount, payment.customer_id, payment.payment_date; testutils.AssertStatementSql(t, query, expectedSQL, 100, 100, int64(10)) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } @@ -1723,12 +1727,14 @@ ORDER BY payment.customer_id; testutils.AssertStatementSql(t, query, expectedSQL, int64(10)) - err := query.Query(db, &struct{}{}) + dest := []struct{}{} + err := query.Query(db, &dest) assert.NilError(t, err) } func TestSimpleView(t *testing.T) { + query := SELECT( view.ActorInfo.AllColumns, ). @@ -1743,6 +1749,12 @@ func TestSimpleView(t *testing.T) { FilmInfo string } + //sql, args := query.Sql() + // + //row := db.QueryRow(sql, args...) + // + //row.Scan() + var dest []ActorInfo err := query.Query(db, &dest) @@ -1786,3 +1798,13 @@ func TestJoinViewWithTable(t *testing.T) { assert.Equal(t, len(dest[0].Rentals), 32) assert.Equal(t, len(dest[1].Rentals), 27) } + +func TestErrNoRows(t *testing.T) { + query := SELECT(Customer.AllColumns).FROM(Customer).WHERE(Customer.CustomerID.EQ(Int(-1))) + + customer := model.Customer{} + + err := query.Query(db, &customer) + + assert.Error(t, err, sql.ErrNoRows.Error()) +}