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. |