Merge stella.local:/home2/mydev/mysql-5.0-axmrg
into stella.local:/home2/mydev/mysql-5.1-axmrg
This commit is contained in:
commit
857dd49aa8
@ -1654,6 +1654,32 @@ set GLOBAL query_cache_type=default;
|
|||||||
set GLOBAL query_cache_limit=default;
|
set GLOBAL query_cache_limit=default;
|
||||||
set GLOBAL query_cache_min_res_unit=default;
|
set GLOBAL query_cache_min_res_unit=default;
|
||||||
set GLOBAL query_cache_size=default;
|
set GLOBAL query_cache_size=default;
|
||||||
|
FLUSH STATUS;
|
||||||
|
SET GLOBAL query_cache_size=10*1024*1024;
|
||||||
|
SET @save_concurrent_insert= @@concurrent_insert;
|
||||||
|
SET GLOBAL concurrent_insert= 0;
|
||||||
|
CREATE TABLE t1 (c1 INT NOT NULL) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 (c1) VALUES (1), (2);
|
||||||
|
SHOW GLOBAL VARIABLES LIKE 'concurrent_insert';
|
||||||
|
Variable_name Value
|
||||||
|
concurrent_insert 0
|
||||||
|
SHOW STATUS LIKE 'Qcache_hits';
|
||||||
|
Variable_name Value
|
||||||
|
Qcache_hits 0
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1
|
||||||
|
1
|
||||||
|
2
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1
|
||||||
|
1
|
||||||
|
2
|
||||||
|
SHOW STATUS LIKE 'Qcache_hits';
|
||||||
|
Variable_name Value
|
||||||
|
Qcache_hits 1
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET GLOBAL concurrent_insert= @save_concurrent_insert;
|
||||||
|
SET GLOBAL query_cache_size= default;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
CREATE TABLE t1 (a ENUM('rainbow'));
|
CREATE TABLE t1 (a ENUM('rainbow'));
|
||||||
INSERT INTO t1 VALUES (),(),(),(),();
|
INSERT INTO t1 VALUES (),(),(),(),();
|
||||||
|
@ -1298,6 +1298,25 @@ set GLOBAL query_cache_limit=default;
|
|||||||
set GLOBAL query_cache_min_res_unit=default;
|
set GLOBAL query_cache_min_res_unit=default;
|
||||||
set GLOBAL query_cache_size=default;
|
set GLOBAL query_cache_size=default;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#33756 - query cache with concurrent_insert=0 appears broken
|
||||||
|
#
|
||||||
|
FLUSH STATUS;
|
||||||
|
SET GLOBAL query_cache_size=10*1024*1024;
|
||||||
|
SET @save_concurrent_insert= @@concurrent_insert;
|
||||||
|
SET GLOBAL concurrent_insert= 0;
|
||||||
|
CREATE TABLE t1 (c1 INT NOT NULL) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 (c1) VALUES (1), (2);
|
||||||
|
#
|
||||||
|
SHOW GLOBAL VARIABLES LIKE 'concurrent_insert';
|
||||||
|
SHOW STATUS LIKE 'Qcache_hits';
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SHOW STATUS LIKE 'Qcache_hits';
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET GLOBAL concurrent_insert= @save_concurrent_insert;
|
||||||
|
SET GLOBAL query_cache_size= default;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -2098,6 +2098,7 @@ my_bool ha_myisam::register_query_cache_table(THD *thd, char *table_name,
|
|||||||
*engine_callback,
|
*engine_callback,
|
||||||
ulonglong *engine_data)
|
ulonglong *engine_data)
|
||||||
{
|
{
|
||||||
|
DBUG_ENTER("ha_myisam::register_query_cache_table");
|
||||||
/*
|
/*
|
||||||
No call back function is needed to determine if a cached statement
|
No call back function is needed to determine if a cached statement
|
||||||
is valid or not.
|
is valid or not.
|
||||||
@ -2109,39 +2110,48 @@ my_bool ha_myisam::register_query_cache_table(THD *thd, char *table_name,
|
|||||||
*/
|
*/
|
||||||
*engine_data= 0;
|
*engine_data= 0;
|
||||||
|
|
||||||
/*
|
if (file->s->concurrent_insert)
|
||||||
If a concurrent INSERT has happened just before the currently processed
|
|
||||||
SELECT statement, the total size of the table is unknown.
|
|
||||||
|
|
||||||
To determine if the table size is known, the current thread's snap shot of
|
|
||||||
the table size with the actual table size are compared.
|
|
||||||
|
|
||||||
If the table size is unknown the SELECT statement can't be cached.
|
|
||||||
*/
|
|
||||||
ulonglong actual_data_file_length;
|
|
||||||
ulonglong current_data_file_length;
|
|
||||||
|
|
||||||
/*
|
|
||||||
POSIX visibility rules specify that "2. Whatever memory values a
|
|
||||||
thread can see when it unlocks a mutex <...> can also be seen by any
|
|
||||||
thread that later locks the same mutex". In this particular case,
|
|
||||||
concurrent insert thread had modified the data_file_length in
|
|
||||||
MYISAM_SHARE before it has unlocked (or even locked)
|
|
||||||
structure_guard_mutex. So, here we're guaranteed to see at least that
|
|
||||||
value after we've locked the same mutex. We can see a later value
|
|
||||||
(modified by some other thread) though, but it's ok, as we only want
|
|
||||||
to know if the variable was changed, the actual new value doesn't matter
|
|
||||||
*/
|
|
||||||
actual_data_file_length= file->s->state.state.data_file_length;
|
|
||||||
current_data_file_length= file->save_state.data_file_length;
|
|
||||||
|
|
||||||
if (current_data_file_length != actual_data_file_length)
|
|
||||||
{
|
{
|
||||||
/* Don't cache current statement. */
|
/*
|
||||||
return FALSE;
|
If a concurrent INSERT has happened just before the currently
|
||||||
|
processed SELECT statement, the total size of the table is
|
||||||
|
unknown.
|
||||||
|
|
||||||
|
To determine if the table size is known, the current thread's snap
|
||||||
|
shot of the table size with the actual table size are compared.
|
||||||
|
|
||||||
|
If the table size is unknown the SELECT statement can't be cached.
|
||||||
|
|
||||||
|
When concurrent inserts are disabled at table open, mi_open()
|
||||||
|
does not assign a get_status() function. In this case the local
|
||||||
|
("current") status is never updated. We would wrongly think that
|
||||||
|
we cannot cache the statement.
|
||||||
|
*/
|
||||||
|
ulonglong actual_data_file_length;
|
||||||
|
ulonglong current_data_file_length;
|
||||||
|
|
||||||
|
/*
|
||||||
|
POSIX visibility rules specify that "2. Whatever memory values a
|
||||||
|
thread can see when it unlocks a mutex <...> can also be seen by any
|
||||||
|
thread that later locks the same mutex". In this particular case,
|
||||||
|
concurrent insert thread had modified the data_file_length in
|
||||||
|
MYISAM_SHARE before it has unlocked (or even locked)
|
||||||
|
structure_guard_mutex. So, here we're guaranteed to see at least that
|
||||||
|
value after we've locked the same mutex. We can see a later value
|
||||||
|
(modified by some other thread) though, but it's ok, as we only want
|
||||||
|
to know if the variable was changed, the actual new value doesn't matter
|
||||||
|
*/
|
||||||
|
actual_data_file_length= file->s->state.state.data_file_length;
|
||||||
|
current_data_file_length= file->save_state.data_file_length;
|
||||||
|
|
||||||
|
if (current_data_file_length != actual_data_file_length)
|
||||||
|
{
|
||||||
|
/* Don't cache current statement. */
|
||||||
|
DBUG_RETURN(FALSE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* It is ok to try to cache current statement. */
|
/* It is ok to try to cache current statement. */
|
||||||
return TRUE;
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user