summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bzrignore1
-rw-r--r--mysql-test/r/sp.result21
-rw-r--r--mysql-test/t/sp.test24
-rw-r--r--sql/sql_delete.cc3
-rw-r--r--sql/sql_parse.cc2
5 files changed, 49 insertions, 2 deletions
diff --git a/.bzrignore b/.bzrignore
index 81b5139a7d3..302ea948459 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -1105,3 +1105,4 @@ vio/test-ssl
vio/test-sslclient
vio/test-sslserver
vio/viotest-ssl
+acinclude.m4
diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result
index b4198a5f467..8a549b57189 100644
--- a/mysql-test/r/sp.result
+++ b/mysql-test/r/sp.result
@@ -2538,3 +2538,24 @@ drop procedure bug7992|
drop table t3|
drop table t1;
drop table t2;
+drop procedure if exists sp1;
+create table t1 (a int) engine=innodb|
+create procedure sp1 ()
+begin
+truncate table t1; insert t1 values (1); rollback;
+end
+|
+begin;
+insert t1 values (2);
+call sp1();
+ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
+commit;
+select * from t1;
+a
+2
+call sp1();
+select * from t1;
+a
+1
+drop table t1;
+drop procedure sp1;
diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test
index cfb5de7ddd0..61287e94a6f 100644
--- a/mysql-test/t/sp.test
+++ b/mysql-test/t/sp.test
@@ -3073,3 +3073,27 @@ delimiter ;|
drop table t1;
drop table t2;
+#
+# BUG#8850
+#
+--disable_warnings
+drop procedure if exists sp1;
+--enable_warnings
+delimiter |;
+create table t1 (a int) engine=innodb|
+create procedure sp1 ()
+begin
+ truncate table t1; insert t1 values (1); rollback;
+end
+|
+delimiter ;|
+begin;
+insert t1 values (2);
+--error 1192
+call sp1();
+commit;
+select * from t1;
+call sp1();
+select * from t1;
+drop table t1;
+drop procedure sp1;
diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc
index eddc6741be6..d49d654cb87 100644
--- a/sql/sql_delete.cc
+++ b/sql/sql_delete.cc
@@ -749,11 +749,12 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
table_list->db, table_list->table_name);
DBUG_RETURN(TRUE);
}
- if (!ha_supports_generate(table_type))
+ if (!ha_supports_generate(table_type) || thd->lex->sphead)
{
/* Probably InnoDB table */
table_list->lock_type= TL_WRITE;
ha_enable_transaction(thd, FALSE);
+ mysql_init_select(thd->lex);
error= mysql_delete(thd, table_list, (COND*) 0, (SQL_LIST*) 0,
HA_POS_ERROR, 0);
ha_enable_transaction(thd, TRUE);
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 2f38f96c976..b093a9d94e5 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -3312,7 +3312,7 @@ unsent_create_error:
Don't allow this within a transaction because we want to use
re-generate table
*/
- if (thd->locked_tables || thd->active_transaction())
+ if ((thd->locked_tables && !lex->sphead) || thd->active_transaction())
{
my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));