Commit eb061b65 authored by unknown's avatar unknown
Browse files

Fix for Bug#12995: Inside function "Table 't4' was not locked with LOCK TABLES"

Any form of HANDLER statement is forbidden from usage in stored procedures/functions.


mysql-test/r/sp-error.result:
  Results for the test case for Bug#12995 added.
mysql-test/t/sp-error.test:
  Test case for Bug#12995 added.
sql/sql_yacc.yy:
  Forbid any form of "HANDLER" statement from use in stored procedures/functions.
parent 7c69d4a3
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -765,3 +765,24 @@ OPTIMIZE TABLE t1;
RETURN 1;
END|
ERROR 0A000: OPTIMIZE TABLE is not allowed in stored procedures
DROP FUNCTION IF EXISTS bug12995|
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
HANDLER t1 OPEN;
RETURN 1;
END|
ERROR 0A000: HANDLER is not allowed in stored procedures
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
HANDLER t1 READ FIRST;
RETURN 1;
END|
ERROR 0A000: HANDLER is not allowed in stored procedures
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
HANDLER t1 CLOSE;
RETURN 1;
END|
ERROR 0A000: HANDLER is not allowed in stored procedures
SELECT bug12995()|
ERROR 42000: FUNCTION test.bug12995 does not exist
+30 −0
Original line number Diff line number Diff line
@@ -1099,6 +1099,36 @@ BEGIN
  OPTIMIZE TABLE t1;
  RETURN 1;
END|
delimiter ;|

#
# Bug##12995 "Inside function "Table 't4' was not locked with LOCK TABLES"
#
delimiter |;
--disable_warnings
DROP FUNCTION IF EXISTS bug12995|
--enable_warnings
--error ER_SP_BADSTATEMENT
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
  HANDLER t1 OPEN;
  RETURN 1;
END|
--error ER_SP_BADSTATEMENT
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
  HANDLER t1 READ FIRST;
  RETURN 1;
END|
--error ER_SP_BADSTATEMENT
CREATE FUNCTION bug12995() RETURNS INT
BEGIN
  HANDLER t1 CLOSE;
  RETURN 1;
END|
--error 1305
SELECT bug12995()|
delimiter ;|

#
# BUG#NNNN: New bug synopsis
+15 −0
Original line number Diff line number Diff line
@@ -8157,6 +8157,11 @@ handler:
	HANDLER_SYM table_ident OPEN_SYM opt_table_alias
	{
	  LEX *lex= Lex;
	  if (lex->sphead)
	  {
	    my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER");
	    YYABORT;
	  }
	  lex->sql_command = SQLCOM_HA_OPEN;
	  if (!lex->current_select->add_table_to_list(lex->thd, $2, $4, 0))
	    YYABORT;
@@ -8164,6 +8169,11 @@ handler:
	| HANDLER_SYM table_ident_nodb CLOSE_SYM
	{
	  LEX *lex= Lex;
	  if (lex->sphead)
	  {
	    my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER");
	    YYABORT;
	  }
	  lex->sql_command = SQLCOM_HA_CLOSE;
	  if (!lex->current_select->add_table_to_list(lex->thd, $2, 0, 0))
	    YYABORT;
@@ -8171,6 +8181,11 @@ handler:
	| HANDLER_SYM table_ident_nodb READ_SYM
	{
	  LEX *lex=Lex;
	  if (lex->sphead)
	  {
	    my_error(ER_SP_BADSTATEMENT, MYF(0), "HANDLER");
	    YYABORT;
	  }
	  lex->sql_command = SQLCOM_HA_READ;
	  lex->ha_rkey_mode= HA_READ_KEY_EXACT;	/* Avoid purify warnings */
	  lex->current_select->select_limit= new Item_int((int32) 1);