Commit 27539cd2 authored by Sergei Petrunia's avatar Sergei Petrunia

MDEV-26801: Valgrind/MSAN errors in Column_statistics_collected::finish ...

The problem was introduced in fix for MDEV-26724. That patch has made it
possible for histogram collection to fail. In particular, it fails for
non-assigned characters.

When histogram construction fails, we also abort the computation of
COUNT(DISTINCT). When we try to use the value, we get valgrind failures.

Switched the code to abort the statistics collection in this case.
parent 93d59804
......@@ -7443,14 +7443,11 @@ create table t1 ( a varchar(100) character set cp1251);
insert into t1 values ( _cp1251 x'88'),( _cp1251 x'98');
analyze table t1 persistent for all;
Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK
# Command succeeded but no histogram was collected:
test.t1 analyze status Operation failed
select hist_type, histogram
from mysql.column_stats
where db_name=database() and table_name='t1';
hist_type histogram
NULL NULL
drop table t1;
#
# ASAN use-after-poison my_strnxfrm_simple_internal / Histogram_json_hb::range_selectivity ...
......
......@@ -235,7 +235,6 @@ create table t1 ( a varchar(100) character set cp1251);
insert into t1 values ( _cp1251 x'88'),( _cp1251 x'98');
analyze table t1 persistent for all;
--echo # Command succeeded but no histogram was collected:
select hist_type, histogram
from mysql.column_stats
where db_name=database() and table_name='t1';
......
......@@ -314,7 +314,7 @@ class Column_statistics_collected :public Column_statistics
inline void init(THD *thd, Field * table_field);
inline bool add();
inline void finish(MEM_ROOT *mem_root, ha_rows rows, double sample_fraction);
inline bool finish(MEM_ROOT *mem_root, ha_rows rows, double sample_fraction);
inline void cleanup();
};
......@@ -2468,7 +2468,7 @@ bool Column_statistics_collected::add()
*/
inline
void Column_statistics_collected::finish(MEM_ROOT *mem_root, ha_rows rows,
bool Column_statistics_collected::finish(MEM_ROOT *mem_root, ha_rows rows,
double sample_fraction)
{
double val;
......@@ -2507,6 +2507,10 @@ void Column_statistics_collected::finish(MEM_ROOT *mem_root, ha_rows rows,
{
delete histogram;
histogram= NULL;
delete count_distinct;
count_distinct= NULL;
return true; // Error
}
}
......@@ -2559,7 +2563,8 @@ void Column_statistics_collected::finish(MEM_ROOT *mem_root, ha_rows rows,
val= 1.0;
set_avg_frequency(val);
set_not_null(COLUMN_STAT_AVG_FREQUENCY);
}
}
return false;
}
......@@ -2810,7 +2815,10 @@ int collect_statistics_for_table(THD *thd, TABLE *table)
continue;
bitmap_set_bit(table->write_set, table_field->field_index);
if (!rc)
table_field->collected_stats->finish(&table->mem_root, rows, sample_fraction);
{
rc= table_field->collected_stats->finish(&table->mem_root, rows,
sample_fraction);
}
else
table_field->collected_stats->cleanup();
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment