mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-31578 DECLARE CURSOR: "Memory not freed: 280 bytes lost" on syntax error
When CURSOR parameters get parsed, their sp_assignment_lex instances (one instance per parameter) get collected to List<sp_assignment_lex>. These instances get linked to sphead only in the end of the list. If a syntax error happened in the middle of the parameter list, these instances were not deleted, which caused memory leaks. Fix: using a Bison %destructor to free rules of the <sp_assignment_lex_list> type (on syntax errors). Afte the fix these sp_assignment_lex instances from CURSOR parameters deleted as follows: - If the CURSOR statement was fully parsed, then these instances get properly linked to sp_head structures, so they are deleted during ~sp_head (this did not change) - If the CURSOR statement failed on a syntax error, then by Bison's %destructor (this is being added in the current patch).
This commit is contained in:
@ -27,3 +27,28 @@ BEGIN NOT ATOMIC
|
||||
END
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-31578 DECLARE CURSOR: "Memory not freed: 280 bytes lost" on syntax error
|
||||
--echo #
|
||||
|
||||
DELIMITER $$;
|
||||
--error ER_PARSE_ERROR
|
||||
BEGIN NOT ATOMIC
|
||||
DECLARE cur CURSOR (a INT) FOR SELECT a+1;
|
||||
OPEN cur(sp_followed_by_syntax_error();
|
||||
CLOSE cur;
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
||||
DELIMITER $$;
|
||||
--error ER_PARSE_ERROR
|
||||
BEGIN NOT ATOMIC
|
||||
DECLARE cur CURSOR (a INT) FOR SELECT a+1;
|
||||
OPEN cur(1,sp_followed_by_syntax_error();
|
||||
CLOSE cur;
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
Reference in New Issue
Block a user