[Commits] 59fcd7f: MDEV-9118 ANALYZE TABLE for Engine independent status fetchs blob/text columns without use

OleksandrByelkin sanja at mariadb.com
Fri Dec 18 13:23:45 EET 2015


revision-id: 59fcd7ff2315d007045eb987da5f21abbea6f6f1 (mariadb-10.1.9-20-g59fcd7f)
parent(s): 953d5680a3c050273a8f29253f7386984679f92b
committer: Oleksandr Byelkin
timestamp: 2015-12-18 12:23:45 +0100
message:

MDEV-9118 ANALYZE TABLE for Engine independent status fetchs blob/text columns without use

Do not include BLOB fields by default.

---
 mysql-test/r/analyze.result                     |  2 +
 mysql-test/r/mysqlcheck.result                  | 60 ++++++++++++++++++++-----
 mysql-test/r/statistics.result                  | 26 ++++++++++-
 mysql-test/r/statistics_index_crash-7362.result |  2 +
 mysql-test/t/statistics.test                    | 11 +++++
 sql/share/errmsg-utf8.txt                       |  3 ++
 sql/sql_admin.cc                                | 31 ++++++++++---
 7 files changed, 117 insertions(+), 18 deletions(-)

diff --git a/mysql-test/r/analyze.result b/mysql-test/r/analyze.result
index 9dff94a..5a05d1c 100644
--- a/mysql-test/r/analyze.result
+++ b/mysql-test/r/analyze.result
@@ -34,9 +34,11 @@ 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 7d646dc..e69653f 100644
--- a/mysql-test/r/mysqlcheck.result
+++ b/mysql-test/r/mysqlcheck.result
@@ -7,19 +7,34 @@ mtr.test_suppressions                              OK
 mysql.column_stats                                 OK
 mysql.columns_priv                                 OK
 mysql.db                                           OK
-mysql.event                                        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.func                                         OK
 mysql.gtid_slave_pos                               OK
-mysql.help_category                                OK
+mysql.help_category
+Warning  : Engine-independent statistics are not collected for column 'url'
+status   : OK
 mysql.help_keyword                                 OK
 mysql.help_relation                                OK
-mysql.help_topic                                   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.host                                         OK
 mysql.index_stats                                  OK
 mysql.innodb_index_stats                           OK
 mysql.innodb_table_stats                           OK
 mysql.plugin                                       OK
-mysql.proc                                         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.procs_priv                                   OK
 mysql.proxies_priv                                 OK
 mysql.roles_mapping                                OK
@@ -31,7 +46,12 @@ mysql.time_zone_leap_second                        OK
 mysql.time_zone_name                               OK
 mysql.time_zone_transition                         OK
 mysql.time_zone_transition_type                    OK
-mysql.user                                         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
 mtr.global_suppressions                            Table is already up to date
 mtr.test_suppressions                              Table is already up to date
 mysql.column_stats                                 OK
@@ -69,19 +89,34 @@ mysql.user                                         OK
 mysql.column_stats                                 OK
 mysql.columns_priv                                 OK
 mysql.db                                           OK
-mysql.event                                        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.func                                         OK
 mysql.gtid_slave_pos                               OK
-mysql.help_category                                OK
+mysql.help_category
+Warning  : Engine-independent statistics are not collected for column 'url'
+status   : OK
 mysql.help_keyword                                 OK
 mysql.help_relation                                OK
-mysql.help_topic                                   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.host                                         OK
 mysql.index_stats                                  OK
 mysql.innodb_index_stats                           OK
 mysql.innodb_table_stats                           OK
 mysql.plugin                                       OK
-mysql.proc                                         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.procs_priv                                   OK
 mysql.proxies_priv                                 OK
 mysql.roles_mapping                                OK
@@ -93,7 +128,12 @@ mysql.time_zone_leap_second                        OK
 mysql.time_zone_name                               OK
 mysql.time_zone_transition                         OK
 mysql.time_zone_transition_type                    OK
-mysql.user                                         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.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 bd6a084..fdda572 100644
--- a/mysql-test/r/statistics.result
+++ b/mysql-test/r/statistics.result
@@ -1212,6 +1212,7 @@ test	t2	PRIMARY	1	1.0000
 ANALYZE TABLE t1;
 Table	Op	Msg_type	Msg_text
 test.t1	analyze	status	Engine-independent statistics collected
+test.t1	analyze	Warning	Engine-independent statistics are not collected for column 'b'
 test.t1	analyze	status	OK
 SELECT * FROM mysql.column_stats;
 db_name	table_name	column_name	min_value	max_value	nulls_ratio	avg_length	avg_frequency	hist_size	hist_type	histogram
@@ -1225,7 +1226,6 @@ test	t1	c	aaaa	dddddddd	0.1250	6.6571	7.0000	0	NULL	NULL
 test	t1	d	1989-03-12	1999-07-23	0.1500	3.0000	8.5000	0	NULL	NULL
 test	t1	e	0.01	0.112	0.2250	8.0000	6.2000	0	NULL	NULL
 test	t1	f	1	5	0.2000	1.0000	6.4000	0	NULL	NULL
-test	t1	b	NULL	NULL	0.2000	17.1250	NULL	NULL	NULL	NULL
 SELECT * FROM mysql.index_stats;
 db_name	table_name	index_name	prefix_arity	avg_frequency
 test	t1	idx2	1	7.0000
@@ -1265,6 +1265,7 @@ set use_stat_tables='never';
 ANALYZE TABLE t1 PERSISTENT FOR ALL;
 Table	Op	Msg_type	Msg_text
 test.t1	analyze	status	Engine-independent statistics collected
+test.t1	analyze	Warning	Engine-independent statistics are not collected for column 'b'
 test.t1	analyze	status	Table is already up to date
 SELECT * FROM mysql.table_stats;
 db_name	table_name	cardinality
@@ -1276,7 +1277,6 @@ test	t1	c	aaaa	dddddddd	0.1250	6.6571	7.0000	0	NULL	NULL
 test	t1	d	1989-03-12	1999-07-23	0.1500	3.0000	8.5000	0	NULL	NULL
 test	t1	e	0.01	0.112	0.2250	8.0000	6.2000	0	NULL	NULL
 test	t1	f	1	5	0.2000	1.0000	6.4000	0	NULL	NULL
-test	t1	b	NULL	NULL	0.2000	17.1250	NULL	NULL	NULL	NULL
 SELECT * FROM mysql.index_stats;
 db_name	table_name	index_name	prefix_arity	avg_frequency
 test	t1	PRIMARY	1	1.0000
@@ -1291,6 +1291,28 @@ test	t1	idx4	3	NULL
 DELETE FROM mysql.table_stats;
 DELETE FROM mysql.column_stats;
 DELETE FROM mysql.index_stats;
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS(b) INDEXES();
+Table	Op	Msg_type	Msg_text
+test.t1	analyze	status	Engine-independent statistics collected
+test.t1	analyze	Warning	Engine-independent statistics are not collected for column 'b'
+test.t1	analyze	status	Table is already up to date
+ANALYZE TABLE t1 PERSISTENT FOR columns(a,b) INDEXES();
+Table	Op	Msg_type	Msg_text
+test.t1	analyze	status	Engine-independent statistics collected
+test.t1	analyze	Warning	Engine-independent statistics are not collected for column 'b'
+test.t1	analyze	status	Table is already up to date
+ANALYZE TABLE t1 PERSISTENT FOR columns(b) indexes(idx2);
+Table	Op	Msg_type	Msg_text
+test.t1	analyze	status	Engine-independent statistics collected
+test.t1	analyze	Warning	Engine-independent statistics are not collected for column 'b'
+test.t1	analyze	status	Table is already up to date
+ANALYZE TABLE t1 PERSISTENT FOR columns() indexes(idx2);
+Table	Op	Msg_type	Msg_text
+test.t1	analyze	status	Engine-independent statistics collected
+test.t1	analyze	status	Table is already up to date
+DELETE FROM mysql.table_stats;
+DELETE FROM mysql.column_stats;
+DELETE FROM mysql.index_stats;
 DROP TABLE t1,t2;
 set names utf8;
 CREATE DATABASE world;
diff --git a/mysql-test/r/statistics_index_crash-7362.result b/mysql-test/r/statistics_index_crash-7362.result
index 99f65d7..c213fa4 100644
--- a/mysql-test/r/statistics_index_crash-7362.result
+++ b/mysql-test/r/statistics_index_crash-7362.result
@@ -3,6 +3,7 @@ INSERT INTO t1 VALUES (unhex('3E0D0A4141414142334E7A6143317963324541414141424977
 ANALYZE TABLE t1 PERSISTENT FOR ALL;
 Table	Op	Msg_type	Msg_text
 test.t1	analyze	status	Engine-independent statistics collected
+test.t1	analyze	Warning	Engine-independent statistics are not collected for column 'a'
 test.t1	analyze	status	OK
 SELECT * FROM mysql.index_stats WHERE index_name='a' AND table_name='t1';
 db_name	table_name	index_name	prefix_arity	avg_frequency
@@ -13,6 +14,7 @@ INSERT INTO t1 VALUES (unhex('3E0D0A4141414142334E7A6143317963324541414141424977
 ANALYZE TABLE t1 PERSISTENT FOR ALL;
 Table	Op	Msg_type	Msg_text
 test.t1	analyze	status	Engine-independent statistics collected
+test.t1	analyze	Warning	Engine-independent statistics are not collected for column 'a'
 test.t1	analyze	status	OK
 SELECT * FROM mysql.index_stats WHERE index_name='a' AND table_name='t1';
 db_name	table_name	index_name	prefix_arity	avg_frequency
diff --git a/mysql-test/t/statistics.test b/mysql-test/t/statistics.test
index 2c8dec3..3b57b8f 100644
--- a/mysql-test/t/statistics.test
+++ b/mysql-test/t/statistics.test
@@ -494,6 +494,17 @@ DELETE FROM mysql.table_stats;
 DELETE FROM mysql.column_stats;
 DELETE FROM mysql.index_stats;
 
+
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS(b) INDEXES();
+ANALYZE TABLE t1 PERSISTENT FOR columns(a,b) INDEXES();
+ANALYZE TABLE t1 PERSISTENT FOR columns(b) indexes(idx2);
+ANALYZE TABLE t1 PERSISTENT FOR columns() indexes(idx2);
+
+DELETE FROM mysql.table_stats;
+DELETE FROM mysql.column_stats;
+DELETE FROM mysql.index_stats;
+
+
 DROP TABLE t1,t2;
 
 set names utf8;
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index 59908dc..178d1dd 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -7136,3 +7136,6 @@ ER_KILL_QUERY_DENIED_ERROR
         eng "You are not owner of query %lu"
         ger "Sie sind nicht Eigentümer von Abfrage %lu"
         rus "Вы не являетесь владельцем запроса %lu"
+ER_NO_EIS_FOR_FIELD
+        eng "Engine-independent statistics are not collected for column '%s'"
+        ukr "Незалежна від типу таблиці статистика не збирається для стовбця '%s'"
diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc
index 0787aa9..d8ca863 100644
--- a/sql/sql_admin.cc
+++ b/sql/sql_admin.cc
@@ -692,10 +692,20 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
       }
 
       if (!lex->column_list)
-      { 
-        uint fields= 0;
-        for ( ; *field_ptr; field_ptr++, fields++) ;         
-        bitmap_set_prefix(tab->read_set, fields);
+      {
+        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
+            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
       {
@@ -713,8 +723,17 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
             compl_result_code= result_code= HA_ADMIN_INVALID;
             break;
           }
-          bitmap_set_bit(tab->read_set, pos-1);
-        } 
+          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(); 
       }
       


More information about the commits mailing list