mirror of
https://github.com/MariaDB/server.git
synced 2025-03-23 23:48:41 +01:00
MDEV-32476 LeakSanitizer errors in get_quick_select or Assertion ...
Problem was that JOIN_TAB::cleanup() was not run because JOIN::top_join_tab_count was not set in case of early errors. Fixed by setting JOIN::tab_join_tab_count when JOIN_TAB's are allocated. Something that should eventually be fixed: - Cleaning up JOIN_TAB's is now done in 3 different loops. JOIN_TAB::cleanup() is only doing a partial cleanup. Other cleanups are done outside of JOIN_TAB::cleanup(). The above should be fixed so that JOIN_TAB::cleanup() is freeing everything related to it's own memory, including all its sub JOIN_ TAB's. JOIN::cleanup() should only loop over all it's top JOIN_TAB's and call JOIN_TAB::cleanup() on these. This will greatly simplify and speedup the current code (as we now do some cleanup's twice).
This commit is contained in:
parent
a1b6befc78
commit
6a674c3142
3 changed files with 38 additions and 3 deletions
13
mysql-test/main/leaks.result
Normal file
13
mysql-test/main/leaks.result
Normal file
|
@ -0,0 +1,13 @@
|
|||
#
|
||||
# MDEV-32476 LeakSanitizer errors in get_quick_select or
|
||||
# Assertion `status_var.local_memory_used == 0
|
||||
#
|
||||
CREATE TABLE t1 (pk INT AUTO_INCREMENT, f INT, PRIMARY KEY (pk), KEY(f))
|
||||
ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (1,10),(2,20);
|
||||
INSERT INTO t1 (f) SELECT t2.f FROM t1 t2, t1 t3 WHERE t2.f = 10 AND t3.pk > 'foo';
|
||||
ERROR 22007: Truncated incorrect DECIMAL value: 'foo'
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 10.6 tests
|
||||
#
|
22
mysql-test/main/leaks.test
Normal file
22
mysql-test/main/leaks.test
Normal file
|
@ -0,0 +1,22 @@
|
|||
#
|
||||
# Collection of small tests that finds leaks and does not fit in any other
|
||||
# tests
|
||||
#
|
||||
|
||||
--source include/have_innodb.inc
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-32476 LeakSanitizer errors in get_quick_select or
|
||||
--echo # Assertion `status_var.local_memory_used == 0
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (pk INT AUTO_INCREMENT, f INT, PRIMARY KEY (pk), KEY(f))
|
||||
ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (1,10),(2,20);
|
||||
--error ER_TRUNCATED_WRONG_VALUE
|
||||
INSERT INTO t1 (f) SELECT t2.f FROM t1 t2, t1 t3 WHERE t2.f = 10 AND t3.pk > 'foo';
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.6 tests
|
||||
--echo #
|
|
@ -5299,6 +5299,7 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
|
|||
|
||||
/* The following should be optimized to only clear critical things */
|
||||
bzero((void*)stat, sizeof(JOIN_TAB)* table_count);
|
||||
join->top_join_tab_count= table_count;
|
||||
|
||||
/* Initialize POSITION objects */
|
||||
for (i=0 ; i <= table_count ; i++)
|
||||
|
@ -5880,8 +5881,8 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
|
|||
join->cond_equal= &((Item_cond_and*) (join->conds))->m_cond_equal;
|
||||
|
||||
s->quick=select->quick;
|
||||
s->needed_reg=select->needed_reg;
|
||||
select->quick=0;
|
||||
s->needed_reg=select->needed_reg;
|
||||
impossible_range= records == 0 && s->table->reginfo.impossible_range;
|
||||
if (join->thd->lex->sql_command == SQLCOM_SELECT &&
|
||||
optimizer_flag(join->thd, OPTIMIZER_SWITCH_USE_ROWID_FILTER))
|
||||
|
@ -14409,7 +14410,6 @@ void JOIN_TAB::cleanup()
|
|||
*/
|
||||
table->pos_in_table_list->table= NULL;
|
||||
free_tmp_table(join->thd, table);
|
||||
table= NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -14422,8 +14422,8 @@ void JOIN_TAB::cleanup()
|
|||
multiple times (it may be)
|
||||
*/
|
||||
tmp->table= NULL;
|
||||
table= NULL;
|
||||
}
|
||||
table= NULL;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
/*
|
||||
|
|
Loading…
Add table
Reference in a new issue