From f94be71e29d67135dacbe7aac384ef4a9cfce9a0 Mon Sep 17 00:00:00 2001
From: Sebastiaan de Schaetzen <sebastiaan.de.schaetzen@gmail.com>
Date: Sun, 18 May 2025 07:51:46 +0200
Subject: [PATCH] Add ErrMissingScan error and support for int64

---
 errors.go     |  1 +
 query.go      |  6 ++++++
 query_test.go | 17 +++++++++++++++++
 3 files changed, 24 insertions(+)

diff --git a/errors.go b/errors.go
index fa4ce90..56f07b9 100644
--- a/errors.go
+++ b/errors.go
@@ -4,3 +4,4 @@ import "errors"
 
 var ErrNoRows = errors.New("mysqlite: no rows returned")
 var ErrMissingBind = errors.New("mysqlite: missing bind value")
+var ErrMissingScan = errors.New("mysqlite: missing scan value")
diff --git a/query.go b/query.go
index e674b4b..831f8a3 100644
--- a/query.go
+++ b/query.go
@@ -66,6 +66,9 @@ func (q *Query) bindInto(into *int, args ...any) *Query {
 		} else if asInt, ok := arg.(int); ok {
 			q.stmt.BindInt64(*into, int64(asInt))
 			q.binds++
+		} else if asInt64, ok := arg.(int64); ok {
+			q.stmt.BindInt64(*into, asInt64)
+			q.binds++
 		} else if asFloat, ok := arg.(float64); ok {
 			q.stmt.BindFloat(*into, asFloat)
 			q.binds++
@@ -215,6 +218,9 @@ func (r *Rows) MustNext() bool {
 }
 
 func (r *Rows) Scan(results ...any) error {
+	if r.query.stmt.ColumnCount() != len(results) {
+		return ErrMissingScan
+	}
 	for i, arg := range results {
 		err := r.scanArgument(i, arg)
 		if err != nil {
diff --git a/query_test.go b/query_test.go
index 4c8eb89..baab78c 100644
--- a/query_test.go
+++ b/query_test.go
@@ -28,6 +28,23 @@ func TestSimpleQueryWithNoResults(t *testing.T) {
 	require.True(t, errors.Is(err, ErrNoRows))
 }
 
+func TestScanWithMissingValues(t *testing.T) {
+	db := openTestDb(t)
+	var count int
+	err := db.Query("select 1, 2").ScanSingle(&count)
+	require.Equal(t, ErrMissingScan, err)
+}
+
+func TestBindInt64(t *testing.T) {
+	db := openTestDb(t)
+	var value int64
+	var result int64
+	value = 5
+	err := db.Query("select ?").Bind(&value).ScanSingle(&result)
+	require.NoError(t, err)
+	require.Equal(t, int64(5), result)
+}
+
 func TestSimpleQueryWithArgs(t *testing.T) {
 	db := openTestDb(t)
 	var value string