mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			202 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			202 lines
		
	
	
		
			4.9 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 95 "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 95 "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(`test`.`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;
 |