mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	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)
		
			
				
	
	
		
			47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
#
 | 
						|
# Bug#57252 disabling innobase_stats_on_metadata disables ANALYZE
 | 
						|
# http://bugs.mysql.com/57252
 | 
						|
#
 | 
						|
 | 
						|
-- source include/have_innodb.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;
 |