@@ -2544,6 +2544,7 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
25442544 THROW_AND_RETURN_ON_BAD_STATE (
25452545 env, stmt->IsFinalized (), " statement has been finalized" );
25462546 Isolate* isolate = env->isolate ();
2547+ stmt->reset_generation_ ++;
25472548 int r = sqlite3_reset (stmt->statement_ );
25482549 CHECK_ERROR_OR_THROW (isolate, stmt->db_ .get (), r, SQLITE_OK, void ());
25492550
@@ -2570,6 +2571,7 @@ void StatementSync::Iterate(const FunctionCallbackInfo<Value>& args) {
25702571 Environment* env = Environment::GetCurrent (args);
25712572 THROW_AND_RETURN_ON_BAD_STATE (
25722573 env, stmt->IsFinalized (), " statement has been finalized" );
2574+ stmt->reset_generation_ ++;
25732575 int r = sqlite3_reset (stmt->statement_ );
25742576 CHECK_ERROR_OR_THROW (env->isolate (), stmt->db_ .get (), r, SQLITE_OK, void ());
25752577
@@ -2593,6 +2595,7 @@ void StatementSync::Get(const FunctionCallbackInfo<Value>& args) {
25932595 Environment* env = Environment::GetCurrent (args);
25942596 THROW_AND_RETURN_ON_BAD_STATE (
25952597 env, stmt->IsFinalized (), " statement has been finalized" );
2598+ stmt->reset_generation_ ++;
25962599 int r = sqlite3_reset (stmt->statement_ );
25972600 CHECK_ERROR_OR_THROW (env->isolate (), stmt->db_ .get (), r, SQLITE_OK, void ());
25982601
@@ -2617,6 +2620,7 @@ void StatementSync::Run(const FunctionCallbackInfo<Value>& args) {
26172620 Environment* env = Environment::GetCurrent (args);
26182621 THROW_AND_RETURN_ON_BAD_STATE (
26192622 env, stmt->IsFinalized (), " statement has been finalized" );
2623+ stmt->reset_generation_ ++;
26202624 int r = sqlite3_reset (stmt->statement_ );
26212625 CHECK_ERROR_OR_THROW (env->isolate (), stmt->db_ .get (), r, SQLITE_OK, void ());
26222626
@@ -3162,6 +3166,7 @@ StatementSyncIterator::StatementSyncIterator(Environment* env,
31623166 : BaseObject(env, object), stmt_(std::move(stmt)) {
31633167 MakeWeak ();
31643168 done_ = false ;
3169+ statement_reset_generation_ = stmt_->reset_generation_ ;
31653170}
31663171
31673172StatementSyncIterator::~StatementSyncIterator () {}
@@ -3220,6 +3225,11 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
32203225 return ;
32213226 }
32223227
3228+ THROW_AND_RETURN_ON_BAD_STATE (
3229+ env,
3230+ iter->statement_reset_generation_ != iter->stmt_ ->reset_generation_ ,
3231+ " iterator was invalidated" );
3232+
32233233 int r = sqlite3_step (iter->stmt_ ->statement_ );
32243234 if (r != SQLITE_ROW) {
32253235 CHECK_ERROR_OR_THROW (
0 commit comments