920 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			920 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | drop procedure if exists empty; | ||
|  | drop procedure if exists code_sample; | ||
|  | create procedure empty() | ||
|  | begin | ||
|  | end; | ||
|  | show procedure code empty; | ||
|  | Pos	Instruction | ||
|  | drop procedure empty; | ||
|  | create function almost_empty() | ||
|  | returns int | ||
|  | return 0; | ||
|  | show function code almost_empty; | ||
|  | Pos	Instruction | ||
|  | 0	freturn 3 0 | ||
|  | drop function almost_empty; | ||
|  | 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// | ||
|  | show procedure code code_sample; | ||
|  | Pos	Instruction | ||
|  | 0	set count@3 0 | ||
|  | 1	set nulls@2 0 | ||
|  | 2	cpush c@0 | ||
|  | 3	hpush_jump 6 4 EXIT | ||
|  | 4	cclose c@0 | ||
|  | 5	hreturn 0 19 | ||
|  | 6	copen c@0 | ||
|  | 7	set n@4 NULL | ||
|  | 8	hpush_jump 11 5 CONTINUE | ||
|  | 9	set err@1 1 | ||
|  | 10	hreturn 5 | ||
|  | 11	cfetch c@0 n@4 | ||
|  | 12	jump_if_not 15(17) isnull(n@4) | ||
|  | 13	set nulls@2 (nulls@2 + 1) | ||
|  | 14	jump 17 | ||
|  | 15	set count@3 (count@3 + 1) | ||
|  | 16	stmt 4 "update t2 set idx = count where name=n" | ||
|  | 17	hpop 1 | ||
|  | 18	jump 7 | ||
|  | 19	hpop 1 | ||
|  | 20	cpop 1 | ||
|  | 21	stmt 0 "select t.name, t.idx from t2 t order ..." | ||
|  | drop procedure code_sample; | ||
|  | drop procedure if exists sudoku_solve; | ||
|  | 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// | ||
|  | show procedure code sudoku_solve; | ||
|  | Pos	Instruction | ||
|  | 0	stmt 9 "drop temporary table if exists sudoku..." | ||
|  | 1	stmt 1 "create temporary table sudoku_work ( ..." | ||
|  | 2	stmt 1 "create temporary table sudoku_schedul..." | ||
|  | 3	stmt 94 "call sudoku_init()" | ||
|  | 4	jump_if_not 7(8) p_naive@0 | ||
|  | 5	stmt 4 "update sudoku_work set cnt = 0 where ..." | ||
|  | 6	jump 8 | ||
|  | 7	stmt 94 "call sudoku_count()" | ||
|  | 8	stmt 6 "insert into sudoku_schedule (row,col)..." | ||
|  | 9	set v_scounter@2 0 | ||
|  | 10	set v_i@3 1 | ||
|  | 11	set v_dig@4 NULL | ||
|  | 12	set v_schedmax@5 NULL | ||
|  | 13	stmt 0 "select count(*) into v_schedmax from ..." | ||
|  | 14	set v_tcounter@6 0 | ||
|  | 15	jump_if_not 39(39) (v_i@3 <= v_schedmax@5) | ||
|  | 16	set v_row@7 NULL | ||
|  | 17	set v_col@8 NULL | ||
|  | 18	stmt 0 "select row,col into v_row,v_col from ..." | ||
|  | 19	stmt 0 "select dig into v_dig from sudoku_wor..." | ||
|  | 20	set_case_expr (34) 0 v_dig@4 | ||
|  | 21	jump_if_not 25(34) (case_expr@0 = 0) | ||
|  | 22	set v_dig@4 1 | ||
|  | 23	stmt 4 "update sudoku_work set dig = 1 where ..." | ||
|  | 24	jump 34 | ||
|  | 25	jump_if_not 32(34) (case_expr@0 = 9) | ||
|  | 26	jump_if_not 30(34) (v_i@3 > 0) | ||
|  | 27	stmt 4 "update sudoku_work set dig = 0 where ..." | ||
|  | 28	set v_i@3 (v_i@3 - 1) | ||
|  | 29	jump 15 | ||
|  | 30	stmt 0 "select v_scounter as 'Solutions'" | ||
|  | 31	jump 45 | ||
|  | 32	set v_dig@4 (v_dig@4 + 1) | ||
|  | 33	stmt 4 "update sudoku_work set dig = v_dig wh..." | ||
|  | 34	set v_tcounter@6 (v_tcounter@6 + 1) | ||
|  | 35	jump_if_not 37(37) (not(`sudoku_digit_ok`(v_row@7,v_col@8,v_dig@4))) | ||
|  | 36	jump 15 | ||
|  | 37	set v_i@3 (v_i@3 + 1) | ||
|  | 38	jump 15 | ||
|  | 39	stmt 0 "select dig from sudoku_work" | ||
|  | 40	stmt 0 "select v_tcounter as 'Tests'" | ||
|  | 41	set v_scounter@2 (v_scounter@2 + 1) | ||
|  | 42	jump_if_not 45(14) (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..." | ||
|  | drop procedure sudoku_solve; | ||
|  | 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; | ||
|  | 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| | ||
|  | 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| | ||
|  | 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| | ||
|  | 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| | ||
|  | 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| | ||
|  | SHOW PROCEDURE CODE proc_19194_simple; | ||
|  | Pos	Instruction | ||
|  | 0	set str@1 NULL | ||
|  | 1	set_case_expr (12) 0 i@0 | ||
|  | 2	jump_if_not 5(12) (case_expr@0 = 1) | ||
|  | 3	set str@1 '1' | ||
|  | 4	jump 12 | ||
|  | 5	jump_if_not 8(12) (case_expr@0 = 2) | ||
|  | 6	set str@1 '2' | ||
|  | 7	jump 12 | ||
|  | 8	jump_if_not 11(12) (case_expr@0 = 3) | ||
|  | 9	set str@1 '3' | ||
|  | 10	jump 12 | ||
|  | 11	set str@1 'unknown' | ||
|  | 12	stmt 0 "SELECT str" | ||
|  | SHOW PROCEDURE CODE proc_19194_searched; | ||
|  | Pos	Instruction | ||
|  | 0	set str@1 NULL | ||
|  | 1	jump_if_not 4(11) (i@0 = 1) | ||
|  | 2	set str@1 '1' | ||
|  | 3	jump 11 | ||
|  | 4	jump_if_not 7(11) (i@0 = 2) | ||
|  | 5	set str@1 '2' | ||
|  | 6	jump 11 | ||
|  | 7	jump_if_not 10(11) (i@0 = 3) | ||
|  | 8	set str@1 '3' | ||
|  | 9	jump 11 | ||
|  | 10	set str@1 'unknown' | ||
|  | 11	stmt 0 "SELECT str" | ||
|  | SHOW PROCEDURE CODE proc_19194_nested_1; | ||
|  | Pos	Instruction | ||
|  | 0	set str_i@2 NULL | ||
|  | 1	set str_j@3 NULL | ||
|  | 2	set_case_expr (27) 0 i@0 | ||
|  | 3	jump_if_not 6(27) (case_expr@0 = 10) | ||
|  | 4	set str_i@2 '10' | ||
|  | 5	jump 27 | ||
|  | 6	jump_if_not 20(27) (case_expr@0 = 20) | ||
|  | 7	set str_i@2 '20' | ||
|  | 8	jump_if_not 11(18) (j@1 = 1) | ||
|  | 9	set str_j@3 '1' | ||
|  | 10	jump 18 | ||
|  | 11	jump_if_not 14(18) (j@1 = 2) | ||
|  | 12	set str_j@3 '2' | ||
|  | 13	jump 18 | ||
|  | 14	jump_if_not 17(18) (j@1 = 3) | ||
|  | 15	set str_j@3 '3' | ||
|  | 16	jump 18 | ||
|  | 17	set str_j@3 'unknown' | ||
|  | 18	stmt 0 "select "i was 20"" | ||
|  | 19	jump 27 | ||
|  | 20	jump_if_not 23(27) (case_expr@0 = 30) | ||
|  | 21	set str_i@2 '30' | ||
|  | 22	jump 27 | ||
|  | 23	jump_if_not 26(27) (case_expr@0 = 40) | ||
|  | 24	set str_i@2 '40' | ||
|  | 25	jump 27 | ||
|  | 26	set str_i@2 'unknown' | ||
|  | 27	stmt 0 "SELECT str_i, str_j" | ||
|  | SHOW PROCEDURE CODE proc_19194_nested_2; | ||
|  | Pos	Instruction | ||
|  | 0	set str_i@2 NULL | ||
|  | 1	set str_j@3 NULL | ||
|  | 2	jump_if_not 5(27) (i@0 = 10) | ||
|  | 3	set str_i@2 '10' | ||
|  | 4	jump 27 | ||
|  | 5	jump_if_not 20(27) (i@0 = 20) | ||
|  | 6	set str_i@2 '20' | ||
|  | 7	set_case_expr (18) 0 j@1 | ||
|  | 8	jump_if_not 11(18) (case_expr@0 = 1) | ||
|  | 9	set str_j@3 '1' | ||
|  | 10	jump 18 | ||
|  | 11	jump_if_not 14(18) (case_expr@0 = 2) | ||
|  | 12	set str_j@3 '2' | ||
|  | 13	jump 18 | ||
|  | 14	jump_if_not 17(18) (case_expr@0 = 3) | ||
|  | 15	set str_j@3 '3' | ||
|  | 16	jump 18 | ||
|  | 17	set str_j@3 'unknown' | ||
|  | 18	stmt 0 "select "i was 20"" | ||
|  | 19	jump 27 | ||
|  | 20	jump_if_not 23(27) (i@0 = 30) | ||
|  | 21	set str_i@2 '30' | ||
|  | 22	jump 27 | ||
|  | 23	jump_if_not 26(27) (i@0 = 40) | ||
|  | 24	set str_i@2 '40' | ||
|  | 25	jump 27 | ||
|  | 26	set str_i@2 'unknown' | ||
|  | 27	stmt 0 "SELECT str_i, str_j" | ||
|  | SHOW PROCEDURE CODE proc_19194_nested_3; | ||
|  | Pos	Instruction | ||
|  | 0	set str_i@2 NULL | ||
|  | 1	set str_j@3 NULL | ||
|  | 2	set_case_expr (28) 0 i@0 | ||
|  | 3	jump_if_not 6(28) (case_expr@0 = 10) | ||
|  | 4	set str_i@2 '10' | ||
|  | 5	jump 28 | ||
|  | 6	jump_if_not 21(28) (case_expr@0 = 20) | ||
|  | 7	set str_i@2 '20' | ||
|  | 8	set_case_expr (19) 1 j@1 | ||
|  | 9	jump_if_not 12(19) (case_expr@1 = 1) | ||
|  | 10	set str_j@3 '1' | ||
|  | 11	jump 19 | ||
|  | 12	jump_if_not 15(19) (case_expr@1 = 2) | ||
|  | 13	set str_j@3 '2' | ||
|  | 14	jump 19 | ||
|  | 15	jump_if_not 18(19) (case_expr@1 = 3) | ||
|  | 16	set str_j@3 '3' | ||
|  | 17	jump 19 | ||
|  | 18	set str_j@3 'unknown' | ||
|  | 19	stmt 0 "select "i was 20"" | ||
|  | 20	jump 28 | ||
|  | 21	jump_if_not 24(28) (case_expr@0 = 30) | ||
|  | 22	set str_i@2 '30' | ||
|  | 23	jump 28 | ||
|  | 24	jump_if_not 27(28) (case_expr@0 = 40) | ||
|  | 25	set str_i@2 '40' | ||
|  | 26	jump 28 | ||
|  | 27	set str_i@2 'unknown' | ||
|  | 28	stmt 0 "SELECT str_i, str_j" | ||
|  | SHOW PROCEDURE CODE proc_19194_nested_4; | ||
|  | Pos	Instruction | ||
|  | 0	set str_i@2 NULL | ||
|  | 1	set str_j@3 NULL | ||
|  | 2	jump_if_not 5(26) (i@0 = 10) | ||
|  | 3	set str_i@2 '10' | ||
|  | 4	jump 26 | ||
|  | 5	jump_if_not 19(26) (i@0 = 20) | ||
|  | 6	set str_i@2 '20' | ||
|  | 7	jump_if_not 10(17) (j@1 = 1) | ||
|  | 8	set str_j@3 '1' | ||
|  | 9	jump 17 | ||
|  | 10	jump_if_not 13(17) (j@1 = 2) | ||
|  | 11	set str_j@3 '2' | ||
|  | 12	jump 17 | ||
|  | 13	jump_if_not 16(17) (j@1 = 3) | ||
|  | 14	set str_j@3 '3' | ||
|  | 15	jump 17 | ||
|  | 16	set str_j@3 'unknown' | ||
|  | 17	stmt 0 "select "i was 20"" | ||
|  | 18	jump 26 | ||
|  | 19	jump_if_not 22(26) (i@0 = 30) | ||
|  | 20	set str_i@2 '30' | ||
|  | 21	jump 26 | ||
|  | 22	jump_if_not 25(26) (i@0 = 40) | ||
|  | 23	set str_i@2 '40' | ||
|  | 24	jump 26 | ||
|  | 25	set str_i@2 'unknown' | ||
|  | 26	stmt 0 "SELECT str_i, str_j" | ||
|  | CALL proc_19194_nested_1(10, 1); | ||
|  | str_i	str_j | ||
|  | 10	NULL | ||
|  | CALL proc_19194_nested_1(25, 1); | ||
|  | str_i	str_j | ||
|  | unknown	NULL | ||
|  | CALL proc_19194_nested_1(20, 1); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	1 | ||
|  | CALL proc_19194_nested_1(20, 2); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	2 | ||
|  | CALL proc_19194_nested_1(20, 3); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	3 | ||
|  | CALL proc_19194_nested_1(20, 4); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	unknown | ||
|  | CALL proc_19194_nested_1(30, 1); | ||
|  | str_i	str_j | ||
|  | 30	NULL | ||
|  | CALL proc_19194_nested_1(40, 1); | ||
|  | str_i	str_j | ||
|  | 40	NULL | ||
|  | CALL proc_19194_nested_1(0, 0); | ||
|  | str_i	str_j | ||
|  | unknown	NULL | ||
|  | CALL proc_19194_nested_2(10, 1); | ||
|  | str_i	str_j | ||
|  | 10	NULL | ||
|  | CALL proc_19194_nested_2(25, 1); | ||
|  | str_i	str_j | ||
|  | unknown	NULL | ||
|  | CALL proc_19194_nested_2(20, 1); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	1 | ||
|  | CALL proc_19194_nested_2(20, 2); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	2 | ||
|  | CALL proc_19194_nested_2(20, 3); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	3 | ||
|  | CALL proc_19194_nested_2(20, 4); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	unknown | ||
|  | CALL proc_19194_nested_2(30, 1); | ||
|  | str_i	str_j | ||
|  | 30	NULL | ||
|  | CALL proc_19194_nested_2(40, 1); | ||
|  | str_i	str_j | ||
|  | 40	NULL | ||
|  | CALL proc_19194_nested_2(0, 0); | ||
|  | str_i	str_j | ||
|  | unknown	NULL | ||
|  | CALL proc_19194_nested_3(10, 1); | ||
|  | str_i	str_j | ||
|  | 10	NULL | ||
|  | CALL proc_19194_nested_3(25, 1); | ||
|  | str_i	str_j | ||
|  | unknown	NULL | ||
|  | CALL proc_19194_nested_3(20, 1); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	1 | ||
|  | CALL proc_19194_nested_3(20, 2); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	2 | ||
|  | CALL proc_19194_nested_3(20, 3); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	3 | ||
|  | CALL proc_19194_nested_3(20, 4); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	unknown | ||
|  | CALL proc_19194_nested_3(30, 1); | ||
|  | str_i	str_j | ||
|  | 30	NULL | ||
|  | CALL proc_19194_nested_3(40, 1); | ||
|  | str_i	str_j | ||
|  | 40	NULL | ||
|  | CALL proc_19194_nested_3(0, 0); | ||
|  | str_i	str_j | ||
|  | unknown	NULL | ||
|  | CALL proc_19194_nested_4(10, 1); | ||
|  | str_i	str_j | ||
|  | 10	NULL | ||
|  | CALL proc_19194_nested_4(25, 1); | ||
|  | str_i	str_j | ||
|  | unknown	NULL | ||
|  | CALL proc_19194_nested_4(20, 1); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	1 | ||
|  | CALL proc_19194_nested_4(20, 2); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	2 | ||
|  | CALL proc_19194_nested_4(20, 3); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	3 | ||
|  | CALL proc_19194_nested_4(20, 4); | ||
|  | i was 20 | ||
|  | i was 20 | ||
|  | str_i	str_j | ||
|  | 20	unknown | ||
|  | CALL proc_19194_nested_4(30, 1); | ||
|  | str_i	str_j | ||
|  | 30	NULL | ||
|  | CALL proc_19194_nested_4(40, 1); | ||
|  | str_i	str_j | ||
|  | 40	NULL | ||
|  | CALL proc_19194_nested_4(0, 0); | ||
|  | str_i	str_j | ||
|  | unknown	NULL | ||
|  | 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; | ||
|  | DROP PROCEDURE IF EXISTS p1; | ||
|  | CREATE PROCEDURE p1() CREATE INDEX idx ON t1 (c1); | ||
|  | SHOW PROCEDURE CODE p1; | ||
|  | Pos	Instruction | ||
|  | 0	stmt 2 "CREATE INDEX idx ON t1 (c1)" | ||
|  | DROP PROCEDURE p1; | ||
|  | drop table if exists t1; | ||
|  | drop procedure if exists proc_26977_broken; | ||
|  | drop procedure if exists proc_26977_works; | ||
|  | create table t1(a int unique); | ||
|  | 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// | ||
|  | show procedure code proc_26977_broken; | ||
|  | Pos	Instruction | ||
|  | 0	set i@1 5 | ||
|  | 1	hpush_jump 8 2 CONTINUE | ||
|  | 2	stmt 0 "select 'caught something'" | ||
|  | 3	jump_if_not 7(7) (i@1 > 0) | ||
|  | 4	set i@1 (i@1 - 1) | ||
|  | 5	stmt 0 "select 'looping', i" | ||
|  | 6	jump 3 | ||
|  | 7	hreturn 2 | ||
|  | 8	stmt 0 "select 'do something'" | ||
|  | 9	stmt 5 "insert into t1 values (v)" | ||
|  | 10	stmt 0 "select 'do something again'" | ||
|  | 11	stmt 5 "insert into t1 values (v)" | ||
|  | 12	hpop 1 | ||
|  | show procedure code proc_26977_works; | ||
|  | Pos	Instruction | ||
|  | 0	set i@1 5 | ||
|  | 1	hpush_jump 9 2 CONTINUE | ||
|  | 2	stmt 0 "select 'caught something'" | ||
|  | 3	jump_if_not 7(7) (i@1 > 0) | ||
|  | 4	set i@1 (i@1 - 1) | ||
|  | 5	stmt 0 "select 'looping', i" | ||
|  | 6	jump 3 | ||
|  | 7	stmt 0 "select 'optimizer: keep hreturn'" | ||
|  | 8	hreturn 2 | ||
|  | 9	stmt 0 "select 'do something'" | ||
|  | 10	stmt 5 "insert into t1 values (v)" | ||
|  | 11	stmt 0 "select 'do something again'" | ||
|  | 12	stmt 5 "insert into t1 values (v)" | ||
|  | 13	hpop 1 | ||
|  | call proc_26977_broken(1); | ||
|  | do something | ||
|  | do something | ||
|  | do something again | ||
|  | do something again | ||
|  | caught something | ||
|  | caught something | ||
|  | looping	i | ||
|  | looping	4 | ||
|  | looping	i | ||
|  | looping	3 | ||
|  | looping	i | ||
|  | looping	2 | ||
|  | looping	i | ||
|  | looping	1 | ||
|  | looping	i | ||
|  | looping	0 | ||
|  | call proc_26977_works(2); | ||
|  | do something | ||
|  | do something | ||
|  | do something again | ||
|  | do something again | ||
|  | caught something | ||
|  | caught something | ||
|  | looping	i | ||
|  | looping	4 | ||
|  | looping	i | ||
|  | looping	3 | ||
|  | looping	i | ||
|  | looping	2 | ||
|  | looping	i | ||
|  | looping	1 | ||
|  | looping	i | ||
|  | looping	0 | ||
|  | optimizer: keep hreturn | ||
|  | optimizer: keep hreturn | ||
|  | drop table t1; | ||
|  | drop procedure proc_26977_broken; | ||
|  | drop procedure proc_26977_works; | ||
|  | drop procedure if exists proc_33618_h; | ||
|  | drop procedure if exists proc_33618_c; | ||
|  | 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// | ||
|  | show procedure code proc_33618_h; | ||
|  | Pos	Instruction | ||
|  | 0	set count1@1 '0' | ||
|  | 1	set vb@2 NULL | ||
|  | 2	set last_row@3 NULL | ||
|  | 3	jump_if_not 24(24) (num@0 >= 1) | ||
|  | 4	set num@0 (num@0 - 1) | ||
|  | 5	cpush cur1@0 | ||
|  | 6	hpush_jump 9 4 CONTINUE | ||
|  | 7	set last_row@3 1 | ||
|  | 8	hreturn 4 | ||
|  | 9	set last_row@3 0 | ||
|  | 10	copen cur1@0 | ||
|  | 11	hpush_jump 13 4 EXIT | ||
|  | 12	hreturn 0 17 | ||
|  | 13	cfetch cur1@0 vb@2 | ||
|  | 14	jump_if_not 17(17) (last_row@3 = 1) | ||
|  | 15	hpop 1 | ||
|  | 16	jump 19 | ||
|  | 17	hpop 1 | ||
|  | 18	jump_if_not 11(19) (last_row@3 = 1) | ||
|  | 19	cclose cur1@0 | ||
|  | 20	hpop 1 | ||
|  | 21	cpop 1 | ||
|  | 22	jump 3 | ||
|  | show procedure code proc_33618_c; | ||
|  | Pos	Instruction | ||
|  | 0	set count1@1 '0' | ||
|  | 1	set vb@2 NULL | ||
|  | 2	set last_row@3 NULL | ||
|  | 3	jump_if_not 23(23) (num@0 >= 1) | ||
|  | 4	set num@0 (num@0 - 1) | ||
|  | 5	cpush cur1@0 | ||
|  | 6	hpush_jump 9 4 CONTINUE | ||
|  | 7	set last_row@3 1 | ||
|  | 8	hreturn 4 | ||
|  | 9	set last_row@3 0 | ||
|  | 10	copen cur1@0 | ||
|  | 11	cpush cur2@1 | ||
|  | 12	cfetch cur1@0 vb@2 | ||
|  | 13	jump_if_not 16(16) (last_row@3 = 1) | ||
|  | 14	cpop 1 | ||
|  | 15	jump 18 | ||
|  | 16	cpop 1 | ||
|  | 17	jump_if_not 11(18) (last_row@3 = 1) | ||
|  | 18	cclose cur1@0 | ||
|  | 19	hpop 1 | ||
|  | 20	cpop 1 | ||
|  | 21	jump 3 | ||
|  | drop procedure proc_33618_h; | ||
|  | drop procedure proc_33618_c; | ||
|  | drop procedure if exists p_20906_a; | ||
|  | drop procedure if exists p_20906_b; | ||
|  | create procedure p_20906_a() SET @a=@a+1, @b=@b+1; | ||
|  | show procedure code p_20906_a; | ||
|  | Pos	Instruction | ||
|  | 0	stmt 31 "SET @a=@a+1" | ||
|  | 1	stmt 31 "SET  @b=@b+1" | ||
|  | set @a=1; | ||
|  | set @b=1; | ||
|  | call p_20906_a(); | ||
|  | select @a, @b; | ||
|  | @a	@b | ||
|  | 2	2 | ||
|  | create procedure p_20906_b() SET @a=@a+1, @b=@b+1, @c=@c+1; | ||
|  | show procedure code p_20906_b; | ||
|  | Pos	Instruction | ||
|  | 0	stmt 31 "SET @a=@a+1" | ||
|  | 1	stmt 31 "SET  @b=@b+1" | ||
|  | 2	stmt 31 "SET  @c=@c+1" | ||
|  | set @a=1; | ||
|  | set @b=1; | ||
|  | set @c=1; | ||
|  | call p_20906_b(); | ||
|  | select @a, @b, @c; | ||
|  | @a	@b	@c | ||
|  | 2	2	2 | ||
|  | drop procedure p_20906_a; | ||
|  | drop procedure p_20906_b; | ||
|  | End of 5.0 tests. | ||
|  | CREATE PROCEDURE p1()  | ||
|  | BEGIN  | ||
|  | DECLARE dummy int default 0; | ||
|  | CASE 12  | ||
|  | WHEN 12  | ||
|  | THEN SET dummy = 0; | ||
|  | END CASE; | ||
|  | END// | ||
|  | SHOW PROCEDURE CODE p1; | ||
|  | Pos	Instruction | ||
|  | 0	set dummy@0 0 | ||
|  | 1	set_case_expr (6) 0 12 | ||
|  | 2	jump_if_not 5(6) (case_expr@0 = 12) | ||
|  | 3	set dummy@0 0 | ||
|  | 4	jump 6 | ||
|  | 5	error 1339 | ||
|  | DROP PROCEDURE p1; | ||
|  | # | ||
|  | # Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE | ||
|  | # | ||
|  | SET @@SQL_MODE = ''; | ||
|  | CREATE FUNCTION testf_bug11763507() RETURNS INT | ||
|  | BEGIN | ||
|  | RETURN 0; | ||
|  | END | ||
|  | $ | ||
|  | CREATE PROCEDURE testp_bug11763507() | ||
|  | BEGIN | ||
|  | SELECT "PROCEDURE testp_bug11763507"; | ||
|  | END | ||
|  | $ | ||
|  | SHOW FUNCTION CODE testf_bug11763507; | ||
|  | Pos	Instruction | ||
|  | 0	freturn 3 0 | ||
|  | SHOW FUNCTION CODE TESTF_bug11763507; | ||
|  | Pos	Instruction | ||
|  | 0	freturn 3 0 | ||
|  | SHOW PROCEDURE CODE testp_bug11763507; | ||
|  | Pos	Instruction | ||
|  | 0	stmt 0 "SELECT "PROCEDURE testp_bug11763507"" | ||
|  | SHOW PROCEDURE CODE TESTP_bug11763507; | ||
|  | Pos	Instruction | ||
|  | 0	stmt 0 "SELECT "PROCEDURE testp_bug11763507"" | ||
|  | DROP PROCEDURE testp_bug11763507; | ||
|  | DROP FUNCTION testf_bug11763507; | ||
|  | #END OF BUG#11763507 test. |