summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Widenius <monty@askmonty.org>2012-09-09 01:22:06 +0300
committerMichael Widenius <monty@askmonty.org>2012-09-09 01:22:06 +0300
commit3a793b9d4d53867263eefd60010af2a124f485d1 (patch)
treec8c1d89279a3c6c743020dbcab4adb155fc76122
parent5161b3ddde41617cc623e54980f6f28f38e650a7 (diff)
downloadmariadb-git-3a793b9d4d53867263eefd60010af2a124f485d1.tar.gz
Added new status variables:
feature_dynamic_columns,feature_fulltext,feature_gis,feature_locale,feature_subquery,feature_timezone,feature_trigger,feature_xml Opened_views, Executed_triggers, Executed_events Added new process status 'updating status' as part of 'freeing items' mysql-test/r/features.result: Test of feature_xxx status variables mysql-test/r/mysqld--help.result: Removed duplicated 'language' variable. mysql-test/r/view.result: Test of opened_views mysql-test/suite/rpl/t/rpl_start_stop_slave.test: Write more information on failure mysql-test/t/features.test: Test of feature_xxx status variables mysql-test/t/view.test: Test of opened_views sql/event_scheduler.cc: Increment executed_events status variable sql/field.cc: Increment status variable sql/item_func.cc: Increment status variable sql/item_strfunc.cc: Increment status variable sql/item_subselect.cc: Increment status variable sql/item_xmlfunc.cc: Increment status variable sql/mysqld.cc: Add new status variables to 'show status' sql/mysqld.h: Added executed_events sql/sql_base.cc: Increment status variable sql/sql_class.h: Add new status variables sql/sql_parse.cc: Added new process status 'updating status' as part of 'freeing items' sql/sql_trigger.cc: Increment status variable sql/sys_vars.cc: Increment status variable sql/tztime.cc: Increment status variable
-rw-r--r--mysql-test/r/features.result140
-rw-r--r--mysql-test/r/mysqld--help.result1
-rw-r--r--mysql-test/r/view.result10
-rw-r--r--mysql-test/suite/rpl/t/rpl_start_stop_slave.test10
-rw-r--r--mysql-test/t/features.test107
-rw-r--r--mysql-test/t/view.test4
-rw-r--r--sql/event_scheduler.cc5
-rw-r--r--sql/field.cc3
-rw-r--r--sql/item_func.cc2
-rw-r--r--sql/item_strfunc.cc1
-rw-r--r--sql/item_subselect.cc2
-rw-r--r--sql/item_xmlfunc.cc2
-rw-r--r--sql/mysqld.cc13
-rw-r--r--sql/mysqld.h1
-rw-r--r--sql/sql_base.cc1
-rw-r--r--sql/sql_class.h24
-rw-r--r--sql/sql_parse.cc1
-rw-r--r--sql/sql_trigger.cc3
-rw-r--r--sql/sys_vars.cc15
-rw-r--r--sql/tztime.cc4
20 files changed, 328 insertions, 21 deletions
diff --git a/mysql-test/r/features.result b/mysql-test/r/features.result
new file mode 100644
index 00000000000..7b6a352ab0c
--- /dev/null
+++ b/mysql-test/r/features.result
@@ -0,0 +1,140 @@
+drop table if exists t1;
+show status like "feature%";
+Variable_name Value
+Feature_dynamic_columns 0
+Feature_fulltext 0
+Feature_gis 0
+Feature_locale 0
+Feature_subquery 0
+Feature_timezone 0
+Feature_trigger 0
+Feature_xml 0
+#
+# Feature GIS
+#
+CREATE TABLE t1 (g POINT);
+SHOW FIELDS FROM t1;
+Field Type Null Key Default Extra
+g point YES NULL
+INSERT INTO t1 VALUES
+(PointFromText('POINT(10 10)')),
+(PointFromText('POINT(20 10)')),
+(PointFromText('POINT(20 20)')),
+(PointFromWKB(AsWKB(PointFromText('POINT(10 20)'))));
+drop table t1;
+show status like "feature_gis";
+Variable_name Value
+Feature_gis 3
+#
+# Feature dynamic columns
+#
+set @a= COLUMN_CREATE(1, 1212 AS int);
+set @b= column_add(@a, 2, 1212 as integer);
+select column_get(@b, 2 as integer);
+column_get(@b, 2 as integer)
+1212
+show status like "feature_dynamic_columns";
+Variable_name Value
+Feature_dynamic_columns 2
+#
+# Feature fulltext
+#
+CREATE TABLE t1 (a VARCHAR(200), b TEXT, FULLTEXT (a,b)) engine=myisam;
+INSERT INTO t1 VALUES('MySQL has now support', 'for full-text search'),
+('Full-text indexes', 'are called collections'),
+('Only MyISAM tables','support collections'),
+('Function MATCH ... AGAINST()','is used to do a search'),
+('Full-text search in MySQL', 'implements vector space model');
+select * from t1 where MATCH(a,b) AGAINST ("collections");
+a b
+Only MyISAM tables support collections
+Full-text indexes are called collections
+select * from t1 where MATCH(a,b) AGAINST ("indexes");
+a b
+Full-text indexes are called collections
+drop table t1;
+show status like "feature_fulltext";
+Variable_name Value
+Feature_fulltext 2
+#
+# Feature locale
+#
+SET lc_messages=sr_RS;
+SET lc_messages=en_US;
+show status like "feature_locale";
+Variable_name Value
+Feature_locale 2
+#
+# Feature subquery
+#
+select (select 2);
+(select 2)
+2
+SELECT (SELECT 1) UNION SELECT (SELECT 2);
+(SELECT 1)
+1
+2
+create table t1 (a int);
+insert into t1 values (2);
+select (select a from t1 where t1.a=t2.a), a from t1 as t2;
+(select a from t1 where t1.a=t2.a) a
+2 2
+drop table t1;
+show status like "feature_subquery";
+Variable_name Value
+Feature_subquery 4
+#
+# Feature timezone
+#
+SELECT FROM_UNIXTIME(unix_timestamp()) > "1970-01-01";
+FROM_UNIXTIME(unix_timestamp()) > "1970-01-01"
+1
+set time_zone="+03:00";
+SELECT FROM_UNIXTIME(unix_timestamp()) > "1970-01-01";
+FROM_UNIXTIME(unix_timestamp()) > "1970-01-01"
+1
+set time_zone= @@global.time_zone;
+show status like "feature_timezone";
+Variable_name Value
+Feature_timezone 1
+#
+# Feature triggers
+#
+create table t1 (i int);
+# let us test some very simple trigger
+create trigger trg before insert on t1 for each row set @a:=1;
+set @a:=0;
+select @a;
+@a
+0
+insert into t1 values (1),(2);
+select @a;
+@a
+1
+SHOW TRIGGERS IN test like 't1';
+Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation
+trg INSERT t1 set @a:=1 BEFORE NULL root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
+drop trigger trg;
+drop table t1;
+show status like "%trigger%";
+Variable_name Value
+Com_create_trigger 1
+Com_drop_trigger 1
+Com_show_create_trigger 0
+Com_show_triggers 1
+Executed_triggers 2
+Feature_trigger 2
+#
+# Feature xml
+#
+SET @xml='<a aa1="aa1" aa2="aa2">a1<b ba1="ba1">b1<c>c1</c>b2</b>a2</a>';
+SELECT extractValue(@xml,'/a');
+extractValue(@xml,'/a')
+a1 a2
+select updatexml('<div><div><span>1</span><span>2</span></div></div>',
+'/','<tr><td>1</td><td>2</td></tr>') as upd1;
+upd1
+<tr><td>1</td><td>2</td></tr>
+show status like "feature_xml";
+Variable_name Value
+Feature_xml 2
diff --git a/mysql-test/r/mysqld--help.result b/mysql-test/r/mysqld--help.result
index 63df79160cc..718909d1b27 100644
--- a/mysql-test/r/mysqld--help.result
+++ b/mysql-test/r/mysqld--help.result
@@ -923,7 +923,6 @@ key-cache-age-threshold 300
key-cache-block-size 1024
key-cache-division-limit 100
key-cache-segments 0
-language MYSQL_SHAREDIR/
large-pages FALSE
lc-messages en_US
lc-messages-dir MYSQL_SHAREDIR/
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index 1b35fe5a56a..5af20fd0c3c 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -4678,6 +4678,7 @@ DROP TABLE t1,t2,t3;
# LP bug#1007622 Server crashes in handler::increment_statistics on
# inserting into a view over a view
#
+flush status;
CREATE TABLE t1 (a INT);
CREATE ALGORITHM=MERGE VIEW v1 AS SELECT a1.* FROM t1 AS a1, t1 AS a2;
CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM v1;
@@ -4687,6 +4688,15 @@ a
1
drop view v2,v1;
drop table t1;
+show status like '%view%';
+Variable_name Value
+Com_create_view 2
+Com_drop_view 1
+Opened_views 3
+show status like 'Opened_table%';
+Variable_name Value
+Opened_table_definitions 2
+Opened_tables 3
#
# MDEV-486 LP BUG#1010116 Incorrect query results in
# view and derived tables
diff --git a/mysql-test/suite/rpl/t/rpl_start_stop_slave.test b/mysql-test/suite/rpl/t/rpl_start_stop_slave.test
index c9c8f043668..ab388f3eebc 100644
--- a/mysql-test/suite/rpl/t/rpl_start_stop_slave.test
+++ b/mysql-test/suite/rpl/t/rpl_start_stop_slave.test
@@ -21,6 +21,16 @@
connection slave;
--let $connection_id=`SELECT id FROM information_schema.processlist where state LIKE 'Waiting for master to send event'`
+if(!$connection_id)
+{
+ # Something went wrong (timing)
+ # Show process list so that we can debug. In this case we will abort with
+ # wrong result
+ -- echo "Could not find connect id. Dumping process list for debugging"
+ SELECT * FROM information_schema.processlist;
+ exit;
+}
+
set @time_before_kill := (select CURRENT_TIMESTAMP);
--echo [Time before the query]
diff --git a/mysql-test/t/features.test b/mysql-test/t/features.test
new file mode 100644
index 00000000000..a54b09a3fd3
--- /dev/null
+++ b/mysql-test/t/features.test
@@ -0,0 +1,107 @@
+# Testing of feature statistics
+
+-- source include/have_geometry.inc
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+
+show status like "feature%";
+
+--echo #
+--echo # Feature GIS
+--echo #
+
+CREATE TABLE t1 (g POINT);
+SHOW FIELDS FROM t1;
+INSERT INTO t1 VALUES
+ (PointFromText('POINT(10 10)')),
+ (PointFromText('POINT(20 10)')),
+ (PointFromText('POINT(20 20)')),
+ (PointFromWKB(AsWKB(PointFromText('POINT(10 20)'))));
+drop table t1;
+
+show status like "feature_gis";
+
+--echo #
+--echo # Feature dynamic columns
+--echo #
+set @a= COLUMN_CREATE(1, 1212 AS int);
+set @b= column_add(@a, 2, 1212 as integer);
+select column_get(@b, 2 as integer);
+
+show status like "feature_dynamic_columns";
+
+--echo #
+--echo # Feature fulltext
+--echo #
+
+CREATE TABLE t1 (a VARCHAR(200), b TEXT, FULLTEXT (a,b)) engine=myisam;
+INSERT INTO t1 VALUES('MySQL has now support', 'for full-text search'),
+ ('Full-text indexes', 'are called collections'),
+ ('Only MyISAM tables','support collections'),
+ ('Function MATCH ... AGAINST()','is used to do a search'),
+ ('Full-text search in MySQL', 'implements vector space model');
+select * from t1 where MATCH(a,b) AGAINST ("collections");
+select * from t1 where MATCH(a,b) AGAINST ("indexes");
+drop table t1;
+
+show status like "feature_fulltext";
+
+
+--echo #
+--echo # Feature locale
+--echo #
+
+SET lc_messages=sr_RS;
+SET lc_messages=en_US;
+show status like "feature_locale";
+
+--echo #
+--echo # Feature subquery
+--echo #
+
+select (select 2);
+SELECT (SELECT 1) UNION SELECT (SELECT 2);
+
+create table t1 (a int);
+insert into t1 values (2);
+select (select a from t1 where t1.a=t2.a), a from t1 as t2;
+drop table t1;
+show status like "feature_subquery";
+
+--echo #
+--echo # Feature timezone
+--echo #
+
+SELECT FROM_UNIXTIME(unix_timestamp()) > "1970-01-01";
+set time_zone="+03:00";
+SELECT FROM_UNIXTIME(unix_timestamp()) > "1970-01-01";
+set time_zone= @@global.time_zone;
+show status like "feature_timezone";
+
+--echo #
+--echo # Feature triggers
+--echo #
+
+create table t1 (i int);
+--echo # let us test some very simple trigger
+create trigger trg before insert on t1 for each row set @a:=1;
+set @a:=0;
+select @a;
+insert into t1 values (1),(2);
+select @a;
+SHOW TRIGGERS IN test like 't1';
+drop trigger trg;
+drop table t1;
+
+show status like "%trigger%";
+
+--echo #
+--echo # Feature xml
+--echo #
+SET @xml='<a aa1="aa1" aa2="aa2">a1<b ba1="ba1">b1<c>c1</c>b2</b>a2</a>';
+SELECT extractValue(@xml,'/a');
+select updatexml('<div><div><span>1</span><span>2</span></div></div>',
+ '/','<tr><td>1</td><td>2</td></tr>') as upd1;
+show status like "feature_xml";
diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test
index efb6956ae8f..4f739b524e6 100644
--- a/mysql-test/t/view.test
+++ b/mysql-test/t/view.test
@@ -4618,6 +4618,8 @@ DROP TABLE t1,t2,t3;
--echo # inserting into a view over a view
--echo #
+flush status;
+
CREATE TABLE t1 (a INT);
CREATE ALGORITHM=MERGE VIEW v1 AS SELECT a1.* FROM t1 AS a1, t1 AS a2;
CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM v1;
@@ -4625,6 +4627,8 @@ INSERT INTO v2 (a) VALUES (1) ;
select * from t1;
drop view v2,v1;
drop table t1;
+show status like '%view%';
+show status like 'Opened_table%';
--echo #
--echo # MDEV-486 LP BUG#1010116 Incorrect query results in
diff --git a/sql/event_scheduler.cc b/sql/event_scheduler.cc
index 55a3f6b36c4..b41c9e2cda0 100644
--- a/sql/event_scheduler.cc
+++ b/sql/event_scheduler.cc
@@ -42,7 +42,7 @@
cond_wait(mythd, abstime, msg, SCHED_FUNC, __LINE__)
extern pthread_attr_t connection_attrib;
-
+extern ulong event_executed;
Event_db_repository *Event_worker_thread::db_repository;
@@ -557,7 +557,8 @@ Event_scheduler::execute_top(Event_queue_element_for_exec *event_name)
event_name)))
goto error;
- ++started_events;
+ started_events++;
+ executed_events++; // For SHOW STATUS
DBUG_PRINT("info", ("Event is in THD: 0x%lx", (long) new_thd));
DBUG_RETURN(FALSE);
diff --git a/sql/field.cc b/sql/field.cc
index 1004f58c945..a3d3d951887 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -9395,9 +9395,12 @@ Field *make_field(TABLE_SHARE *share, uchar *ptr, uint32 field_length,
#ifdef HAVE_SPATIAL
if (f_is_geom(pack_flag))
+ {
+ status_var_increment(current_thd->status_var.feature_gis);
return new Field_geom(ptr,null_pos,null_bit,
unireg_check, field_name, share,
pack_length, geom_type);
+ }
#endif
if (f_is_blob(pack_flag))
return new Field_blob(ptr,null_pos,null_bit,
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 1e891f06f0b..441eb37d701 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -6046,6 +6046,8 @@ bool Item_func_match::fix_fields(THD *thd, Item **ref)
DBUG_ASSERT(fixed == 0);
Item *UNINIT_VAR(item); // Safe as arg_count is > 1
+ status_var_increment(thd->status_var.feature_fulltext);
+
maybe_null=1;
join_key=0;
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index c5d1edbe475..ebfca684ccb 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -3774,6 +3774,7 @@ bool Item_func_dyncol_create::fix_fields(THD *thd, Item **ref)
(arg_count / 2));
nums= (uint *) alloc_root(thd->mem_root,
sizeof(uint) * (arg_count / 2));
+ status_var_increment(thd->status_var.feature_dynamic_columns);
return res || vals == 0 || nums == 0;
}
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index 8bb4e7af00f..091eb178d68 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -220,6 +220,8 @@ bool Item_subselect::fix_fields(THD *thd_param, Item **ref)
uint8 uncacheable;
bool res;
+ status_var_increment(thd->status_var.feature_subquery);
+
DBUG_ASSERT(fixed == 0);
engine->set_thd((thd= thd_param));
if (!done_first_fix_fields)
diff --git a/sql/item_xmlfunc.cc b/sql/item_xmlfunc.cc
index 0fa2d39aea9..ae0a74c5ba6 100644
--- a/sql/item_xmlfunc.cc
+++ b/sql/item_xmlfunc.cc
@@ -2601,6 +2601,8 @@ void Item_xml_str_func::fix_length_and_dec()
MY_XPATH xpath;
int rc;
+ status_var_increment(current_thd->status_var.feature_xml);
+
nodeset_func= 0;
if (agg_arg_charsets_for_comparison(collation, args, arg_count))
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index c2a07e11f0e..e56b5123a7c 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -482,6 +482,7 @@ ulonglong binlog_stmt_cache_size=0;
ulonglong max_binlog_stmt_cache_size=0;
ulonglong query_cache_size=0;
ulong refresh_version; /* Increments on each reload */
+ulong executed_events=0;
query_id_t global_query_id;
my_atomic_rwlock_t global_query_id_lock;
my_atomic_rwlock_t thread_running_lock;
@@ -6948,6 +6949,16 @@ SHOW_VAR status_vars[]= {
{"Delayed_insert_threads", (char*) &delayed_insert_threads, SHOW_LONG_NOFLUSH},
{"Delayed_writes", (char*) &delayed_insert_writes, SHOW_LONG},
{"Empty_queries", (char*) offsetof(STATUS_VAR, empty_queries), SHOW_LONG_STATUS},
+ {"Executed_events", (char*) &executed_events, SHOW_LONG_NOFLUSH },
+ {"Executed_triggers", (char*) offsetof(STATUS_VAR, executed_triggers), SHOW_LONG_STATUS},
+ {"Feature_dynamic_columns", (char*) offsetof(STATUS_VAR, feature_dynamic_columns), SHOW_LONG_STATUS},
+ {"Feature_fulltext", (char*) offsetof(STATUS_VAR, feature_fulltext), SHOW_LONG_STATUS},
+ {"Feature_gis", (char*) offsetof(STATUS_VAR, feature_gis), SHOW_LONG_STATUS},
+ {"Feature_locale", (char*) offsetof(STATUS_VAR, feature_locale), SHOW_LONG_STATUS},
+ {"Feature_subquery", (char*) offsetof(STATUS_VAR, feature_subquery), SHOW_LONG_STATUS},
+ {"Feature_timezone", (char*) offsetof(STATUS_VAR, feature_timezone), SHOW_LONG_STATUS},
+ {"Feature_trigger", (char*) offsetof(STATUS_VAR, feature_trigger), SHOW_LONG_STATUS},
+ {"Feature_xml", (char*) offsetof(STATUS_VAR, feature_xml), SHOW_LONG_STATUS},
{"Flush_commands", (char*) &refresh_version, SHOW_LONG_NOFLUSH},
{"Handler_commit", (char*) offsetof(STATUS_VAR, ha_commit_count), SHOW_LONG_STATUS},
{"Handler_delete", (char*) offsetof(STATUS_VAR, ha_delete_count), SHOW_LONG_STATUS},
@@ -6987,6 +6998,7 @@ SHOW_VAR status_vars[]= {
{"Opened_files", (char*) &my_file_total_opened, SHOW_LONG_NOFLUSH},
{"Opened_tables", (char*) offsetof(STATUS_VAR, opened_tables), SHOW_LONG_STATUS},
{"Opened_table_definitions", (char*) offsetof(STATUS_VAR, opened_shares), SHOW_LONG_STATUS},
+ {"Opened_views", (char*) offsetof(STATUS_VAR, opened_views), SHOW_LONG_STATUS},
{"Prepared_stmt_count", (char*) &show_prepared_stmt_count, SHOW_FUNC},
{"Rows_sent", (char*) offsetof(STATUS_VAR, rows_sent), SHOW_LONGLONG_STATUS},
{"Rows_read", (char*) offsetof(STATUS_VAR, rows_read), SHOW_LONGLONG_STATUS},
@@ -7274,6 +7286,7 @@ static int mysql_init_variables(void)
protocol_version= PROTOCOL_VERSION;
what_to_log= ~ (1L << (uint) COM_TIME);
refresh_version= 1L; /* Increments on each reload */
+ executed_events= 0;
global_query_id= thread_id= 1L;
my_atomic_rwlock_init(&global_query_id_lock);
my_atomic_rwlock_init(&thread_running_lock);
diff --git a/sql/mysqld.h b/sql/mysqld.h
index 56419acdcd4..619f30ce683 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -175,6 +175,7 @@ extern ulong opt_binlog_rows_event_max_size;
extern ulong rpl_recovery_rank, thread_cache_size;
extern ulong stored_program_cache_size;
extern ulong back_log;
+extern ulong executed_events;
extern char language[FN_REFLEN];
extern "C" MYSQL_PLUGIN_IMPORT ulong server_id;
extern ulong concurrency;
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index a1e00b74a47..85e9227c154 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -9421,6 +9421,7 @@ open_new_frm(THD *thd, TABLE_SHARE *share, const char *alias,
if (mysql_make_view(thd, parser, table_desc,
(prgflag & OPEN_VIEW_NO_PARSE)))
goto err;
+ status_var_increment(thd->status_var.opened_views);
}
else
{
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 845c2115922..344d6435ad5 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -620,25 +620,17 @@ typedef struct system_status_var
ulong ha_savepoint_count;
ulong ha_savepoint_rollback_count;
-#if 0
- /* KEY_CACHE parts. These are copies of the original */
- ulong key_blocks_changed;
- ulong key_blocks_used;
- ulong key_cache_r_requests;
- ulong key_cache_read;
- ulong key_cache_w_requests;
- ulong key_cache_write;
- /* END OF KEY_CACHE parts */
-#endif
-
ulong net_big_packet_count;
ulong opened_tables;
ulong opened_shares;
+ ulong opened_views; /* +1 opening a view */
+
ulong select_full_join_count;
ulong select_full_range_join_count;
ulong select_range_count;
ulong select_range_check_count;
ulong select_scan_count;
+ ulong executed_triggers;
ulong long_query_count;
ulong filesort_merge_passes;
ulong filesort_range_count;
@@ -653,6 +645,16 @@ typedef struct system_status_var
ulong com_stmt_reset;
ulong com_stmt_close;
+ /* Features used */
+ ulong feature_dynamic_columns; /* +1 when creating a dynamic column */
+ ulong feature_fulltext; /* +1 when MATCH is used */
+ ulong feature_gis; /* +1 opening a table with GIS features */
+ ulong feature_locale; /* +1 when LOCALE is set */
+ ulong feature_subquery; /* +1 when subqueries are used */
+ ulong feature_timezone; /* +1 when XPATH is used */
+ ulong feature_trigger; /* +1 opening a table with triggers */
+ ulong feature_xml; /* +1 when XPATH is used */
+
ulong empty_queries;
ulong access_denied_errors;
ulong lost_connections;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 6f157c89ee2..dd14173e47f 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1425,6 +1425,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
(thd->open_tables == NULL ||
(thd->locked_tables_mode == LTM_LOCK_TABLES)));
+ thd_proc_info(thd, "updating status");
/* Finalize server status flags after executing a command. */
thd->update_server_status();
thd->protocol->end_statement();
diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc
index 1b942ecc93b..aff00f9fcf4 100644
--- a/sql/sql_trigger.cc
+++ b/sql/sql_trigger.cc
@@ -1334,6 +1334,7 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db,
triggers->definitions_list.elements);
table->triggers= triggers;
+ status_var_increment(thd->status_var.feature_trigger);
/*
TODO: This could be avoided if there is no triggers
@@ -2116,6 +2117,8 @@ bool Table_triggers_list::process_triggers(THD *thd,
if (sp_trigger == NULL)
return FALSE;
+ status_var_increment(thd->status_var.executed_triggers);
+
if (old_row_is_record1)
{
old_field= record1_field;
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 2fdba7fda82..6de285086a2 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -3578,22 +3578,25 @@ static bool check_locale(sys_var *self, THD *thd, set_var *var)
if (!locale->errmsgs->errmsgs)
{
+ bool res;
mysql_mutex_lock(&LOCK_error_messages);
- if (!locale->errmsgs->errmsgs &&
- read_texts(ERRMSG_FILE, locale->errmsgs->language,
- &locale->errmsgs->errmsgs,
- ER_ERROR_LAST - ER_ERROR_FIRST + 1))
+ res= (!locale->errmsgs->errmsgs &&
+ read_texts(ERRMSG_FILE, locale->errmsgs->language,
+ &locale->errmsgs->errmsgs,
+ ER_ERROR_LAST - ER_ERROR_FIRST + 1));
+ mysql_mutex_unlock(&LOCK_error_messages);
+ if (res)
{
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
"Can't process error message file for locale '%s'",
locale->name);
- mysql_mutex_unlock(&LOCK_error_messages);
return true;
}
- mysql_mutex_unlock(&LOCK_error_messages);
}
+ status_var_increment(thd->status_var.feature_locale);
return false;
}
+
static Sys_var_struct Sys_lc_messages(
"lc_messages", "Set the language used for the error messages",
SESSION_VAR(lc_messages), NO_CMD_LINE,
diff --git a/sql/tztime.cc b/sql/tztime.cc
index 9fae9f3fedd..ba24cab9ca7 100644
--- a/sql/tztime.cc
+++ b/sql/tztime.cc
@@ -2329,7 +2329,6 @@ my_tz_find(THD *thd, const String *name)
if (!str_to_offset(name->ptr(), name->length(), &offset))
{
-
if (!(result_tz= (Time_zone_offset *)my_hash_search(&offset_tzs,
(const uchar *)&offset,
sizeof(long))))
@@ -2371,6 +2370,9 @@ my_tz_find(THD *thd, const String *name)
mysql_mutex_unlock(&tz_LOCK);
+ if (result_tz && result_tz != my_tz_SYSTEM && result_tz != my_tz_UTC)
+ status_var_increment(thd->status_var.feature_timezone);
+
DBUG_RETURN(result_tz);
}