diff --git a/src/statement.cc b/src/statement.cc index 6123a07ed..f6f4418a1 100644 --- a/src/statement.cc +++ b/src/statement.cc @@ -381,7 +381,7 @@ void Statement::EIO_BeginGet(Baton* baton) { int Statement::EIO_Get(eio_req *req) { STATEMENT_INIT(RowBaton); - if (stmt->status != SQLITE_DONE) { + if (stmt->status != SQLITE_DONE || baton->parameters.size()) { sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->handle); sqlite3_mutex_enter(mtx); diff --git a/test/rerun.test.js b/test/rerun.test.js new file mode 100644 index 000000000..3be8b02d2 --- /dev/null +++ b/test/rerun.test.js @@ -0,0 +1,43 @@ +var sqlite3 = require('sqlite3'); +var assert = require('assert'); + +if (process.setMaxListeners) process.setMaxListeners(0); + +exports['test running the same statement multiple times'] = function(beforeExit) { + var db = new sqlite3.Database(':memory:'); + + var count = 10; + var inserted = 0; + var retrieved = 0; + + db.serialize(function() { + db.run("CREATE TABLE foo (id int)"); + + var stmt = db.prepare("INSERT INTO foo VALUES(?)"); + for (var i = 5; i < count; i++) { + stmt.run(i, function(err) { + if (err) throw err; + inserted++; + }); + } + stmt.finalize(); + + var collected = []; + var stmt = db.prepare("SELECT id FROM foo WHERE id = ?"); + for (var i = 0; i < count; i++) { + stmt.get(i, function(err, row) { + if (err) throw err; + if (row) collected.push(row); + }); + } + stmt.finalize(function() { + retrieved += collected.length; + assert.deepEqual(collected, [ { id: 5 }, { id: 6 }, { id: 7 }, { id: 8 }, { id: 9 } ]); + }); + }); + + beforeExit(function() { + assert.equal(inserted, 5); + assert.equal(retrieved, 5); + }); +};