From e8af217e16837000b8a3809e9fa48a5e75088cd0 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Thu, 17 Mar 2016 15:12:57 +0100 Subject: [PATCH] MDEV-9590: Always print "Engine-independent statistic" warnings and might be filtering columns unintentionally from engines Do not issue the warning in case we are not going to collect the statistics. --- mysql-test/r/analyze.result | 2 - mysql-test/r/mysqlcheck.result | 60 ++---------- mysql-test/r/statistics.result | 14 +++ .../suite/innodb_fts/r/innodb-fts-fic.result | 1 - .../innodb_fts/r/innodb-fts-stopword.result | 2 - .../suite/innodb_zip/r/innodb-zip.result | 2 - .../parts/r/partition_repair_myisam.result | 1 - mysql-test/t/statistics.test | 13 +++ sql/sql_admin.cc | 96 ++++++++++--------- 9 files changed, 89 insertions(+), 102 deletions(-) diff --git a/mysql-test/r/analyze.result b/mysql-test/r/analyze.result index 5a05d1c5da8..9dff94ab08c 100644 --- a/mysql-test/r/analyze.result +++ b/mysql-test/r/analyze.result @@ -34,11 +34,9 @@ create table t1 (a mediumtext, fulltext key key1(a)) charset utf8 collate utf8_g insert into t1 values ('hello'); analyze table t1; Table Op Msg_type Msg_text -test.t1 analyze Warning Engine-independent statistics are not collected for column 'a' test.t1 analyze status OK analyze table t1; Table Op Msg_type Msg_text -test.t1 analyze Warning Engine-independent statistics are not collected for column 'a' test.t1 analyze status Table is already up to date drop table t1; CREATE TABLE t1 (a int); diff --git a/mysql-test/r/mysqlcheck.result b/mysql-test/r/mysqlcheck.result index eb05f056321..033b4086985 100644 --- a/mysql-test/r/mysqlcheck.result +++ b/mysql-test/r/mysqlcheck.result @@ -7,34 +7,19 @@ mtr.test_suppressions OK mysql.column_stats OK mysql.columns_priv OK mysql.db OK -mysql.event -Warning : Engine-independent statistics are not collected for column 'body' -Warning : Engine-independent statistics are not collected for column 'body_utf8' -status : OK +mysql.event OK mysql.func OK mysql.gtid_slave_pos OK -mysql.help_category -Warning : Engine-independent statistics are not collected for column 'url' -status : OK +mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK -mysql.help_topic -Warning : Engine-independent statistics are not collected for column 'description' -Warning : Engine-independent statistics are not collected for column 'example' -Warning : Engine-independent statistics are not collected for column 'url' -status : OK +mysql.help_topic OK mysql.host OK mysql.index_stats OK mysql.innodb_index_stats OK mysql.innodb_table_stats OK mysql.plugin OK -mysql.proc -Warning : Engine-independent statistics are not collected for column 'param_list' -Warning : Engine-independent statistics are not collected for column 'returns' -Warning : Engine-independent statistics are not collected for column 'body' -Warning : Engine-independent statistics are not collected for column 'comment' -Warning : Engine-independent statistics are not collected for column 'body_utf8' -status : OK +mysql.proc OK mysql.procs_priv OK mysql.proxies_priv OK mysql.roles_mapping OK @@ -46,12 +31,7 @@ mysql.time_zone_leap_second OK mysql.time_zone_name OK mysql.time_zone_transition OK mysql.time_zone_transition_type OK -mysql.user -Warning : Engine-independent statistics are not collected for column 'ssl_cipher' -Warning : Engine-independent statistics are not collected for column 'x509_issuer' -Warning : Engine-independent statistics are not collected for column 'x509_subject' -Warning : Engine-independent statistics are not collected for column 'authentication_string' -status : OK +mysql.user OK mtr.global_suppressions Table is already up to date mtr.test_suppressions Table is already up to date mysql.column_stats OK @@ -89,34 +69,19 @@ mysql.user OK mysql.column_stats OK mysql.columns_priv OK mysql.db OK -mysql.event -Warning : Engine-independent statistics are not collected for column 'body' -Warning : Engine-independent statistics are not collected for column 'body_utf8' -status : OK +mysql.event OK mysql.func OK mysql.gtid_slave_pos OK -mysql.help_category -Warning : Engine-independent statistics are not collected for column 'url' -status : OK +mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK -mysql.help_topic -Warning : Engine-independent statistics are not collected for column 'description' -Warning : Engine-independent statistics are not collected for column 'example' -Warning : Engine-independent statistics are not collected for column 'url' -status : OK +mysql.help_topic OK mysql.host OK mysql.index_stats OK mysql.innodb_index_stats OK mysql.innodb_table_stats OK mysql.plugin OK -mysql.proc -Warning : Engine-independent statistics are not collected for column 'param_list' -Warning : Engine-independent statistics are not collected for column 'returns' -Warning : Engine-independent statistics are not collected for column 'body' -Warning : Engine-independent statistics are not collected for column 'comment' -Warning : Engine-independent statistics are not collected for column 'body_utf8' -status : OK +mysql.proc OK mysql.procs_priv OK mysql.proxies_priv OK mysql.roles_mapping OK @@ -128,12 +93,7 @@ mysql.time_zone_leap_second OK mysql.time_zone_name OK mysql.time_zone_transition OK mysql.time_zone_transition_type OK -mysql.user -Warning : Engine-independent statistics are not collected for column 'ssl_cipher' -Warning : Engine-independent statistics are not collected for column 'x509_issuer' -Warning : Engine-independent statistics are not collected for column 'x509_subject' -Warning : Engine-independent statistics are not collected for column 'authentication_string' -status : OK +mysql.user OK mysql.column_stats Table is already up to date mysql.columns_priv Table is already up to date mysql.db Table is already up to date diff --git a/mysql-test/r/statistics.result b/mysql-test/r/statistics.result index fdda572f396..be2e39665b3 100644 --- a/mysql-test/r/statistics.result +++ b/mysql-test/r/statistics.result @@ -1663,3 +1663,17 @@ FROM mysql.column_stats; db_name table_name column_name HEX(min_value) HEX(max_value) nulls_ratio avg_frequency hist_size hist_type HEX(histogram) test t1 a D879626AF872675F73E662F8 D879626AF872675F73E662F8 0.0000 1.0000 0 NULL NULL drop table t1; +# +# MDEV-9590: Always print "Engine-independent statistic" warnings and +# might be filtering columns unintentionally from engines +# +set use_stat_tables='NEVER'; +create table t1 (test blob); +show variables like 'use_stat_tables'; +Variable_name Value +use_stat_tables NEVER +analyze table t1; +Table Op Msg_type Msg_text +test.t1 analyze status Table is already up to date +drop table t1; +set use_stat_tables=@save_use_stat_tables; diff --git a/mysql-test/suite/innodb_fts/r/innodb-fts-fic.result b/mysql-test/suite/innodb_fts/r/innodb-fts-fic.result index ee7277af640..e5df6ca8b05 100644 --- a/mysql-test/suite/innodb_fts/r/innodb-fts-fic.result +++ b/mysql-test/suite/innodb_fts/r/innodb-fts-fic.result @@ -36,7 +36,6 @@ count 2 ANALYZE TABLE articles; Table Op Msg_type Msg_text -test.articles analyze Warning Engine-independent statistics are not collected for column 'body' test.articles analyze status OK SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); diff --git a/mysql-test/suite/innodb_fts/r/innodb-fts-stopword.result b/mysql-test/suite/innodb_fts/r/innodb-fts-stopword.result index e0ba456b51c..ea0ec381faa 100644 --- a/mysql-test/suite/innodb_fts/r/innodb-fts-stopword.result +++ b/mysql-test/suite/innodb_fts/r/innodb-fts-stopword.result @@ -247,7 +247,6 @@ articles CREATE TABLE `articles` ( ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body); ANALYZE TABLE articles; Table Op Msg_type Msg_text -test.articles analyze Warning Engine-independent statistics are not collected for column 'body' test.articles analyze status OK SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will"); id title body @@ -570,7 +569,6 @@ select @@innodb_ft_enable_stopword; 1 ANALYZE TABLE articles; Table Op Msg_type Msg_text -test.articles analyze Warning Engine-independent statistics are not collected for column 'body' test.articles analyze status OK SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will"); id title body diff --git a/mysql-test/suite/innodb_zip/r/innodb-zip.result b/mysql-test/suite/innodb_zip/r/innodb-zip.result index 2113c6e1069..dbfae3c0630 100644 --- a/mysql-test/suite/innodb_zip/r/innodb-zip.result +++ b/mysql-test/suite/innodb_zip/r/innodb-zip.result @@ -122,11 +122,9 @@ a left(b,40) 1 1abcdefghijklmnopqrstuvwxyzAAAAAAAAAAAAA analyze table t1; Table Op Msg_type Msg_text -mysqltest_innodb_zip.t1 analyze Warning Engine-independent statistics are not collected for column 'b' mysqltest_innodb_zip.t1 analyze status OK analyze table t2; Table Op Msg_type Msg_text -mysqltest_innodb_zip.t2 analyze Warning Engine-independent statistics are not collected for column 'b' mysqltest_innodb_zip.t2 analyze status OK SELECT table_schema, table_name, row_format, data_length, index_length FROM information_schema.tables WHERE engine='innodb' AND table_schema != 'mysql'; table_schema table_name row_format data_length index_length diff --git a/mysql-test/suite/parts/r/partition_repair_myisam.result b/mysql-test/suite/parts/r/partition_repair_myisam.result index cbc425b48db..3652698f634 100644 --- a/mysql-test/suite/parts/r/partition_repair_myisam.result +++ b/mysql-test/suite/parts/r/partition_repair_myisam.result @@ -322,7 +322,6 @@ FLUSH TABLES; # replacing p6 with a crashed MYD file (1) (splitted dynamic record) ANALYZE TABLE t1_will_crash; Table Op Msg_type Msg_text -test.t1_will_crash analyze Warning Engine-independent statistics are not collected for column 'c' test.t1_will_crash analyze status OK OPTIMIZE TABLE t1_will_crash; Table Op Msg_type Msg_text diff --git a/mysql-test/t/statistics.test b/mysql-test/t/statistics.test index 3b57b8f2c52..805c169b2a4 100644 --- a/mysql-test/t/statistics.test +++ b/mysql-test/t/statistics.test @@ -728,3 +728,16 @@ select db_name, table_name, column_name, FROM mysql.column_stats; drop table t1; + +--echo # +--echo # MDEV-9590: Always print "Engine-independent statistic" warnings and +--echo # might be filtering columns unintentionally from engines +--echo # + +set use_stat_tables='NEVER'; +create table t1 (test blob); +show variables like 'use_stat_tables'; +analyze table t1; +drop table t1; + +set use_stat_tables=@save_use_stat_tables; diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc index 8b58f062a3e..f27cdcc41f2 100644 --- a/sql/sql_admin.cc +++ b/sql/sql_admin.cc @@ -369,6 +369,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, char* db = table->db; bool fatal_error=0; bool open_error; + bool collect_eis= FALSE; DBUG_PRINT("admin", ("table: '%s'.'%s'", table->db, table->table_name)); strxmov(table_name, db, ".", table->table_name, NullS); @@ -697,53 +698,64 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, { compl_result_code= result_code= HA_ADMIN_INVALID; } + collect_eis= + (table->table->s->table_category == TABLE_CATEGORY_USER && + (get_use_stat_tables_mode(thd) > NEVER || + lex->with_persistent_for_clause)); - if (!lex->column_list) + if (collect_eis) { - bitmap_clear_all(tab->read_set); - for (uint fields= 0; *field_ptr; field_ptr++, fields++) + if (!lex->column_list) { - enum enum_field_types type= (*field_ptr)->type(); - if (type < MYSQL_TYPE_MEDIUM_BLOB || - type > MYSQL_TYPE_BLOB) - bitmap_set_bit(tab->read_set, fields); - else - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_NO_EIS_FOR_FIELD, - ER_THD(thd, ER_NO_EIS_FOR_FIELD), - (*field_ptr)->field_name); + bitmap_clear_all(tab->read_set); + for (uint fields= 0; *field_ptr; field_ptr++, fields++) + { + enum enum_field_types type= (*field_ptr)->type(); + if (type < MYSQL_TYPE_MEDIUM_BLOB || + type > MYSQL_TYPE_BLOB) + bitmap_set_bit(tab->read_set, fields); + else if (collect_eis) + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_NO_EIS_FOR_FIELD, + ER_THD(thd, ER_NO_EIS_FOR_FIELD), + (*field_ptr)->field_name); + } + } + else + { + int pos; + LEX_STRING *column_name; + List_iterator_fast it(*lex->column_list); + + bitmap_clear_all(tab->read_set); + while ((column_name= it++)) + { + if (tab->s->fieldnames.type_names == 0 || + (pos= find_type(&tab->s->fieldnames, column_name->str, + column_name->length, 1)) <= 0) + { + compl_result_code= result_code= HA_ADMIN_INVALID; + break; + } + pos--; + enum enum_field_types type= tab->field[pos]->type(); + if (type < MYSQL_TYPE_MEDIUM_BLOB || + type > MYSQL_TYPE_BLOB) + bitmap_set_bit(tab->read_set, pos); + else if (collect_eis) + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_NO_EIS_FOR_FIELD, + ER_THD(thd, ER_NO_EIS_FOR_FIELD), + column_name->str); + } + tab->file->column_bitmaps_signal(); } } else { - int pos; - LEX_STRING *column_name; - List_iterator_fast it(*lex->column_list); - - bitmap_clear_all(tab->read_set); - while ((column_name= it++)) - { - if (tab->s->fieldnames.type_names == 0 || - (pos= find_type(&tab->s->fieldnames, column_name->str, - column_name->length, 1)) <= 0) - { - compl_result_code= result_code= HA_ADMIN_INVALID; - break; - } - pos--; - enum enum_field_types type= tab->field[pos]->type(); - if (type < MYSQL_TYPE_MEDIUM_BLOB || - type > MYSQL_TYPE_BLOB) - bitmap_set_bit(tab->read_set, pos); - else - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_NO_EIS_FOR_FIELD, - ER_THD(thd, ER_NO_EIS_FOR_FIELD), - column_name->str); - } - tab->file->column_bitmaps_signal(); + DBUG_ASSERT(!lex->column_list); } - + if (!lex->index_list) { tab->keys_in_use_for_query.init(tab->s->keys); @@ -778,11 +790,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, DBUG_PRINT("admin", ("operator_func returned: %d", result_code)); } - if (compl_result_code == HA_ADMIN_OK && - operator_func == &handler::ha_analyze && - table->table->s->table_category == TABLE_CATEGORY_USER && - (get_use_stat_tables_mode(thd) > NEVER || - lex->with_persistent_for_clause)) + if (compl_result_code == HA_ADMIN_OK && collect_eis) { if (!(compl_result_code= alloc_statistics_for_table(thd, table->table)) &&