mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
506c2a722f
limitation) Bug#24854 (Mixing Searched Case with Simple Case inside Stored Procedure crashes Mysqld) Implemented code review (19194) comments
120 lines
2.5 KiB
Text
120 lines
2.5 KiB
Text
DROP PROCEDURE IF EXISTS proc_19194_codegen;
|
|
DROP PROCEDURE IF EXISTS bug_19194_simple;
|
|
DROP PROCEDURE IF EXISTS bug_19194_searched;
|
|
CREATE PROCEDURE proc_19194_codegen(
|
|
IN proc_name VARCHAR(50),
|
|
IN count INTEGER,
|
|
IN simple INTEGER,
|
|
OUT body MEDIUMTEXT)
|
|
BEGIN
|
|
DECLARE code MEDIUMTEXT;
|
|
DECLARE i INT DEFAULT 1;
|
|
SET code = concat("CREATE PROCEDURE ", proc_name, "(i INT)\n");
|
|
SET code = concat(code, "BEGIN\n");
|
|
SET code = concat(code, " DECLARE str CHAR(10);\n");
|
|
IF (simple)
|
|
THEN
|
|
SET code = concat(code, " CASE i\n");
|
|
ELSE
|
|
SET code = concat(code, " CASE\n");
|
|
END IF;
|
|
WHILE (i <= count)
|
|
DO
|
|
IF (simple)
|
|
THEN
|
|
SET code = concat(code, " WHEN ", i, " THEN SET str=\"", i, "\";\n");
|
|
ELSE
|
|
SET code = concat(code, " WHEN i=", i, " THEN SET str=\"", i, "\";\n");
|
|
END IF;
|
|
SET i = i + 1;
|
|
END WHILE;
|
|
SET code = concat(code, " ELSE SET str=\"unknown\";\n");
|
|
SET code = concat(code, " END CASE;\n");
|
|
SET code = concat(code, " SELECT str;\n");
|
|
SET code = concat(code, "END\n");
|
|
SET body = code;
|
|
END|
|
|
set @body="";
|
|
call proc_19194_codegen("test_simple", 10, 1, @body);
|
|
select @body;
|
|
@body
|
|
CREATE PROCEDURE test_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";
|
|
WHEN 4 THEN SET str="4";
|
|
WHEN 5 THEN SET str="5";
|
|
WHEN 6 THEN SET str="6";
|
|
WHEN 7 THEN SET str="7";
|
|
WHEN 8 THEN SET str="8";
|
|
WHEN 9 THEN SET str="9";
|
|
WHEN 10 THEN SET str="10";
|
|
ELSE SET str="unknown";
|
|
END CASE;
|
|
SELECT str;
|
|
END
|
|
|
|
call proc_19194_codegen("test_searched", 10, 0, @body);
|
|
select @body;
|
|
@body
|
|
CREATE PROCEDURE test_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";
|
|
WHEN i=4 THEN SET str="4";
|
|
WHEN i=5 THEN SET str="5";
|
|
WHEN i=6 THEN SET str="6";
|
|
WHEN i=7 THEN SET str="7";
|
|
WHEN i=8 THEN SET str="8";
|
|
WHEN i=9 THEN SET str="9";
|
|
WHEN i=10 THEN SET str="10";
|
|
ELSE SET str="unknown";
|
|
END CASE;
|
|
SELECT str;
|
|
END
|
|
|
|
CALL bug_19194_simple(1);
|
|
str
|
|
1
|
|
CALL bug_19194_simple(2);
|
|
str
|
|
2
|
|
CALL bug_19194_simple(1000);
|
|
str
|
|
1000
|
|
CALL bug_19194_simple(4998);
|
|
str
|
|
4998
|
|
CALL bug_19194_simple(4999);
|
|
str
|
|
4999
|
|
CALL bug_19194_simple(9999);
|
|
str
|
|
unknown
|
|
CALL bug_19194_searched(1);
|
|
str
|
|
1
|
|
CALL bug_19194_searched(2);
|
|
str
|
|
2
|
|
CALL bug_19194_searched(1000);
|
|
str
|
|
1000
|
|
CALL bug_19194_searched(4998);
|
|
str
|
|
4998
|
|
CALL bug_19194_searched(4999);
|
|
str
|
|
4999
|
|
CALL bug_19194_searched(9999);
|
|
str
|
|
unknown
|
|
DROP PROCEDURE proc_19194_codegen;
|
|
DROP PROCEDURE bug_19194_simple;
|
|
DROP PROCEDURE bug_19194_searched;
|