mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 20:36:16 +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
 |