Commit 2fc5d274 authored by unknown's avatar unknown

Fixing bug #8850 in such a way that when TRUNCATE is called within

stored  procedure,  it  is converted  to DELETE.


mysql-test/r/sp.result:
  A result for  the  test  case  for bug #8850
mysql-test/t/sp.test:
  A test  case  for the bug #8850
sql/sql_delete.cc:
  A fix for bug  #8850, plus adding a missing call  to mysql_init_select(),
  which  caused mem_root corruption.
sql/sql_parse.cc:
  A fix for the bug #8850
BitKeeper/etc/ignore:
  Added acinclude.m4 to the ignore list
parent 679088a2
......@@ -1105,3 +1105,4 @@ vio/test-ssl
vio/test-sslclient
vio/test-sslserver
vio/viotest-ssl
acinclude.m4
......@@ -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;
......@@ -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;
......@@ -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);
......
......@@ -3312,7 +3312,7 @@ mysql_execute_command(THD *thd)
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));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment