From 7b19170cf7416d3d553b30a5b12e20458331d149 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Fri, 11 Mar 2005 21:10:41 +0100 Subject: [PATCH] BUG#9101 - RELEASE/ROLLBACK TO SAVEPOINT did not forget savepoints correctly --- mysql-test/r/innodb.result | 8 +++++++- mysql-test/t/innodb.test | 11 ++++++++++- sql/sql_parse.cc | 24 ++++++++++++------------ 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index 2c285efafaf..be73f6986ac 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -262,7 +262,11 @@ n 5 6 7 -rollback to savepoint `savept2`; +savepoint savept3; +rollback to savepoint savept2; +rollback to savepoint savept3; +ERROR 42000: SAVEPOINT savept3 does not exist +rollback to savepoint savept2; release savepoint `my_savepoint`; select n from t1; n @@ -272,6 +276,8 @@ n 7 rollback to savepoint `my_savepoint`; ERROR 42000: SAVEPOINT my_savepoint does not exist +rollback to savepoint savept2; +ERROR 42000: SAVEPOINT savept2 does not exist insert into t1 values (8); savepoint sv; commit; diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test index 3c9752bb928..91a2b5b0e54 100644 --- a/mysql-test/t/innodb.test +++ b/mysql-test/t/innodb.test @@ -130,17 +130,26 @@ insert into t1 values (6); insert into t1 values (4); select n from t1; set autocommit=0; +# +# savepoints +# begin; savepoint `my_savepoint`; insert into t1 values (7); savepoint `savept2`; insert into t1 values (3); select n from t1; -rollback to savepoint `savept2`; +savepoint savept3; +rollback to savepoint savept2; +--error 1305 +rollback to savepoint savept3; +rollback to savepoint savept2; release savepoint `my_savepoint`; select n from t1; -- error 1305 rollback to savepoint `my_savepoint`; +--error 1305 +rollback to savepoint savept2; insert into t1 values (8); savepoint sv; commit; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 03e6d91507c..d5ed8c8efb0 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3805,21 +3805,21 @@ unsent_create_error: break; case SQLCOM_RELEASE_SAVEPOINT: { - SAVEPOINT **sv; - for (sv=&thd->transaction.savepoints; *sv; sv=&(*sv)->prev) + SAVEPOINT *sv; + for (sv=thd->transaction.savepoints; sv; sv=sv->prev) { if (my_strnncoll(system_charset_info, (uchar *)lex->ident.str, lex->ident.length, - (uchar *)(*sv)->name, (*sv)->length) == 0) + (uchar *)sv->name, sv->length) == 0) break; } - if (*sv) + if (sv) { - if (ha_release_savepoint(thd, *sv)) + if (ha_release_savepoint(thd, sv)) res= TRUE; // cannot happen else send_ok(thd); - *sv=(*sv)->prev; + thd->transaction.savepoints=sv->prev; } else my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "SAVEPOINT", lex->ident.str); @@ -3827,17 +3827,17 @@ unsent_create_error: } case SQLCOM_ROLLBACK_TO_SAVEPOINT: { - SAVEPOINT **sv; - for (sv=&thd->transaction.savepoints; *sv; sv=&(*sv)->prev) + SAVEPOINT *sv; + for (sv=thd->transaction.savepoints; sv; sv=sv->prev) { if (my_strnncoll(system_charset_info, (uchar *)lex->ident.str, lex->ident.length, - (uchar *)(*sv)->name, (*sv)->length) == 0) + (uchar *)sv->name, sv->length) == 0) break; } - if (*sv) + if (sv) { - if (ha_rollback_to_savepoint(thd, *sv)) + if (ha_rollback_to_savepoint(thd, sv)) res= TRUE; // cannot happen else { @@ -3848,7 +3848,7 @@ unsent_create_error: ER(ER_WARNING_NOT_COMPLETE_ROLLBACK)); send_ok(thd); } - *sv=(*sv)->prev; + thd->transaction.savepoints=sv; } else my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "SAVEPOINT", lex->ident.str);