mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
store SERVER_MORE_RESULTS_EXISTS in key of query cache (BUG#6897)
mysql-test/r/query_cache.result: query in QC from normal execution and SP mysql-test/t/query_cache.test: environment restoring fix layout fix query in QC from normal execution and SP sql/mysql_priv.h: store SERVER_MORE_RESULTS_EXISTS sql/sql_cache.cc: store SERVER_MORE_RESULTS_EXISTS in key of query cache BitKeeper/etc/config: switching logging off
This commit is contained in:
@ -24,7 +24,7 @@ description: MySQL - fast and reliable SQL database
|
|||||||
# repository is commercial it can be an internal email address or "none"
|
# repository is commercial it can be an internal email address or "none"
|
||||||
# to disable logging.
|
# to disable logging.
|
||||||
#
|
#
|
||||||
logging: logging@openlogging.org
|
logging: none
|
||||||
#
|
#
|
||||||
# If this field is set, all checkins will appear to be made by this user,
|
# If this field is set, all checkins will appear to be made by this user,
|
||||||
# in effect making this a single user package. Single user packages are
|
# in effect making this a single user package. Single user packages are
|
||||||
|
File diff suppressed because one or more lines are too long
@ -616,6 +616,7 @@ set character_set_results=cp1251;
|
|||||||
SELECT a,'<27>','<27>'='<27>' FROM t1;
|
SELECT a,'<27>','<27>'='<27>' FROM t1;
|
||||||
show status like "Qcache_hits";
|
show status like "Qcache_hits";
|
||||||
show status like "Qcache_queries_in_cache";
|
show status like "Qcache_queries_in_cache";
|
||||||
|
SET NAMES default;
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
@ -711,9 +712,10 @@ repair table t1;
|
|||||||
show status like 'qcache_queries_in_cache';
|
show status like 'qcache_queries_in_cache';
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
# Bug #9549: Make sure cached queries that span more than one cache block
|
# Bug #9549: Make sure cached queries that span more than one cache block
|
||||||
# are handled properly in the embedded server.
|
# are handled properly in the embedded server.
|
||||||
|
#
|
||||||
# We just want a small query cache, so we can fragment it easily
|
# We just want a small query cache, so we can fragment it easily
|
||||||
set GLOBAL query_cache_size=64*1024;
|
set GLOBAL query_cache_size=64*1024;
|
||||||
# This actually gives us a usable cache size of about 48K
|
# This actually gives us a usable cache size of about 48K
|
||||||
@ -755,6 +757,8 @@ select a from t1;
|
|||||||
flush query cache;
|
flush query cache;
|
||||||
|
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
set GLOBAL query_cache_size=1355776
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# SP cursors and selects with query cache (BUG#9715)
|
# SP cursors and selects with query cache (BUG#9715)
|
||||||
@ -788,4 +792,43 @@ drop procedure p1//
|
|||||||
drop table t1//
|
drop table t1//
|
||||||
delimiter ;//
|
delimiter ;//
|
||||||
|
|
||||||
|
#
|
||||||
|
# query in QC from normal execution and SP (BUG#6897)
|
||||||
|
#
|
||||||
|
flush query cache;
|
||||||
|
reset query cache;
|
||||||
|
flush status;
|
||||||
|
delimiter //;
|
||||||
|
create table t1 (s1 int)//
|
||||||
|
create procedure f1 () begin
|
||||||
|
select sql_cache * from t1;
|
||||||
|
select sql_cache * from t1;
|
||||||
|
end;//
|
||||||
|
delimiter ;//
|
||||||
|
call f1();
|
||||||
|
show status like "Qcache_queries_in_cache";
|
||||||
|
show status like "Qcache_inserts";
|
||||||
|
show status like "Qcache_hits";
|
||||||
|
call f1();
|
||||||
|
show status like "Qcache_queries_in_cache";
|
||||||
|
show status like "Qcache_inserts";
|
||||||
|
show status like "Qcache_hits";
|
||||||
|
call f1();
|
||||||
|
select sql_cache * from t1;
|
||||||
|
show status like "Qcache_queries_in_cache";
|
||||||
|
show status like "Qcache_inserts";
|
||||||
|
show status like "Qcache_hits";
|
||||||
|
insert into t1 values (1);
|
||||||
|
select sql_cache * from t1;
|
||||||
|
show status like "Qcache_queries_in_cache";
|
||||||
|
show status like "Qcache_inserts";
|
||||||
|
show status like "Qcache_hits";
|
||||||
|
call f1();
|
||||||
|
call f1();
|
||||||
|
select sql_cache * from t1;
|
||||||
|
show status like "Qcache_queries_in_cache";
|
||||||
|
show status like "Qcache_inserts";
|
||||||
|
show status like "Qcache_hits";
|
||||||
|
drop procedure f1;
|
||||||
|
drop table t1;
|
||||||
set GLOBAL query_cache_size=0;
|
set GLOBAL query_cache_size=0;
|
||||||
|
@ -521,6 +521,7 @@ struct Query_cache_query_flags
|
|||||||
{
|
{
|
||||||
unsigned int client_long_flag:1;
|
unsigned int client_long_flag:1;
|
||||||
unsigned int client_protocol_41:1;
|
unsigned int client_protocol_41:1;
|
||||||
|
unsigned int more_results_exists:1;
|
||||||
uint character_set_client_num;
|
uint character_set_client_num;
|
||||||
uint character_set_results_num;
|
uint character_set_results_num;
|
||||||
uint collation_connection_num;
|
uint collation_connection_num;
|
||||||
|
@ -775,10 +775,11 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used)
|
|||||||
Query_cache_query_flags flags;
|
Query_cache_query_flags flags;
|
||||||
// fill all gaps between fields with 0 to get repeatable key
|
// fill all gaps between fields with 0 to get repeatable key
|
||||||
bzero(&flags, QUERY_CACHE_FLAGS_SIZE);
|
bzero(&flags, QUERY_CACHE_FLAGS_SIZE);
|
||||||
flags.client_long_flag= (thd->client_capabilities & CLIENT_LONG_FLAG ?
|
flags.client_long_flag= test(thd->client_capabilities & CLIENT_LONG_FLAG);
|
||||||
1 : 0);
|
flags.client_protocol_41= test(thd->client_capabilities &
|
||||||
flags.client_protocol_41= (thd->client_capabilities & CLIENT_PROTOCOL_41 ?
|
CLIENT_PROTOCOL_41);
|
||||||
1 : 0);
|
flags.more_results_exists= test(thd->server_status &
|
||||||
|
SERVER_MORE_RESULTS_EXISTS);
|
||||||
flags.character_set_client_num=
|
flags.character_set_client_num=
|
||||||
thd->variables.character_set_client->number;
|
thd->variables.character_set_client->number;
|
||||||
flags.character_set_results_num=
|
flags.character_set_results_num=
|
||||||
@ -792,6 +793,20 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used)
|
|||||||
flags.sql_mode= thd->variables.sql_mode;
|
flags.sql_mode= thd->variables.sql_mode;
|
||||||
flags.max_sort_length= thd->variables.max_sort_length;
|
flags.max_sort_length= thd->variables.max_sort_length;
|
||||||
flags.group_concat_max_len= thd->variables.group_concat_max_len;
|
flags.group_concat_max_len= thd->variables.group_concat_max_len;
|
||||||
|
DBUG_PRINT("qcache", ("long %d, 4.1: %d, more results %d, \
|
||||||
|
CS client: %u, CS result: %u, CS conn: %u, limit: %lu, TZ: 0x%lx, \
|
||||||
|
sql mode: 0x%lx, sort len: %lu, conncat len: %lu",
|
||||||
|
(int)flags.client_long_flag,
|
||||||
|
(int)flags.client_protocol_41,
|
||||||
|
(int)flags.more_results_exists,
|
||||||
|
flags.character_set_client_num,
|
||||||
|
flags.character_set_results_num,
|
||||||
|
flags.collation_connection_num,
|
||||||
|
flags.limit,
|
||||||
|
(ulong)flags.time_zone,
|
||||||
|
flags.sql_mode,
|
||||||
|
flags.max_sort_length,
|
||||||
|
flags.group_concat_max_len));
|
||||||
STRUCT_LOCK(&structure_guard_mutex);
|
STRUCT_LOCK(&structure_guard_mutex);
|
||||||
|
|
||||||
if (query_cache_size == 0)
|
if (query_cache_size == 0)
|
||||||
@ -974,10 +989,11 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
|
|||||||
|
|
||||||
// fill all gaps between fields with 0 to get repeatable key
|
// fill all gaps between fields with 0 to get repeatable key
|
||||||
bzero(&flags, QUERY_CACHE_FLAGS_SIZE);
|
bzero(&flags, QUERY_CACHE_FLAGS_SIZE);
|
||||||
flags.client_long_flag= (thd->client_capabilities & CLIENT_LONG_FLAG ?
|
flags.client_long_flag= test(thd->client_capabilities & CLIENT_LONG_FLAG);
|
||||||
1 : 0);
|
flags.client_protocol_41= test(thd->client_capabilities &
|
||||||
flags.client_protocol_41= (thd->client_capabilities & CLIENT_PROTOCOL_41 ?
|
CLIENT_PROTOCOL_41);
|
||||||
1 : 0);
|
flags.more_results_exists= test(thd->server_status &
|
||||||
|
SERVER_MORE_RESULTS_EXISTS);
|
||||||
flags.character_set_client_num= thd->variables.character_set_client->number;
|
flags.character_set_client_num= thd->variables.character_set_client->number;
|
||||||
flags.character_set_results_num=
|
flags.character_set_results_num=
|
||||||
(thd->variables.character_set_results ?
|
(thd->variables.character_set_results ?
|
||||||
@ -989,6 +1005,20 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
|
|||||||
flags.sql_mode= thd->variables.sql_mode;
|
flags.sql_mode= thd->variables.sql_mode;
|
||||||
flags.max_sort_length= thd->variables.max_sort_length;
|
flags.max_sort_length= thd->variables.max_sort_length;
|
||||||
flags.group_concat_max_len= thd->variables.group_concat_max_len;
|
flags.group_concat_max_len= thd->variables.group_concat_max_len;
|
||||||
|
DBUG_PRINT("qcache", ("long %d, 4.1: %d, more results %d, \
|
||||||
|
CS client: %u, CS result: %u, CS conn: %u, limit: %lu, TZ: 0x%lx, \
|
||||||
|
sql mode: 0x%lx, sort len: %lu, conncat len: %lu",
|
||||||
|
(int)flags.client_long_flag,
|
||||||
|
(int)flags.client_protocol_41,
|
||||||
|
(int)flags.more_results_exists,
|
||||||
|
flags.character_set_client_num,
|
||||||
|
flags.character_set_results_num,
|
||||||
|
flags.collation_connection_num,
|
||||||
|
flags.limit,
|
||||||
|
(ulong)flags.time_zone,
|
||||||
|
flags.sql_mode,
|
||||||
|
flags.max_sort_length,
|
||||||
|
flags.group_concat_max_len));
|
||||||
memcpy((void *)(sql + (tot_length - QUERY_CACHE_FLAGS_SIZE)),
|
memcpy((void *)(sql + (tot_length - QUERY_CACHE_FLAGS_SIZE)),
|
||||||
&flags, QUERY_CACHE_FLAGS_SIZE);
|
&flags, QUERY_CACHE_FLAGS_SIZE);
|
||||||
query_block = (Query_cache_block *) hash_search(&queries, (byte*) sql,
|
query_block = (Query_cache_block *) hash_search(&queries, (byte*) sql,
|
||||||
|
Reference in New Issue
Block a user