MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:vasil.dimov Date:October 18 2010 11:21am
Subject:bzr commit into mysql-5.1-innodb branch (vasil.dimov:3637) Bug#57252
View as plain text  
#At file:///bzrroot/server/mysql-5.1-innodb/ based on revid:vasil.dimov@stripped

 3637 Vasil Dimov	2010-10-18
      Fix Bug#57252 disabling innobase_stats_on_metadata disables ANALYZE
      
      This is a merge from 5.1/builtin to 5.1/plugin of:
      
        --------------
        revision-id: vasil.dimov@stripped
        committer: Vasil Dimov <vasil.dimov@stripped>
        timestamp: Mon 2010-10-18 13:48:11 +0300
        message:
          Fix Bug#57252 disabling innobase_stats_on_metadata disables ANALYZE
          
          In order to fix this bug we need to distinguish whether ha_innobase::info()
          has been called from ::analyze() or not. Rename ::info() to ::info_low()
          and add a boolean parameter that tells whether the call is from ::analyze()
          or not. Create a new simple ::info() that just calls
          ::info_low(false => not called from analyze). From ::analyze() instead of
          ::info() call ::info_low(true => called from analyze).
          
          Approved by:	Jimmy (rb://487)
        --------------

    added:
      mysql-test/suite/innodb_plugin/r/innodb_bug57252.result
      mysql-test/suite/innodb_plugin/t/innodb_bug57252.test
    modified:
      storage/innodb_plugin/ChangeLog
      storage/innodb_plugin/handler/ha_innodb.cc
      storage/innodb_plugin/handler/ha_innodb.h
=== added file 'mysql-test/suite/innodb_plugin/r/innodb_bug57252.result'
--- a/mysql-test/suite/innodb_plugin/r/innodb_bug57252.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb_plugin/r/innodb_bug57252.result	revid:vasil.dimov@stripped
@@ -0,0 +1,6 @@
+cardinality
+10
+Table	Op	Msg_type	Msg_text
+test.bug57252	analyze	status	OK
+cardinality
+10

=== added file 'mysql-test/suite/innodb_plugin/t/innodb_bug57252.test'
--- a/mysql-test/suite/innodb_plugin/t/innodb_bug57252.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/innodb_plugin/t/innodb_bug57252.test	revid:vasil.dimov@stripped
@@ -0,0 +1,46 @@
+#
+# Bug#57252 disabling innobase_stats_on_metadata disables ANALYZE
+# http://bugs.mysql.com/57252
+#
+
+-- source include/have_innodb_plugin.inc
+
+-- disable_query_log
+-- disable_result_log
+
+SET @innodb_stats_on_metadata_orig = @@innodb_stats_on_metadata;
+
+CREATE TABLE bug57252 (a INT, KEY akey (a)) ENGINE=INNODB;
+
+BEGIN;
+let $i = 10;
+while ($i) {
+	eval INSERT INTO bug57252 VALUES ($i);
+	dec $i;
+}
+COMMIT;
+
+-- enable_result_log
+
+SET GLOBAL innodb_stats_on_metadata=0;
+
+# this calls ::info() without HA_STATUS_CONST and so
+# index->stat_n_diff_key_vals[] is not copied to the mysql-visible
+# rec_per_key
+SELECT cardinality FROM information_schema.statistics
+WHERE table_name='bug57252' AND index_name='akey';
+
+# this calls ::info() with HA_STATUS_CONST and so
+# index->stat_n_diff_key_vals[] is copied to the mysql-visible
+# rec_per_key at the end; when the bug is present dict_update_statistics()
+# is not called beforehand and so index->stat_n_diff_key_vals[] contains
+# an outdated data and thus we get an outdated data in the result when the
+# bug is present
+ANALYZE TABLE bug57252;
+
+SELECT cardinality FROM information_schema.statistics
+WHERE table_name='bug57252' AND index_name='akey';
+
+DROP TABLE bug57252;
+
+SET GLOBAL innodb_stats_on_metadata = @innodb_stats_on_metadata_orig;

=== modified file 'storage/innodb_plugin/ChangeLog'
--- a/storage/innodb_plugin/ChangeLog	revid:vasil.dimov@stripped
+++ b/storage/innodb_plugin/ChangeLog	revid:vasil.dimov@stripped
@@ -1,3 +1,9 @@
+2010-10-18	The InnoDB Team
+
+	* handler/ha_innodb.cc, handler/ha_innodb.h, innodb_bug57252.result,
+	innodb_bug57252.test:
+	Fix Bug#57252 disabling innobase_stats_on_metadata disables ANALYZE
+
 2010-10-14	The InnoDB Team
 
 	* handler/ha_innodb.cc, innodb_bug56143.result, innodb_bug56143.test:

=== modified file 'storage/innodb_plugin/handler/ha_innodb.cc'
--- a/storage/innodb_plugin/handler/ha_innodb.cc	revid:vasil.dimov@stripped
+++ b/storage/innodb_plugin/handler/ha_innodb.cc	revid:vasil.dimov@stripped
@@ -7523,9 +7523,12 @@ Returns statistics information of the ta
 in various fields of the handle object. */
 UNIV_INTERN
 int
-ha_innobase::info(
-/*==============*/
-	uint flag)	/*!< in: what information MySQL requests */
+ha_innobase::info_low(
+/*==================*/
+	uint	flag,			/*!< in: what information MySQL
+					requests */
+	bool	called_from_analyze)	/* in: TRUE if called from
+					::analyze() */
 {
 	dict_table_t*	ib_table;
 	dict_index_t*	index;
@@ -7556,7 +7559,7 @@ ha_innobase::info(
 	ib_table = prebuilt->table;
 
 	if (flag & HA_STATUS_TIME) {
-		if (innobase_stats_on_metadata) {
+		if (called_from_analyze || innobase_stats_on_metadata) {
 			/* In sql_show we call with this flag: update
 			then statistics so that they are up-to-date */
 
@@ -7804,6 +7807,18 @@ func_exit:
 	DBUG_RETURN(0);
 }
 
+/*********************************************************************//**
+Returns statistics information of the table to the MySQL interpreter,
+in various fields of the handle object. */
+UNIV_INTERN
+int
+ha_innobase::info(
+/*==============*/
+	uint	flag)	/*!< in: what information MySQL requests */
+{
+	return(info_low(flag, false /* not called from analyze */));
+}
+
 /**********************************************************************//**
 Updates index cardinalities of the table, based on 8 random dives into
 each index tree. This does NOT calculate exact statistics on the table.
@@ -7816,7 +7831,8 @@ ha_innobase::analyze(
 	HA_CHECK_OPT*	check_opt)	/*!< in: currently ignored */
 {
 	/* Simply call ::info() with all the flags */
-	info(HA_STATUS_TIME | HA_STATUS_CONST | HA_STATUS_VARIABLE);
+	info_low(HA_STATUS_TIME | HA_STATUS_CONST | HA_STATUS_VARIABLE,
+		 true /* called from analyze */);
 
 	return(0);
 }

=== modified file 'storage/innodb_plugin/handler/ha_innodb.h'
--- a/storage/innodb_plugin/handler/ha_innodb.h	revid:vasil.dimov@stripped
+++ b/storage/innodb_plugin/handler/ha_innodb.h	revid:vasil.dimov@stripped
@@ -109,6 +109,7 @@ class ha_innobase: public handler
 	ulint innobase_update_autoinc(ulonglong	auto_inc);
 	void innobase_initialize_autoinc();
 	dict_index_t* innobase_get_index(uint keynr);
+	int info_low(uint flag, bool called_from_analyze);
 
 	/* Init values for the class: */
  public:


Attachment: [text/bzr-bundle] bzr/vasil.dimov@oracle.com-20101018112016-wzj459jcdvvije5p.bundle
Thread
bzr commit into mysql-5.1-innodb branch (vasil.dimov:3637) Bug#57252vasil.dimov18 Oct