Commit eb25e83e authored by unknown's avatar unknown
Browse files

Increase allowed size of stored procedure bodies to 4GB, and

produce a sensible error when that limit is exceeded. (Bug #11602)


client/mysqltest.c:
  Increase query buffer size, and explain why
mysql-test/r/system_mysql_db.result:
  Update results
scripts/mysql_create_system_tables.sh:
  Increase size of proc.body
scripts/mysql_fix_privilege_tables.sql:
  Increase size of proc.body
sql/share/errmsg.txt:
  Add error for SP routines that are too long
sql/sp.cc:
  Raise an error when the SP body is too long.
sql/sp.h:
  Add error for SP body being too long.
sql/sql_parse.cc:
  Handle SP_BODY_TOO_LONG error.
mysql-test/r/sp-big.result:
  New BitKeeper file ``mysql-test/r/sp-big.result''
mysql-test/t/sp-big.test:
  New BitKeeper file ``mysql-test/t/sp-big.test''
parent 51308e23
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -66,7 +66,8 @@
#ifndef WEXITSTATUS
# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
#endif
#define MAX_QUERY     131072
/* MAX_QUERY is 256K -- there is a test in sp-big that is >128K */
#define MAX_QUERY     (256*1024)
#define MAX_VAR_NAME	256
#define MAX_COLUMNS	256
#define PAD_SIZE	128
+15 −0
Original line number Diff line number Diff line
drop procedure if exists test.longprocedure;
drop table if exists t1;
create table t1 (a int);
insert into t1 values (1),(2),(3);
length
107520
select length(routine_definition) from information_schema.routines where routine_schema = 'test' and routine_name = 'longprocedure';
length(routine_definition)
107530
call test.longprocedure(@value);
select @value;
@value
3
drop procedure test.longprocedure;
drop table t1;
+1 −1
Original line number Diff line number Diff line
@@ -172,7 +172,7 @@ proc CREATE TABLE `proc` (
  `security_type` enum('INVOKER','DEFINER') NOT NULL default 'DEFINER',
  `param_list` blob NOT NULL,
  `returns` char(64) NOT NULL default '',
  `body` blob NOT NULL,
  `body` longblob NOT NULL,
  `definer` char(77) character set utf8 collate utf8_bin NOT NULL default '',
  `created` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `modified` timestamp NOT NULL default '0000-00-00 00:00:00',
+33 −0
Original line number Diff line number Diff line
#
# Bug #11602: SP with very large body not handled well
#

--disable_warnings
drop procedure if exists test.longprocedure;
drop table if exists t1;
--enable_warnings

create table t1 (a int);
insert into t1 values (1),(2),(3);

let $body=`select repeat('select count(*) into out1 from t1;\n', 3072)`;

delimiter //;
--disable_query_log
eval select length('$body') as length//
eval create procedure test.longprocedure (out out1 int) deterministic
begin
  $body
end//
--enable_query_log

delimiter ;//

# this is larger than the length above, because it includes the 'begin' and
# 'end' bits and some whitespace
select length(routine_definition) from information_schema.routines where routine_schema = 'test' and routine_name = 'longprocedure';

call test.longprocedure(@value); select @value;

drop procedure test.longprocedure;
drop table t1;
+1 −1
Original line number Diff line number Diff line
@@ -683,7 +683,7 @@ then
  c_p="$c_p   security_type     enum('INVOKER','DEFINER') DEFAULT 'DEFINER' NOT NULL,"
  c_p="$c_p   param_list        blob DEFAULT '' NOT NULL,"
  c_p="$c_p   returns           char(64) DEFAULT '' NOT NULL,"
  c_p="$c_p   body              blob DEFAULT '' NOT NULL,"
  c_p="$c_p   body              longblob DEFAULT '' NOT NULL,"
  c_p="$c_p   definer           char(77) collate utf8_bin DEFAULT '' NOT NULL,"
  c_p="$c_p   created           timestamp,"
  c_p="$c_p   modified          timestamp,"
Loading