mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix for MDEV-5531: double call procedure in one session - hard shutdown the server
Main fix was to not cache derivied tables as they may be temporary tables that are deleted before the next query. This was a bit tricky as Item_field::fix_fields depended on cached_tables to be set to resolve some columns. mysql-test/r/sp-bugs.result: Added test case mysql-test/t/sp-bugs.test: Added test case sql/item.cc: Fixed fix_outer_field to handle case where found field did not have in cached_table Idea is that if cached_table is not avaliable, use from_field->table->pos_in_table_list instead sql/records.cc: Also accept INTERNAL_TMP_TABLE for memmap sql/sql_base.cc: More DBUG_PRINT Fixed that setup_natural_join_row_types() is not run twice. Original code modified context->first_name_resolution_table also for second executions. This was wrong as this could give wrong results if some joins had been optimized away between calls. sql/sql_derived.cc: Mark derived tables as internal temporary tables (INTERNAL_TMP_TABLE), not as NON_TRANSACTIONAL_TMP_TABLE. This is more correct as the tables are not visible by the end user. sql/sql_insert.cc: Reset pos_in_table_list before calling fix_fields. One of the consequences of the change of not caching all generated tables in Item_ident is that pos_in_table_list needs to be correct in calls to fix_fields. sql/sql_lex.cc: More DBUG_PRINT sql/sql_parse.cc: Don't cache derivied tables as they may be temporary tables that are deleted before the next query sql/sql_select.cc: Reset table_vector. This was required as some code checked the vector to see if temporary tables had already been created. sql/table.cc: Mark tables with field translations as cacheable (as these will not disapper between stmt executions.
This commit is contained in:
@ -222,3 +222,49 @@ testf_bug11763507
|
||||
DROP PROCEDURE testp_bug11763507;
|
||||
DROP FUNCTION testf_bug11763507;
|
||||
#END OF BUG#11763507 test.
|
||||
#
|
||||
# MDEV-5531 double call procedure in one session
|
||||
#
|
||||
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;
|
||||
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 $$
|
||||
CALL test_5531(1);
|
||||
DROP PROCEDURE test_5531;
|
||||
DROP TABLE t1;
|
||||
|
@ -228,3 +228,60 @@ 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;
|
||||
|
Reference in New Issue
Block a user