From b69b933c944f55ccbd3d94cbfd1a2f32c18ffa8a Mon Sep 17 00:00:00 2001 From: Yaacov Akiba Slama Date: Mon, 12 Oct 2020 20:23:17 +0300 Subject: [PATCH] Add support for NULL values --- CONTRIBUTORS | 1 + null_test.go | 26 ++++++++++++++++++++++++++ sqlite.go | 13 +++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 null_test.go diff --git a/CONTRIBUTORS b/CONTRIBUTORS index f3a2504..c79b3cf 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -10,3 +10,4 @@ Alexander Menzhinsky David Skinner Jan Mercl <0xjnml@gmail.com> Steffen Butzer +Yaacov Akiba Slama \ No newline at end of file diff --git a/null_test.go b/null_test.go new file mode 100644 index 0000000..d44faf2 --- /dev/null +++ b/null_test.go @@ -0,0 +1,26 @@ +package sqlite + +import ( + "database/sql" + "testing" +) + +func TestNullBinding(t *testing.T) { + db, err := sql.Open("sqlite", "file::memory:") + if err != nil { + t.Errorf("cannot open: %v", err) + return + } + _, err = db.Exec(` + CREATE TABLE table1 (field1 varchar NULL); + INSERT INTO table1 (field1) VALUES (?); + `, sql.NullString{}) + if err != nil { + t.Errorf("Error binding null: %v", err) + } + err = db.Close() + if err != nil { + t.Errorf("cannot close: %v", err) + return + } +} diff --git a/sqlite.go b/sqlite.go index 0b2ea41..4bad6d7 100644 --- a/sqlite.go +++ b/sqlite.go @@ -916,6 +916,10 @@ func (c *conn) bind(pstmt uintptr, n int, args []driver.NamedValue) (allocs []ui if p, err = c.bindText(pstmt, i, x.String()); err != nil { return allocs, err } + case nil: + if p, err = c.bindNull(pstmt, i); err != nil { + return allocs, err + } default: return allocs, fmt.Errorf("sqlite: invalid driver.Value type %T", x) } @@ -926,6 +930,15 @@ func (c *conn) bind(pstmt uintptr, n int, args []driver.NamedValue) (allocs []ui return allocs, nil } +// int sqlite3_bind_null(sqlite3_stmt*, int); +func (c *conn) bindNull(pstmt uintptr, idx1 int) (uintptr, error) { + if rc := sqlite3.Xsqlite3_bind_null(c.tls, pstmt, int32(idx1)); rc != sqlite3.SQLITE_OK { + return 0, c.errstr(rc) + } + + return 0, nil +} + // int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*)); func (c *conn) bindText(pstmt uintptr, idx1 int, value string) (uintptr, error) { p, err := libc.CString(value)