mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
MDEV-6985: MariaDB crashes on stored procedure call
Item_ident fixed to allow double cleanup().
This commit is contained in:
parent
357cb12d87
commit
ff5349bd6c
3 changed files with 86 additions and 1 deletions
32
mysql-test/r/sp-innodb.result
Normal file
32
mysql-test/r/sp-innodb.result
Normal file
|
@ -0,0 +1,32 @@
|
|||
drop table if exists t1,t2;
|
||||
drop procedure if exists p1;
|
||||
#
|
||||
#MDEV-6985: MariaDB crashes on stored procedure call
|
||||
#
|
||||
CREATE TABLE `t1` (
|
||||
`ID` int(11) NOT NULL,
|
||||
PRIMARY KEY (`ID`)
|
||||
) ENGINE=InnoDB;
|
||||
CREATE TABLE `t2` (
|
||||
`ID` int(11) NOT NULL,
|
||||
`DATE` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`ID`)
|
||||
) ENGINE=InnoDB;
|
||||
CREATE PROCEDURE `p1`()
|
||||
BEGIN
|
||||
DECLARE _mySelect CURSOR FOR
|
||||
SELECT DISTINCT t1.ID
|
||||
FROM t1
|
||||
LEFT JOIN t2 AS t2 ON
|
||||
t2.ID = t1.ID
|
||||
AND t2.DATE = (
|
||||
SELECT MAX(T3.DATE) FROM t2 AS T3 WHERE T3.ID = t2.ID AND T3.DATE<=NOW()
|
||||
)
|
||||
WHERE t1.ID = 1;
|
||||
OPEN _mySelect;
|
||||
CLOSE _mySelect;
|
||||
END ;;
|
||||
CALL p1();
|
||||
CALL p1();
|
||||
drop procedure p1;
|
||||
drop table t1,t2;
|
45
mysql-test/t/sp-innodb.test
Normal file
45
mysql-test/t/sp-innodb.test
Normal file
|
@ -0,0 +1,45 @@
|
|||
|
||||
--source include/have_innodb.inc
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1,t2;
|
||||
drop procedure if exists p1;
|
||||
--enable_warnings
|
||||
|
||||
--echo #
|
||||
--echo #MDEV-6985: MariaDB crashes on stored procedure call
|
||||
--echo #
|
||||
CREATE TABLE `t1` (
|
||||
`ID` int(11) NOT NULL,
|
||||
PRIMARY KEY (`ID`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE `t2` (
|
||||
`ID` int(11) NOT NULL,
|
||||
`DATE` datetime DEFAULT NULL,
|
||||
PRIMARY KEY (`ID`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
--delimiter ;;
|
||||
|
||||
CREATE PROCEDURE `p1`()
|
||||
BEGIN
|
||||
DECLARE _mySelect CURSOR FOR
|
||||
SELECT DISTINCT t1.ID
|
||||
FROM t1
|
||||
LEFT JOIN t2 AS t2 ON
|
||||
t2.ID = t1.ID
|
||||
AND t2.DATE = (
|
||||
SELECT MAX(T3.DATE) FROM t2 AS T3 WHERE T3.ID = t2.ID AND T3.DATE<=NOW()
|
||||
)
|
||||
WHERE t1.ID = 1;
|
||||
OPEN _mySelect;
|
||||
CLOSE _mySelect;
|
||||
END ;;
|
||||
--delimiter ;
|
||||
|
||||
CALL p1();
|
||||
CALL p1();
|
||||
|
||||
drop procedure p1;
|
||||
drop table t1,t2;
|
10
sql/item.cc
10
sql/item.cc
|
@ -862,12 +862,20 @@ void Item_ident::cleanup()
|
|||
field_name ? field_name : "(null)",
|
||||
orig_field_name ? orig_field_name : "(null)"));
|
||||
#endif
|
||||
bool was_fixed= fixed;
|
||||
Item::cleanup();
|
||||
db_name= orig_db_name;
|
||||
table_name= orig_table_name;
|
||||
field_name= orig_field_name;
|
||||
/* Store if this Item was depended */
|
||||
can_be_depended= test(depended_from);
|
||||
if (was_fixed)
|
||||
{
|
||||
/*
|
||||
We can trust that depended_from set correctly only if this item
|
||||
was fixed
|
||||
*/
|
||||
can_be_depended= test(depended_from);
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue