=== modified file 'mysql-test/r/sp-code.result' --- mysql-test/r/sp-code.result 2013-09-14 01:09:36 +0000 +++ mysql-test/r/sp-code.result 2014-03-14 10:29:50 +0000 @@ -970,3 +970,289 @@ Pos Instruction DROP PROCEDURE testp_bug11763507; DROP FUNCTION testf_bug11763507; #END OF BUG#11763507 test. + +# WL#4179: Stored programs: validation of stored program statements. +# +# Check that query string is stored only for the expressions, which +# reference tables or stored functions. +# +# Test cases in this file require SHOW ... CODE, which is available only +# in the debug mode. + +CREATE TABLE t1(a INT); +INSERT INTO t1 VALUES (10); +CREATE TEMPORARY TABLE t2(a INT); +INSERT INTO t2 VALUES (20); +CREATE VIEW t3 AS SELECT 30; +CREATE FUNCTION f() RETURNS INT +RETURN 1| +CREATE PROCEDURE p1() +BEGIN +# DEFAULT-expression +DECLARE x1 INT DEFAULT (SELECT 1 + 2); +DECLARE x2 INT DEFAULT (SELECT * FROM (SELECT 1 + 2) t1); +DECLARE x3 INT DEFAULT (SELECT * FROM t1); +DECLARE x4 INT DEFAULT (SELECT * FROM t2); +DECLARE x5 INT DEFAULT (SELECT * FROM t3); +DECLARE x6 INT DEFAULT (SELECT f()); +# CURSOR-query. +DECLARE c1 CURSOR FOR SELECT (1 + 2) FROM dual; +DECLARE c2 CURSOR FOR SELECT * FROM (SELECT 1 + 2) t1; +DECLARE c3 CURSOR FOR SELECT * FROM t1; +DECLARE c4 CURSOR FOR SELECT * FROM t2; +DECLARE c5 CURSOR FOR SELECT * FROM t3; +DECLARE c6 CURSOR FOR SELECT f(); +# IF-expression. +IF (SELECT 1 + 2) THEN +SET @dummy = 1; +END IF; +IF (SELECT * FROM (SELECT 1 + 2) t1) THEN +SET @dummy = 1; +END IF; +IF (SELECT * FROM t1) THEN +SET @dummy = 1; +END IF; +IF (SELECT * FROM t2) THEN +SET @dummy = 1; +END IF; +IF (SELECT * FROM t3) THEN +SET @dummy = 1; +END IF; +IF (SELECT f()) THEN +SET @dummy = 1; +END IF; +# SET-expression. +SET x1 = (SELECT 1 + 2); +SET x1 = (SELECT * FROM (SELECT 1 + 2) t1); +SET x1 = (SELECT * FROM t1); +SET x1 = (SELECT * FROM t2); +SET x1 = (SELECT * FROM t3); +SET x1 = (SELECT f()); +# CASE-expressions. +CASE +WHEN (SELECT 1 + 2) = 1 THEN SET @dummy = 1; +WHEN (SELECT * FROM (SELECT 1 + 2) t1) = 2 THEN SET @dummy = 1; +WHEN (SELECT * FROM t1) = 3 THEN SET @dummy = 1; +WHEN (SELECT * FROM t2) = 3 THEN SET @dummy = 1; +WHEN (SELECT * FROM t3) = 3 THEN SET @dummy = 1; +WHEN (SELECT f()) = 3 THEN SET @dummy = 1; +END CASE; +CASE (SELECT 1 + 2) +WHEN 1 THEN SET @dummy = 1; +ELSE SET @dummy = 1; +END CASE; +CASE (SELECT * FROM (SELECT 1 + 2) t1) +WHEN 1 THEN SET @dummy = 1; +ELSE SET @dummy = 1; +END CASE; +CASE (SELECT * FROM t1) +WHEN 1 THEN SET @dummy = 1; +ELSE SET @dummy = 1; +END CASE; +CASE (SELECT * FROM t2) +WHEN 1 THEN SET @dummy = 1; +ELSE SET @dummy = 1; +END CASE; +CASE (SELECT * FROM t3) +WHEN 1 THEN SET @dummy = 1; +ELSE SET @dummy = 1; +END CASE; +CASE (SELECT f()) +WHEN 1 THEN SET @dummy = 1; +ELSE SET @dummy = 1; +END CASE; +# WHILE-expression. +WHILE (SELECT 1 - 1) DO +SET @dummy = 1; +END WHILE; +WHILE (SELECT * FROM (SELECT 1 - 1) t1) DO +SET @dummy = 1; +END WHILE; +WHILE (SELECT * FROM t1) - 10 DO +SET @dummy = 1; +END WHILE; +WHILE (SELECT * FROM t2) - 10 DO +SET @dummy = 1; +END WHILE; +WHILE (SELECT * FROM t3) - 10 DO +SET @dummy = 1; +END WHILE; +WHILE (SELECT f()) - 1 DO +SET @dummy = 1; +END WHILE; +# REPEAT-expression. +REPEAT +SET @dummy = 1; +UNTIL (SELECT 1 - 1) END REPEAT; +REPEAT +SET @dummy = 1; +UNTIL (SELECT * FROM (SELECT 1 - 1) t1) END REPEAT; +REPEAT +SET @dummy = 1; +UNTIL (SELECT * FROM t1) - 10 END REPEAT; +REPEAT +SET @dummy = 1; +UNTIL (SELECT * FROM t2) - 10 END REPEAT; +REPEAT +SET @dummy = 1; +UNTIL (SELECT * FROM t3) - 10 END REPEAT; +REPEAT +SET @dummy = 1; +UNTIL (SELECT f()) - 1 END REPEAT; +END| +CREATE FUNCTION f1() RETURNS INT +RETURN (SELECT 1 + 2)| +CREATE FUNCTION f2() RETURNS INT +RETURN (SELECT * FROM (SELECT 1 + 2) t1)| +CREATE FUNCTION f3() RETURNS INT +RETURN (SELECT * FROM t1)| +CREATE FUNCTION f4() RETURNS INT +RETURN (SELECT * FROM t2)| +CREATE FUNCTION f5() RETURNS INT +RETURN (SELECT * FROM t3)| +CREATE FUNCTION f6() RETURNS INT +RETURN f()| + +SHOW PROCEDURE CODE p1; +Pos Instruction +0 set x1@0 (select (1 + 2)) +1 set x2@1 (select `*` from (select (1 + 2) AS `1 + 2`) `t1`) +2 set x3@2 (select `*` from `test`.`t1`) +3 set x4@3 (select `*` from `test`.`t2`) +4 set x5@4 (select `*` from `test`.`t3`) +5 set x6@5 (select `f`()) +6 cpush c1@0: +7 cpush c2@1: SELECT * FROM (SELECT 1 + 2) t1 +8 cpush c3@2: SELECT * FROM t1 +9 cpush c4@3: SELECT * FROM t2 +10 cpush c5@4: SELECT * FROM t3 +11 cpush c6@5: SELECT f() +12 jump_if_not 14(14) (select (1 + 2)) +13 stmt "SET @dummy = 1" +14 jump_if_not 16(16) (select `*` from (select (1 + 2) AS `1 + 2`) `t1`) +15 stmt "SET @dummy = 1" +16 jump_if_not 18(18) (select `*` from `test`.`t1`) +17 stmt "SET @dummy = 1" +18 jump_if_not 20(20) (select `*` from `test`.`t2`) +19 stmt "SET @dummy = 1" +20 jump_if_not 22(22) (select `*` from `test`.`t3`) +21 stmt "SET @dummy = 1" +22 jump_if_not 24(24) (select `f`()) +23 stmt "SET @dummy = 1" +24 set x1@0 (select (1 + 2)) +25 set x1@0 (select `*` from (select (1 + 2) AS `1 + 2`) `t1`) +26 set x1@0 (select `*` from `test`.`t1`) +27 set x1@0 (select `*` from `test`.`t2`) +28 set x1@0 (select `*` from `test`.`t3`) +29 set x1@0 (select `f`()) +30 jump_if_not 33(49) ((select (1 + 2)) = 1) +31 stmt "SET @dummy = 1" +32 jump 49 +33 jump_if_not 36(49) ((select `*` from (select (1 + 2) AS `1 + 2`) `t1`) = 2) +34 stmt "SET @dummy = 1" +35 jump 49 +36 jump_if_not 39(49) ((select `*` from `test`.`t1`) = 3) +37 stmt "SET @dummy = 1" +38 jump 49 +39 jump_if_not 42(49) ((select `*` from `test`.`t2`) = 3) +40 stmt "SET @dummy = 1" +41 jump 49 +42 jump_if_not 45(49) ((select `*` from `test`.`t3`) = 3) +43 stmt "SET @dummy = 1" +44 jump 49 +45 jump_if_not 48(49) ((select `f`()) = 3) +46 stmt "SET @dummy = 1" +47 jump 49 +48 error 1339 +49 set_case_expr (54) 0 (select (1 + 2)) +50 jump_if_not_case_when 53(54) (case_expr@0 = 1) +51 stmt "SET @dummy = 1" +52 jump 54 +53 stmt "SET @dummy = 1" +54 set_case_expr (59) 1 (select `*` from (select (1 + 2) AS `1 + 2`) `t1`) +55 jump_if_not_case_when 58(59) (case_expr@1 = 1) +56 stmt "SET @dummy = 1" +57 jump 59 +58 stmt "SET @dummy = 1" +59 set_case_expr (64) 2 (select `*` from `test`.`t1`) +60 jump_if_not_case_when 63(64) (case_expr@2 = 1) +61 stmt "SET @dummy = 1" +62 jump 64 +63 stmt "SET @dummy = 1" +64 set_case_expr (69) 3 (select `*` from `test`.`t2`) +65 jump_if_not_case_when 68(69) (case_expr@3 = 1) +66 stmt "SET @dummy = 1" +67 jump 69 +68 stmt "SET @dummy = 1" +69 set_case_expr (74) 4 (select `*` from `test`.`t3`) +70 jump_if_not_case_when 73(74) (case_expr@4 = 1) +71 stmt "SET @dummy = 1" +72 jump 74 +73 stmt "SET @dummy = 1" +74 set_case_expr (79) 5 (select `f`()) +75 jump_if_not_case_when 78(79) (case_expr@5 = 1) +76 stmt "SET @dummy = 1" +77 jump 79 +78 stmt "SET @dummy = 1" +79 jump_if_not 82(82) (select (1 - 1)) +80 stmt "SET @dummy = 1" +81 jump 79 +82 jump_if_not 85(85) (select `*` from (select (1 - 1) AS `1 - 1`) `t1`) +83 stmt "SET @dummy = 1" +84 jump 82 +85 jump_if_not 88(88) ((select `*` from `test`.`t1`) - 10) +86 stmt "SET @dummy = 1" +87 jump 85 +88 jump_if_not 91(91) ((select `*` from `test`.`t2`) - 10) +89 stmt "SET @dummy = 1" +90 jump 88 +91 jump_if_not 94(94) ((select `*` from `test`.`t3`) - 10) +92 stmt "SET @dummy = 1" +93 jump 91 +94 jump_if_not 97(97) ((select `f`()) - 1) +95 stmt "SET @dummy = 1" +96 jump 94 +97 stmt "SET @dummy = 1" +98 jump_if_not 97(99) (select (1 - 1)) +99 stmt "SET @dummy = 1" +100 jump_if_not 99(101) (select `*` from (select (1 - 1) AS `1 - 1`) `t1`) +101 stmt "SET @dummy = 1" +102 jump_if_not 101(103) ((select `*` from `test`.`t1`) - 10) +103 stmt "SET @dummy = 1" +104 jump_if_not 103(105) ((select `*` from `test`.`t2`) - 10) +105 stmt "SET @dummy = 1" +106 jump_if_not 105(107) ((select `*` from `test`.`t3`) - 10) +107 stmt "SET @dummy = 1" +108 jump_if_not 107(109) ((select `f`()) - 1) +109 cpop 6 + +SHOW FUNCTION CODE f1; +Pos Instruction +0 freturn 3 (select (1 + 2)) +SHOW FUNCTION CODE f2; +Pos Instruction +0 freturn 3 (select `*` from (select (1 + 2) AS `1 + 2`) `t1`) +SHOW FUNCTION CODE f3; +Pos Instruction +0 freturn 3 (select `*` from `test`.`t1`) +SHOW FUNCTION CODE f4; +Pos Instruction +0 freturn 3 (select `*` from `test`.`t2`) +SHOW FUNCTION CODE f5; +Pos Instruction +0 freturn 3 (select `*` from `test`.`t3`) +SHOW FUNCTION CODE f6; +Pos Instruction +0 freturn 3 `f`() + +DROP FUNCTION f; +DROP PROCEDURE p1; +DROP FUNCTION f1; +DROP FUNCTION f2; +DROP FUNCTION f3; +DROP FUNCTION f4; +DROP FUNCTION f5; +DROP FUNCTION f6; +DROP TABLE t1; +DROP TEMPORARY TABLE t2; +DROP VIEW t3; === modified file 'mysql-test/r/sp_notembedded.result' --- mysql-test/r/sp_notembedded.result 2013-10-18 18:38:13 +0000 +++ mysql-test/r/sp_notembedded.result 2014-03-14 10:32:40 +0000 @@ -284,4 +284,41 @@ DROP EVENT teste_bug11763507; # ------------------------------------------------------------------ # -- End of 5.1 tests # ------------------------------------------------------------------ + +# WL#4179: Stored programs: validation of stored program statements +# +# Test handle of metadata changes with events. + +CREATE TABLE t1 (a INT, b INT); +CREATE TABLE t2 (a INT, b INT); +CREATE TABLE t3 (a INT); +INSERT INTO t1 VALUES (1, 2); +SET GLOBAL EVENT_SCHEDULER = ON; +SELECT GET_LOCK('e1_lock', 60); +GET_LOCK('e1_lock', 60) +1 +CREATE EVENT e1 ON SCHEDULE EVERY 1 SECOND STARTS NOW() DO +BEGIN +DECLARE EXIT HANDLER FOR 1136 BEGIN +INSERT INTO t3 VALUES (1); +END; -- ER_WRONG_VALUE_COUNT_ON_ROW +SELECT GET_LOCK('e1_lock', 60); +SELECT RELEASE_LOCK('e1_lock'); +INSERT INTO t2 SELECT * FROM t1; +END| +SELECT RELEASE_LOCK('e1_lock'); +RELEASE_LOCK('e1_lock') +1 +SELECT GET_LOCK('e1_lock', 60); +GET_LOCK('e1_lock', 60) +1 +ALTER TABLE t1 ADD COLUMN (c INT); +SELECT RELEASE_LOCK('e1_lock'); +RELEASE_LOCK('e1_lock') +1 +# Wait for new rows in t3. That means, the even has been executed, +# and INSERT INTO t2 failed because now t1 has 3 columns. +DROP EVENT e1; +DROP TABLE t1, t2, t3; +SET GLOBAL EVENT_SCHEDULER = OFF; set @@global.concurrent_insert= @old_concurrent_insert; === modified file 'mysql-test/t/sp-code.test' --- mysql-test/t/sp-code.test 2012-04-10 06:28:13 +0000 +++ mysql-test/t/sp-code.test 2014-03-14 10:28:37 +0000 @@ -734,3 +734,221 @@ DROP PROCEDURE testp_bug11763507; DROP FUNCTION testf_bug11763507; --echo #END OF BUG#11763507 test. + +--echo +--echo # WL#4179: Stored programs: validation of stored program statements. +--echo # +--echo # Check that query string is stored only for the expressions, which +--echo # reference tables or stored functions. +--echo # +--echo # Test cases in this file require SHOW ... CODE, which is available only +--echo # in the debug mode. +--echo + +CREATE TABLE t1(a INT); +INSERT INTO t1 VALUES (10); + +CREATE TEMPORARY TABLE t2(a INT); +INSERT INTO t2 VALUES (20); + +CREATE VIEW t3 AS SELECT 30; + +delimiter |; + +CREATE FUNCTION f() RETURNS INT + RETURN 1| + +CREATE PROCEDURE p1() +BEGIN + + # DEFAULT-expression + + DECLARE x1 INT DEFAULT (SELECT 1 + 2); + DECLARE x2 INT DEFAULT (SELECT * FROM (SELECT 1 + 2) t1); + DECLARE x3 INT DEFAULT (SELECT * FROM t1); + DECLARE x4 INT DEFAULT (SELECT * FROM t2); + DECLARE x5 INT DEFAULT (SELECT * FROM t3); + DECLARE x6 INT DEFAULT (SELECT f()); + + # CURSOR-query. + + DECLARE c1 CURSOR FOR SELECT (1 + 2) FROM dual; + DECLARE c2 CURSOR FOR SELECT * FROM (SELECT 1 + 2) t1; + DECLARE c3 CURSOR FOR SELECT * FROM t1; + DECLARE c4 CURSOR FOR SELECT * FROM t2; + DECLARE c5 CURSOR FOR SELECT * FROM t3; + DECLARE c6 CURSOR FOR SELECT f(); + + # IF-expression. + + IF (SELECT 1 + 2) THEN + SET @dummy = 1; + END IF; + + IF (SELECT * FROM (SELECT 1 + 2) t1) THEN + SET @dummy = 1; + END IF; + + IF (SELECT * FROM t1) THEN + SET @dummy = 1; + END IF; + + IF (SELECT * FROM t2) THEN + SET @dummy = 1; + END IF; + + IF (SELECT * FROM t3) THEN + SET @dummy = 1; + END IF; + + IF (SELECT f()) THEN + SET @dummy = 1; + END IF; + + # SET-expression. + + SET x1 = (SELECT 1 + 2); + SET x1 = (SELECT * FROM (SELECT 1 + 2) t1); + SET x1 = (SELECT * FROM t1); + SET x1 = (SELECT * FROM t2); + SET x1 = (SELECT * FROM t3); + SET x1 = (SELECT f()); + + # CASE-expressions. + + CASE + WHEN (SELECT 1 + 2) = 1 THEN SET @dummy = 1; + WHEN (SELECT * FROM (SELECT 1 + 2) t1) = 2 THEN SET @dummy = 1; + WHEN (SELECT * FROM t1) = 3 THEN SET @dummy = 1; + WHEN (SELECT * FROM t2) = 3 THEN SET @dummy = 1; + WHEN (SELECT * FROM t3) = 3 THEN SET @dummy = 1; + WHEN (SELECT f()) = 3 THEN SET @dummy = 1; + END CASE; + + CASE (SELECT 1 + 2) + WHEN 1 THEN SET @dummy = 1; + ELSE SET @dummy = 1; + END CASE; + + CASE (SELECT * FROM (SELECT 1 + 2) t1) + WHEN 1 THEN SET @dummy = 1; + ELSE SET @dummy = 1; + END CASE; + + CASE (SELECT * FROM t1) + WHEN 1 THEN SET @dummy = 1; + ELSE SET @dummy = 1; + END CASE; + + CASE (SELECT * FROM t2) + WHEN 1 THEN SET @dummy = 1; + ELSE SET @dummy = 1; + END CASE; + + CASE (SELECT * FROM t3) + WHEN 1 THEN SET @dummy = 1; + ELSE SET @dummy = 1; + END CASE; + + CASE (SELECT f()) + WHEN 1 THEN SET @dummy = 1; + ELSE SET @dummy = 1; + END CASE; + + # WHILE-expression. + + WHILE (SELECT 1 - 1) DO + SET @dummy = 1; + END WHILE; + + WHILE (SELECT * FROM (SELECT 1 - 1) t1) DO + SET @dummy = 1; + END WHILE; + + WHILE (SELECT * FROM t1) - 10 DO + SET @dummy = 1; + END WHILE; + + WHILE (SELECT * FROM t2) - 10 DO + SET @dummy = 1; + END WHILE; + + WHILE (SELECT * FROM t3) - 10 DO + SET @dummy = 1; + END WHILE; + + WHILE (SELECT f()) - 1 DO + SET @dummy = 1; + END WHILE; + + # REPEAT-expression. + + REPEAT + SET @dummy = 1; + UNTIL (SELECT 1 - 1) END REPEAT; + + REPEAT + SET @dummy = 1; + UNTIL (SELECT * FROM (SELECT 1 - 1) t1) END REPEAT; + + REPEAT + SET @dummy = 1; + UNTIL (SELECT * FROM t1) - 10 END REPEAT; + + REPEAT + SET @dummy = 1; + UNTIL (SELECT * FROM t2) - 10 END REPEAT; + + REPEAT + SET @dummy = 1; + UNTIL (SELECT * FROM t3) - 10 END REPEAT; + + REPEAT + SET @dummy = 1; + UNTIL (SELECT f()) - 1 END REPEAT; +END| + +CREATE FUNCTION f1() RETURNS INT + RETURN (SELECT 1 + 2)| + +CREATE FUNCTION f2() RETURNS INT + RETURN (SELECT * FROM (SELECT 1 + 2) t1)| + +CREATE FUNCTION f3() RETURNS INT + RETURN (SELECT * FROM t1)| + +CREATE FUNCTION f4() RETURNS INT + RETURN (SELECT * FROM t2)| + +CREATE FUNCTION f5() RETURNS INT + RETURN (SELECT * FROM t3)| + +CREATE FUNCTION f6() RETURNS INT + RETURN f()| + +delimiter ;| + +--echo +SHOW PROCEDURE CODE p1; +--echo +SHOW FUNCTION CODE f1; +SHOW FUNCTION CODE f2; +SHOW FUNCTION CODE f3; +SHOW FUNCTION CODE f4; +SHOW FUNCTION CODE f5; +SHOW FUNCTION CODE f6; +--echo + +DROP FUNCTION f; + +DROP PROCEDURE p1; +DROP FUNCTION f1; +DROP FUNCTION f2; +DROP FUNCTION f3; +DROP FUNCTION f4; +DROP FUNCTION f5; +DROP FUNCTION f6; + +DROP TABLE t1; +DROP TEMPORARY TABLE t2; +DROP VIEW t3; === modified file 'mysql-test/t/sp_notembedded.test' --- mysql-test/t/sp_notembedded.test 2013-09-13 16:14:56 +0000 +++ mysql-test/t/sp_notembedded.test 2014-03-14 10:33:39 +0000 @@ -458,6 +458,60 @@ DROP EVENT teste_bug11763507; --echo # -- End of 5.1 tests --echo # ------------------------------------------------------------------ +--echo +--echo # WL#4179: Stored programs: validation of stored program statements +--echo # +--echo # Test handle of metadata changes with events. +--echo + +CREATE TABLE t1 (a INT, b INT); +CREATE TABLE t2 (a INT, b INT); +CREATE TABLE t3 (a INT); + +INSERT INTO t1 VALUES (1, 2); + +SET GLOBAL EVENT_SCHEDULER = ON; + +SELECT GET_LOCK('e1_lock', 60); + +delimiter |; + +CREATE EVENT e1 ON SCHEDULE EVERY 1 SECOND STARTS NOW() DO +BEGIN + DECLARE EXIT HANDLER FOR 1136 BEGIN + INSERT INTO t3 VALUES (1); + END; -- ER_WRONG_VALUE_COUNT_ON_ROW + + SELECT GET_LOCK('e1_lock', 60); + SELECT RELEASE_LOCK('e1_lock'); + + INSERT INTO t2 SELECT * FROM t1; +END| + +delimiter ;| + +SELECT RELEASE_LOCK('e1_lock'); + +let $wait_condition = SELECT COUNT(*) >= 3 FROM t2; +--source include/wait_condition.inc + +SELECT GET_LOCK('e1_lock', 60); + +ALTER TABLE t1 ADD COLUMN (c INT); + +SELECT RELEASE_LOCK('e1_lock'); + +--echo # Wait for new rows in t3. That means, the even has been executed, +--echo # and INSERT INTO t2 failed because now t1 has 3 columns. +let $wait_condition = SELECT COUNT(*) > 0 FROM t3; +--source include/wait_condition.inc + +DROP EVENT e1; +DROP TABLE t1, t2, t3; + +SET GLOBAL EVENT_SCHEDULER = OFF; + + # # Restore global concurrent_insert value. Keep in the end of the test file. #