|
From: <di...@us...> - 2010-09-18 06:52:52
|
Revision: 51570
http://firebird.svn.sourceforge.net/firebird/?rev=51570&view=rev
Author: dimitr
Date: 2010-09-18 06:52:46 +0000 (Sat, 18 Sep 2010)
Log Message:
-----------
Fixed CORE-3137: Partial rollback is possible for a selectable procedure modifying data.
Modified Paths:
--------------
firebird/trunk/src/jrd/vio.cpp
Modified: firebird/trunk/src/jrd/vio.cpp
===================================================================
--- firebird/trunk/src/jrd/vio.cpp 2010-09-18 06:52:12 UTC (rev 51569)
+++ firebird/trunk/src/jrd/vio.cpp 2010-09-18 06:52:46 UTC (rev 51570)
@@ -2149,19 +2149,22 @@
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()
+ 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
+ if (!sav_point->sav_next)
+ {
+ sav_point->sav_next = org_save_point;
+ }
- sav_point->sav_next = transaction->tra_save_point;
- transaction->tra_save_point = sav_point;
-
VIO_verb_cleanup(tdbb, transaction);
if ( (sav_point = transaction->tra_save_free) ) {
@@ -2175,6 +2178,8 @@
*sav_point_list = sav_point;
sav_point_list = &sav_point->sav_next;
}
+
+ fb_assert(org_save_point == transaction->tra_save_point);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|