Skip to content

Commit 21b6423

Browse files
cjihrigtargos
authored andcommitted
sqlite: reset statement immediately in run()
This commit updates StatementSync.prototype.run() to reset the prepared statement immediately after calling sqlite3_step() to return the correct change metadata. Fixes: #57344 PR-URL: #57350 Reviewed-By: Edy Silva <edigleyssonsilva@gmail.com> Reviewed-By: Jake Yuesong Li <jake.yuesong@gmail.com>
1 parent b866755 commit 21b6423

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

src/node_sqlite.cc

+3-7
Original file line numberDiff line numberDiff line change
@@ -1866,13 +1866,9 @@ void StatementSync::Run(const FunctionCallbackInfo<Value>& args) {
18661866
return;
18671867
}
18681868

1869-
auto reset = OnScopeLeave([&]() { sqlite3_reset(stmt->statement_); });
1870-
r = sqlite3_step(stmt->statement_);
1871-
if (r != SQLITE_ROW && r != SQLITE_DONE) {
1872-
THROW_ERR_SQLITE_ERROR(env->isolate(), stmt->db_.get());
1873-
return;
1874-
}
1875-
1869+
sqlite3_step(stmt->statement_);
1870+
r = sqlite3_reset(stmt->statement_);
1871+
CHECK_ERROR_OR_THROW(env->isolate(), stmt->db_.get(), r, SQLITE_OK, void());
18761872
Local<Object> result = Object::New(env->isolate());
18771873
sqlite3_int64 last_insert_rowid =
18781874
sqlite3_last_insert_rowid(stmt->db_->Connection());

test/parallel/test-sqlite-statement-sync.js

+19
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,25 @@ suite('StatementSync.prototype.run()', () => {
170170
errstr: 'constraint failed',
171171
});
172172
});
173+
174+
test('returns correct metadata when using RETURNING', (t) => {
175+
const db = new DatabaseSync(':memory:');
176+
const setup = db.exec(
177+
'CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER NOT NULL) STRICT;'
178+
);
179+
t.assert.strictEqual(setup, undefined);
180+
const sql = 'INSERT INTO data (key, val) VALUES ($k, $v) RETURNING key';
181+
const stmt = db.prepare(sql);
182+
t.assert.deepStrictEqual(
183+
stmt.run({ k: 1, v: 10 }), { changes: 1, lastInsertRowid: 1 }
184+
);
185+
t.assert.deepStrictEqual(
186+
stmt.run({ k: 2, v: 20 }), { changes: 1, lastInsertRowid: 2 }
187+
);
188+
t.assert.deepStrictEqual(
189+
stmt.run({ k: 3, v: 30 }), { changes: 1, lastInsertRowid: 3 }
190+
);
191+
});
173192
});
174193

175194
suite('StatementSync.prototype.sourceSQL', () => {

0 commit comments

Comments
 (0)