mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 10:56:12 +01:00 
			
		
		
		
	 56bc6901d6
			
		
	
	
	56bc6901d6
	
	
	
		
			
			Attempt to create a procedure with the DEFINER clause resulted in abnormal server termination in case the server run with the option --skip-grant-tables=1. The reason of abnormal termination is that on handling of the DEFINER clause, not initialized data members of acl_cache is accessed, that led to server crash. Behaviour of the server for considered use case must be the same as for embedded server. Than means, if a security subsytem wasn't initialized (server is started with the option --skip-grant-tables=1) return success from get_current_user() without further access to the acl_cache that obviously not initialized. Additionlly, AUTHID::is_role was modified to handle the case when a host part of the user name isn't provided. Treat this case as if the empty host name is provided.
		
			
				
	
	
		
			439 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			439 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| # Test file for stored procedure bugfixes
 | |
| 
 | |
| --echo #
 | |
| --echo # Bug #47412: Valgrind warnings / user can read uninitialized memory
 | |
| --echo # using SP variables
 | |
| --echo #
 | |
| 
 | |
| CREATE SCHEMA testdb;
 | |
| USE testdb;
 | |
| DELIMITER |;
 | |
| CREATE FUNCTION f2 () RETURNS INTEGER
 | |
| BEGIN
 | |
|    DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
 | |
|    RETURN f_not_exists () ;
 | |
| END|
 | |
| CREATE PROCEDURE p3 ( arg1 VARCHAR(32) )
 | |
| BEGIN
 | |
|    CALL p_not_exists ( );
 | |
| END|
 | |
| DELIMITER ;|
 | |
| --echo # should not return valgrind warnings
 | |
| --error ER_SP_DOES_NOT_EXIST
 | |
| CALL p3 ( f2 () );
 | |
| 
 | |
| DROP SCHEMA testdb;
 | |
| 
 | |
| CREATE SCHEMA testdb;
 | |
| USE testdb;
 | |
| DELIMITER |;
 | |
| CREATE FUNCTION f2 () RETURNS INTEGER
 | |
| BEGIN
 | |
|    DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
 | |
|    RETURN f_not_exists () ;
 | |
| END|
 | |
| CREATE PROCEDURE p3 ( arg2 INTEGER )
 | |
| BEGIN
 | |
|    CALL p_not_exists ( );
 | |
| END|
 | |
| DELIMITER ;|
 | |
| --echo # should not return valgrind warnings
 | |
| --error ER_SP_DOES_NOT_EXIST
 | |
| CALL p3 ( f2 () );
 | |
| 
 | |
| DROP SCHEMA testdb;
 | |
| 
 | |
| CREATE SCHEMA testdb;
 | |
| USE testdb;
 | |
| DELIMITER |;
 | |
| CREATE FUNCTION f2 () RETURNS INTEGER
 | |
| BEGIN
 | |
|    DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
 | |
|    RETURN f_not_exists () ;
 | |
| END|
 | |
| DELIMITER ;|
 | |
| --echo # should not return valgrind warnings
 | |
| SELECT f2 ();
 | |
| 
 | |
| DROP SCHEMA testdb;
 | |
| 
 | |
| USE test;
 | |
| 
 | |
| --echo #
 | |
| --echo # Bug#50423: Crash on second call of a procedure dropping a trigger
 | |
| --echo #
 | |
| 
 | |
| --disable_warnings
 | |
| DROP TABLE IF EXISTS t1;
 | |
| DROP TRIGGER IF EXISTS tr1;
 | |
| DROP PROCEDURE IF EXISTS p1;
 | |
| --enable_warnings
 | |
| 
 | |
| CREATE TABLE t1 (f1 INTEGER);
 | |
| CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @aux = 1;
 | |
| CREATE PROCEDURE p1 () DROP TRIGGER tr1;
 | |
| 
 | |
| CALL p1 ();
 | |
| --error ER_TRG_DOES_NOT_EXIST
 | |
| CALL p1 ();
 | |
| 
 | |
| DROP TABLE t1;
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| --echo #
 | |
| --echo # Bug#54375: Error in stored procedure leaves connection
 | |
| --echo # in different default schema
 | |
| --echo #
 | |
| 
 | |
| --disable_warnings
 | |
| SET @@SQL_MODE = 'STRICT_ALL_TABLES';
 | |
| DROP DATABASE IF EXISTS db1;
 | |
| CREATE DATABASE db1;
 | |
| USE db1;
 | |
| DROP TABLE IF EXISTS t1;
 | |
| CREATE TABLE t1 (c1 int NOT NULL PRIMARY KEY);
 | |
| INSERT INTO t1 VALUES (1);
 | |
| DELIMITER $$;
 | |
| CREATE FUNCTION f1 (
 | |
| 	some_value int
 | |
| )
 | |
| RETURNS smallint
 | |
| DETERMINISTIC
 | |
| BEGIN
 | |
| 	INSERT INTO t1 SET c1 = some_value;
 | |
|         RETURN(LAST_INSERT_ID());
 | |
| END$$
 | |
| DELIMITER ;$$
 | |
| DROP DATABASE IF EXISTS db2;
 | |
| CREATE DATABASE db2;
 | |
| --enable_warnings
 | |
| USE db2;
 | |
| SELECT DATABASE();
 | |
| --error ER_DUP_ENTRY
 | |
| SELECT db1.f1(1);
 | |
| SELECT DATABASE();
 | |
| USE test;
 | |
| DROP FUNCTION db1.f1;
 | |
| DROP TABLE db1.t1;
 | |
| DROP DATABASE db1;
 | |
| DROP DATABASE db2;
 | |
| USE test;
 | |
| 
 | |
| --echo #
 | |
| --echo # Bug#13105873:valgrind warning:possible crash in foreign 
 | |
| --echo # key handling on subsequent create table if not exists 
 | |
| --echo #
 | |
| 
 | |
| --disable_warnings
 | |
| DROP DATABASE IF EXISTS testdb;
 | |
| --enable_warnings
 | |
| CREATE DATABASE testdb;
 | |
| USE testdb;
 | |
| CREATE TABLE t1 (id1 INT PRIMARY KEY);
 | |
| DELIMITER $;
 | |
| CREATE PROCEDURE `p1`()
 | |
| BEGIN
 | |
|     CREATE TABLE IF NOT EXISTS t2(id INT PRIMARY KEY,
 | |
|     CONSTRAINT FK FOREIGN KEY (id) REFERENCES t1( id1 ));
 | |
| END$
 | |
| DELIMITER ;$
 | |
| CALL p1();
 | |
| --echo # below stmt should not return valgrind warnings
 | |
| CALL p1(); 
 | |
| DROP DATABASE testdb;
 | |
| USE test;
 | |
| 
 | |
| --echo #
 | |
| --echo # End of 5.1 tests
 | |
| --echo #
 | |
| 
 | |
| --echo #
 | |
| --echo # BUG#13489996 valgrind:conditional jump or move depends on
 | |
| --echo # uninitialised values-field_blob
 | |
| --echo #
 | |
| 
 | |
| CREATE FUNCTION sf() RETURNS BLOB RETURN "";
 | |
| SELECT sf();
 | |
| DROP FUNCTION sf;
 | |
| 
 | |
| --echo #
 | |
| --echo # Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE
 | |
| --echo #
 | |
| SET @@SQL_MODE = '';
 | |
| DELIMITER $;
 | |
| CREATE FUNCTION testf_bug11763507() RETURNS INT
 | |
| BEGIN
 | |
|     RETURN 0;
 | |
| END
 | |
| $
 | |
| 
 | |
| CREATE PROCEDURE testp_bug11763507()
 | |
| BEGIN
 | |
|     SELECT "PROCEDURE testp_bug11763507";
 | |
| END
 | |
| $
 | |
| 
 | |
| DELIMITER ;$
 | |
| 
 | |
| # STORED FUNCTIONS
 | |
| SELECT testf_bug11763507();
 | |
| SELECT TESTF_bug11763507();
 | |
| 
 | |
| --replace_column 5 # 6 #
 | |
| SHOW FUNCTION STATUS LIKE  'testf_bug11763507';
 | |
| --replace_column 5 # 6 #
 | |
| SHOW FUNCTION STATUS WHERE NAME='testf_bug11763507';
 | |
| --replace_column 5 # 6 #
 | |
| SHOW FUNCTION STATUS LIKE  'TESTF_bug11763507';
 | |
| --replace_column 5 # 6 #
 | |
| SHOW FUNCTION STATUS WHERE NAME='TESTF_bug11763507';
 | |
| 
 | |
| SHOW CREATE FUNCTION testf_bug11763507;
 | |
| SHOW CREATE FUNCTION TESTF_bug11763507;
 | |
| 
 | |
| # STORED PROCEDURE
 | |
| CALL testp_bug11763507();
 | |
| CALL TESTP_bug11763507();
 | |
| 
 | |
| --replace_column 5 # 6 #
 | |
| SHOW PROCEDURE STATUS LIKE  'testp_bug11763507';
 | |
| --replace_column 5 # 6 #
 | |
| SHOW PROCEDURE STATUS WHERE NAME='testp_bug11763507';
 | |
| --replace_column 5 # 6 #
 | |
| SHOW PROCEDURE STATUS LIKE  'TESTP_bug11763507';
 | |
| --replace_column 5 # 6 #
 | |
| SHOW PROCEDURE STATUS WHERE NAME='TESTP_bug11763507';
 | |
| 
 | |
| SHOW CREATE PROCEDURE testp_bug11763507;
 | |
| SHOW CREATE PROCEDURE TESTP_bug11763507;
 | |
| 
 | |
| # INFORMATION SCHEMA 
 | |
| SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name LIKE 'testf_bug11763507';
 | |
| SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name LIKE 'TESTF_bug11763507';
 | |
| 
 | |
| SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name='testf_bug11763507';
 | |
| SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name='TESTF_bug11763507';
 | |
| 
 | |
| DROP PROCEDURE testp_bug11763507;
 | |
| DROP FUNCTION testf_bug11763507;
 | |
| 
 | |
| --echo #END OF BUG#11763507 test.
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-5531 double call procedure in one session
 | |
| --echo #
 | |
| 
 | |
| CREATE TABLE  `t1` (
 | |
|   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 | |
|   `create_ts` int(10) unsigned DEFAULT '0',
 | |
|   PRIMARY KEY (`id`)
 | |
| ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
 | |
| 
 | |
| DELIMITER $$;
 | |
| 
 | |
| CREATE PROCEDURE test_5531 (IN step TINYINT(1))
 | |
| BEGIN
 | |
|   DECLARE counts INT DEFAULT 0;
 | |
|   DECLARE cur1 CURSOR FOR
 | |
| 
 | |
|   SELECT ct.id
 | |
|   FROM (SELECT NULL) AS z
 | |
|   JOIN (
 | |
|     SELECT id
 | |
|     FROM `t1`
 | |
|     LIMIT 10
 | |
|   ) AS ct
 | |
|   JOIN (SELECT NULL) AS x ON(
 | |
|     EXISTS(
 | |
|       SELECT 1
 | |
|       FROM `t1`
 | |
|       WHERE id=ct.id
 | |
|       LIMIT 1
 | |
|     )
 | |
|   );
 | |
| 
 | |
|   IF step=1 THEN
 | |
|     TRUNCATE t1;
 | |
|     REPEAT
 | |
|       INSERT INTO `t1`
 | |
|       (create_ts) VALUES
 | |
|       (UNIX_TIMESTAMP());
 | |
| 
 | |
|       SET counts=counts+1;
 | |
|     UNTIL counts>150 END REPEAT;
 | |
| 
 | |
|     SET max_sp_recursion_depth=1;
 | |
| 
 | |
|     CALL test_5531(2);
 | |
|     SET max_sp_recursion_depth=2;
 | |
|     CALL test_5531(2);
 | |
|   ELSEIF step=2 THEN
 | |
|     OPEN cur1; CLOSE cur1;
 | |
|   END IF;
 | |
| END $$
 | |
| DELIMITER ;$$
 | |
| CALL test_5531(1);
 | |
| DROP PROCEDURE test_5531;
 | |
| DROP TABLE t1;
 | |
| 
 | |
| #
 | |
| # MDEV-6601 Assertion `!thd->in_active_multi_stmt_transa ction() || thd->in_multi_stmt_transaction_mode()' failed on executing a stored procedure with commit
 | |
| #
 | |
| delimiter |;
 | |
| create procedure sp() begin
 | |
|   commit;
 | |
| end|
 | |
| delimiter ;|
 | |
| start transaction;
 | |
| call sp();
 | |
| drop procedure sp;
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-11146 SP variables of the SET data type erroneously allow values with comma
 | |
| --echo #
 | |
| 
 | |
| DELIMITER $$;
 | |
| --error ER_ILLEGAL_VALUE_FOR_TYPE
 | |
| CREATE PROCEDURE p1()
 | |
| BEGIN
 | |
|   DECLARE a SET('a','b','c','a,b');
 | |
|   SET a='a,b';
 | |
|   SELECT a, a+0;
 | |
| END;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| 
 | |
| 
 | |
| --echo #
 | |
| --echo # Start of 10.3 tests
 | |
| --echo #
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-16117 SP with a single FOR statement creates but further fails to load
 | |
| --echo #
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1()
 | |
|   FOR i IN 1..10 DO
 | |
|       set @x = 5;
 | |
|   END FOR;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| CALL p1;
 | |
| SELECT body FROM mysql.proc WHERE db='test' AND specific_name='p1';
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1() WITH t1 AS (SELECT 1) SELECT 1;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| CALL p1;
 | |
| SELECT body FROM mysql.proc WHERE db='test' AND specific_name='p1';
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE PROCEDURE p1() VALUES (1);
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| CALL p1;
 | |
| SELECT body FROM mysql.proc WHERE db='test' AND specific_name='p1';
 | |
| DROP PROCEDURE p1;
 | |
| 
 | |
| 
 | |
| DELIMITER $$;
 | |
| CREATE FUNCTION f1() RETURNS INT
 | |
|   FOR i IN 1..10 DO
 | |
|     RETURN 1;
 | |
|   END FOR;
 | |
| $$
 | |
| DELIMITER ;$$
 | |
| SELECT f1();
 | |
| SELECT body FROM mysql.proc WHERE db='test' AND specific_name='f1';
 | |
| DROP FUNCTION f1;
 | |
| 
 | |
| --echo #
 | |
| --echo # End of 10.2 tests
 | |
| --echo #
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-25501 routine_definition in information_schema.routines loses tablename if it starts with an _ and is not backticked
 | |
| --echo #
 | |
| create table _t1 (a int);
 | |
| create procedure p1() select * from _t1;
 | |
| show create procedure p1;
 | |
| select routine_definition from information_schema.routines where routine_schema=database() and specific_name='p1';
 | |
| select body, body_utf8 from mysql.proc where name='p1';
 | |
| drop procedure p1;
 | |
| drop table _t1;
 | |
| 
 | |
| --echo #
 | |
| --echo # End of 10.3 tests
 | |
| --echo #
 | |
| 
 | |
| --echo #
 | |
| --echo #  MDEV-22001: Server crashes in st_select_lex_unit::exclude_level upon execution of SP
 | |
| --echo #
 | |
| --delimiter $
 | |
| BEGIN NOT ATOMIC DECLARE a INT DEFAULT 0 IN ( SELECT 1 ) OR 2 ; END $
 | |
| BEGIN NOT ATOMIC DECLARE a INT DEFAULT 0 IN ( SELECT 1 ) OR (SELECT 2) ; END $
 | |
| --delimiter ;
 | |
| 
 | |
| --error ER_NO_SUCH_THREAD
 | |
| KILL  (('x' IN ( SELECT 1)) MOD 44);
 | |
| 
 | |
| --echo #
 | |
| --echo # End of 10.4 tests
 | |
| --echo #
 | |
| 
 | |
| --echo #
 | |
| --echo #  MDEV-24935: Server crashes in Field_iterator_natural_join::next or Field_iterator_table_ref::set_field_iterator upon 2nd execution of SP
 | |
| --echo #
 | |
| CREATE TABLE t1 (a INT);
 | |
| CREATE TABLE t2 (b INT, c INT);
 | |
| CREATE TABLE t3 (d INT);
 | |
| CREATE PROCEDURE sp() SELECT * FROM t1 JOIN t2 JOIN t3 USING (x);
 | |
| --error ER_BAD_FIELD_ERROR
 | |
| CALL sp;
 | |
| --error ER_BAD_FIELD_ERROR
 | |
| CALL sp;
 | |
| --echo # Clean up
 | |
| DROP PROCEDURE sp;
 | |
| DROP TABLE t1, t2, t3;
 | |
| 
 | |
| CREATE TABLE t1 (c1 INT,c2 INT);
 | |
| CREATE TABLE t2 (c INT,c2 INT);
 | |
| CREATE PROCEDURE p2 (OUT i INT,OUT o INT) READS SQL DATA DELETE a2,a3 FROM t1 AS a1 JOIN t2 AS a2 NATURAL JOIN t2 AS a3;
 | |
| 
 | |
| --error ER_NON_UNIQ_ERROR
 | |
| CALL p2 (@c,@a);
 | |
| --error ER_NON_UNIQ_ERROR
 | |
| CALL p2 (@a,@c);
 | |
| --echo # Clean up
 | |
| DROP PROCEDURE p2;
 | |
| DROP TABLE t1, t2;
 | |
| 
 | |
| --echo #
 | |
| --echo # MDEV-34501: SIGSEGV in pfs_start_mutex_wait_v1, __strlen_avx2, or __strlen_evex from safe_mutex_lock on CREATE DEFINER when using skip-grant-tables
 | |
| --echo #
 | |
| --echo # This test is a duplicate of the one located in the file skip_grants.test
 | |
| --echo # and placed here to check the same test case against embedded-server
 | |
| 
 | |
| # Disable warnings before running the following CREATE PROCEDURE/FUNCTION
 | |
| # statement since the warning message
 | |
| #   "The user specified as a definer ('a'@'%') does not exist"
 | |
| # is output in case the test be run against a regular server
 | |
| # and isn't output if embedded server is used (@sa sp_process_definer()
 | |
| # in sql_parse.cc).
 | |
| --disable_warnings
 | |
| CREATE DEFINER=a PROCEDURE p() SELECT 1;
 | |
| CREATE DEFINER=a FUNCTION f() RETURNS INT RETURN 100;
 | |
| --enable_warnings
 | |
| 
 | |
| DROP PROCEDURE p;
 | |
| DROP FUNCTION f;
 | |
| 
 | |
| --echo #
 | |
| --echo # End of 10.5 tests
 | |
| --echo #
 |