diff options
author | Varun Gupta <varun.gupta@mariadb.com> | 2020-05-18 10:31:17 +0530 |
---|---|---|
committer | Varun Gupta <varun.gupta@mariadb.com> | 2020-05-18 10:31:17 +0530 |
commit | e59e7723f6cc5b7ca6c6b4ee9f05f0cd192c56ad (patch) | |
tree | cdc451aa83bc7e2e140f386c6bc3766b499facc8 /sql/sql_statistics.cc | |
parent | 5d85bc08c6412d067a69d2c1354a10f9a803b332 (diff) | |
download | mariadb-git-10.5-mdev22509.tar.gz |
MDEV-22509: Server crashes in Field_inet6::store_inet6_null_with_warn / Field::maybe_null10.5-mdev22509
Diffstat (limited to 'sql/sql_statistics.cc')
-rw-r--r-- | sql/sql_statistics.cc | 38 |
1 files changed, 12 insertions, 26 deletions
diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index 55e8e52c052..ef9d4a1599c 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -1025,6 +1025,7 @@ public: char buff[MAX_FIELD_WIDTH]; String val(buff, sizeof(buff), &my_charset_bin); my_bitmap_map *old_map; + Field *fld= NULL; old_map= dbug_tmp_use_all_columns(stat_table, stat_table->read_set); for (uint i= COLUMN_STAT_MIN_VALUE; i <= COLUMN_STAT_HISTOGRAM; i++) @@ -1037,26 +1038,12 @@ public: stat_field->set_notnull(); switch (i) { case COLUMN_STAT_MIN_VALUE: - if (table_field->type() == MYSQL_TYPE_BIT) - stat_field->store(table_field->collected_stats->min_value->val_int(),true); - else - { - table_field->collected_stats->min_value->val_str(&val); - size_t length= Well_formed_prefix(val.charset(), val.ptr(), - MY_MIN(val.length(), stat_field->field_length)).length(); - stat_field->store(val.ptr(), length, &my_charset_bin); - } + fld= table_field->collected_stats->min_value; + fld->store_to_statistical_minmax_field(stat_field, &val); break; case COLUMN_STAT_MAX_VALUE: - if (table_field->type() == MYSQL_TYPE_BIT) - stat_field->store(table_field->collected_stats->max_value->val_int(),true); - else - { - table_field->collected_stats->max_value->val_str(&val); - size_t length= Well_formed_prefix(val.charset(), val.ptr(), - MY_MIN(val.length(), stat_field->field_length)).length(); - stat_field->store(val.ptr(), length, &my_charset_bin); - } + fld= table_field->collected_stats->max_value; + fld->store_to_statistical_minmax_field(stat_field, &val); break; case COLUMN_STAT_NULLS_RATIO: stat_field->store(table_field->collected_stats->get_nulls_ratio()); @@ -1118,6 +1105,7 @@ public: { char buff[MAX_FIELD_WIDTH]; String val(buff, sizeof(buff), &my_charset_bin); + Field *field= NULL; for (uint i= COLUMN_STAT_MIN_VALUE; i <= COLUMN_STAT_HIST_TYPE; i++) { @@ -1134,16 +1122,14 @@ 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); + field= table_field->read_stats->min_value; + field->set_notnull(); + field->store_from_statistical_minmax_field(stat_field, &val); 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); + field= table_field->read_stats->min_value; + field->set_notnull(); + field->store_from_statistical_minmax_field(stat_field, &val); break; case COLUMN_STAT_NULLS_RATIO: table_field->read_stats->set_nulls_ratio(stat_field->val_real()); |