summaryrefslogtreecommitdiff
path: root/mysql-test/main/sp-destruct.test
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/main/sp-destruct.test')
-rw-r--r--mysql-test/main/sp-destruct.test322
1 files changed, 322 insertions, 0 deletions
diff --git a/mysql-test/main/sp-destruct.test b/mysql-test/main/sp-destruct.test
new file mode 100644
index 00000000000..607c733b492
--- /dev/null
+++ b/mysql-test/main/sp-destruct.test
@@ -0,0 +1,322 @@
+#
+# Destructive stored procedure tests
+#
+# We do horrible things to the mysql.proc table here, so any unexpected
+# failures here might leave it in an undetermined state.
+#
+# In the case of trouble you might want to skip this.
+#
+
+-- source include/not_embedded.inc
+
+# Supress warnings written to the log file
+call mtr.add_suppression("Column count of mysql.proc is wrong. Expected 21, found 20. The table is probably corrupted");
+call mtr.add_suppression("Stored routine .test...bug14233_[123].: invalid value in column mysql.proc");
+
+# Backup proc table
+let $MYSQLD_DATADIR= `select @@datadir`;
+flush table mysql.proc;
+--copy_file $MYSQLD_DATADIR/mysql/proc.frm $MYSQLTEST_VARDIR/tmp/proc.frm
+--copy_file $MYSQLD_DATADIR/mysql/proc.MYD $MYSQLTEST_VARDIR/tmp/proc.MYD
+--copy_file $MYSQLD_DATADIR/mysql/proc.MYI $MYSQLTEST_VARDIR/tmp/proc.MYI
+
+use test;
+
+--disable_warnings
+drop procedure if exists bug14233;
+drop function if exists bug14233;
+drop table if exists t1;
+drop view if exists v1;
+--enable_warnings
+
+create procedure bug14233()
+ set @x = 42;
+
+create function bug14233_f() returns int
+ return 42;
+
+create table t1 (id int);
+create trigger t1_ai after insert on t1 for each row call bug14233();
+
+# Unsupported tampering with the mysql.proc definition
+alter table mysql.proc drop security_type;
+--error ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2
+call bug14233();
+--error ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2
+create view v1 as select bug14233_f();
+--error ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2
+insert into t1 values (0);
+--error ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2
+show procedure status;
+
+flush table mysql.proc;
+
+# Thrashing the .frm file
+--remove_file $MYSQLD_DATADIR/mysql/proc.frm
+--write_file $MYSQLD_DATADIR/mysql/proc.frm
+saljdfa
+EOF
+--replace_result $MYSQLTEST_VARDIR . master-data// '' '\\' '/'
+--error ER_NOT_FORM_FILE
+call bug14233();
+--replace_result $MYSQLTEST_VARDIR . master-data// '' '\\' '/'
+--error ER_NOT_FORM_FILE
+create view v1 as select bug14233_f();
+--replace_result $MYSQLTEST_VARDIR . master-data// '' '\\' '/'
+--error ER_NOT_FORM_FILE
+insert into t1 values (0);
+
+flush table mysql.proc;
+
+# Drop the mysql.proc table
+--remove_file $MYSQLD_DATADIR/mysql/proc.frm
+--remove_file $MYSQLD_DATADIR/mysql/proc.MYD
+--remove_file $MYSQLD_DATADIR/mysql/proc.MYI
+--error ER_NO_SUCH_TABLE
+call bug14233();
+--error ER_NO_SUCH_TABLE
+create view v1 as select bug14233_f();
+--error ER_NO_SUCH_TABLE
+insert into t1 values (0);
+
+# Restore mysql.proc
+--copy_file $MYSQLTEST_VARDIR/tmp/proc.frm $MYSQLD_DATADIR/mysql/proc.frm
+--copy_file $MYSQLTEST_VARDIR/tmp/proc.MYD $MYSQLD_DATADIR/mysql/proc.MYD
+--copy_file $MYSQLTEST_VARDIR/tmp/proc.MYI $MYSQLD_DATADIR/mysql/proc.MYI
+--remove_file $MYSQLTEST_VARDIR/tmp/proc.frm
+--remove_file $MYSQLTEST_VARDIR/tmp/proc.MYD
+--remove_file $MYSQLTEST_VARDIR/tmp/proc.MYI
+
+flush table mysql.proc;
+flush privileges;
+
+delete from mysql.proc where name like 'bug14233%';
+
+# Unsupported editing of mysql.proc, circumventing checks in "create ..."
+insert into mysql.proc
+(
+ db, name, type, specific_name, language, sql_data_access, is_deterministic,
+ security_type, param_list, returns, body, definer, created, modified,
+ sql_mode, comment, character_set_client, collation_connection, db_collation,
+ body_utf8
+)
+values
+(
+ 'test', 'bug14233_1', 'FUNCTION', 'bug14233_1', 'SQL', 'READS_SQL_DATA', 'NO',
+ 'DEFINER', '', 'int(10)',
+ 'select count(*) from mysql.user',
+ 'root@localhost', NOW() , '0000-00-00 00:00:00', '', '',
+ '', '', '',
+ 'select count(*) from mysql.user'
+),
+(
+ 'test', 'bug14233_2', 'FUNCTION', 'bug14233_2', 'SQL', 'READS_SQL_DATA', 'NO',
+ 'DEFINER', '', 'int(10)',
+ 'begin declare x int; select count(*) into x from mysql.user; end',
+ 'root@localhost', NOW() , '0000-00-00 00:00:00', '', '',
+ '', '', '',
+ 'begin declare x int; select count(*) into x from mysql.user; end'
+),
+(
+ 'test', 'bug14233_3', 'PROCEDURE', 'bug14233_3', 'SQL', 'READS_SQL_DATA','NO',
+ 'DEFINER', '', '',
+ 'alksj wpsj sa ^#!@ ',
+ 'root@localhost', NOW() , '0000-00-00 00:00:00', '', '',
+ '', '', '',
+ 'alksj wpsj sa ^#!@ '
+);
+
+--error ER_SP_PROC_TABLE_CORRUPT
+select bug14233_1();
+--error ER_SP_PROC_TABLE_CORRUPT
+create view v1 as select bug14233_1();
+
+--error ER_SP_PROC_TABLE_CORRUPT
+select bug14233_2();
+--error ER_SP_PROC_TABLE_CORRUPT
+create view v1 as select bug14233_2();
+
+--error ER_SP_PROC_TABLE_CORRUPT
+call bug14233_3();
+drop trigger t1_ai;
+create trigger t1_ai after insert on t1 for each row call bug14233_3();
+--error ER_SP_PROC_TABLE_CORRUPT
+insert into t1 values (0);
+
+# Clean-up
+drop trigger t1_ai;
+drop table t1;
+
+#
+# BUG#16303: erroneus stored procedures and functions should be droppable
+#
+drop function bug14233_1;
+drop function bug14233_2;
+drop procedure bug14233_3;
+# Assert: These should show nothing.
+show procedure status where db=DATABASE();
+show function status where db=DATABASE();
+
+#
+# Bug#41726 upgrade from 5.0 to 5.1.30 crashes if you didn't run mysql_upgrade
+#
+
+
+--disable_warnings
+DROP TABLE IF EXISTS proc_backup;
+DROP PROCEDURE IF EXISTS p1;
+--enable_warnings
+
+--echo # Backup the proc table
+
+RENAME TABLE mysql.proc TO proc_backup;
+CREATE TABLE mysql.proc LIKE proc_backup;
+FLUSH TABLE mysql.proc;
+
+--echo # Test with a valid table.
+
+CREATE PROCEDURE p1()
+ SET @foo = 10;
+CALL p1();
+--replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00'
+SHOW PROCEDURE STATUS;
+
+--echo # Modify a field of the table.
+
+ALTER TABLE mysql.proc MODIFY comment CHAR (32);
+
+--error ER_CANNOT_LOAD_FROM_TABLE_V2
+CREATE PROCEDURE p2()
+ SET @foo = 10;
+--echo # Procedure loaded from the cache
+CALL p1();
+--error ER_CANNOT_LOAD_FROM_TABLE_V2
+SHOW PROCEDURE STATUS;
+
+DROP TABLE mysql.proc;
+RENAME TABLE proc_backup TO mysql.proc;
+FLUSH TABLE mysql.proc;
+
+
+--echo #
+--echo # Bug#51376 Assert `! is_set()' failed in
+--echo # Diagnostics_area::set_ok_status on DROP FUNCTION
+--echo #
+
+--disable_warnings
+DROP FUNCTION IF EXISTS f1;
+--enable_warnings
+
+CREATE FUNCTION f1() RETURNS INT RETURN 1;
+
+--echo # Backup the procs_priv table
+RENAME TABLE mysql.procs_priv TO procs_priv_backup;
+FLUSH TABLE mysql.procs_priv;
+
+# DROP FUNCTION used to cause an assert.
+DROP FUNCTION f1;
+SHOW WARNINGS;
+
+--echo # Restore the procs_priv table
+RENAME TABLE procs_priv_backup TO mysql.procs_priv;
+FLUSH TABLE mysql.procs_priv;
+
+
+--echo #
+--echo # Bug #56137 "Assertion `thd->lock == 0' failed on upgrading from
+--echo # 5.1.50 to 5.5.6".
+--echo #
+--disable_warnings
+drop database if exists mysqltest;
+--enable_warnings
+--echo # Backup mysql.proc.
+flush table mysql.proc;
+let $MYSQLD_DATADIR= `select @@datadir`;
+--copy_file $MYSQLD_DATADIR/mysql/proc.frm $MYSQLTEST_VARDIR/tmp/proc.frm
+--copy_file $MYSQLD_DATADIR/mysql/proc.MYD $MYSQLTEST_VARDIR/tmp/proc.MYD
+--copy_file $MYSQLD_DATADIR/mysql/proc.MYI $MYSQLTEST_VARDIR/tmp/proc.MYI
+
+create database mysqltest;
+--echo # Corrupt mysql.proc to make it unusable by current version of server.
+alter table mysql.proc drop column security_type;
+--echo # The below statement should not cause assertion failure.
+drop database mysqltest;
+
+--echo # Restore mysql.proc.
+drop table mysql.proc;
+--copy_file $MYSQLTEST_VARDIR/tmp/proc.frm $MYSQLD_DATADIR/mysql/proc.frm
+--copy_file $MYSQLTEST_VARDIR/tmp/proc.MYD $MYSQLD_DATADIR/mysql/proc.MYD
+--copy_file $MYSQLTEST_VARDIR/tmp/proc.MYI $MYSQLD_DATADIR/mysql/proc.MYI
+--remove_file $MYSQLTEST_VARDIR/tmp/proc.frm
+--remove_file $MYSQLTEST_VARDIR/tmp/proc.MYD
+--remove_file $MYSQLTEST_VARDIR/tmp/proc.MYI
+
+
+--echo #
+--echo # Bug#58414 mysql_upgrade fails on dump upgrade between 5.1.53 -> 5.5.8
+--echo #
+
+--disable_warnings
+DROP TABLE IF EXISTS proc_backup;
+DROP DATABASE IF EXISTS db1;
+--enable_warnings
+
+--echo # Backup the proc table
+RENAME TABLE mysql.proc TO proc_backup;
+CREATE TABLE mysql.proc LIKE proc_backup;
+
+CREATE DATABASE db1;
+CREATE PROCEDURE db1.p1() SET @foo = 10;
+
+--echo # Modify a field of the table.
+ALTER TABLE mysql.proc MODIFY comment CHAR (32);
+
+# This should not fail even if mysql.proc is invalid.
+DROP DATABASE db1;
+
+--echo # Restore mysql.proc
+DROP TABLE mysql.proc;
+RENAME TABLE proc_backup TO mysql.proc;
+
+#
+# BUG#19875331 - HANDLE_FATAL_SIGNAL 11 IN STRMAKE
+#
+create database mysqltest1;
+create procedure mysqltest1.foo() select "foo";
+update mysql.proc set name='' where db='mysqltest1';
+drop database mysqltest1;
+
+
+--echo #
+--echo # MDEV-15444 Querying I_S.PARAMETERS can crash with a corrupted mysql.proc
+--echo #
+
+CREATE OR REPLACE FUNCTION f1 (a INT) RETURNS INT RETURN 10;
+CREATE OR REPLACE FUNCTION f2 (a INT) RETURNS INT RETURN 10;
+
+# Get the current data type for mysql.proc.type
+--vertical_results
+SELECT
+ @type0:=COLUMN_TYPE AS t0,
+ @type1:=REPLACE(COLUMN_TYPE,')',',''XXX'')') AS t1
+ FROM INFORMATION_SCHEMA.COLUMNS
+WHERE table_schema='mysql' AND table_name='proc' AND column_name='type';
+--horizontal_results
+
+# Change mysql.proc.type and update the record for 'f1'
+EXECUTE IMMEDIATE CONCAT('ALTER TABLE mysql.proc MODIFY type ', @type1);
+SHOW COLUMNS IN mysql.proc LIKE 'type';
+UPDATE mysql.proc SET type='XXX' WHERE name='f1' AND db='test';
+
+# Check the I_S query
+--vertical_results
+SELECT * FROM INFORMATION_SCHEMA.PARAMETERS WHERE SPECIFIC_SCHEMA='test';
+--horizontal_results
+
+# Restore the record for 'f1' and restore mysql.proc.type
+UPDATE mysql.proc SET type='FUNCTION' WHERE name='f1' AND db='test';
+EXECUTE IMMEDIATE CONCAT('ALTER TABLE mysql.proc MODIFY type ', @type0);
+SHOW COLUMNS IN mysql.proc LIKE 'type';
+
+DROP FUNCTION f1;
+DROP FUNCTION f2;