mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
5eccc400b1
Documentation of the feature can be found at: http://kb.askmonty.org/en/multi-source-replication/ This code is based on code from Taobao, developed by Plinux Other things: - Added new commands: START ALL SLAVES, STOP ALL SLAVES and SHOW FULL SLAVE STATUS - Almost all usage of 'active_mi' is deleted. - Added parameter to reset_logs() so that one can specify if new logs should be created. - Check wildcard match as early as possible for SHOW STATUS. This makes SHOW STATUS like 'xxx' a lot faster and use less mutex - Made max_relay_log_size depending on master connection. - Added sys_vars.default_master_connection_basic to fix a failure in sys_vars.all_vars, modified sql_slave_skip_counter_basic to allow session-level settings - Added commands to mysqladmin: start-all-slaves & stop-all-slaves - Removed logging of "next log '%s' is currently active | not active" - Fixed bug in my_vsnprintf() when using positional parameters with length - Added fn_ext2(), which returns pointer to last '.' in file name - max_relay_log_size now acts as a normal slave specific variable - Don't store replication position if innobase_overwrite_relay_log_info is not set - max_relay_log_size copies it's values from max_binlog_size at startup BUILD/SETUP.sh: Added -Wno-invalid-offsetof to get rid of warning of offsetof() on C++ class (safe in the contex we use it) client/mysqladmin.cc: Added commands start-all-slaves & stop-all-slaves client/mysqltest.cc: Added support for error names starting with 'W' Added connection_name support to --sync_with_master cmake/maintainer.cmake: Added -Wno-invalid-offsetof to get rid of warning of offsetof() on C++ class (safe in the contex we use it) include/my_sys.h: Added fn_ext2(), which returns pointer to last '.' in file name include/mysql/plugin.h: Added SHOW_SIMPLE_FUNC include/mysql/plugin_audit.h.pp: Updated signature file include/mysql/plugin_auth.h.pp: Updated signature file include/mysql/plugin_ftparser.h.pp: Updated signature file mysql-test/extra/rpl_tests/rpl_max_relay_size.test: Updated test mysql-test/include/setup_fake_relay_log.inc: There is no orphan relay log files anymore mysql-test/mysql-test-run.pl: Added multi_source to test suite mysql-test/r/flush.result: Added test for new syntax of flush relay logs (can't repeat relay logs or slave) mysql-test/r/mysqld--help.result: Updated result mysql-test/r/mysqltest.result: Updated result mysql-test/r/parser.result: Updated result mysql-test/r/signal_code.result: Updated result after introducing new commands mysql-test/r/sp-code.result: Updated result after introducing new commands mysql-test/suite/multi_source: Tests for multi-source mysql-test/suite/multi_source/info_logs-master.opt: Test with strange file names mysql-test/suite/multi_source/info_logs.result: Test of logs mysql-test/suite/multi_source/info_logs.test: Test of logs mysql-test/suite/multi_source/my.cnf: Setup of multi-master tests Added log-warnings to get more information to the log files mysql-test/suite/multi_source/relaylog_events.result: Test relay log handling mysql-test/suite/multi_source/relaylog_events.test: Test relay log handling mysql-test/suite/multi_source/reset_slave.result: Test RESET SLAVE mysql-test/suite/multi_source/reset_slave.test: Test RESET SLAVE mysql-test/suite/multi_source/simple.result: Simple basic test of multi-source functionality mysql-test/suite/multi_source/simple.test: Simple basic test of multi-source functionality mysql-test/suite/multi_source/skip_counter.result: Testing skip_counter and max_relay_log_size mysql-test/suite/multi_source/skip_counter.test: Testing skip_counter and max_relay_log_size mysql-test/suite/multi_source/syntax.result: Test of multi-source syntax mysql-test/suite/multi_source/syntax.test: Test of multi-source syntax mysql-test/suite/rpl/r/rpl_deadlock_innodb.result: New warnings mysql-test/suite/rpl/r/rpl_filter_dbs_dynamic.result: Improved error texts mysql-test/suite/rpl/r/rpl_filter_tables_dynamic.result: Improved error texts mysql-test/suite/rpl/r/rpl_filter_wild_tables_dynamic.result: Improved error texts mysql-test/suite/rpl/r/rpl_flush_logs.result: Update results mysql-test/suite/rpl/r/rpl_heartbeat.result: Warning was removed mysql-test/suite/rpl/r/rpl_heartbeat_basic.result: Warning was removed mysql-test/suite/rpl/r/rpl_rotate_logs.result: Updated results because of new error messages mysql-test/suite/rpl/r/rpl_row_max_relay_size.result: Updated results mysql-test/suite/rpl/r/rpl_row_show_relaylog_events.result: Updated results after improved RESET SLAVE (we now use less relay log files) mysql-test/suite/rpl/r/rpl_skip_replication.result: New error message mysql-test/suite/rpl/r/rpl_start_slave_deadlock_sys_vars.result: Test removed as the old DBUG_SYNC entries doesn't exist anymore mysql-test/suite/rpl/r/rpl_stm_max_relay_size.result: Updated results mysql-test/suite/rpl/r/rpl_stm_mix_show_relaylog_events.result: Updated results after improved RESET SLAVE (we now use less relay log files) mysql-test/suite/rpl/t/rpl_flush_logs.test: Updated tests as relay log files is created a bit differently than before mysql-test/suite/rpl/t/rpl_start_slave_deadlock_sys_vars.test: Test removed as the old DBUG_SYNC entries doesn't exist anymore mysql-test/suite/sys_vars/r/default_master_connection_basic.result: New test to test usage of default_master_connection mysql-test/suite/sys_vars/r/max_relay_log_size_basic.result: Updated results mysql-test/suite/sys_vars/r/sql_slave_skip_counter_basic.result: Updated usage of sql_slave_skip_counter mysql-test/suite/sys_vars/t/default_master_connection_basic.test: New test to test usage of default_master_connection mysql-test/suite/sys_vars/t/max_relay_log_size_basic.test: Updated results mysql-test/suite/sys_vars/t/sql_slave_skip_counter_basic.test: Updated test for multi-source mysql-test/t/flush.test: Added test for new syntax of flush relay logs (can't repeat relay logs or slave) mysql-test/t/parser.test: Updated test as master_pos_wait() now takes more arguments than before mysys/mf_fn_ext.c: Added fn_ext2(), which returns pointer to last '.' in file name plugin/semisync/semisync_master_plugin.cc: Use SHOW_SIMPLE_FUNC to optimize SHOW STATUS sql/event_scheduler.cc: No reason to initialize slave_thread (it's guaranteed to be zero here) sql/item_create.cc: Added connection_name argument to master_pos_wait() Simplified code sql/item_func.cc: Added connection_name argument to master_pos_wait() sql/item_func.h: Added connection_name argument to master_pos_wait() sql/lex.h: Added SLAVES keyword sql/log.cc: Added tag "Master 'connection_name'" to slave errors that has a connection name. Added parameter to reset_logs() so that one can specify if new logs should be created. Removed some wrong casts Changed some constants to defines sql/log.h: Added parameter to reset_logs() Updated comment to reflect new code sql/log_event.cc: Updated DBUG_PRINT sql/mysqld.cc: Added variable mysqld_server_initialized so that other functions can test if server is fully initialized. Free all slave data in one place (fewer ifdef's) Removed not needed call to close_active_mi() Initialize slaves() later in startup to ensure that everthing is really initialized when slaves start. Made status variable slave_running multi-source safe max_relay_log_size copies it's values from max_binlog_size at startup SHOW_FUNC -> SHOW_SIMPLE_FUNC sql/mysqld.h: Added mysqld_server_initialized Removed max_relay_log_size sql/rpl_mi.cc: Store connection name and cmp_connection_name (only used for show full slave status) in Master_info Added code for Master_info_index, which handles storage of multi-master information Don't write the empty "" connection_name to multi-master.info file. This is handled by the original code. Create Master_info_index::index_file_names once at init More DBUG_PRINT Give error if Master_info_index::check_duplicate_master_info fails Added start|stop all slaves sql/rpl_mi.h: Added connection_name and Master_info_index Updated prototypes sql/rpl_rli.cc: Added connection_name to relay log files. If we do a full reset, don't create any new relay log files. Updated comment to reflect new code Made max_relay_log_size depending on master connection. sql/rpl_rli.h: Fixed type of slave_skip_counter as we now access it directly in sys_vars.cc, so it must be ulong Made executed_entries and max_relay_log_size depending on master connection. sql/set_var.cc: Fixed that one can get variable name also when one uses DEFAULT sql/set_var.h: Made option global so that one can check and change min & max values (sorry Sergei) sql/share/errmsg-utf8.txt: Added new error messages needed for multi-source Added multi-source name to error ER_MASTER_INFO and WARN_NO_MASTER_INFO Improved error message if connection exists sql/slave.cc: Moved things a bit around to make it easier to handle error conditions. Create a global master_info_index and add the "" connection to it Ensure that new Master_info doesn't fail. Don't call terminate_slave_threads(active_mi..) on end_slave() as this is now done automaticly when deleting master_info_index. Delete not needed function close_active_mi(). One can achive same thing by calling end_slave(). Added support for SHOW FULL SLAVE STATUS (show status for all master connections with connection_name as first column) Removed logging of "next log '%s' is currently active | not active" Added Slave_received_heartbeats and Slave_heartbeat_period sql/slave.h: Added new defines and prototypes sql/sql_base.cc: More DBUG_PRINT sql/sql_class.cc: Reset thd->connection_name and thd-->default_master_connection sql/sql_class.h: Added thd->connection_name and thd-->default_master_connection Made slave_skip_count and max_relay_log_size depending on master connection. These variables are in THD to make changing them thread safe. sql/sql_const.h: Added MAX_CONNECTION_NAME sql/sql_insert.cc: thd->slave_thread -> thd->rli_slave Removed usage of active_mi sql/sql_lex.cc: Reset 'lex->verbose' (to simplify some sql_yacc.yy code) sql/sql_lex.h: Added connection_name, relay_log_connection_name, SQLCOM_SLAVE_ALL_START and SQLCOM_SLAVE_ALL_STOP sql/sql_load.cc: thd->slave_thread -> thd->rli_slave Removed usage of active_mi sql/sql_parse.cc: Added support for connection_name to all SLAVE commands. - Instead of using active_mi, we now get the current Master_info from master_info_index. - Create new replication threads with CHANGE MASTER - Added support for show_all_master_info()- sql/sql_prepare.cc: Added SQLCOM_SLAVE_ALL_START and SQLCOM_SLAVE_ALL_STOP sql/sql_reload.cc: Made reset/full slave use master_info_index->get_master_info() instead of active_mi. If one uses 'RESET SLAVE "connection_name" all' the connection is removed from master_info_index. Fixed issues with FLUSH RELAY LOGS sql/sql_repl.cc: sql_slave_skip_counter is moved to thd->variables to make it thread safe and fix some bugs with it Add connection name to relay log files. Added connection name to errors. Added some logging for multi-master if log_warnings > 1 stop_slave(): - Don't check if thd is set. It's guaranteed to always be set. change_master(): - Check for duplicate connection names in change_master() - Check for wrong arguments first in file (to simplify error handling) - Register new connections in master_info_index ****** Added multi-source support to show relaylog events ****** check_duplicate_master_info() now generates an error Added parameter to reset_logs() ****** Updated calls to create_signed_file_name() sql/sql_show.cc: Check wildcard match as early as possible for SHOW STATUS. This makes SHOW STATUS like 'xxx' a lot faster and use less mutex sql/sql_yacc.yy: Added optional connection_name to a all relevant master/slave commands Added multi-source support to show relaylog events Added new commands START ALL SLAVES, STOP ALL SLAVES and SHOW FULL SLAVE STATUS sql/strfunc.cc: my_global.h shoud always be included first. sql/sys_vars.cc: Added variable default_master_connection Made variable sql_slave_skip_counter multi-source safe Made max_relay_log_size depending on master connection. Made old code more reusable sql/sys_vars.h: Added Sys_var_session_lexstring (needed for default_master_connection) Added Sys_var_multi_source_uint (needed for sql_slave_skip_counter). Changed Sys_var_multi_source_uint to ulong to be able to handle max_relay_log_size Made old code more reusable storage/example/ha_example.cc: Use SHOW_SIMPLE_FUNC to optimize SHOW STATUS storage/sphinx/ha_sphinx.cc: Use SHOW_SIMPLE_FUNC to optimize SHOW STATUS storage/xtradb/handler/ha_innodb.cc: Don't store replication position if innobase_overwrite_relay_log_info is not set strings/my_vsnprintf.c: Fixed bug when using positional parameters with length
976 lines
20 KiB
Text
976 lines
20 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 90 "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 90 "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
|
|
Warnings:
|
|
Error 1062 Duplicate entry '1' for key 'a'
|
|
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
|
|
Warnings:
|
|
Error 1062 Duplicate entry '2' for key 'a'
|
|
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#23032: Handlers declared in a SP do not handle warnings generated in sub-SP
|
|
#
|
|
|
|
# - Case 4: check that "No Data trumps Warning".
|
|
|
|
CREATE TABLE t1(a INT);
|
|
INSERT INTO t1 VALUES (1), (2), (3);
|
|
CREATE PROCEDURE p1()
|
|
BEGIN
|
|
DECLARE c CURSOR FOR SELECT a FROM t1;
|
|
OPEN c;
|
|
BEGIN
|
|
DECLARE v INT;
|
|
DECLARE CONTINUE HANDLER FOR SQLWARNING
|
|
BEGIN
|
|
SELECT "Warning found!";
|
|
SHOW WARNINGS;
|
|
END;
|
|
DECLARE EXIT HANDLER FOR NOT FOUND
|
|
BEGIN
|
|
SELECT "End of Result Set found!";
|
|
SHOW WARNINGS;
|
|
END;
|
|
WHILE TRUE DO
|
|
FETCH c INTO v;
|
|
END WHILE;
|
|
END;
|
|
CLOSE c;
|
|
SELECT a INTO @foo FROM t1 LIMIT 1; # Clear warning stack
|
|
END|
|
|
SET SESSION debug_dbug="+d,bug23032_emit_warning";
|
|
CALL p1();
|
|
Warning found!
|
|
Warning found!
|
|
Level Code Message
|
|
Warning 1105 Unknown error
|
|
Warning found!
|
|
Warning found!
|
|
Level Code Message
|
|
Warning 1105 Unknown error
|
|
Warning found!
|
|
Warning found!
|
|
Level Code Message
|
|
Warning 1105 Unknown error
|
|
End of Result Set found!
|
|
End of Result Set found!
|
|
Level Code Message
|
|
Warning 1105 Unknown error
|
|
Error 1329 No data - zero rows fetched, selected, or processed
|
|
SET SESSION debug_dbug="-d,bug23032_emit_warning";
|
|
DROP PROCEDURE p1;
|
|
DROP TABLE t1;
|
|
#
|
|
# 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.
|