mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
48b224fa18
- Change 94 to 95 according to Pem's instructions in bug report. mysql-test/r/sp-code.result: Update from 94 to 95 according to Pem's instructions mysql-test/t/disabled.def: Enable sp-code test case
201 lines
4.9 KiB
Text
201 lines
4.9 KiB
Text
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;
|