@@ -2421,6 +2421,11 @@ inline bool StatementSync::IsFinalized() {
24212421 return statement_ == nullptr ;
24222422}
24232423
2424+ inline int StatementSync::ResetStatement () {
2425+ reset_generation_++;
2426+ return sqlite3_reset (statement_);
2427+ }
2428+
24242429bool StatementSync::BindParams (const FunctionCallbackInfo<Value>& args) {
24252430 int r = sqlite3_clear_bindings (statement_);
24262431 CHECK_ERROR_OR_THROW (env ()->isolate (), db_.get (), r, SQLITE_OK, false );
@@ -2812,7 +2817,7 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
28122817 THROW_AND_RETURN_ON_BAD_STATE (
28132818 env, stmt->IsFinalized (), " statement has been finalized" );
28142819 Isolate* isolate = env->isolate ();
2815- int r = sqlite3_reset ( stmt->statement_ );
2820+ int r = stmt->ResetStatement ( );
28162821 CHECK_ERROR_OR_THROW (isolate, stmt->db_ .get (), r, SQLITE_OK, void ());
28172822
28182823 if (!stmt->BindParams (args)) {
@@ -2838,7 +2843,7 @@ void StatementSync::Iterate(const FunctionCallbackInfo<Value>& args) {
28382843 Environment* env = Environment::GetCurrent (args);
28392844 THROW_AND_RETURN_ON_BAD_STATE (
28402845 env, stmt->IsFinalized (), " statement has been finalized" );
2841- int r = sqlite3_reset ( stmt->statement_ );
2846+ int r = stmt->ResetStatement ( );
28422847 CHECK_ERROR_OR_THROW (env->isolate (), stmt->db_ .get (), r, SQLITE_OK, void ());
28432848
28442849 if (!stmt->BindParams (args)) {
@@ -2861,7 +2866,7 @@ void StatementSync::Get(const FunctionCallbackInfo<Value>& args) {
28612866 Environment* env = Environment::GetCurrent (args);
28622867 THROW_AND_RETURN_ON_BAD_STATE (
28632868 env, stmt->IsFinalized (), " statement has been finalized" );
2864- int r = sqlite3_reset ( stmt->statement_ );
2869+ int r = stmt->ResetStatement ( );
28652870 CHECK_ERROR_OR_THROW (env->isolate (), stmt->db_ .get (), r, SQLITE_OK, void ());
28662871
28672872 if (!stmt->BindParams (args)) {
@@ -2885,7 +2890,7 @@ void StatementSync::Run(const FunctionCallbackInfo<Value>& args) {
28852890 Environment* env = Environment::GetCurrent (args);
28862891 THROW_AND_RETURN_ON_BAD_STATE (
28872892 env, stmt->IsFinalized (), " statement has been finalized" );
2888- int r = sqlite3_reset ( stmt->statement_ );
2893+ int r = stmt->ResetStatement ( );
28892894 CHECK_ERROR_OR_THROW (env->isolate (), stmt->db_ .get (), r, SQLITE_OK, void ());
28902895
28912896 if (!stmt->BindParams (args)) {
@@ -3430,6 +3435,7 @@ StatementSyncIterator::StatementSyncIterator(Environment* env,
34303435 : BaseObject(env, object), stmt_(std::move(stmt)) {
34313436 MakeWeak ();
34323437 done_ = false ;
3438+ statement_reset_generation_ = stmt_->reset_generation_ ;
34333439}
34343440
34353441StatementSyncIterator::~StatementSyncIterator () {}
@@ -3488,6 +3494,11 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
34883494 return ;
34893495 }
34903496
3497+ THROW_AND_RETURN_ON_BAD_STATE (
3498+ env,
3499+ iter->statement_reset_generation_ != iter->stmt_ ->reset_generation_ ,
3500+ " iterator was invalidated" );
3501+
34913502 int r = sqlite3_step (iter->stmt_ ->statement_ );
34923503 if (r != SQLITE_ROW) {
34933504 CHECK_ERROR_OR_THROW (
0 commit comments