summaryrefslogtreecommitdiff
path: root/mysql-test/main/parser_stack.test
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/main/parser_stack.test')
-rw-r--r--mysql-test/main/parser_stack.test395
1 files changed, 395 insertions, 0 deletions
diff --git a/mysql-test/main/parser_stack.test b/mysql-test/main/parser_stack.test
new file mode 100644
index 00000000000..8bc316da18e
--- /dev/null
+++ b/mysql-test/main/parser_stack.test
@@ -0,0 +1,395 @@
+#
+# These tests are designed to cause an internal parser stack overflow,
+# and trigger my_yyoverflow().
+#
+
+use test;
+
+SELECT
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+1
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+;
+
+prepare stmt from
+"
+SELECT
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+1
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+"
+;
+
+execute stmt;
+
+--disable_warnings
+drop view if exists view_overflow;
+--enable_warnings
+
+CREATE VIEW view_overflow AS
+SELECT
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
+1
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+;
+
+SELECT * from view_overflow;
+
+drop view view_overflow;
+
+--disable_warnings
+drop procedure if exists proc_overflow;
+--enable_warnings
+
+delimiter $$;
+
+CREATE PROCEDURE proc_overflow()
+BEGIN
+
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+
+ select 1;
+ select 2;
+ select 3;
+
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+
+END $$
+
+delimiter ;$$
+
+call proc_overflow();
+
+drop procedure proc_overflow;
+
+--disable_warnings
+drop function if exists func_overflow;
+--enable_warnings
+
+delimiter $$;
+
+create function func_overflow() returns int
+BEGIN
+ DECLARE x int default 0;
+
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+
+ SET x=x+1;
+ SET x=x+2;
+ SET x=x+3;
+
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+
+ return x;
+END $$
+
+delimiter ;$$
+
+select func_overflow();
+
+drop function func_overflow;
+
+--disable_warnings
+drop table if exists table_overflow;
+--enable_warnings
+
+create table table_overflow(a int, b int);
+
+delimiter $$;
+
+create trigger trigger_overflow before insert on table_overflow
+for each row
+BEGIN
+
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+ BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN BEGIN
+
+ SET NEW.b := NEW.a;
+ SET NEW.b := NEW.b + 1;
+ SET NEW.b := NEW.b + 2;
+ SET NEW.b := NEW.b + 3;
+
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+ END; END; END; END; END; END; END; END; END; END; END; END;
+
+END $$
+
+delimiter ;$$
+
+insert into table_overflow set a=10;
+insert into table_overflow set a=20;
+select * from table_overflow;
+
+drop table table_overflow;
+
+--disable_warnings
+drop procedure if exists proc_35577;
+--enable_warnings
+
+delimiter $$;
+
+CREATE PROCEDURE proc_35577()
+BEGIN
+ DECLARE z_done INT DEFAULT 0;
+ DECLARE t_done VARCHAR(5000);
+ outer_loop: LOOP
+ IF t_done=1 THEN
+ LEAVE outer_loop;
+ END IF;
+
+ inner_block:BEGIN
+ DECLARE z_done INT DEFAULT 0;
+ SET z_done = 0;
+ inner_loop: LOOP
+ IF z_done=1 THEN
+ LEAVE inner_loop;
+ END IF;
+ IF (t_done = 'a') THEN
+ IF (t_done <> 0) THEN
+ IF ( t_done > 0) THEN
+ IF (t_done = 'a') THEN
+ SET t_done = 'a';
+ ELSEIF (t_done = 'a') THEN
+ SET t_done = 'a';
+ ELSEIF(t_done = 'a') THEN
+ SET t_done = 'a';
+ ELSEIF(t_done = 'a') THEN
+ SET t_done = 'a';
+ ELSEIF(t_done = 'a') THEN
+ SET t_done = 'a';
+ ELSEIF(t_done = 'a') THEN
+ SET t_done = 'a';
+ ELSEIF(t_done = 'a') THEN
+ SET t_done = 'a';
+ ELSEIF(t_done = 'a') THEN
+ SET t_done = 'a';
+ END IF;
+ END IF;
+ END IF;
+ END IF;
+ END LOOP inner_loop;
+ END inner_block;
+ END LOOP outer_loop;
+END $$
+
+delimiter ;$$
+
+drop procedure proc_35577;
+
+#
+# Bug#37269 (parser crash when creating stored procedure)
+#
+
+--disable_warnings
+drop procedure if exists p_37269;
+--enable_warnings
+
+delimiter $$;
+
+create procedure p_37269()
+begin
+ declare done int default 0;
+ declare varb int default 0;
+ declare vara int default 0;
+
+ repeat
+ select now();
+ until done end repeat;
+ while varb do
+ select now();
+ begin
+ select now();
+ repeat
+ select now();
+ until done end repeat;
+ if vara then
+ select now();
+ repeat
+ select now();
+ loop
+ select now();
+ end loop;
+ repeat
+ select now();
+ label1: while varb do
+ select now();
+ end while label1;
+ if vara then
+ select now();
+ repeat
+ select now();
+ until done end repeat;
+ begin
+ select now();
+ while varb do
+ select now();
+ label1: while varb do
+ select now();
+ end while label1;
+ if vara then
+ select now();
+ while varb do
+ select now();
+ loop
+ select now();
+ end loop;
+ repeat
+ select now();
+ loop
+ select now();
+ while varb do
+ select now();
+ end while;
+ repeat
+ select now();
+ label1: loop
+ select now();
+ if vara then
+ select now();
+ end if;
+ end loop label1;
+ until done end repeat;
+ end loop;
+ until done end repeat;
+ end while;
+ end if;
+ end while;
+ end;
+ end if;
+ until done end repeat;
+ until done end repeat;
+ end if;
+ end;
+ end while;
+end $$
+
+delimiter ;$$
+
+drop procedure p_37269;
+
+#
+# Bug#37228 (Sever crashes when creating stored procedure with more than
+# 10 IF/ELSEIF)
+#
+
+--disable_warnings
+drop procedure if exists p_37228;
+--enable_warnings
+
+delimiter $$;
+
+create procedure p_37228 ()
+BEGIN
+ DECLARE v INT DEFAULT 123;
+
+ IF (v > 1) THEN SET v = 1;
+ ELSEIF (v < 10) THEN SET v = 10;
+ ELSEIF (v < 11) THEN SET v = 11;
+ ELSEIF (v < 12) THEN SET v = 12;
+ ELSEIF (v < 13) THEN SET v = 13;
+ ELSEIF (v < 14) THEN SET v = 14;
+ ELSEIF (v < 15) THEN SET v = 15;
+ ELSEIF (v < 16) THEN SET v = 16;
+ ELSEIF (v < 17) THEN SET v = 17;
+ ELSEIF (v < 18) THEN SET v = 18;
+ ELSEIF (v < 19) THEN SET v = 19;
+ ELSEIF (v < 20) THEN SET v = 20;
+ ELSEIF (v < 21) THEN SET v = 21;
+ ELSEIF (v < 22) THEN SET v = 22;
+ ELSEIF (v < 23) THEN SET v = 23;
+ ELSEIF (v < 24) THEN SET v = 24;
+ ELSEIF (v < 25) THEN SET v = 25;
+ ELSEIF (v < 26) THEN SET v = 26;
+ ELSEIF (v < 27) THEN SET v = 27;
+ ELSEIF (v < 28) THEN SET v = 28;
+ ELSEIF (v < 29) THEN SET v = 29;
+ ELSEIF (v < 30) THEN SET v = 30;
+ ELSEIF (v < 31) THEN SET v = 31;
+ ELSEIF (v < 32) THEN SET v = 32;
+ ELSEIF (v < 33) THEN SET v = 33;
+ ELSEIF (v < 34) THEN SET v = 34;
+ ELSEIF (v < 35) THEN SET v = 35;
+ ELSEIF (v < 36) THEN SET v = 36;
+ ELSEIF (v < 37) THEN SET v = 37;
+ ELSEIF (v < 38) THEN SET v = 38;
+ ELSEIF (v < 39) THEN SET v = 39;
+ END IF;
+END $$
+
+delimiter ;$$
+
+drop procedure p_37228;
+
+#
+# Bug#27863 (excessive memory usage for many small queries in a multiquery
+# packet).
+#
+
+let $i=`select repeat("set @a=1;", 65535)`;
+--disable_query_log
+eval $i;
+--enable_query_log