diff --git a/mysql-test/main/sp_validation.result b/mysql-test/main/sp_validation.result index ad02e17ca0f..5aa2d6d9ed2 100644 --- a/mysql-test/main/sp_validation.result +++ b/mysql-test/main/sp_validation.result @@ -3,6 +3,7 @@ # WL#4179: Stored programs: validation of stored program statements. # +SET @orig_debug=@@debug_dbug; # The test case below demonstrates that meta-data changes are detected # by triggers. SET sql_mode = 'NO_ENGINE_SUBSTITUTION'; @@ -21,6 +22,7 @@ SELECT * FROM t2; a b 11 12 21 22 +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; ALTER TABLE t1 ADD COLUMN c INT; ALTER TABLE t2 ADD COLUMN c INT; INSERT INTO t2 VALUES (31, 32, 33); @@ -37,6 +39,7 @@ a b c 11 12 NULL 21 22 NULL 31 32 33 +SET @@debug_dbug=@orig_dbug; DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; @@ -66,6 +69,7 @@ CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1), (2); CREATE PROCEDURE p1() SELECT * FROM t1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a 1 @@ -95,6 +99,7 @@ CALL p1(); b n/a hello +SET @@debug_dbug=@orig_dbug; # 1.4 Check if table's recreation is handled correctly # inside a call of stored procedure. @@ -104,6 +109,7 @@ CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1), (2); CREATE PROCEDURE p1() SELECT * FROM t1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a 1 @@ -117,6 +123,7 @@ CALL p1(); a 1 2 +SET @@debug_dbug=@orig_dbug; # 1.5 Recreate table t1 with another set of columns and # re-call a stored procedure. @@ -126,6 +133,7 @@ CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1), (2); CREATE PROCEDURE p1() SELECT * FROM t1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a 1 @@ -139,6 +147,7 @@ CALL p1(); b c a b c d +SET @@debug_dbug=@orig_dbug; DROP TABLE t1; DROP PROCEDURE p1; @@ -174,6 +183,7 @@ CREATE VIEW v1 AS SELECT * FROM t1; DROP PROCEDURE p1; CREATE PROCEDURE p1() SELECT * FROM v1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a b 1 2 @@ -181,6 +191,7 @@ ALTER TABLE t1 ADD COLUMN c INT DEFAULT 3; CALL p1(); a b 1 2 +SET @@debug_dbug=@orig_dbug; # 2.4 Stored program that uses query like 'SELECT * FROM v' must be # re-executed successfully if not used columns were removed from the @@ -193,6 +204,7 @@ CREATE VIEW v1 AS SELECT b, c FROM t1; DROP PROCEDURE p1; CREATE PROCEDURE p1() SELECT * FROM v1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); b c 2 3 @@ -203,6 +215,7 @@ b c ALTER TABLE t1 DROP COLUMN b; CALL p1(); ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +SET @@debug_dbug=@orig_dbug; # 2.5 Stored program that uses query like 'SELECT * FROM v' must be # re-executed successfully if a type of some base table's columns were @@ -213,6 +226,7 @@ INSERT INTO t1 VALUES (1, 2, 3); DROP VIEW v1; CREATE VIEW v1 AS SELECT b, c FROM t1; DROP PROCEDURE p1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CREATE PROCEDURE p1() SELECT * FROM v1; CALL p1(); @@ -224,6 +238,7 @@ INSERT INTO t1(a, c) VALUES (10, 30); CALL p1(); b c n/a 30 +SET @@debug_dbug=@orig_dbug; # 2.6 Stored program that uses query like 'SELECT * FROM v' must be # re-executed successfully if the view 'v' was dropped and created again @@ -259,6 +274,7 @@ INSERT INTO t1 VALUES (1, 2); CREATE VIEW v1 AS SELECT * FROM t1; CREATE PROCEDURE p1() SELECT * FROM v1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a b 1 2 @@ -271,6 +287,7 @@ CALL p1(); a b a b c d +SET @@debug_dbug=@orig_dbug; DROP VIEW v1; DROP TABLE t1; DROP PROCEDURE p1; @@ -281,6 +298,7 @@ DROP PROCEDURE p1; CREATE TEMPORARY TABLE t1(a INT, b INT); INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT * FROM t1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a b 1 2 @@ -326,6 +344,7 @@ INSERT INTO t1 VALUES ('aa', 'bb', 'cc'); CALL p1(); a b c aa bb cc +SET @@debug_dbug=@orig_dbug; DROP TEMPORARY TABLE t1; DROP PROCEDURE p1; @@ -334,12 +353,14 @@ DROP PROCEDURE p1; CREATE TABLE t1(a INT, b INT); INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT a, b FROM t1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a b 1 2 ALTER TABLE t1 DROP COLUMN b; CALL p1(); ERROR 42S22: Unknown column 'b' in 'field list' +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP TABLE t1; @@ -348,12 +369,14 @@ DROP TABLE t1; CREATE TEMPORARY TABLE t1(a INT, b INT); INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT a, b FROM t1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a b 1 2 ALTER TABLE t1 DROP COLUMN b; CALL p1(); ERROR 42S22: Unknown column 'b' in 'field list' +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP TEMPORARY TABLE t1; @@ -367,6 +390,7 @@ a b ALTER VIEW v1 AS SELECT 1 AS a; CALL p1(); ERROR 42S22: Unknown column 'b' in 'field list' +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP VIEW v1; @@ -375,12 +399,14 @@ DROP VIEW v1; CREATE TABLE t1(a INT, b INT); INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT a, b FROM t1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a b 1 2 DROP TABLE t1; CALL p1(); ERROR 42S02: Table 'test.t1' doesn't exist +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; # 4.5 Stored program must fail when it is re-executed after a view that @@ -400,12 +426,14 @@ DROP PROCEDURE p1; CREATE TEMPORARY TABLE t1(a INT, b INT); INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT a, b FROM t1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a b 1 2 DROP TABLE t1; CALL p1(); ERROR 42S02: Table 'test.t1' doesn't exist +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; # 4.7 Stored program must fail if the program executes some @@ -471,6 +499,7 @@ DROP VIEW t1; CREATE TABLE t1(a INT, b INT); INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT * FROM t1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a b 1 2 @@ -480,6 +509,7 @@ INSERT INTO t1 VALUES (1, 2); CALL p1(); a b 1 2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP TEMPORARY TABLE t1; @@ -495,6 +525,7 @@ INSERT INTO t1 VALUES (1, 2); CALL p1(); a b 1 2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP TABLE t1; @@ -525,6 +556,7 @@ CREATE VIEW t1 AS SELECT 1 AS a, 2 AS b; CALL p1(); a b 1 2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP VIEW t1; @@ -532,6 +564,7 @@ DROP VIEW t1; CREATE TEMPORARY TABLE t1(a INT, b INT); INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT * FROM t1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a b 1 2 @@ -541,6 +574,7 @@ INSERT INTO t1 VALUES (1, 2); CALL p1(); a b 1 2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP TABLE t1; @@ -562,6 +596,7 @@ BEGIN SET @x = OLD.a; SET @y = NEW.a; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; SET @x = 0, @y = 0; UPDATE t1 SET a = 3, b = 4; @@ -584,6 +619,7 @@ UPDATE t1 SET a = CONCAT('xxx_', a), b = 7; SELECT @x, @y; @x @y 5 xxx_5 +SET @@debug_dbug=@orig_dbug; DROP TABLE t1; @@ -601,6 +637,7 @@ BEGIN SET @x = OLD.a; SET @y = NEW.b; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; UPDATE t1 SET a = 3, b = 4; @@ -614,6 +651,7 @@ ALTER TABLE t1 CHANGE COLUMN b b2 INT; UPDATE t1 SET a = 5, b2 = 6; ERROR 42S22: Unknown column 'b' in 'NEW' +SET @@debug_dbug=@orig_dbug; DROP TABLE t1; @@ -633,6 +671,7 @@ SELECT a, b FROM t1; CALL p1(); SELECT a, b FROM t1; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p2(); a b @@ -640,6 +679,7 @@ a b a b 1 2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP TABLE t1; @@ -660,6 +700,7 @@ SELECT a, b FROM t1; CALL p1(); SELECT a, b FROM t1; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p2(); a b @@ -667,6 +708,7 @@ a b a b 1 2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP TEMPORARY TABLE t1; @@ -691,6 +733,7 @@ SELECT a, b FROM t1; CALL p1(); SELECT a, b FROM t1; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p2(); a b @@ -698,6 +741,7 @@ a b a b 1 2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP TABLE t1; @@ -722,6 +766,7 @@ SELECT a, b FROM t1; CALL p1(); SELECT a, b FROM t1; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p2(); a b @@ -729,6 +774,7 @@ a b a b 1 2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP TEMPORARY TABLE t1; @@ -750,6 +796,7 @@ SELECT a, b FROM v1; CALL p1(); SELECT a, b FROM v1; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p2(); a b @@ -757,6 +804,7 @@ a b a b 1 2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP VIEW v1; @@ -778,12 +826,14 @@ SELECT a, b FROM t1; CALL p1(); SELECT a, b FROM t1; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p2(); a b 1 2 ERROR 42S22: Unknown column 'a' in 'field list' +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP TABLE t1; @@ -805,12 +855,14 @@ SELECT a, b FROM t1; CALL p1(); SELECT a, b FROM t1; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p2(); a b 1 2 ERROR 42S22: Unknown column 'a' in 'field list' +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP TEMPORARY TABLE t1; @@ -836,12 +888,14 @@ SELECT a, b FROM t1; CALL p1(); SELECT a, b FROM t1; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p2(); a b 1 2 ERROR 42S22: Unknown column 'a' in 'field list' +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP TABLE t1; @@ -867,12 +921,14 @@ SELECT a, b FROM t1; CALL p1(); SELECT a, b FROM t1; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p2(); a b 1 2 ERROR 42S22: Unknown column 'a' in 'field list' +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP TEMPORARY TABLE t1; @@ -895,12 +951,14 @@ SELECT a, b FROM v1; CALL p1(); SELECT a, b FROM v1; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p2(); a b 1 2 ERROR 42S22: Unknown column 'a' in 'field list' +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP VIEW v1; @@ -948,6 +1006,7 @@ SELECT * FROM v1; SELECT * FROM v1; DROP VIEW v1; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); msg SQLEXCEPTION caught @@ -963,6 +1022,7 @@ msg SQLEXCEPTION caught a b 1 2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP PROCEDURE p3; @@ -1037,6 +1097,7 @@ RETURN 3; END| CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (1); +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); 1 @@ -1092,6 +1153,7 @@ SELECT f2(); f2() 1 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; DROP FUNCTION f1; @@ -1110,6 +1172,7 @@ END WHILE; END| CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (0); +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(3); UPDATE t1 SET a = 1; CALL p1(3); @@ -1130,6 +1193,7 @@ CALL p1(3); x 3 ERROR 42S22: Unknown column 'a' in 'field list' +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP TABLE t1; @@ -1145,6 +1209,7 @@ UNTIL(NOT (SELECT * FROM t1))END REPEAT; END| CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (0); +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(3); x 3 @@ -1175,6 +1240,7 @@ CALL p1(3); x 3 ERROR 42S22: Unknown column 'a' in 'field list' +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP TABLE t1; @@ -1200,6 +1266,7 @@ END CASE; END| CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (0); +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a4 @@ -1232,6 +1299,7 @@ a2 CALL p2(); a2 a2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -1260,6 +1328,7 @@ WHEN (SELECT * FROM t2) THEN SELECT 'subselect'; ELSE SELECT 'else'; END CASE; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; SET @x = 0; CALL p1(); @@ -1288,6 +1357,7 @@ subselect SELECT @x; @x 1 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP FUNCTION f1; @@ -1304,6 +1374,7 @@ BEGIN DECLARE v INT DEFAULT (SELECT * FROM t1); SELECT v; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); v @@ -1319,6 +1390,7 @@ ALTER TABLE t1 DROP COLUMN a; CALL p1(); v 2 +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP TABLE t1; @@ -1346,6 +1418,7 @@ CREATE TRIGGER t2_bu BEFORE UPDATE ON t2 FOR EACH ROW BEGIN SET NEW.a = (SELECT * FROM t1) * 2; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); x @@ -1379,6 +1452,7 @@ CALL p2(); 2 UPDATE t2 SET a = 30; +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -1406,10 +1480,12 @@ FETCH c INTO v; CLOSE c; SELECT v; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); v 2 +SET @@debug_dbug=@orig_dbug; DROP TABLE t1; DROP PROCEDURE p1; @@ -1429,10 +1505,12 @@ FETCH c INTO v; CLOSE c; SELECT v; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); v 2 +SET @@debug_dbug=@orig_dbug; DROP TEMPORARY TABLE t1; DROP PROCEDURE p1; @@ -1453,10 +1531,12 @@ FETCH c INTO v; CLOSE c; SELECT v; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); v 1 +SET @@debug_dbug=@orig_dbug; DROP TABLE t1; DROP PROCEDURE p1; @@ -1486,10 +1566,12 @@ SELECT f1, f2, f3; CLOSE c; END; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); f1 f2 f3 1 2 1 +SET @@debug_dbug=@orig_dbug; DROP TABLE t1; DROP PROCEDURE p1; @@ -1521,6 +1603,7 @@ CREATE TEMPORARY TABLE t1 (a INT); INSERT INTO t1 VALUES (1), (2); CREATE PROCEDURE p1() SELECT * FROM t1; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1(); a 1 @@ -1539,6 +1622,7 @@ CALL p1(); b NULL NULL +SET @@debug_dbug=@orig_dbug; DROP PROCEDURE p1; DROP TABLE t1; # Test handle of metadata changes with stored function. @@ -1549,6 +1633,7 @@ BEGIN CREATE TEMPORARY TABLE t1_result_set AS SELECT * FROM t1; RETURN 0; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; SELECT f1(); f1() 0 @@ -1576,6 +1661,7 @@ SELECT * FROM t1_result_set; b NULL NULL +SET @@debug_dbug=@orig_dbug; DROP TABLE t1_result_set; DROP TABLE t1; DROP FUNCTION f1; @@ -1588,6 +1674,7 @@ BEGIN CREATE TEMPORARY TABLE t1_result_set AS SELECT * FROM t1; RETURN 0; END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; SELECT f1(); f1() 0 @@ -1608,6 +1695,7 @@ SELECT * FROM t1_result_set; a 1 2 +SET @@debug_dbug=@orig_dbug; DROP TABLE t1_result_set; DROP FUNCTION f1; DROP TABLE t1; @@ -1669,6 +1757,7 @@ DROP TABLE t1_result_set; DROP TABLE t1; CREATE TEMPORARY TABLE t1 (a INT); INSERT INTO t1 VALUES (1), (2); +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1; a 1 @@ -1681,6 +1770,7 @@ a 1 2 DROP TABLE t1_result_set; +SET @@debug_dbug=@orig_dbug; DROP TABLE t1; CREATE TABLE t2 (a INT); INSERT INTO t2 VALUES (1), (2); @@ -1705,6 +1795,7 @@ DROP PROCEDURE p1; CREATE TABLE t1 (a INT); CREATE TRIGGER trg1 BEFORE INSERT ON t1 FOR EACH ROW SET new.a = new.a + 100; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; INSERT INTO t1 VALUES (1), (2); SELECT * FROM t1; a @@ -1718,12 +1809,14 @@ a b 101 NULL 102 NULL 103 4 +SET @@debug_dbug=@orig_dbug; DROP TRIGGER trg1; DROP TABLE t1; # Test if deleted column is handled correctly by trigger invocation. CREATE TABLE t1 (a INT, b INT); CREATE TRIGGER trg1 BEFORE INSERT ON t1 FOR EACH ROW SET new.a = new.a + 100; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; INSERT INTO t1 VALUES (1, 2), (3, 4); SELECT * FROM t1; a b @@ -1736,6 +1829,7 @@ a 101 103 105 +SET @@debug_dbug=@orig_dbug; DROP TRIGGER trg1; DROP TABLE t1; # Check if server returns and error when was dropped a column @@ -1743,6 +1837,7 @@ DROP TABLE t1; CREATE TABLE t1 (a INT, b INT); CREATE TRIGGER trg1 BEFORE INSERT ON t1 FOR EACH ROW SET new.a = new.a + 100; +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; INSERT INTO t1 VALUES (1, 2), (3, 4); SELECT * FROM t1; a b @@ -1751,6 +1846,7 @@ a b ALTER TABLE t1 DROP COLUMN a; INSERT INTO t1 VALUES (5); ERROR 42S22: Unknown column 'a' in 'NEW' +SET @@debug_dbug=@orig_dbug; DROP TRIGGER trg1; DROP TABLE t1; @@ -1765,6 +1861,7 @@ BEGIN INSERT INTO v1 VALUES (NEW.a); SET @x = (SELECT CHARSET(a) FROM v1 LIMIT 1); END| +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; SET @x = NULL; UPDATE t2 SET a = 10; @@ -1788,6 +1885,7 @@ a SELECT @x; @x latin1 +SET @@debug_dbug=@orig_dbug; DROP TABLE t1; DROP TABLE t2; diff --git a/mysql-test/main/sp_validation.test b/mysql-test/main/sp_validation.test index d91ee0003b5..1b6d92ec8cb 100644 --- a/mysql-test/main/sp_validation.test +++ b/mysql-test/main/sp_validation.test @@ -18,8 +18,11 @@ --echo # --echo +--source include/have_debug.inc + ########################################################################### ########################################################################### +SET @orig_debug=@@debug_dbug; --echo # The test case below demonstrates that meta-data changes are detected --echo # by triggers. @@ -38,6 +41,14 @@ INSERT INTO t3 (a) VALUES (1); SELECT * FROM t1; SELECT * FROM t2; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# trigger's body doesn't lead to eviction of the trigger +# from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + ALTER TABLE t1 ADD COLUMN c INT; ALTER TABLE t2 ADD COLUMN c INT; INSERT INTO t2 VALUES (31, 32, 33); @@ -47,6 +58,8 @@ INSERT INTO t3 (a) VALUES (2); SELECT * FROM t1; SELECT * FROM t2; +SET @@debug_dbug=@orig_dbug; + DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; @@ -92,6 +105,14 @@ INSERT INTO t1 VALUES (1), (2); CREATE PROCEDURE p1() SELECT * FROM t1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); --echo @@ -113,6 +134,8 @@ DELETE FROM t1; INSERT INTO t1 VALUES (b), ('hello'); CALL p1(); +SET @@debug_dbug=@orig_dbug; + --echo --echo # 1.4 Check if table's recreation is handled correctly --echo # inside a call of stored procedure. @@ -126,6 +149,14 @@ INSERT INTO t1 VALUES (1), (2); CREATE PROCEDURE p1() SELECT * FROM t1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); DROP TABLE t1; @@ -138,6 +169,8 @@ INSERT INTO t1 VALUES (1), (2); CALL p1(); +SET @@debug_dbug=@orig_dbug; + --echo --echo # 1.5 Recreate table t1 with another set of columns and --echo # re-call a stored procedure. @@ -151,6 +184,14 @@ INSERT INTO t1 VALUES (1), (2); CREATE PROCEDURE p1() SELECT * FROM t1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); DROP TABLE t1; @@ -163,6 +204,8 @@ INSERT INTO t1 VALUES ('a', 'b'), ('c', 'd'); CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP TABLE t1; DROP PROCEDURE p1; @@ -182,6 +225,13 @@ CALL p1(); ALTER VIEW v1 AS SELECT 1, 2, 3, 4, 5; +# In result of dropping/creating a view sp_cache is invalidated. +# It means that the stored procedure p1 be evicted from sp_cache +# and loaded again on opening the routine. So, the statement +# SET @@debug_dbug='+d,check_sp_cache_not_invalidated' +# shouldn't be run before execution of the statement +# 'CALL p1();' since it will hit DBUG_SUICIDE in the function +# sp_cache_flush_obsolete() CALL p1(); --echo @@ -208,6 +258,14 @@ DROP PROCEDURE p1; CREATE PROCEDURE p1() SELECT * FROM v1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); ALTER TABLE t1 ADD COLUMN c INT DEFAULT 3; @@ -219,6 +277,8 @@ ALTER TABLE t1 ADD COLUMN c INT DEFAULT 3; # So, this call should return 2 (not 3) columns. CALL p1(); +SET @@debug_dbug=@orig_dbug; + --echo --echo # 2.4 Stored program that uses query like 'SELECT * FROM v' must be --echo # re-executed successfully if not used columns were removed from the @@ -235,6 +295,14 @@ DROP PROCEDURE p1; CREATE PROCEDURE p1() SELECT * FROM v1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); ALTER TABLE t1 DROP COLUMN a; @@ -248,6 +316,8 @@ ALTER TABLE t1 DROP COLUMN b; --error ER_VIEW_INVALID CALL p1(); +SET @@debug_dbug=@orig_dbug; + --echo --echo # 2.5 Stored program that uses query like 'SELECT * FROM v' must be --echo # re-executed successfully if a type of some base table's columns were @@ -261,6 +331,15 @@ DROP VIEW v1; CREATE VIEW v1 AS SELECT b, c FROM t1; DROP PROCEDURE p1; + +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CREATE PROCEDURE p1() SELECT * FROM v1; @@ -272,6 +351,8 @@ INSERT INTO t1(a, c) VALUES (10, 30); CALL p1(); +SET @@debug_dbug=@orig_dbug; + --echo --echo # 2.6 Stored program that uses query like 'SELECT * FROM v' must be --echo # re-executed successfully if the view 'v' was dropped and created again @@ -294,6 +375,13 @@ CALL p1(); DROP VIEW v1; +# In result of dropping/creating a view sp_cache is invalidated. +# It means that the stored procedure p1 be evicted from sp_cache +# and loaded again on opening the routine. So, the statement +# SET @@debug_dbug='+d,check_sp_cache_not_invalidated' +# shouldn't be run before execution of the statement +# 'CALL p1();' since it will hit DBUG_SUICIDE in the function +# sp_cache_flush_obsolete() --error ER_NO_SUCH_TABLE CALL p1(); @@ -317,6 +405,14 @@ CREATE VIEW v1 AS SELECT * FROM t1; CREATE PROCEDURE p1() SELECT * FROM v1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); DROP TABLE t1; @@ -329,6 +425,8 @@ INSERT INTO t1 VALUES ('a', 'b'), ('c', 'd'); CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP VIEW v1; DROP TABLE t1; DROP PROCEDURE p1; @@ -343,6 +441,14 @@ INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT * FROM t1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); ALTER TABLE t1 ADD COLUMN c INT DEFAULT 3; @@ -389,6 +495,8 @@ INSERT INTO t1 VALUES ('aa', 'bb', 'cc'); CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP TEMPORARY TABLE t1; DROP PROCEDURE p1; @@ -403,6 +511,14 @@ INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT a, b FROM t1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); ALTER TABLE t1 DROP COLUMN b; @@ -410,6 +526,8 @@ ALTER TABLE t1 DROP COLUMN b; --error ER_BAD_FIELD_ERROR CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP TABLE t1; @@ -422,6 +540,14 @@ INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT a, b FROM t1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); ALTER TABLE t1 DROP COLUMN b; @@ -429,6 +555,8 @@ ALTER TABLE t1 DROP COLUMN b; --error ER_BAD_FIELD_ERROR CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP TEMPORARY TABLE t1; @@ -442,11 +570,19 @@ CREATE PROCEDURE p1() SELECT a, b FROM v1; CALL p1(); +# In result of altering a view sp_cache is invalidated. +# It means that the stored procedure p1 be evicted from sp_cache +# and loaded again on opening the routine. So, the statement +# SET @@debug_dbug='+d,check_sp_cache_not_invalidated' +# shouldn't be run here since it will hit DBUG_SUICIDE in the function +# sp_cache_flush_obsolete() ALTER VIEW v1 AS SELECT 1 AS a; --error ER_BAD_FIELD_ERROR CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP VIEW v1; @@ -459,6 +595,14 @@ INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT a, b FROM t1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); DROP TABLE t1; @@ -466,6 +610,8 @@ DROP TABLE t1; --error ER_NO_SUCH_TABLE CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; --echo @@ -480,6 +626,12 @@ CALL p1(); DROP VIEW v1; +# In result of dropping/creating a view sp_cache is invalidated. +# It means that the stored procedure p1 be evicted from sp_cache +# and loaded again on opening the routine. So, the statement +# SET @@debug_dbug='+d,check_sp_cache_not_invalidated' +# shouldn't be run here since it will hit DBUG_SUICIDE in the function +# sp_cache_flush_obsolete() --error ER_NO_SUCH_TABLE CALL p1(); @@ -494,6 +646,14 @@ INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT a, b FROM t1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); DROP TABLE t1; @@ -501,6 +661,8 @@ DROP TABLE t1; --error ER_NO_SUCH_TABLE CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; --echo @@ -578,6 +740,12 @@ CALL p1(); DROP TABLE t1; CREATE VIEW t1 AS SELECT 1 AS a, 2 AS b; +# In result of dropping/creating a view sp_cache is invalidated. +# It means that the stored procedure p1 be evicted from sp_cache +# and loaded again on opening the routine. So, the statement +# SET @@debug_dbug='+d,check_sp_cache_not_invalidated' +# shouldn't be run here since it will hit DBUG_SUICIDE in the function +# sp_cache_flush_obsolete() CALL p1(); DROP PROCEDURE p1; @@ -591,6 +759,14 @@ INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT * FROM t1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); DROP TABLE t1; @@ -599,6 +775,8 @@ INSERT INTO t1 VALUES (1, 2); CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP TEMPORARY TABLE t1; @@ -617,6 +795,8 @@ INSERT INTO t1 VALUES (1, 2); CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP TABLE t1; @@ -633,6 +813,12 @@ DROP VIEW t1; CREATE TEMPORARY TABLE t1(a INT, b INT); INSERT INTO t1 VALUES (1, 2); +# In result of dropping/creating a view sp_cache is invalidated. +# It means that the stored procedure p1 be evicted from sp_cache +# and loaded again on opening the routine. So, the statement +# SET @@debug_dbug='+d,check_sp_cache_not_invalidated' +# shouldn't be run here since it will hit DBUG_SUICIDE in the function +# sp_cache_flush_obsolete() CALL p1(); DROP PROCEDURE p1; @@ -654,6 +840,8 @@ CREATE VIEW t1 AS SELECT 1 AS a, 2 AS b; CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP VIEW t1; @@ -665,6 +853,14 @@ INSERT INTO t1 VALUES (1, 2); CREATE PROCEDURE p1() SELECT * FROM t1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); DROP TEMPORARY TABLE t1; @@ -673,6 +869,8 @@ INSERT INTO t1 VALUES (1, 2); CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP TABLE t1; @@ -704,6 +902,12 @@ END| delimiter ;| +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# trigger's body doesn't lead to eviction of the trigger +# from sp_cache +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo SET @x = 0, @y = 0; UPDATE t1 SET a = 3, b = 4; @@ -725,6 +929,8 @@ SET @x = 0, @y = 0; UPDATE t1 SET a = CONCAT('xxx_', a), b = 7; SELECT @x, @y; +SET @@debug_dbug=@orig_dbug; + --echo DROP TABLE t1; @@ -750,6 +956,12 @@ END| delimiter ;| +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# trigger's body doesn't lead to eviction of the trigger +# from sp_cache +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo UPDATE t1 SET a = 3, b = 4; @@ -768,6 +980,8 @@ ALTER TABLE t1 CHANGE COLUMN b b2 INT; --error ER_BAD_FIELD_ERROR UPDATE t1 SET a = 5, b2 = 6; +SET @@debug_dbug=@orig_dbug; + --echo DROP TABLE t1; @@ -798,10 +1012,18 @@ END| delimiter ;| +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p2(); --echo +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -832,10 +1054,18 @@ END| delimiter ;| +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p2(); --echo +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -870,10 +1100,18 @@ END| delimiter ;| +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p2(); --echo +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -908,10 +1146,18 @@ END| delimiter ;| +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p2(); --echo +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -943,10 +1189,18 @@ END| delimiter ;| +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p2(); --echo +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -978,11 +1232,19 @@ END| delimiter ;| +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo --error ER_BAD_FIELD_ERROR CALL p2(); --echo +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -1014,11 +1276,19 @@ END| delimiter ;| +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo --error ER_BAD_FIELD_ERROR CALL p2(); --echo +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -1054,11 +1324,19 @@ END| delimiter ;| +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo --error ER_BAD_FIELD_ERROR CALL p2(); --echo +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -1094,11 +1372,19 @@ END| delimiter ;| +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo --error ER_BAD_FIELD_ERROR CALL p2(); --echo +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -1131,11 +1417,21 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo --error ER_BAD_FIELD_ERROR CALL p2(); --echo +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -1201,12 +1497,22 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); CALL p2(); CALL p3(); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; DROP PROCEDURE p3; @@ -1303,6 +1609,14 @@ delimiter ;| CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (1); +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p1(); CALL p2(); @@ -1346,6 +1660,8 @@ SELECT f1(); SELECT f2(); --echo +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP PROCEDURE p2; DROP FUNCTION f1; @@ -1376,6 +1692,14 @@ delimiter ;| CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (0); +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(3); UPDATE t1 SET a = 1; @@ -1395,6 +1719,8 @@ ALTER TABLE t1 DROP COLUMN a; --error ER_BAD_FIELD_ERROR CALL p1(3); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP TABLE t1; @@ -1422,6 +1748,14 @@ delimiter ;| CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (0); +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(3); UPDATE t1 SET a = 1; @@ -1441,6 +1775,8 @@ ALTER TABLE t1 DROP COLUMN a; --error ER_BAD_FIELD_ERROR CALL p1(3); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP TABLE t1; @@ -1479,6 +1815,14 @@ delimiter ;| CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (0); +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p1(); @@ -1514,6 +1858,8 @@ ALTER TABLE t1 DROP COLUMN a; CALL p1(); CALL p2(); +SET @@debug_dbug=@orig_dbug; + --echo DROP PROCEDURE p1; @@ -1555,6 +1901,14 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo SET @x = 0; @@ -1583,6 +1937,8 @@ SET @x = 0; CALL p1(); SELECT @x; +SET @@debug_dbug=@orig_dbug; + --echo DROP PROCEDURE p1; @@ -1610,6 +1966,14 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p1(); @@ -1627,6 +1991,8 @@ ALTER TABLE t1 DROP COLUMN a; --echo CALL p1(); +SET @@debug_dbug=@orig_dbug; + --echo DROP PROCEDURE p1; DROP TABLE t1; @@ -1673,6 +2039,14 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p1(); --echo @@ -1704,6 +2078,8 @@ CALL p2(); --echo UPDATE t2 SET a = 30; +SET @@debug_dbug=@orig_dbug; + --echo DROP PROCEDURE p1; DROP PROCEDURE p2; @@ -1744,9 +2120,19 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p1(); +SET @@debug_dbug=@orig_dbug; + --echo DROP TABLE t1; DROP PROCEDURE p1; @@ -1777,9 +2163,19 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p1(); +SET @@debug_dbug=@orig_dbug; + --echo DROP TEMPORARY TABLE t1; DROP PROCEDURE p1; @@ -1814,9 +2210,19 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p1(); +SET @@debug_dbug=@orig_dbug; + --echo DROP TABLE t1; DROP PROCEDURE p1; @@ -1862,9 +2268,19 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo CALL p1(); +SET @@debug_dbug=@orig_dbug; + --echo DROP TABLE t1; DROP PROCEDURE p1; @@ -1878,6 +2294,12 @@ DROP PROCEDURE p1; CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1), (2); +# In result of dropping/creating a view sp_cache is invalidated. +# It means that the stored procedure p1 be evicted from sp_cache +# and loaded again on opening the routine. So, the statement +# SET @@debug_dbug='+d,check_sp_cache_not_invalidated' +# shouldn't be run here since it will hit DBUG_SUICIDE in the function +# sp_cache_flush_obsolete() CREATE VIEW v1 AS SELECT * FROM t1; CREATE PROCEDURE p1() @@ -1904,6 +2326,14 @@ INSERT INTO t1 VALUES (1), (2); CREATE PROCEDURE p1() SELECT * FROM t1; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + CALL p1(); --echo # Test if added temporary table's column is recognized during @@ -1916,6 +2346,8 @@ CALL p1(); ALTER TABLE t1 DROP COLUMN a; CALL p1(); +SET @@debug_dbug=@orig_dbug; + DROP PROCEDURE p1; DROP TABLE t1; @@ -1935,6 +2367,14 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + SELECT f1(); SELECT * FROM t1_result_set; DROP TABLE t1_result_set; @@ -1951,6 +2391,9 @@ ALTER TABLE t1 DROP COLUMN a; SELECT f1(); SELECT * FROM t1_result_set; + +SET @@debug_dbug=@orig_dbug; + DROP TABLE t1_result_set; DROP TABLE t1; @@ -1973,6 +2416,14 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + SELECT f1(); SELECT * FROM t1_result_set; DROP TABLE t1_result_set; @@ -1985,6 +2436,9 @@ INSERT INTO t1 VALUES (1), (2); SELECT f1(); SELECT * FROM t1_result_set; + +SET @@debug_dbug=@orig_dbug; + DROP TABLE t1_result_set; DROP FUNCTION f1; @@ -2011,10 +2465,18 @@ SELECT * FROM t1_result_set; DROP TABLE t1_result_set; ALTER TABLE t1 ADD COLUMN (b INT); + ALTER VIEW v1 AS SELECT * FROM t1; +# In result of altering a view sp_cache is invalidated. +# It means that the stored function f1 be evicted from sp_cache +# and loaded again on opening the routine. So, the statement +# SET @@debug_dbug='+d,check_sp_cache_not_invalidated' +# shouldn't be run here since it will hit DBUG_SUICIDE in the function +# sp_cache_flush_obsolete() SELECT f1(); SELECT * FROM t1_result_set; + DROP TABLE t1_result_set; DROP TABLE t1; DROP VIEW v1; @@ -2049,11 +2511,20 @@ DROP TABLE t1; CREATE TEMPORARY TABLE t1 (a INT); INSERT INTO t1 VALUES (1), (2); +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# stored routine's body doesn't lead to eviction of +# the stored routine from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; CALL p1; SELECT f1(); SELECT * FROM t1_result_set; DROP TABLE t1_result_set; +SET @@debug_dbug=@orig_dbug; + DROP TABLE t1; CREATE TABLE t2 (a INT); INSERT INTO t2 VALUES (1), (2); @@ -2062,6 +2533,7 @@ CREATE VIEW t1 AS SELECT * FROM t2; CALL p1; SELECT f1(); SELECT * FROM t1_result_set; + DROP TABLE t1_result_set; DROP TABLE t2; @@ -2077,6 +2549,14 @@ CREATE TABLE t1 (a INT); CREATE TRIGGER trg1 BEFORE INSERT ON t1 FOR EACH ROW SET new.a = new.a + 100; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# trigger's body doesn't lead to eviction of trigger +# from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + INSERT INTO t1 VALUES (1), (2); SELECT * FROM t1; @@ -2086,6 +2566,8 @@ INSERT INTO t1 VALUES (3, 4); SELECT * FROM t1; +SET @@debug_dbug=@orig_dbug; + DROP TRIGGER trg1; DROP TABLE t1; @@ -2095,6 +2577,14 @@ CREATE TABLE t1 (a INT, b INT); CREATE TRIGGER trg1 BEFORE INSERT ON t1 FOR EACH ROW SET new.a = new.a + 100; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# trigger's body doesn't lead to eviction of trigger +# from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + INSERT INTO t1 VALUES (1, 2), (3, 4); SELECT * FROM t1; @@ -2103,6 +2593,8 @@ ALTER TABLE t1 DROP COLUMN b; INSERT INTO t1 VALUES (5); SELECT * FROM t1; +SET @@debug_dbug=@orig_dbug; + DROP TRIGGER trg1; DROP TABLE t1; @@ -2113,6 +2605,14 @@ CREATE TABLE t1 (a INT, b INT); CREATE TRIGGER trg1 BEFORE INSERT ON t1 FOR EACH ROW SET new.a = new.a + 100; +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# trigger's body doesn't lead to eviction of trigger +# from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + INSERT INTO t1 VALUES (1, 2), (3, 4); SELECT * FROM t1; @@ -2121,6 +2621,8 @@ ALTER TABLE t1 DROP COLUMN a; --error ER_BAD_FIELD_ERROR INSERT INTO t1 VALUES (5); +SET @@debug_dbug=@orig_dbug; + DROP TRIGGER trg1; DROP TABLE t1; @@ -2145,6 +2647,14 @@ END| delimiter ;| +# +# Set the debug keyword 'check_sp_cache_not_invalidated' +# in order to check that re-parsing of statements inside +# trigger's body doesn't lead to eviction of trigger +# from sp_cache +# +SET @@debug_dbug='+d,check_sp_cache_not_invalidated'; + --echo SET @x = NULL; @@ -2164,6 +2674,8 @@ UPDATE t2 SET a = 20; SELECT * FROM v1; SELECT @x; +SET @@debug_dbug=@orig_dbug; + --echo DROP TABLE t1; DROP TABLE t2; diff --git a/sql/sp_cache.cc b/sql/sp_cache.cc index 36ad37104bd..70ae22cec96 100644 --- a/sql/sp_cache.cc +++ b/sql/sp_cache.cc @@ -233,6 +233,7 @@ void sp_cache_flush_obsolete(sp_cache **cp, sp_head **sp) { if ((*sp)->sp_cache_version() < Cversion && !(*sp)->is_invoked()) { + DBUG_EXECUTE_IF("check_sp_cache_not_invalidated", DBUG_SUICIDE();); (*cp)->remove(*sp); *sp= NULL; }