summaryrefslogtreecommitdiff
path: root/sql/sql_statistics.cc
diff options
context:
space:
mode:
authorMichael Widenius <monty@mariadb.org>2019-09-22 04:08:48 +0300
committerMichael Widenius <monty@mariadb.org>2019-09-22 04:08:48 +0300
commit1bbe8c5e0f6823acd4780d7563e8c02f8b4c5a01 (patch)
tree640662e33767ac08186f6b1a5cf95c77faf560e7 /sql/sql_statistics.cc
parentba7725dace48d403187eb2a418a2081703fe5c9d (diff)
downloadmariadb-git-1bbe8c5e0f6823acd4780d7563e8c02f8b4c5a01.tar.gz
Proper fix for disabling warnings in read_statistics_for_table().
MDEV-20589: Server still crashes in Field::set_warning_truncated_wrong_value - Use dbug_tmp_use_all_columns() to mark that all fields can be used - Remove field->is_stat_field (not needed) - Remove extra arguments to Field::clone() that should not be there - Safety fix for Field::set_warning_truncated_wrong_value() to not crash if table is zero in production builds (We have got crashes several times here so better to be safe than sorry). - Threat wrong character string warnings identical to other field conversion warnings. This removes some warnings we before got from internal conversion errors. There is no good reason why a user would get an error in case of 'key_field='wrong-utf8-string' but not for 'field=wrong-utf8-string'. The old code could also easily give thousands of no-sence warnings for one single statement.
Diffstat (limited to 'sql/sql_statistics.cc')
-rw-r--r--sql/sql_statistics.cc11
1 files changed, 9 insertions, 2 deletions
diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc
index 8d1342773f7..5e0275fa65d 100644
--- a/sql/sql_statistics.cc
+++ b/sql/sql_statistics.cc
@@ -1042,7 +1042,9 @@ public:
{
char buff[MAX_FIELD_WIDTH];
String val(buff, sizeof(buff), &my_charset_bin);
+ my_bitmap_map *old_map;
+ 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++)
{
Field *stat_field= stat_table->field[i];
@@ -1100,6 +1102,7 @@ public:
}
}
}
+ dbug_tmp_restore_column_map(stat_table->read_set, old_map);
}
@@ -1973,7 +1976,7 @@ void create_min_max_statistical_fields_for_table(TABLE *table)
my_ptrdiff_t diff= record-table->record[0];
if (!bitmap_is_set(table->read_set, table_field->field_index))
continue;
- if (!(fld= table_field->clone(&table->mem_root, table, diff, TRUE)))
+ if (!(fld= table_field->clone(&table->mem_root, table, diff)))
continue;
if (i == 0)
table_field->collected_stats->min_value= fld;
@@ -2984,9 +2987,12 @@ int read_statistics_for_table(THD *thd, TABLE *table, TABLE_LIST *stat_tables)
KEY *key_info, *key_info_end;
TABLE_SHARE *table_share= table->s;
Table_statistics *read_stats= table_share->stats_cb.table_stats;
-
+ enum_check_fields old_check_level= thd->count_cuted_fields;
DBUG_ENTER("read_statistics_for_table");
+ /* Don't write warnings for internal field conversions */
+ thd->count_cuted_fields= CHECK_FIELD_IGNORE;
+
/* Read statistics from the statistical table table_stats */
stat_table= stat_tables[TABLE_STAT].table;
Table_stat table_stat(stat_table, table);
@@ -3067,6 +3073,7 @@ int read_statistics_for_table(THD *thd, TABLE *table, TABLE_LIST *stat_tables)
}
table->stats_is_read= TRUE;
+ thd->count_cuted_fields= old_check_level;
DBUG_RETURN(0);
}