1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Bug#21013: Performance Degrades when importing data that uses Trigger

and Stored Procedure

The essence of the bug was that for every re-execution of stored
routine or prepared statement new items for character set conversions
were created, thus increasing the number of items and the time of their
processing, and creating memory leak.

No test case is provided since current test suite can't cover such type
of bugs.
This commit is contained in:
kroki/tomash@moonlight.intranet
2006-07-17 14:48:40 +04:00
parent b823c2f601
commit 5a64e5c24f
3 changed files with 42 additions and 2 deletions

View File

@ -5057,4 +5057,16 @@ concat('data was: /', var1, '/')
data was: /1/
drop table t3|
drop procedure bug15217|
DROP PROCEDURE IF EXISTS bug21013 |
CREATE PROCEDURE bug21013(IN lim INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE (i < lim) DO
SET @b = LOCATE(_latin1'b', @a, 1);
SET i = i + 1;
END WHILE;
END |
SET @a = _latin2"aaaaaaaaaa" |
CALL bug21013(10) |
DROP PROCEDURE bug21013 |
drop table t1,t2;

View File

@ -5962,6 +5962,33 @@ call bug15217()|
drop table t3|
drop procedure bug15217|
#
# BUG#21013: Performance Degrades when importing data that uses
# Trigger and Stored Procedure
#
# This is a performance and memory leak test. Run with large number
# passed to bug21013() procedure.
#
--disable_warnings
DROP PROCEDURE IF EXISTS bug21013 |
--enable_warnings
CREATE PROCEDURE bug21013(IN lim INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE (i < lim) DO
SET @b = LOCATE(_latin1'b', @a, 1);
SET i = i + 1;
END WHILE;
END |
SET @a = _latin2"aaaaaaaaaa" |
CALL bug21013(10) |
DROP PROCEDURE bug21013 |
#
# BUG#NNNN: New bug synopsis
#

View File

@ -1418,7 +1418,8 @@ bool agg_item_charsets(DTCollation &coll, const char *fname,
In case we're in statement prepare, create conversion item
in its memory: it will be reused on each execute.
*/
arena= thd->activate_stmt_arena_if_needed(&backup);
arena= thd->is_stmt_prepare() ? thd->activate_stmt_arena_if_needed(&backup)
: NULL;
for (i= 0, arg= args; i < nargs; i++, arg+= item_sep)
{
@ -1453,7 +1454,7 @@ bool agg_item_charsets(DTCollation &coll, const char *fname,
been created in prepare. In this case register the change for
rollback.
*/
if (arena && arena->is_conventional())
if (arena)
*arg= conv;
else
thd->change_item_tree(arg, conv);