Commit b8920588 authored by unknown's avatar unknown
Browse files

Fix for Bug#12953 "Stored procedures: crash if OPTIMIZE TABLE in function"

OPTIMIZE TABLE statement is forbidden from usage in stored procedures/functions.

NOTE: OPTIMIZE TABLE statement can be useful in stored procedures. The idea is
that the user/administrator can create a stored procedure for admin
tasks (optimizing, backing up, etc). This procedure can be scheduled to run
automatically (by mean of internal cron (WL#1034)). So, once we can make this
statement work, it is worth doing it.


mysql-test/r/sp-error.result:
  Results for the test case for Bug#12953 added.
mysql-test/t/sp-error.test:
  Test case for Bug#12953 "Stored procedures: crash if OPTIMIZE TABLE in function" added.
sql/sql_yacc.yy:
  Forbid "OPTIMIZE TABLE" statement from use in stored procedures/functions.
parent 9e7a1bb2
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -758,3 +758,10 @@ execute stmt;
ERROR 42000: FUNCTION test.bug11834_1 does not exist
deallocate prepare stmt;
drop function bug11834_2;
DROP FUNCTION IF EXISTS bug12953|
CREATE FUNCTION bug12953() RETURNS INT
BEGIN
OPTIMIZE TABLE t1;
RETURN 1;
END|
ERROR 0A000: OPTIMIZE TABLE is not allowed in stored procedures
+15 −2
Original line number Diff line number Diff line
@@ -1085,6 +1085,21 @@ drop function bug11834_1;
execute stmt;
deallocate prepare stmt;
drop function bug11834_2;

#
# Bug#12953 "Stored procedures: crash if OPTIMIZE TABLE in function"
#
delimiter |;
--disable_warnings
DROP FUNCTION IF EXISTS bug12953|
--enable_warnings
--error ER_SP_BADSTATEMENT
CREATE FUNCTION bug12953() RETURNS INT
BEGIN
  OPTIMIZE TABLE t1;
  RETURN 1;
END|

#
# BUG#NNNN: New bug synopsis
#
@@ -1092,5 +1107,3 @@ drop function bug11834_2;
#drop procedure if exists bugNNNN|
#--enable_warnings
#create procedure bugNNNN...

+5 −0
Original line number Diff line number Diff line
@@ -3826,6 +3826,11 @@ optimize:
	OPTIMIZE opt_no_write_to_binlog table_or_tables
	{
	   LEX *lex=Lex;
	   if (lex->sphead)
	   {
	     my_error(ER_SP_BADSTATEMENT, MYF(0), "OPTIMIZE TABLE");
	     YYABORT;
	   }
	   lex->sql_command = SQLCOM_OPTIMIZE;
           lex->no_write_to_binlog= $2;
	   lex->check_opt.init();