Commit 2fc5d274 authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1105,3 +1105,4 @@ vio/test-ssl
vio/test-sslclient
vio/test-sslserver
vio/viotest-ssl
acinclude.m4
+21 −0
Original line number Diff line number Diff line
@@ -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;
+24 −0
Original line number Diff line number Diff line
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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));