mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-18300: ASAN error in Field_blob::get_key_image upon UPDATE with subquery
For single table updates and multi-table updates , engine independent statistics were not being read even if the statistics were collected. Fixed it, so when the optimizer_use_condition_selectivity > 2 then we would read the available statistics for update queries.
This commit is contained in:
@ -65,3 +65,27 @@ SELECT * FROM t1;
|
|||||||
a_id b_id c_id
|
a_id b_id c_id
|
||||||
1 NULL NULL
|
1 NULL NULL
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
#
|
||||||
|
# MDEV-18300: ASAN error in Field_blob::get_key_image upon UPDATE with subquery
|
||||||
|
#
|
||||||
|
set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
|
||||||
|
set @save_use_stat_tables= @@use_stat_tables;
|
||||||
|
set use_stat_tables=preferably;
|
||||||
|
set optimizer_use_condition_selectivity=4;
|
||||||
|
CREATE TABLE t1 (a INT, b CHAR(8)) ENGINE=InnoDB;
|
||||||
|
insert into t1 values (1,'foo'),(2, 'abc');
|
||||||
|
CREATE TABLE t2 (c CHAR(8), d BLOB) ENGINE=InnoDB;
|
||||||
|
insert into t2 values ('abc', 'foo'),('edf', 'food');
|
||||||
|
ANALYZE TABLE t1,t2;
|
||||||
|
UPDATE t1 SET a = 1 WHERE b = ( SELECT c FROM t2 WHERE d = 'foo' );
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a b
|
||||||
|
1 foo
|
||||||
|
1 abc
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
create table t1 (a int not null, b int, c int) engine=InnoDB;
|
||||||
|
create table t2 (d int, e int) engine=InnoDB;
|
||||||
|
update t1, t2 set a=NULL, b=2, c=NULL where b=d and e=200;
|
||||||
|
drop table t1,t2;
|
||||||
|
set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||||
|
set @@use_stat_tables= @save_use_stat_tables;
|
||||||
|
@ -75,3 +75,32 @@ SELECT t2.b_id FROM t1,t2 WHERE t2.c_id = t1.c_id;
|
|||||||
UPDATE t1 SET b_id = (SELECT t2.b_id FROM t2 t2 WHERE t2.c_id = t1.c_id);
|
UPDATE t1 SET b_id = (SELECT t2.b_id FROM t2 t2 WHERE t2.c_id = t1.c_id);
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-18300: ASAN error in Field_blob::get_key_image upon UPDATE with subquery
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
|
||||||
|
set @save_use_stat_tables= @@use_stat_tables;
|
||||||
|
set use_stat_tables=preferably;
|
||||||
|
set optimizer_use_condition_selectivity=4;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT, b CHAR(8)) ENGINE=InnoDB;
|
||||||
|
insert into t1 values (1,'foo'),(2, 'abc');
|
||||||
|
CREATE TABLE t2 (c CHAR(8), d BLOB) ENGINE=InnoDB;
|
||||||
|
insert into t2 values ('abc', 'foo'),('edf', 'food');
|
||||||
|
|
||||||
|
--disable_result_log
|
||||||
|
ANALYZE TABLE t1,t2;
|
||||||
|
--enable_result_log
|
||||||
|
UPDATE t1 SET a = 1 WHERE b = ( SELECT c FROM t2 WHERE d = 'foo' );
|
||||||
|
SELECT * FROM t1;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
create table t1 (a int not null, b int, c int) engine=InnoDB;
|
||||||
|
create table t2 (d int, e int) engine=InnoDB;
|
||||||
|
update t1, t2 set a=NULL, b=2, c=NULL where b=d and e=200;
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
|
set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||||
|
set @@use_stat_tables= @save_use_stat_tables;
|
||||||
|
@ -4071,6 +4071,7 @@ bool is_eits_usable(Field *field)
|
|||||||
partition list of a table. We assume the selecticivity for
|
partition list of a table. We assume the selecticivity for
|
||||||
such columns would be handled during partition pruning.
|
such columns would be handled during partition pruning.
|
||||||
*/
|
*/
|
||||||
|
DBUG_ASSERT(field->table->stats_is_read);
|
||||||
Column_statistics* col_stats= field->read_stats;
|
Column_statistics* col_stats= field->read_stats;
|
||||||
return col_stats && !col_stats->no_stat_values_provided() && //(1)
|
return col_stats && !col_stats->no_stat_values_provided() && //(1)
|
||||||
field->type() != MYSQL_TYPE_GEOMETRY && //(2)
|
field->type() != MYSQL_TYPE_GEOMETRY && //(2)
|
||||||
|
@ -301,6 +301,8 @@ int mysql_update(THD *thd,
|
|||||||
if (lock_tables(thd, table_list, table_count, 0))
|
if (lock_tables(thd, table_list, table_count, 0))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
|
(void) read_statistics_for_tables_if_needed(thd, table_list);
|
||||||
|
|
||||||
if (table_list->handle_derived(thd->lex, DT_MERGE_FOR_INSERT))
|
if (table_list->handle_derived(thd->lex, DT_MERGE_FOR_INSERT))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
if (table_list->handle_derived(thd->lex, DT_PREPARE))
|
if (table_list->handle_derived(thd->lex, DT_PREPARE))
|
||||||
@ -1540,6 +1542,7 @@ int mysql_multi_update_prepare(THD *thd)
|
|||||||
{
|
{
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
(void) read_statistics_for_tables_if_needed(thd, table_list);
|
||||||
/* @todo: downgrade the metadata locks here. */
|
/* @todo: downgrade the metadata locks here. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user