📄 sp-vars.test
字号:
############################################################################# Cleanup.############################################################################--disable_warnings# Drop stored routines (if any) for general SP-vars test cases. These routines# are created in include/sp-vars.inc file.DROP PROCEDURE IF EXISTS sp_vars_check_dflt;DROP PROCEDURE IF EXISTS sp_vars_check_assignment;DROP FUNCTION IF EXISTS sp_vars_check_ret1;DROP FUNCTION IF EXISTS sp_vars_check_ret2;DROP FUNCTION IF EXISTS sp_vars_check_ret3;DROP FUNCTION IF EXISTS sp_vars_check_ret4;--enable_warnings############################################################################# Some general tests for SP-vars functionality.############################################################################# Create the procedure in ANSI mode. Check that all necessary warnings are# emitted properly.SET @@sql_mode = 'ansi';--source include/sp-vars.inc--echo--echo -----------------------------------------------------------------echo Calling the routines, created in ANSI mode.--echo -----------------------------------------------------------------echoCALL sp_vars_check_dflt();CALL sp_vars_check_assignment();SELECT sp_vars_check_ret1();SELECT sp_vars_check_ret2();SELECT sp_vars_check_ret3();SELECT sp_vars_check_ret4();# Check that changing sql_mode after creating a store procedure does not# matter.SET @@sql_mode = 'traditional';--echo--echo -----------------------------------------------------------------echo Calling in TRADITIONAL mode the routines, created in ANSI mode.--echo -----------------------------------------------------------------echoCALL sp_vars_check_dflt();CALL sp_vars_check_assignment();SELECT sp_vars_check_ret1();SELECT sp_vars_check_ret2();SELECT sp_vars_check_ret3();SELECT sp_vars_check_ret4();# Create the procedure in TRADITIONAL mode. Check that error will be thrown on# execution.DROP PROCEDURE sp_vars_check_dflt;DROP PROCEDURE sp_vars_check_assignment;DROP FUNCTION sp_vars_check_ret1;DROP FUNCTION sp_vars_check_ret2;DROP FUNCTION sp_vars_check_ret3;DROP FUNCTION sp_vars_check_ret4;--source include/sp-vars.inc--echo--echo -----------------------------------------------------------------echo Calling the routines, created in TRADITIONAL mode.--echo -----------------------------------------------------------------echo--error ER_WARN_DATA_OUT_OF_RANGECALL sp_vars_check_dflt();--error ER_WARN_DATA_OUT_OF_RANGECALL sp_vars_check_assignment();--error ER_WARN_DATA_OUT_OF_RANGESELECT sp_vars_check_ret1();--error ER_WARN_DATA_OUT_OF_RANGESELECT sp_vars_check_ret2();--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELDSELECT sp_vars_check_ret3();# TODO: Is it an error, that only a warning is emitted here? Check the same# behaviour with tables.SELECT sp_vars_check_ret4();SET @@sql_mode = 'ansi';## Cleanup.#DROP PROCEDURE sp_vars_check_dflt;DROP PROCEDURE sp_vars_check_assignment;DROP FUNCTION sp_vars_check_ret1;DROP FUNCTION sp_vars_check_ret2;DROP FUNCTION sp_vars_check_ret3;DROP FUNCTION sp_vars_check_ret4;############################################################################# Tests for BIT data type.############################################################################--echo--echo -----------------------------------------------------------------echo BIT data type tests--echo -----------------------------------------------------------------echo## Prepare.#--disable_warningsDROP PROCEDURE IF EXISTS p1;--enable_warnings## Test case.#delimiter |;CREATE PROCEDURE p1()BEGIN DECLARE v1 BIT; DECLARE v2 BIT(1); DECLARE v3 BIT(3) DEFAULT b'101'; DECLARE v4 BIT(64) DEFAULT 0x5555555555555555; DECLARE v5 BIT(3); DECLARE v6 BIT(64); DECLARE v7 BIT(8) DEFAULT 128; DECLARE v8 BIT(8) DEFAULT '128'; DECLARE v9 BIT(8) DEFAULT ' 128'; DECLARE v10 BIT(8) DEFAULT 'x 128'; SET v1 = v4; SET v2 = 0; SET v5 = v4; # check overflow SET v6 = v3; # check padding SELECT HEX(v1); SELECT HEX(v2); SELECT HEX(v3); SELECT HEX(v4); SELECT HEX(v5); SELECT HEX(v6); SELECT HEX(v7); SELECT HEX(v8); SELECT HEX(v9); SELECT HEX(v10);END|delimiter ;|CALL p1();## Cleanup.#DROP PROCEDURE p1;############################################################################# Tests for CASE statements functionality:# - test for general functionality (scopes, nested cases, CASE in loops);# - test that if type of the CASE expression is changed on each iteration,# the execution will be correct.############################################################################--echo--echo -----------------------------------------------------------------echo CASE expression tests.--echo -----------------------------------------------------------------echo## Prepare.#DROP PROCEDURE IF EXISTS p1;DROP PROCEDURE IF EXISTS p2;DROP TABLE IF EXISTS t1;## Test case.#CREATE TABLE t1(log_msg VARCHAR(1024));delimiter |;CREATE PROCEDURE p1(arg VARCHAR(255))BEGIN INSERT INTO t1 VALUES('p1: step1'); CASE arg * 10 WHEN 10 * 10 THEN INSERT INTO t1 VALUES('p1: case1: on 10'); WHEN 10 * 10 + 10 * 10 THEN BEGIN CASE arg / 10 WHEN 1 THEN INSERT INTO t1 VALUES('p1: case1: case2: on 1'); WHEN 2 THEN BEGIN DECLARE i TINYINT DEFAULT 10; WHILE i > 0 DO INSERT INTO t1 VALUES(CONCAT('p1: case1: case2: loop: i: ', i)); CASE MOD(i, 2) WHEN 0 THEN INSERT INTO t1 VALUES('p1: case1: case2: loop: i is even'); WHEN 1 THEN INSERT INTO t1 VALUES('p1: case1: case2: loop: i is odd'); ELSE INSERT INTO t1 VALUES('p1: case1: case2: loop: ERROR'); END CASE; SET i = i - 1; END WHILE; END; ELSE INSERT INTO t1 VALUES('p1: case1: case2: ERROR'); END CASE; CASE arg WHEN 10 THEN INSERT INTO t1 VALUES('p1: case1: case3: on 10'); WHEN 20 THEN INSERT INTO t1 VALUES('p1: case1: case3: on 20'); ELSE INSERT INTO t1 VALUES('p1: case1: case3: ERROR'); END CASE; END; ELSE INSERT INTO t1 VALUES('p1: case1: ERROR'); END CASE; CASE arg * 10 WHEN 10 * 10 THEN INSERT INTO t1 VALUES('p1: case4: on 10'); WHEN 10 * 10 + 10 * 10 THEN BEGIN CASE arg / 10 WHEN 1 THEN INSERT INTO t1 VALUES('p1: case4: case5: on 1'); WHEN 2 THEN BEGIN DECLARE i TINYINT DEFAULT 10; WHILE i > 0 DO INSERT INTO t1 VALUES(CONCAT('p1: case4: case5: loop: i: ', i)); CASE MOD(i, 2) WHEN 0 THEN INSERT INTO t1 VALUES('p1: case4: case5: loop: i is even'); WHEN 1 THEN INSERT INTO t1 VALUES('p1: case4: case5: loop: i is odd'); ELSE INSERT INTO t1 VALUES('p1: case4: case5: loop: ERROR'); END CASE; SET i = i - 1; END WHILE; END; ELSE INSERT INTO t1 VALUES('p1: case4: case5: ERROR'); END CASE; CASE arg WHEN 10 THEN INSERT INTO t1 VALUES('p1: case4: case6: on 10'); WHEN 20 THEN INSERT INTO t1 VALUES('p1: case4: case6: on 20'); ELSE INSERT INTO t1 VALUES('p1: case4: case6: ERROR'); END CASE; END; ELSE INSERT INTO t1 VALUES('p1: case4: ERROR'); END CASE;END|CREATE PROCEDURE p2()BEGIN DECLARE i TINYINT DEFAULT 3; WHILE i > 0 DO IF MOD(i, 2) = 0 THEN SET @_test_session_var = 10; ELSE SET @_test_session_var = 'test'; END IF; CASE @_test_session_var WHEN 10 THEN INSERT INTO t1 VALUES('p2: case: numerical type'); WHEN 'test' THEN INSERT INTO t1 VALUES('p2: case: string type'); ELSE INSERT INTO t1 VALUES('p2: case: ERROR'); END CASE; SET i = i - 1; END WHILE;END|delimiter ;|CALL p1(10);CALL p1(20);CALL p2();SELECT * FROM t1;## Cleanup.#DROP PROCEDURE p1;DROP PROCEDURE p2;DROP TABLE t1;############################################################################# Test case for BUG#14161: Stored procedure cannot retrieve bigint unsigned.############################################################################--echo--echo -----------------------------------------------------------------echo BUG#14161--echo -----------------------------------------------------------------echo## Prepare.#--disable_warningsDROP TABLE IF EXISTS t1;DROP PROCEDURE IF EXISTS p1;--enable_warnings## Test case.#CREATE TABLE t1(col BIGINT UNSIGNED);INSERT INTO t1 VALUE(18446744073709551614);delimiter |;CREATE PROCEDURE p1(IN arg BIGINT UNSIGNED)BEGIN SELECT arg; SELECT * FROM t1; SELECT * FROM t1 WHERE col = arg;END|delimiter ;|CALL p1(18446744073709551614);## Cleanup.#DROP TABLE t1;DROP PROCEDURE p1;############################################################################# Test case for BUG#13705: parameters to stored procedures are not verified.############################################################################--echo--echo -----------------------------------------------------------------echo BUG#13705--echo -----------------------------------------------------------------echo## Prepare.#--disable_warningsDROP PROCEDURE IF EXISTS p1;--enable_warnings## Test case.#delimiter |;CREATE PROCEDURE p1(x VARCHAR(10), y CHAR(3)) READS SQL DATABEGIN SELECT x, y;END|delimiter ;|CALL p1('alpha', 'abc');CALL p1('alpha', 'abcdef');## Cleanup.#DROP PROCEDURE p1;############################################################################# Test case for BUG#13675: DATETIME/DATE type in store proc param seems to be# converted as varbinary.## TODO: test case failed.############################################################################--echo--echo -----------------------------------------------------------------echo BUG#13675--echo -----------------------------------------------------------------echo## Prepare.#--disable_warningsDROP PROCEDURE IF EXISTS p1;DROP TABLE IF EXISTS t1;--enable_warnings## Test case.#delimiter |;CREATE PROCEDURE p1(x DATETIME)BEGIN CREATE TABLE t1 SELECT x; SHOW CREATE TABLE t1; DROP TABLE t1;END|delimiter ;|CALL p1(NOW());CALL p1('test');## Cleanup.#DROP PROCEDURE p1;############################################################################# Test case for BUG#12976: Boolean values reversed in stored procedures?## TODO: test case failed.############################################################################--echo--echo -----------------------------------------------------------------echo BUG#12976--echo -----------------------------------------------------------------echo## Prepare.#--disable_warningsDROP TABLE IF EXISTS t1;DROP PROCEDURE IF EXISTS p1;DROP PROCEDURE IF EXISTS p2;--enable_warnings## Test case.#CREATE TABLE t1(b BIT(1));INSERT INTO t1(b) VALUES(b'0'), (b'1');delimiter |;CREATE PROCEDURE p1()BEGIN SELECT HEX(b), b = 0, b = FALSE, b IS FALSE, b = 1, b = TRUE, b IS TRUE FROM t1;END|CREATE PROCEDURE p2()BEGIN DECLARE vb BIT(1); SELECT b INTO vb FROM t1 WHERE b = 0; SELECT HEX(vb), vb = 0, vb = FALSE, vb IS FALSE, vb = 1, vb = TRUE, vb IS TRUE; SELECT b INTO vb FROM t1 WHERE b = 1; SELECT HEX(vb), vb = 0, vb = FALSE, vb IS FALSE, vb = 1, vb = TRUE, vb IS TRUE;END|delimiter ;|# The expected and correct result.call p1();# The wrong result. Note that only hex(vb) works, but is printed with two# digits for some reason in this case.call p2();## Cleanup.#DROP TABLE t1;DROP PROCEDURE p1;DROP PROCEDURE p2;############################################################################# Test case for BUG#9572: Stored procedures: variable type declarations# ignored.############################################################################--echo--echo -----------------------------------------------------------------echo BUG#9572--echo -----------------------------------------------------------------echo## Prepare.#--disable_warningsDROP PROCEDURE IF EXISTS p1;DROP PROCEDURE IF EXISTS p2;DROP PROCEDURE IF EXISTS p3;DROP PROCEDURE IF EXISTS p4;DROP PROCEDURE IF EXISTS p5;DROP PROCEDURE IF EXISTS p6;--enable_warnings## Test case.#SET @@sql_mode = 'traditional';delimiter |;CREATE PROCEDURE p1()BEGIN DECLARE v TINYINT DEFAULT 1e200; SELECT v;END|CREATE PROCEDURE p2()BEGIN DECLARE v DECIMAL(5) DEFAULT 1e200; SELECT v;END|CREATE PROCEDURE p3()BEGIN DECLARE v CHAR(5) DEFAULT 'abcdef'; SELECT v LIKE 'abc___';END|CREATE PROCEDURE p4(arg VARCHAR(2))BEGIN DECLARE var VARCHAR(1); SET var := arg; SELECT arg, var;END|CREATE PROCEDURE p5(arg CHAR(2))BEGIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -