684 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			684 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Test the debugging feature "show procedure/function code <name>" 
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								-- source include/have_debug.inc
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--disable_warnings
							 | 
						||
| 
								 | 
							
								drop procedure if exists empty;
							 | 
						||
| 
								 | 
							
								drop procedure if exists code_sample;
							 | 
						||
| 
								 | 
							
								--enable_warnings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create procedure empty()
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								end;
							 | 
						||
| 
								 | 
							
								show procedure code empty;
							 | 
						||
| 
								 | 
							
								drop procedure empty;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create function almost_empty()
							 | 
						||
| 
								 | 
							
								    returns int
							 | 
						||
| 
								 | 
							
								  return 0;
							 | 
						||
| 
								 | 
							
								show function code almost_empty;
							 | 
						||
| 
								 | 
							
								drop function almost_empty;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								delimiter //;
							 | 
						||
| 
								 | 
							
								create procedure code_sample(x int, out err int, out nulls int)
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								  declare count int default 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  set nulls = 0;
							 | 
						||
| 
								 | 
							
								  begin
							 | 
						||
| 
								 | 
							
								    declare c cursor for select name from t1;
							 | 
						||
| 
								 | 
							
								    declare exit handler for not found close c;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    open c;
							 | 
						||
| 
								 | 
							
								    loop
							 | 
						||
| 
								 | 
							
								      begin
							 | 
						||
| 
								 | 
							
								        declare n varchar(20);
							 | 
						||
| 
								 | 
							
								        declare continue handler for sqlexception set err=1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        fetch c into n;
							 | 
						||
| 
								 | 
							
								        if isnull(n) then
							 | 
						||
| 
								 | 
							
								          set nulls = nulls + 1;
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
								          set count = count + 1;
							 | 
						||
| 
								 | 
							
								          update t2 set idx = count where name=n;
							 | 
						||
| 
								 | 
							
								        end if;
							 | 
						||
| 
								 | 
							
								      end;
							 | 
						||
| 
								 | 
							
								    end loop;
							 | 
						||
| 
								 | 
							
								  end;
							 | 
						||
| 
								 | 
							
								  select t.name, t.idx from t2 t order by idx asc;
							 | 
						||
| 
								 | 
							
								end//
							 | 
						||
| 
								 | 
							
								delimiter ;//
							 | 
						||
| 
								 | 
							
								show procedure code code_sample;
							 | 
						||
| 
								 | 
							
								drop procedure code_sample;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# BUG#15737: Stored procedure optimizer bug with LEAVE
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# This is a much more extensive test case than is strictly needed,
							 | 
						||
| 
								 | 
							
								# but it was kept as is for two reasons:
							 | 
						||
| 
								 | 
							
								# - The bug occurs under some quite special circumstances, so it
							 | 
						||
| 
								 | 
							
								#   wasn't trivial to create a smaller test,
							 | 
						||
| 
								 | 
							
								# - There's some value in having another more complex code sample
							 | 
						||
| 
								 | 
							
								#   in this test file. This might catch future code generation bugs
							 | 
						||
| 
								 | 
							
								#   that doesn't show in behaviour in any obvious way.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--disable_warnings
							 | 
						||
| 
								 | 
							
								drop procedure if exists sudoku_solve;
							 | 
						||
| 
								 | 
							
								--enable_warnings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								delimiter //;
							 | 
						||
| 
								 | 
							
								create procedure sudoku_solve(p_naive boolean, p_all boolean)
							 | 
						||
| 
								 | 
							
								  deterministic
							 | 
						||
| 
								 | 
							
								  modifies sql data
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								  drop temporary table if exists sudoku_work, sudoku_schedule;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  create temporary table sudoku_work
							 | 
						||
| 
								 | 
							
								  (
							 | 
						||
| 
								 | 
							
								    row smallint not null,
							 | 
						||
| 
								 | 
							
								    col smallint not null,
							 | 
						||
| 
								 | 
							
								    dig smallint not null,
							 | 
						||
| 
								 | 
							
								    cnt smallint,
							 | 
						||
| 
								 | 
							
								    key using btree (cnt),
							 | 
						||
| 
								 | 
							
								    key using btree (row),
							 | 
						||
| 
								 | 
							
								    key using btree (col),
							 | 
						||
| 
								 | 
							
								    unique key using hash (row,col)
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  create temporary table sudoku_schedule
							 | 
						||
| 
								 | 
							
								  (
							 | 
						||
| 
								 | 
							
								    idx int not null auto_increment primary key,
							 | 
						||
| 
								 | 
							
								    row smallint not null,
							 | 
						||
| 
								 | 
							
								    col smallint not null
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  call sudoku_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if p_naive then
							 | 
						||
| 
								 | 
							
								    update sudoku_work set cnt = 0 where dig = 0;
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    call sudoku_count();
							 | 
						||
| 
								 | 
							
								  end if;
							 | 
						||
| 
								 | 
							
								  insert into sudoku_schedule (row,col)
							 | 
						||
| 
								 | 
							
								    select row,col from sudoku_work where cnt is not null order by cnt desc;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  begin
							 | 
						||
| 
								 | 
							
								    declare v_scounter bigint default 0;
							 | 
						||
| 
								 | 
							
								    declare v_i smallint default 1;
							 | 
						||
| 
								 | 
							
								    declare v_dig smallint;
							 | 
						||
| 
								 | 
							
								    declare v_schedmax smallint;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    select count(*) into v_schedmax from sudoku_schedule;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   more: 
							 | 
						||
| 
								 | 
							
								    loop
							 | 
						||
| 
								 | 
							
								    begin
							 | 
						||
| 
								 | 
							
								      declare v_tcounter bigint default 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     sched:
							 | 
						||
| 
								 | 
							
								      while v_i <= v_schedmax do
							 | 
						||
| 
								 | 
							
								      begin
							 | 
						||
| 
								 | 
							
								        declare v_row, v_col smallint;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        select row,col into v_row,v_col from sudoku_schedule where v_i = idx;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        select dig into v_dig from sudoku_work
							 | 
						||
| 
								 | 
							
								          where v_row = row and v_col = col;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        case v_dig
							 | 
						||
| 
								 | 
							
								        when 0 then
							 | 
						||
| 
								 | 
							
								          set v_dig = 1;
							 | 
						||
| 
								 | 
							
								          update sudoku_work set dig = 1
							 | 
						||
| 
								 | 
							
								            where v_row = row and v_col = col;
							 | 
						||
| 
								 | 
							
								        when 9 then
							 | 
						||
| 
								 | 
							
								          if v_i > 0 then
							 | 
						||
| 
								 | 
							
								            update sudoku_work set dig = 0
							 | 
						||
| 
								 | 
							
								              where v_row = row and v_col = col;
							 | 
						||
| 
								 | 
							
								            set v_i = v_i - 1;
							 | 
						||
| 
								 | 
							
								            iterate sched;
							 | 
						||
| 
								 | 
							
								          else
							 | 
						||
| 
								 | 
							
								            select v_scounter as 'Solutions';
							 | 
						||
| 
								 | 
							
								            leave more;
							 | 
						||
| 
								 | 
							
								          end if;
							 | 
						||
| 
								 | 
							
								        else
							 | 
						||
| 
								 | 
							
								          set v_dig = v_dig + 1;
							 | 
						||
| 
								 | 
							
								          update sudoku_work set dig = v_dig
							 | 
						||
| 
								 | 
							
								            where v_row = row and v_col = col;
							 | 
						||
| 
								 | 
							
								        end case;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        set v_tcounter = v_tcounter + 1;
							 | 
						||
| 
								 | 
							
								        if not sudoku_digit_ok(v_row, v_col, v_dig) then
							 | 
						||
| 
								 | 
							
								          iterate sched;
							 | 
						||
| 
								 | 
							
								        end if;
							 | 
						||
| 
								 | 
							
								        set v_i = v_i + 1;
							 | 
						||
| 
								 | 
							
								      end;
							 | 
						||
| 
								 | 
							
								      end while sched;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      select dig from sudoku_work;
							 | 
						||
| 
								 | 
							
								      select v_tcounter as 'Tests';
							 | 
						||
| 
								 | 
							
								      set v_scounter = v_scounter + 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if p_all and v_i > 0 then
							 | 
						||
| 
								 | 
							
								        set v_i = v_i - 1;
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								        leave more;
							 | 
						||
| 
								 | 
							
								      end if;
							 | 
						||
| 
								 | 
							
								    end;
							 | 
						||
| 
								 | 
							
								    end loop more;
							 | 
						||
| 
								 | 
							
								  end;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  drop temporary table sudoku_work, sudoku_schedule;
							 | 
						||
| 
								 | 
							
								end//
							 | 
						||
| 
								 | 
							
								delimiter ;//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# The interestings parts are where the code for the two "leave" are:
							 | 
						||
| 
								 | 
							
								# ...
							 | 
						||
| 
								 | 
							
								#|  26 | jump_if_not 30 (v_i@3 > 0)                                            |
							 | 
						||
| 
								 | 
							
								# ...
							 | 
						||
| 
								 | 
							
								#|  30 | stmt 0 "select v_scounter as 'Solutions'"                             |
							 | 
						||
| 
								 | 
							
								#|  31 | jump 45                                                               |
							 | 
						||
| 
								 | 
							
								# ...
							 | 
						||
| 
								 | 
							
								#|  42 | jump_if_not 45 (p_all@1 and (v_i@3 > 0))                              |
							 | 
						||
| 
								 | 
							
								#|  43 | set v_i@3 (v_i@3 - 1)                                                 |
							 | 
						||
| 
								 | 
							
								#|  44 | jump 14                                                               |
							 | 
						||
| 
								 | 
							
								#|  45 | stmt 9 "drop temporary table sudoku_work, sud..."                     |
							 | 
						||
| 
								 | 
							
								#+-----+-----------------------------------------------------------------------+
							 | 
						||
| 
								 | 
							
								# The bug appeared at position 42 (with the wrong destination).
							 | 
						||
| 
								 | 
							
								show procedure code sudoku_solve;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop procedure sudoku_solve;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug#19194 (Right recursion in parser for CASE causes excessive stack
							 | 
						||
| 
								 | 
							
								#   usage, limitation)
							 | 
						||
| 
								 | 
							
								# This bug also exposed a flaw in the generated code with nested case
							 | 
						||
| 
								 | 
							
								# statements
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--disable_warnings
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE IF EXISTS proc_19194_simple;
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE IF EXISTS proc_19194_searched;
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE IF EXISTS proc_19194_nested_1;
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE IF EXISTS proc_19194_nested_2;
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE IF EXISTS proc_19194_nested_3;
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE IF EXISTS proc_19194_nested_4;
							 | 
						||
| 
								 | 
							
								--enable_warnings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								delimiter |;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CREATE PROCEDURE proc_19194_simple(i int)
							 | 
						||
| 
								 | 
							
								BEGIN
							 | 
						||
| 
								 | 
							
								  DECLARE str CHAR(10);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  CASE i
							 | 
						||
| 
								 | 
							
								    WHEN 1 THEN SET str="1";
							 | 
						||
| 
								 | 
							
								    WHEN 2 THEN SET str="2";
							 | 
						||
| 
								 | 
							
								    WHEN 3 THEN SET str="3";
							 | 
						||
| 
								 | 
							
								    ELSE SET str="unknown";
							 | 
						||
| 
								 | 
							
								  END CASE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SELECT str;
							 | 
						||
| 
								 | 
							
								END|
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CREATE PROCEDURE proc_19194_searched(i int)
							 | 
						||
| 
								 | 
							
								BEGIN
							 | 
						||
| 
								 | 
							
								  DECLARE str CHAR(10);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  CASE
							 | 
						||
| 
								 | 
							
								    WHEN i=1 THEN SET str="1";
							 | 
						||
| 
								 | 
							
								    WHEN i=2 THEN SET str="2";
							 | 
						||
| 
								 | 
							
								    WHEN i=3 THEN SET str="3";
							 | 
						||
| 
								 | 
							
								    ELSE SET str="unknown";
							 | 
						||
| 
								 | 
							
								  END CASE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SELECT str;
							 | 
						||
| 
								 | 
							
								END|
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Outer SIMPLE case, inner SEARCHED case
							 | 
						||
| 
								 | 
							
								CREATE PROCEDURE proc_19194_nested_1(i int, j int)
							 | 
						||
| 
								 | 
							
								BEGIN
							 | 
						||
| 
								 | 
							
								  DECLARE str_i CHAR(10);
							 | 
						||
| 
								 | 
							
								  DECLARE str_j CHAR(10);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  CASE i
							 | 
						||
| 
								 | 
							
								    WHEN 10 THEN SET str_i="10";
							 | 
						||
| 
								 | 
							
								    WHEN 20 THEN
							 | 
						||
| 
								 | 
							
								    BEGIN
							 | 
						||
| 
								 | 
							
								      set str_i="20";
							 | 
						||
| 
								 | 
							
								      CASE
							 | 
						||
| 
								 | 
							
								        WHEN j=1 THEN SET str_j="1";
							 | 
						||
| 
								 | 
							
								        WHEN j=2 THEN SET str_j="2";
							 | 
						||
| 
								 | 
							
								        WHEN j=3 THEN SET str_j="3";
							 | 
						||
| 
								 | 
							
								      ELSE SET str_j="unknown";
							 | 
						||
| 
								 | 
							
								      END CASE;
							 | 
						||
| 
								 | 
							
								      select "i was 20";
							 | 
						||
| 
								 | 
							
								    END;
							 | 
						||
| 
								 | 
							
								    WHEN 30 THEN SET str_i="30";
							 | 
						||
| 
								 | 
							
								    WHEN 40 THEN SET str_i="40";
							 | 
						||
| 
								 | 
							
								    ELSE SET str_i="unknown";
							 | 
						||
| 
								 | 
							
								  END CASE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SELECT str_i, str_j;
							 | 
						||
| 
								 | 
							
								END|
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Outer SEARCHED case, inner SIMPLE case
							 | 
						||
| 
								 | 
							
								CREATE PROCEDURE proc_19194_nested_2(i int, j int)
							 | 
						||
| 
								 | 
							
								BEGIN
							 | 
						||
| 
								 | 
							
								  DECLARE str_i CHAR(10);
							 | 
						||
| 
								 | 
							
								  DECLARE str_j CHAR(10);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  CASE
							 | 
						||
| 
								 | 
							
								    WHEN i=10 THEN SET str_i="10";
							 | 
						||
| 
								 | 
							
								    WHEN i=20 THEN
							 | 
						||
| 
								 | 
							
								    BEGIN
							 | 
						||
| 
								 | 
							
								      set str_i="20";
							 | 
						||
| 
								 | 
							
								      CASE j
							 | 
						||
| 
								 | 
							
								        WHEN 1 THEN SET str_j="1";
							 | 
						||
| 
								 | 
							
								        WHEN 2 THEN SET str_j="2";
							 | 
						||
| 
								 | 
							
								        WHEN 3 THEN SET str_j="3";
							 | 
						||
| 
								 | 
							
								      ELSE SET str_j="unknown";
							 | 
						||
| 
								 | 
							
								      END CASE;
							 | 
						||
| 
								 | 
							
								      select "i was 20";
							 | 
						||
| 
								 | 
							
								    END;
							 | 
						||
| 
								 | 
							
								    WHEN i=30 THEN SET str_i="30";
							 | 
						||
| 
								 | 
							
								    WHEN i=40 THEN SET str_i="40";
							 | 
						||
| 
								 | 
							
								    ELSE SET str_i="unknown";
							 | 
						||
| 
								 | 
							
								  END CASE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SELECT str_i, str_j;
							 | 
						||
| 
								 | 
							
								END|
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Outer SIMPLE case, inner SIMPLE case
							 | 
						||
| 
								 | 
							
								CREATE PROCEDURE proc_19194_nested_3(i int, j int)
							 | 
						||
| 
								 | 
							
								BEGIN
							 | 
						||
| 
								 | 
							
								  DECLARE str_i CHAR(10);
							 | 
						||
| 
								 | 
							
								  DECLARE str_j CHAR(10);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  CASE i
							 | 
						||
| 
								 | 
							
								    WHEN 10 THEN SET str_i="10";
							 | 
						||
| 
								 | 
							
								    WHEN 20 THEN
							 | 
						||
| 
								 | 
							
								    BEGIN
							 | 
						||
| 
								 | 
							
								      set str_i="20";
							 | 
						||
| 
								 | 
							
								      CASE j
							 | 
						||
| 
								 | 
							
								        WHEN 1 THEN SET str_j="1";
							 | 
						||
| 
								 | 
							
								        WHEN 2 THEN SET str_j="2";
							 | 
						||
| 
								 | 
							
								        WHEN 3 THEN SET str_j="3";
							 | 
						||
| 
								 | 
							
								      ELSE SET str_j="unknown";
							 | 
						||
| 
								 | 
							
								      END CASE;
							 | 
						||
| 
								 | 
							
								      select "i was 20";
							 | 
						||
| 
								 | 
							
								    END;
							 | 
						||
| 
								 | 
							
								    WHEN 30 THEN SET str_i="30";
							 | 
						||
| 
								 | 
							
								    WHEN 40 THEN SET str_i="40";
							 | 
						||
| 
								 | 
							
								    ELSE SET str_i="unknown";
							 | 
						||
| 
								 | 
							
								  END CASE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SELECT str_i, str_j;
							 | 
						||
| 
								 | 
							
								END|
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Outer SEARCHED case, inner SEARCHED case
							 | 
						||
| 
								 | 
							
								CREATE PROCEDURE proc_19194_nested_4(i int, j int)
							 | 
						||
| 
								 | 
							
								BEGIN
							 | 
						||
| 
								 | 
							
								  DECLARE str_i CHAR(10);
							 | 
						||
| 
								 | 
							
								  DECLARE str_j CHAR(10);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  CASE
							 | 
						||
| 
								 | 
							
								    WHEN i=10 THEN SET str_i="10";
							 | 
						||
| 
								 | 
							
								    WHEN i=20 THEN
							 | 
						||
| 
								 | 
							
								    BEGIN
							 | 
						||
| 
								 | 
							
								      set str_i="20";
							 | 
						||
| 
								 | 
							
								      CASE
							 | 
						||
| 
								 | 
							
								        WHEN j=1 THEN SET str_j="1";
							 | 
						||
| 
								 | 
							
								        WHEN j=2 THEN SET str_j="2";
							 | 
						||
| 
								 | 
							
								        WHEN j=3 THEN SET str_j="3";
							 | 
						||
| 
								 | 
							
								      ELSE SET str_j="unknown";
							 | 
						||
| 
								 | 
							
								      END CASE;
							 | 
						||
| 
								 | 
							
								      select "i was 20";
							 | 
						||
| 
								 | 
							
								    END;
							 | 
						||
| 
								 | 
							
								    WHEN i=30 THEN SET str_i="30";
							 | 
						||
| 
								 | 
							
								    WHEN i=40 THEN SET str_i="40";
							 | 
						||
| 
								 | 
							
								    ELSE SET str_i="unknown";
							 | 
						||
| 
								 | 
							
								  END CASE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SELECT str_i, str_j;
							 | 
						||
| 
								 | 
							
								END|
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								delimiter ;|
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SHOW PROCEDURE CODE proc_19194_simple;
							 | 
						||
| 
								 | 
							
								SHOW PROCEDURE CODE proc_19194_searched;
							 | 
						||
| 
								 | 
							
								SHOW PROCEDURE CODE proc_19194_nested_1;
							 | 
						||
| 
								 | 
							
								SHOW PROCEDURE CODE proc_19194_nested_2;
							 | 
						||
| 
								 | 
							
								SHOW PROCEDURE CODE proc_19194_nested_3;
							 | 
						||
| 
								 | 
							
								SHOW PROCEDURE CODE proc_19194_nested_4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_1(10, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Before 19194, the generated code was:
							 | 
						||
| 
								 | 
							
								#   20      jump_if_not 23(27) 30
							 | 
						||
| 
								 | 
							
								#   21      set str_i@2 _latin1'30'
							 | 
						||
| 
								 | 
							
								# As opposed to the expected:
							 | 
						||
| 
								 | 
							
								#   20      jump_if_not 23(27) (case_expr@0 = 30)
							 | 
						||
| 
								 | 
							
								#   21      set str_i@2 _latin1'30'
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# and as a result, this call returned "30",
							 | 
						||
| 
								 | 
							
								# because the expression 30 is always true,
							 | 
						||
| 
								 | 
							
								# masking the case 40, case 0 and the else.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_1(25, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_1(20, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_1(20, 2);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_1(20, 3);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_1(20, 4);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_1(30, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_1(40, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_1(0, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_2(10, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Before 19194, the generated code was:
							 | 
						||
| 
								 | 
							
								#   20      jump_if_not 23(27) (case_expr@0 = (i@0 = 30))
							 | 
						||
| 
								 | 
							
								#   21      set str_i@2 _latin1'30'
							 | 
						||
| 
								 | 
							
								# As opposed to the expected:
							 | 
						||
| 
								 | 
							
								#   20      jump_if_not 23(27) (i@0 = 30)
							 | 
						||
| 
								 | 
							
								#   21      set str_i@2 _latin1'30'
							 | 
						||
| 
								 | 
							
								# and as a result, this call crashed the server, because there is no
							 | 
						||
| 
								 | 
							
								# such variable as "case_expr@0".
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_2(25, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_2(20, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_2(20, 2);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_2(20, 3);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_2(20, 4);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_2(30, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_2(40, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_2(0, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_3(10, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_3(25, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_3(20, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_3(20, 2);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_3(20, 3);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_3(20, 4);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_3(30, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_3(40, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_3(0, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_4(10, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_4(25, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_4(20, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_4(20, 2);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_4(20, 3);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_4(20, 4);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_4(30, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_4(40, 1);
							 | 
						||
| 
								 | 
							
								CALL proc_19194_nested_4(0, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE proc_19194_simple;
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE proc_19194_searched;
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE proc_19194_nested_1;
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE proc_19194_nested_2;
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE proc_19194_nested_3;
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE proc_19194_nested_4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug#19207: Final parenthesis omitted for CREATE INDEX in Stored
							 | 
						||
| 
								 | 
							
								# Procedure
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Wrong criteria was used to distinguish the case when there was no
							 | 
						||
| 
								 | 
							
								# lookahead performed in the parser.  Bug affected only statements
							 | 
						||
| 
								 | 
							
								# ending in one-character token without any optional tail, like CREATE
							 | 
						||
| 
								 | 
							
								# INDEX and CALL.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								--disable_warnings
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE IF EXISTS p1;
							 | 
						||
| 
								 | 
							
								--enable_warnings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CREATE PROCEDURE p1() CREATE INDEX idx ON t1 (c1);
							 | 
						||
| 
								 | 
							
								SHOW PROCEDURE CODE p1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE p1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug#26977 exception handlers never hreturn
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								--disable_warnings
							 | 
						||
| 
								 | 
							
								drop table if exists t1;
							 | 
						||
| 
								 | 
							
								drop procedure if exists proc_26977_broken;
							 | 
						||
| 
								 | 
							
								drop procedure if exists proc_26977_works;
							 | 
						||
| 
								 | 
							
								--enable_warnings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create table t1(a int unique);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								delimiter //;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create procedure proc_26977_broken(v int)
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								  declare i int default 5;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  declare continue handler for sqlexception
							 | 
						||
| 
								 | 
							
								  begin
							 | 
						||
| 
								 | 
							
								    select 'caught something';
							 | 
						||
| 
								 | 
							
								    retry:
							 | 
						||
| 
								 | 
							
								    while i > 0 do
							 | 
						||
| 
								 | 
							
								      begin
							 | 
						||
| 
								 | 
							
								        set i = i - 1;
							 | 
						||
| 
								 | 
							
								        select 'looping', i;
							 | 
						||
| 
								 | 
							
								      end;
							 | 
						||
| 
								 | 
							
								    end while retry;
							 | 
						||
| 
								 | 
							
								  end;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  select 'do something';
							 | 
						||
| 
								 | 
							
								  insert into t1 values (v);
							 | 
						||
| 
								 | 
							
								  select 'do something again';
							 | 
						||
| 
								 | 
							
								  insert into t1 values (v);
							 | 
						||
| 
								 | 
							
								end//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create procedure proc_26977_works(v int)
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								  declare i int default 5;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  declare continue handler for sqlexception
							 | 
						||
| 
								 | 
							
								  begin
							 | 
						||
| 
								 | 
							
								    select 'caught something';
							 | 
						||
| 
								 | 
							
								    retry:
							 | 
						||
| 
								 | 
							
								    while i > 0 do
							 | 
						||
| 
								 | 
							
								      begin
							 | 
						||
| 
								 | 
							
								        set i = i - 1;
							 | 
						||
| 
								 | 
							
								        select 'looping', i;
							 | 
						||
| 
								 | 
							
								      end;
							 | 
						||
| 
								 | 
							
								    end while retry;
							 | 
						||
| 
								 | 
							
								    select 'optimizer: keep hreturn';
							 | 
						||
| 
								 | 
							
								  end;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  select 'do something';
							 | 
						||
| 
								 | 
							
								  insert into t1 values (v);
							 | 
						||
| 
								 | 
							
								  select 'do something again';
							 | 
						||
| 
								 | 
							
								  insert into t1 values (v);
							 | 
						||
| 
								 | 
							
								end//
							 | 
						||
| 
								 | 
							
								delimiter ;//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								show procedure code proc_26977_broken;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								show procedure code proc_26977_works;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## This caust an error because of jump short cut
							 | 
						||
| 
								 | 
							
								## optimization.
							 | 
						||
| 
								 | 
							
								call proc_26977_broken(1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## This works
							 | 
						||
| 
								 | 
							
								call proc_26977_works(2);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop table t1;
							 | 
						||
| 
								 | 
							
								drop procedure proc_26977_broken;
							 | 
						||
| 
								 | 
							
								drop procedure proc_26977_works;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug#33618 Crash in sp_rcontext
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--disable_warnings
							 | 
						||
| 
								 | 
							
								drop procedure if exists proc_33618_h;
							 | 
						||
| 
								 | 
							
								drop procedure if exists proc_33618_c;
							 | 
						||
| 
								 | 
							
								--enable_warnings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								delimiter //;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create procedure proc_33618_h(num int)
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								  declare count1 int default '0';
							 | 
						||
| 
								 | 
							
								  declare vb varchar(30);
							 | 
						||
| 
								 | 
							
								  declare last_row int;
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								  while(num>=1) do
							 | 
						||
| 
								 | 
							
								    set num=num-1;
							 | 
						||
| 
								 | 
							
								    begin
							 | 
						||
| 
								 | 
							
								      declare cur1 cursor for select `a` from t_33618;
							 | 
						||
| 
								 | 
							
								      declare continue handler for not found set last_row = 1;
							 | 
						||
| 
								 | 
							
								      set last_row:=0;
							 | 
						||
| 
								 | 
							
								      open cur1;
							 | 
						||
| 
								 | 
							
								      rep1:
							 | 
						||
| 
								 | 
							
								      repeat
							 | 
						||
| 
								 | 
							
								        begin
							 | 
						||
| 
								 | 
							
								          declare exit handler for 1062 begin end;
							 | 
						||
| 
								 | 
							
								          fetch cur1 into vb;
							 | 
						||
| 
								 | 
							
								          if (last_row = 1) then
							 | 
						||
| 
								 | 
							
								            ## should generate a hpop instruction here
							 | 
						||
| 
								 | 
							
								            leave rep1;
							 | 
						||
| 
								 | 
							
								          end if;
							 | 
						||
| 
								 | 
							
								        end;
							 | 
						||
| 
								 | 
							
								        until last_row=1
							 | 
						||
| 
								 | 
							
								      end repeat;
							 | 
						||
| 
								 | 
							
								      close cur1;
							 | 
						||
| 
								 | 
							
								    end;
							 | 
						||
| 
								 | 
							
								  end while;
							 | 
						||
| 
								 | 
							
								end//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create procedure proc_33618_c(num int)
							 | 
						||
| 
								 | 
							
								begin
							 | 
						||
| 
								 | 
							
								  declare count1 int default '0';
							 | 
						||
| 
								 | 
							
								  declare vb varchar(30);
							 | 
						||
| 
								 | 
							
								  declare last_row int;
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								  while(num>=1) do
							 | 
						||
| 
								 | 
							
								    set num=num-1;
							 | 
						||
| 
								 | 
							
								    begin
							 | 
						||
| 
								 | 
							
								      declare cur1 cursor for select `a` from t_33618;
							 | 
						||
| 
								 | 
							
								      declare continue handler for not found set last_row = 1;
							 | 
						||
| 
								 | 
							
								      set last_row:=0;
							 | 
						||
| 
								 | 
							
								      open cur1;
							 | 
						||
| 
								 | 
							
								      rep1:
							 | 
						||
| 
								 | 
							
								      repeat
							 | 
						||
| 
								 | 
							
								        begin
							 | 
						||
| 
								 | 
							
								          declare cur2 cursor for select `b` from t_33618;
							 | 
						||
| 
								 | 
							
								          fetch cur1 into vb;
							 | 
						||
| 
								 | 
							
								          if (last_row = 1) then
							 | 
						||
| 
								 | 
							
								            ## should generate a cpop instruction here
							 | 
						||
| 
								 | 
							
								            leave rep1;
							 | 
						||
| 
								 | 
							
								          end if;
							 | 
						||
| 
								 | 
							
								        end;
							 | 
						||
| 
								 | 
							
								        until last_row=1
							 | 
						||
| 
								 | 
							
								      end repeat;
							 | 
						||
| 
								 | 
							
								      close cur1;
							 | 
						||
| 
								 | 
							
								    end;
							 | 
						||
| 
								 | 
							
								  end while;
							 | 
						||
| 
								 | 
							
								end//
							 | 
						||
| 
								 | 
							
								delimiter ;//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								show procedure code proc_33618_h;
							 | 
						||
| 
								 | 
							
								show procedure code proc_33618_c;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop procedure proc_33618_h;
							 | 
						||
| 
								 | 
							
								drop procedure proc_33618_c;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug#20906 (Multiple assignments in SET in stored routine produce incorrect
							 | 
						||
| 
								 | 
							
								# instructions)
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--disable_warnings
							 | 
						||
| 
								 | 
							
								drop procedure if exists p_20906_a;
							 | 
						||
| 
								 | 
							
								drop procedure if exists p_20906_b;
							 | 
						||
| 
								 | 
							
								--enable_warnings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create procedure p_20906_a() SET @a=@a+1, @b=@b+1;
							 | 
						||
| 
								 | 
							
								show procedure code p_20906_a;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set @a=1;
							 | 
						||
| 
								 | 
							
								set @b=1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								call p_20906_a();
							 | 
						||
| 
								 | 
							
								select @a, @b;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								create procedure p_20906_b() SET @a=@a+1, @b=@b+1, @c=@c+1;
							 | 
						||
| 
								 | 
							
								show procedure code p_20906_b;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set @a=1;
							 | 
						||
| 
								 | 
							
								set @b=1;
							 | 
						||
| 
								 | 
							
								set @c=1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								call p_20906_b();
							 | 
						||
| 
								 | 
							
								select @a, @b, @c;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								drop procedure p_20906_a;
							 | 
						||
| 
								 | 
							
								drop procedure p_20906_b;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo End of 5.0 tests.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Bug #26303: reserve() not called before qs_append() may lead to buffer
							 | 
						||
| 
								 | 
							
								# overflow
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								DELIMITER //;
							 | 
						||
| 
								 | 
							
								CREATE PROCEDURE p1() 
							 | 
						||
| 
								 | 
							
								BEGIN 
							 | 
						||
| 
								 | 
							
								  DECLARE dummy int default 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  CASE 12 
							 | 
						||
| 
								 | 
							
								    WHEN 12 
							 | 
						||
| 
								 | 
							
								    THEN SET dummy = 0;
							 | 
						||
| 
								 | 
							
								  END CASE;
							 | 
						||
| 
								 | 
							
								END//
							 | 
						||
| 
								 | 
							
								DELIMITER ;//
							 | 
						||
| 
								 | 
							
								SHOW PROCEDURE CODE p1;
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE p1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo #
							 | 
						||
| 
								 | 
							
								--echo # Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE
							 | 
						||
| 
								 | 
							
								--echo #
							 | 
						||
| 
								 | 
							
								SET @@SQL_MODE = '';
							 | 
						||
| 
								 | 
							
								DELIMITER $;
							 | 
						||
| 
								 | 
							
								CREATE FUNCTION testf_bug11763507() RETURNS INT
							 | 
						||
| 
								 | 
							
								BEGIN
							 | 
						||
| 
								 | 
							
								    RETURN 0;
							 | 
						||
| 
								 | 
							
								END
							 | 
						||
| 
								 | 
							
								$
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CREATE PROCEDURE testp_bug11763507()
							 | 
						||
| 
								 | 
							
								BEGIN
							 | 
						||
| 
								 | 
							
								    SELECT "PROCEDURE testp_bug11763507";
							 | 
						||
| 
								 | 
							
								END
							 | 
						||
| 
								 | 
							
								$
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DELIMITER ;$
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# STORED FUNCTIONS
							 | 
						||
| 
								 | 
							
								SHOW FUNCTION CODE testf_bug11763507;
							 | 
						||
| 
								 | 
							
								SHOW FUNCTION CODE TESTF_bug11763507;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# STORED PROCEDURE
							 | 
						||
| 
								 | 
							
								SHOW PROCEDURE CODE testp_bug11763507;
							 | 
						||
| 
								 | 
							
								SHOW PROCEDURE CODE TESTP_bug11763507;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DROP PROCEDURE testp_bug11763507;
							 | 
						||
| 
								 | 
							
								DROP FUNCTION testf_bug11763507;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--echo #END OF BUG#11763507 test.
							 |