mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-27 08:58:13 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			399 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			399 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| if (`SELECT $PS_PROTOCOL + $CURSOR_PROTOCOL > 0`)
 | |
| {
 | |
|    --skip Test temporarily disabled for ps-protocol and cursor-protocol
 | |
| }
 | |
| #
 | |
| # 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
 | 
