Skip to content

Commit b5b51dc

Browse files
cjihrigaduh95
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 2edd075 commit b5b51dc

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

src/node_sqlite.cc

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1887,13 +1887,9 @@ void StatementSync::Run(const FunctionCallbackInfo<Value>& args) {
18871887
return;
18881888
}
18891889

1890-
auto reset = OnScopeLeave([&]() { sqlite3_reset(stmt->statement_); });
1891-
r = sqlite3_step(stmt->statement_);
1892-
if (r != SQLITE_ROW && r != SQLITE_DONE) {
1893-
THROW_ERR_SQLITE_ERROR(env->isolate(), stmt->db_.get());
1894-
return;
1895-
}
1896-
1890+
sqlite3_step(stmt->statement_);
1891+
r = sqlite3_reset(stmt->statement_);
1892+
CHECK_ERROR_OR_THROW(env->isolate(), stmt->db_.get(), r, SQLITE_OK, void());
18971893
Local<Object> result = Object::New(env->isolate());
18981894
sqlite3_int64 last_insert_rowid =
18991895
sqlite3_last_insert_rowid(stmt->db_->Connection());

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

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

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

0 commit comments

Comments
 (0)