diff options
author | Varun Gupta <varun.gupta@mariadb.com> | 2021-01-30 22:36:51 +0530 |
---|---|---|
committer | Varun Gupta <varun.gupta@mariadb.com> | 2021-01-30 22:36:51 +0530 |
commit | 072b39da66d9c1693ca832eb97f2d63b238cc412 (patch) | |
tree | 0f4dfe87543b194a0a4b495fc4f9372ac6ae78de /sql/sql_statistics.cc | |
parent | b87c342da5e51e112e06b36d8b95037f182bdb0e (diff) | |
download | mariadb-git-072b39da66d9c1693ca832eb97f2d63b238cc412.tar.gz |
MDEV-22583: Selectivity for BIT columns in filtered column for EXPLAIN is incorrect
For BIT columns when EITS is collected, we store the integral value in
text representation in the min and max fields of the statistical table
When this value is retrieved from the statistical table to original table
field then we try to store the text representation in the original field
which is INCORRECT.
The value that is retrieved should be converted to integral type and that
value should be stored back in the original field. This would get us the
correct estimate for selectivity of the predicate.
Diffstat (limited to 'sql/sql_statistics.cc')
-rw-r--r-- | sql/sql_statistics.cc | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index b63172045e6..39fcfd7e6db 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -1154,16 +1154,30 @@ public: switch (i) { case COLUMN_STAT_MIN_VALUE: - table_field->read_stats->min_value->set_notnull(); - stat_field->val_str(&val); - table_field->read_stats->min_value->store(val.ptr(), val.length(), - &my_charset_bin); + table_field->read_stats->min_value->set_notnull(); + if (table_field->type() == MYSQL_TYPE_BIT) + table_field->read_stats->min_value->store(stat_field->val_int(), + true); + else + { + stat_field->val_str(&val); + table_field->read_stats->min_value->store(val.ptr(), + val.length(), + &my_charset_bin); + } break; case COLUMN_STAT_MAX_VALUE: - table_field->read_stats->max_value->set_notnull(); - stat_field->val_str(&val); - table_field->read_stats->max_value->store(val.ptr(), val.length(), - &my_charset_bin); + table_field->read_stats->max_value->set_notnull(); + if (table_field->type() == MYSQL_TYPE_BIT) + table_field->read_stats->max_value->store(stat_field->val_int(), + true); + else + { + stat_field->val_str(&val); + table_field->read_stats->max_value->store(val.ptr(), + val.length(), + &my_charset_bin); + } break; case COLUMN_STAT_NULLS_RATIO: table_field->read_stats->set_nulls_ratio(stat_field->val_real()); |