# ==============================================================================
# (numbering from requirement document TP v1.0, Last updated: 25 Jan 200501:00)
#
# 3.1.3 Syntax checks for the stored procedure-specific flow control statements
# IF, CASE, LOOP, LEAVE, ITERATE, REPEAT, WHILE:
#
#- 1. Ensure that all subclauses that should be supported are supported.
#- 2. Ensure that all subclauses that should not be supported are disallowed
# with an appropriate error message.
#- 3. Ensure that all supported subclauses are supported only in the
# correct order.
#- 4. Ensure that an appropriate error message is returned if a subclause is
# out-of-order in a stored procedure definition.
#- 5. Ensure that all subclauses that are defined to be mandatory are indeed
# required to be mandatory by the MySQL server and tools.
#- 6. Ensure that any subclauses that are defined to be optional are indeed
# treated as optional by the MySQL server and tools.
## 7. Ensure that the IF statement acts correctly for all variants, including
# cases where statements are nested.
## 8. Ensure that the CASE statement acts correctly for all variants,
# including cases where statements are nested.
## 9. Ensure that the LOOP statement acts correctly for all variants,
# including cases where statements are nested.
#- 10. Ensure that the labels enclosing each LOOP statement must match.
#- 11. Ensure that it is possible to put a beginning label at the start of
# a LOOP statement without also requiring an ending label at the endof
# the same statement.
#- 12. Ensure that it isnot possible to put an ending label at the endof
# a LOOP statement without also requiring a matching beginning label
# at the start of the same statement.
#- 13. Ensure that every beginning label must endwith a colon (:).
#- 14. Ensure that every beginning labelwith the same scope must be unique.
## 15. Ensure that the LEAVE statement acts correctly for all variants,
# including cases where statements are nested.
## 16. Ensure that the ITERATE statement acts correctly for all variants,
# including cases where statements are nested.
#- 17. Ensure that the ITERATE statement fails, with an appropriate error
# message, if it appears in any context other than within LOOP, REPEAT,
# orWHILE statements.
## 18. Ensure that the REPEAT statement acts correctly for all variants,
# including cases where statements are nested.
#- 19. Ensure that the labels enclosing each REPEAT statement must match.
#- 20. Ensure that it is possible to put a beginning label at the start of
# a REPEAT statement without also requiring an ending label at the end
# of the same statement.
#- 21. Ensure that it isnot possible to put an ending label at the endof
# a REPEAT statement without also requiring a matching beginning label
# at the start of the same statement.
#- 22. Ensure that every beginning label must endwith a colon (:).
#- 23. Ensure that every beginning labelwith the same scope must be unique.
## 24. Ensure that the WHILE statement acts correctly for all variants,
# including cases where statements are nested.
#- 25. Ensure that the labels enclosing each WHILE statement must match.
#- 26. Ensure that it is possible to put a beginning label at the start of
# a WHILE statement without also requiring an ending label at the end
# of the same statement.
#- 27. Ensure that it isnot possible to put an ending label at the endof
# a WHILE statement without also requiring a matching beginning label
# at the start of the same statement.
#- 28. Ensure that every beginning label must endwith a colon (:).
#- 29. Ensure that every beginning labelwith the same scope must be unique.
## 30. Ensure that multiple cases of all possible combinations of the control
# flow statements, nested within multiple compound statements within
# a stored procedure, always act correctly and return the expected result.
#
# ==============================================================================
let $message= Section 3.1.3 - Syntax checks for the stored procedure-specific flow
control statements IF, CASE, LOOP, LEAVE, ITERATE, REPEAT, WHILE:;
--source include/show_msg80.inc
#FIXME # 3.1.3: enhance syntax checks with very complicated checks
# ------------------------------------------------------------------------------
let $message= Testcase 3.1.3.7:;
--source include/show_msg.inc
let $message=
Ensure that the IF statement acts correctly for all variants, including cases
where statements are nested.;
--source include/show_msg80.inc
--disable_warnings
DROP TABLE IF EXISTS res_t3_itisalongname_1381742_itsaverylongname_1381742;
DROP PROCEDUREIF EXISTS sp9;
--enable_warnings
CREATE TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742( f1 CHAR(20), f2 VARCHAR(20), f3 SMALLINT);
delimiter //;
CREATE PROCEDURE sp9( action char(20), subaction char(20) ) BEGIN if action = 'action'then if subaction = 'subaction'then
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'action', 'subaction' , 1); else
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'action', 'none' , 2); ENDif; else if subaction = 'subaction' then
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'none', 'subaction' , 3);
elseif subaction = 'subaction1' then BEGIN
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values ('none', 'subaction1', 4); END; else
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'none', 'none' , 5); ENDif; ENDif; END//
delimiter ;//
CALL sp9( 'action', 'subaction' );
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742 where f3=1;
CALL sp9( 'temp', 'subaction' );
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742 where f3=3;
CALL sp9( 'temp', 'subaction1' );
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742 where f3=4;
CALL sp9( 'action', 'temp' );
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742 where f3=2;
CALL sp9( 'temp', 'temp' );
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742 where f3=5;
# cleanup 3.1.3.7
DROP PROCEDURE sp9;
DROP TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742;
# ------------------------------------------------------------------------------
let $message= Testcase 3.1.3.8.:;
--source include/show_msg.inc
let $message=
Ensure that the CASE statement acts correctly for all variants, including cases
where statements are nested.;
--source include/show_msg80.inc
--disable_warnings
drop table IF EXISTS res_t3_itisalongname_1381742_itsaverylongname_1381742;
DROP PROCEDUREIF EXISTS sp10;
--enable_warnings
create table res_t3_itisalongname_1381742_itsaverylongname_1381742( f1 char(20), f2 varchar(20), f3 smallint);
delimiter //;
CREATE PROCEDURE sp10( action char(20), subaction char(20) ) BEGIN case action
when 'action'then case
when subaction = 'subaction_1'then
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'action', 'subaction_2' , 1);
when subaction = 'subaction_2'then
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'action', 'subaction_2' , 2); else
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'action', 'none' , 3); ENDcase; else case
when subaction = 'subaction_1'then
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'none', 'subaction_1' , 4);
when subaction = 'subaction_2'then
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'none', 'subaction_2' , 5); else
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'none', 'none' , 6); ENDcase; ENDcase; END//
delimiter ;//
CALL sp10( 'action', 'subaction_1' );
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
delete from res_t3_itisalongname_1381742_itsaverylongname_1381742;
CALL sp10( 'action', 'subaction_2' );
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
delete from res_t3_itisalongname_1381742_itsaverylongname_1381742;
CALL sp10( 'temp', 'subaction_1' );
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
delete from res_t3_itisalongname_1381742_itsaverylongname_1381742;
CALL sp10( 'temp', 'subaction_2' );
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
delete from res_t3_itisalongname_1381742_itsaverylongname_1381742;
CALL sp10( 'action', 'temp' );
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
delete from res_t3_itisalongname_1381742_itsaverylongname_1381742;
CALL sp10( 'temp', 'temp' );
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
# cleanup 3.1.3.8
DROP PROCEDURE sp10;
DROP TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742;
# ------------------------------------------------------------------------------
let $message= Testcase 3.1.3.9 + 3.1.3.15:;
--source include/show_msg.inc
let $message= 09. Ensure that the LOOP statement acts correctly for all variants, including
. cases where statements are nested. 15. Ensure that the LEAVE statement acts correctly for all variants, including
. cases where statements are nested.;
--source include/show_msg80.inc
--disable_warnings
DROP TABLE IF EXISTS res_t3_itisalongname_1381742_itsaverylongname_1381742;
DROP PROCEDUREIF EXISTS sp11;
--enable_warnings
CREATE TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742( f1 CHAR(20), f2 VARCHAR(20), f3 SMALLINT);
delimiter //;
CREATE PROCEDURE sp11( ) BEGIN
declare count1 integer default 1;
declare count2 integer default 1;
label1: loop if count2 > 3then leave label1; ENDif; set count1 = 1;
label2: loop if count1 > 4then leave label2; ENDif;
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'xyz' , 'pqr', count1); set count1 = count1 + 1;
iterate label2; END loop label2; set count2 = count2 + 1;
iterate label1; END loop label1; END//
delimiter ;//
CALL sp11();
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
# cleanup 3.1.3.9
DROP PROCEDURE sp11;
DROP TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742;
# ------------------------------------------------------------------------------
let $message= Testcase 3.1.3.16:;
--source include/show_msg.inc
let $message=
Ensure that the ITERATE statement acts correctly for all variants, including
cases where statements are nested.
(tests for this testcase are also included in other testcases);
--source include/show_msg80.inc
--disable_warnings
DROP PROCEDUREIF EXISTS sp31316;
--enable_warnings
delimiter //;
# wrong label at iterate
# Error: SQLSTATE: 42000 (ER_SP_LILABEL_MISMATCH)
# Message: %s with no matching label: %s
--error ER_SP_LILABEL_MISMATCH
CREATE PROCEDURE sp31316( ) BEGIN
declare count1 integer default 1;
declare count2 integer default 1;
label1: loop if count2 > 3then leave label1; ENDif; set count1 = 1;
label2: loop if count1 > 4then leave label2; ENDif;
insert into temp values( count1, count2); set count1 = count1 + 1;
iterate label3; END loop label2; set count2 = count2 + 1;
iterate label1; END loop label1; END//
delimiter ;//
# cleanup 3.1.3.16
#DROP PROCEDURE sp31316;
# ------------------------------------------------------------------------------
let $message= Testcase 3.1.3.18:;
--source include/show_msg.inc
let $message=
Ensure that the REPEAT statement acts correctly for all variants, including
cases where statements are nested.;
--source include/show_msg80.inc
--disable_warnings
DROP PROCEDUREIF EXISTS sp17;
DROP TABLE IF EXISTS res_t3_itisalongname_1381742_itsaverylongname_1381742;
--enable_warnings
CREATE TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742( f1 CHAR(20), f2 VARCHAR(20), f3 SMALLINT);
delimiter //;
CREATE PROCEDURE sp17( ) BEGIN
declare count1 integer default 1;
declare count2 integer default 1; repeat set count1 = count1 + 1; set count2 = 1;
label1: repeat set count2 = count2 + 1;
insert into res_t3_itisalongname_1381742_itsaverylongname_1381742 values( 'xyz' , 'pqr', count1); until count2 > 3 ENDrepeat label1; until count1 > 3 ENDrepeat; END//
delimiter ;//
CALL sp17();
SELECT * from res_t3_itisalongname_1381742_itsaverylongname_1381742;
# cleanup 3.1.3.18
DROP PROCEDURE sp17;
DROP TABLE res_t3_itisalongname_1381742_itsaverylongname_1381742;
# ------------------------------------------------------------------------------
let $message= Testcase 3.1.3.24:;
--source include/show_msg.inc
let $message=
Ensure that the WHILE statement acts correctly for all variants, including cases
where statements are nested.;
--source include/show_msg80.inc
--disable_warnings
drop table IF EXISTS res_t21;
DROP PROCEDUREIF EXISTS sp21;
--enable_warnings
delimiter //;
CREATE PROCEDURE sp21( ) BEGIN
declare count1 integer default 0;
declare count2 integer default 0; while count1 < 3do BEGIN
declare ithisissamevariablename int default 100;
SELECT ithisissamevariablename; BEGIN
declare ithisissamevariablename int default 200;
SELECT ithisissamevariablename; END; set count2 = 0;
label1: while count2 < 3do BEGIN
declare count1 integer default 7; set count2 = count2 + 1;
insert into res_t21 values( 'xyz' , 'pqr', count2);
label2: while count1 < 10do set count1 = count1 + 1;
insert into res_t21 values( 'xyz' , 'pqr', count1); ENDwhile label2; END; ENDwhile label1; set count1 = count1 + 1; END; ENDwhile; END//
delimiter ;//
CALL sp21();
SELECT * from res_t21;
# cleanup 3.1.3.
DROP PROCEDURE sp21;
drop table res_t21;
# ------------------------------------------------------------------------------
let $message= Testcase 3.1.3.30:;
--source include/show_msg.inc
let $message=
Ensure that multiple cases of all possible combinations of the control flow
statements, nested within multiple compound statements within a stored procedure, always act correctly and return the expected result.;
--source include/show_msg80.inc
--disable_warnings
DROP TABLE IF EXISTS res_tbl;
DROP PROCEDUREIF EXISTS sp31330;
--enable_warnings
delimiter //;
#FIXME: can be enhanced more and more ...
CREATE PROCEDURE sp31330 (path int) BEGIN
declare count int default 1;
declare var1 text;
declare var2 blob;
declare var3 date;
declare var4 set('one', 'two', 'three', 'four', 'five') DEFAULT 'five'; case
when path=1then set var3 = '2000-11-09'; set var1 = 'flowing through case 1';
label1: loop if count > 5then if var4=1000then set var2 = 'exiting out of case 1 - invalid SET'; ENDif; if var4='two'then set var2 = 'exiting out of case 1'; ENDif;
insert into res_tbl values (1, var1, var2, var3, (count-2));
leave label1;
elseif count = 5then set count= count + 2; set var4='two';
iterate label1; else set count= count + 1; ENDif; set var4='one'; END loop label1;
when path=2then set var3 = '1989-11-09'; set var1 = 'flowing through case 2'; set @count3=0;
label2: repeat set count=count + 1; set @count2=1; while @count2 <= 5do set @count2 = @count2 + 1; ENDwhile;
SELECT @count2; set @count3=@count3 + @count2; until count > 5 ENDrepeat label2; set var2 = 'exiting out of case 2'; set var4 = count-3;
SELECT @count3;
insert into res_tbl values (2, var1, var2, var3, var4); ELSEBEGIN set @error_opt='undefined path specified';
SELECT @error_opt; END; ENDcase; END//
delimiter ;//
# Error: SQLSTATE: 42000 (ER_SP_WRONG_NO_OF_ARGS)
# Message: Incorrect number of arguments for %s %s; expected %u, got %u
--error ER_SP_WRONG_NO_OF_ARGS
CALL sp31330();
CALL sp31330(1);
SELECT * from res_tbl;
CALL sp31330(2);
SELECT * from res_tbl;
CALL sp31330(4);
# cleanup 3.1.3.30
DROP PROCEDURE sp31330;
drop table res_tbl;
# ==============================================================================
# USE the same .inc to cleanup before and after the test
--source suite/funcs_1/storedproc/cleanup_sp_tb.inc
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.