From 8ec990eed8e05067f86ea457765dc38e91e98ea0 Mon Sep 17 00:00:00 2001 From: jacksonmowry <96317858+jacksonmowry@users.noreply.github.com> Date: Wed, 13 Mar 2024 12:39:15 +0000 Subject: [PATCH] db.sqlite: fix exec_param_many bug (#21008) --- vlib/db/sqlite/sqlite.c.v | 3 +++ vlib/db/sqlite/sqlite_test.v | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/vlib/db/sqlite/sqlite.c.v b/vlib/db/sqlite/sqlite.c.v index f06997edc7..0f9a7afa91 100644 --- a/vlib/db/sqlite/sqlite.c.v +++ b/vlib/db/sqlite/sqlite.c.v @@ -315,6 +315,9 @@ pub fn (db &DB) exec_param_many(query string, params []string) ![]Row { for { res = C.sqlite3_step(stmt) if res != sqlite.sqlite_row { + if rows.len == 0 && is_error(res) { + return db.error_message(res, query) + } break } mut row := Row{} diff --git a/vlib/db/sqlite/sqlite_test.v b/vlib/db/sqlite/sqlite_test.v index 4bd5be062d..26e44d9eaa 100644 --- a/vlib/db/sqlite/sqlite_test.v +++ b/vlib/db/sqlite/sqlite_test.v @@ -95,3 +95,22 @@ fn test_alias_db() { create_host(sqlite.connect(':memory:')!)! assert true } + +fn test_exec_param_many() { + $if !linux { + return + } + mut db := sqlite.connect(':memory:') or { panic(err) } + assert db.is_open + db.exec('drop table if exists users')! + db.exec("create table users (id integer primary key, name text default '' unique);")! + db.exec("insert into users (name) values ('Sam')")! + db.exec_param_many('insert into users (id, name) values (?, ?)', [ + '60', + 'Sam', + ]) or { + assert err.code() == 19 // constraint failure + return + } + assert false +}