diff --git a/src/jrd/vio.cpp b/src/jrd/vio.cpp index 4b57335ff05..4ca53b6b8d8 100644 --- a/src/jrd/vio.cpp +++ b/src/jrd/vio.cpp @@ -2128,19 +2128,21 @@ void VIO_merge_proc_sav_points(thread_db* tdbb, return; } - // one by one go on putting all savepoints in the sav_point_list on - // top of transaction save points and call VIO_verb_cleanup() + // Merge all savepoints in the sav_point_list at the top + // of transaction save points and call VIO_verb_cleanup() - for (Savepoint* sav_point = *sav_point_list; sav_point; - sav_point = sav_point->sav_next) + Savepoint* const org_save_point = transaction->tra_save_point; + transaction->tra_save_point = *sav_point_list; + + for (Savepoint* sav_point = *sav_point_list; sav_point; sav_point = sav_point->sav_next) { Savepoint* const sav_next = sav_point->sav_next; const SLONG sav_number = sav_point->sav_number; - // add it to the front - - sav_point->sav_next = transaction->tra_save_point; - transaction->tra_save_point = sav_point; + if (!sav_point->sav_next) + { + sav_point->sav_next = org_save_point; + } VIO_verb_cleanup(tdbb, transaction); @@ -2155,6 +2157,8 @@ void VIO_merge_proc_sav_points(thread_db* tdbb, *sav_point_list = sav_point; sav_point_list = &sav_point->sav_next; } + + fb_assert(org_save_point == transaction->tra_save_point); }