Below is the list of changes that have just been committed into a local
5.0 repository of msvensson. When msvensson does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.1965 05/09/23 12:22:49 msvensson@neptunus.(none) +6 -0
Bug #13231 mysqltest: fails to dectect when mysql_next_result fails
- Packets out of order when reading cached data stored by a normal select from a ps or vice versa.
- Fix by rewriting pkt_nr when sending the data from cache.
sql/sql_cache.h
1.31 05/09/23 12:22:45 msvensson@neptunus.(none) +0 -1
Remove last_pkt_nr variable
sql/sql_cache.cc
1.85 05/09/23 12:22:45 msvensson@neptunus.(none) +14 -13
Rewrite pkt_nr in each packet of each block in the query cache before sending the blocks to the client.
Remove fix for bug#3583 "query cache doesn't work for stored procedures"
sql/net_serv.cc
1.85 05/09/23 12:22:45 msvensson@neptunus.(none) +80 -0
Add net_write_block function
sql/mysql_priv.h
1.352 05/09/23 12:22:45 msvensson@neptunus.(none) +4 -0
Declare net_write_block
mysql-test/t/query_cache.test
1.48 05/09/23 12:22:45 msvensson@neptunus.(none) +39 -0
Improve test for queries that are retrieved from query_cache from both a regular statment and a statement inside a stored procedure.
mysql-test/r/query_cache.result
1.64 05/09/23 12:22:44 msvensson@neptunus.(none) +117 -0
Update test results
Add the resultsets that wasn't there before.
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: msvensson
# Host: neptunus.(none)
# Root: /home/msvensson/mysql/bug13231/my50-bug13231
--- 1.351/sql/mysql_priv.h 2005-09-15 01:57:51 +02:00
+++ 1.352/sql/mysql_priv.h 2005-09-23 12:22:45 +02:00
@@ -1371,6 +1371,10 @@
void hostname_cache_free();
void hostname_cache_refresh(void);
+/* from net_serv.cc */
+my_bool net_write_block(NET* net, const char *block,
+ ulong block_len, ulong *left);
+
/* sql_cache.cc */
extern bool sql_cache_init();
extern void sql_cache_free();
--- 1.84/sql/net_serv.cc 2005-09-13 01:55:43 +02:00
+++ 1.85/sql/net_serv.cc 2005-09-23 12:22:45 +02:00
@@ -351,6 +351,86 @@
net_write_buff(net, packet, len) || net_flush(net)));
}
+
+/*
+
+ Write query cache block to net, write new packet header
+
+ SYNOPSIS
+ net_write_block()
+ net NET handler
+ block block containing the packets to be written
+ block_len lenght of block
+ left [in/out] packet length left from last block
+
+ DESCRIPTION
+ Write a block from the query cache to the net
+ Each block contains a number of packets, for each packet a
+ new header is created before it's written to the net. A packet may
+ span several blocks
+
+ RETURN VALUES
+ 0 ok
+ 1 error
+*/
+my_bool
+net_write_block(NET* net, const char *block,
+ ulong block_len, ulong *left)
+{
+ uchar buff[NET_HEADER_SIZE];
+ const char *end= block + block_len;
+
+ DBUG_ENTER("net_write_block");
+ DBUG_PRINT("enter", ("block_len: %d, left: %d", block_len, *left));
+
+ // Write remaining data left from last block
+ if (*left)
+ {
+ if (net_write_buff(net, block, *left))
+ DBUG_RETURN(1);
+ block+= *left;
+ *left= 0;
+ }
+
+ while(block < end)
+ {
+ // Read old packet header
+ uint32 pkt_len= uint3korr(block);
+ uchar pkt_nr= block[3];
+ DBUG_PRINT("info", ("pkt_len: %d, pkt_nr: %d, new_pkt_nr: %d",
+ pkt_len, pkt_nr, net->pkt_nr));
+
+ // Write new packet_header
+ int3store(buff, pkt_len);
+ buff[3]= (uchar) net->pkt_nr++;
+ if (net_write_buff(net,(char*) buff,NET_HEADER_SIZE))
+ DBUG_RETURN(1);
+#ifndef DEBUG_DATA_PACKETS
+ DBUG_DUMP("packet_header",(char*) buff,NET_HEADER_SIZE);
+#endif
+
+ block+= NET_HEADER_SIZE;
+
+ // Write packet data
+ ulong write_len= pkt_len;
+ ulong left_len= end - block;
+ if (left_len < write_len)
+ {
+ // Packet can continue in next block
+ write_len= left_len;
+ *left= pkt_len - left_len;
+ }
+ if (net_write_buff(net, block, write_len))
+ DBUG_RETURN(1);
+
+ // Step to next packet header
+ block+= write_len;
+ }
+
+ DBUG_RETURN(0);
+}
+
+
/*
Caching the data in a local buffer before sending it.
--- 1.84/sql/sql_cache.cc 2005-09-06 19:51:08 +02:00
+++ 1.85/sql/sql_cache.cc 2005-09-23 12:22:45 +02:00
@@ -614,7 +614,6 @@
DBUG_VOID_RETURN;
}
header->result(result);
- header->last_pkt_nr= net->pkt_nr;
BLOCK_UNLOCK_WR(query_block);
}
else
@@ -960,6 +959,7 @@
Query_cache_block_table *block_table, *block_table_end;
ulong tot_length;
Query_cache_query_flags flags;
+ ulong length_in_next= 0;
DBUG_ENTER("Query_cache::send_result_to_client");
if (query_cache_size == 0 || thd->locked_tables ||
@@ -1178,19 +1178,20 @@
do
{
DBUG_PRINT("qcache", ("Results (len %lu, used %lu, headers %lu)",
- result_block->length, result_block->used,
- result_block->headers_len()+
- ALIGN_SIZE(sizeof(Query_cache_result))));
-
- Query_cache_result *result = result_block->result();
- if (net_real_write(&thd->net, result->data(),
- result_block->used -
- result_block->headers_len() -
- ALIGN_SIZE(sizeof(Query_cache_result))))
- break; // Client aborted
- result_block = result_block->next;
- thd->net.pkt_nr= query->last_pkt_nr; // Keep packet number updated
+ result_block->length, result_block->used,
+ result_block->headers_len()+
+ ALIGN_SIZE(sizeof(Query_cache_result))));
+
+ Query_cache_result *result= result_block->result();
+ ulong result_len= result_block->used - result_block->headers_len() -
+ ALIGN_SIZE(sizeof(Query_cache_result));
+
+ if (net_write_block(&thd->net, result->data(), result_len,
+ &length_in_next))
+ break; // Client aborted
+ result_block= result_block->next;
} while (result_block != first_result_block);
+ net_flush(&thd->net);
#else
{
Querycache_stream qs(result_block, result_block->headers_len() +
--- 1.63/mysql-test/r/query_cache.result 2005-08-11 19:42:02 +02:00
+++ 1.64/mysql-test/r/query_cache.result 2005-09-23 12:22:44 +02:00
@@ -1058,8 +1058,23 @@
select sql_cache * from t1;
select sql_cache * from t1;
end;//
+create procedure f2 () begin
+select sql_cache * from t1 where s1=1;
+select sql_cache * from t1;
+end;//
+create procedure f3 () begin
+select sql_cache * from t1;
+select sql_cache * from t1 where s1=1;
+end;//
+create procedure f4 () begin
+select sql_cache * from t1;
+select sql_cache * from t1 where s1=1;
+select sql_cache * from t1;
+select sql_cache * from t1 where s1=1;
+end;//
call f1();
s1
+s1
show status like "Qcache_queries_in_cache";
Variable_name Value
Qcache_queries_in_cache 1
@@ -1071,6 +1086,7 @@
Qcache_hits 1
call f1();
s1
+s1
show status like "Qcache_queries_in_cache";
Variable_name Value
Qcache_queries_in_cache 1
@@ -1082,6 +1098,7 @@
Qcache_hits 3
call f1();
s1
+s1
select sql_cache * from t1;
s1
show status like "Qcache_queries_in_cache";
@@ -1109,9 +1126,13 @@
call f1();
s1
1
+s1
+1
call f1();
s1
1
+s1
+1
select sql_cache * from t1;
s1
1
@@ -1124,6 +1145,102 @@
show status like "Qcache_hits";
Variable_name Value
Qcache_hits 9
+flush query cache;
+reset query cache;
+flush status;
+select sql_cache * from t1;
+s1
+1
+select sql_cache * from t1 where s1=1;
+s1
+1
+call f1();
+s1
+1
+s1
+1
+call f2();
+s1
+1
+s1
+1
+call f3();
+s1
+1
+s1
+1
+call f4();
+s1
+1
+s1
+1
+s1
+1
+s1
+1
+call f4();
+s1
+1
+s1
+1
+s1
+1
+s1
+1
+call f3();
+s1
+1
+s1
+1
+call f2();
+s1
+1
+s1
+1
+insert into t1 values (2);
+call f1();
+s1
+1
+2
+s1
+1
+2
+select sql_cache * from t1 where s1=1;
+s1
+1
+select sql_cache * from t1;
+s1
+1
+2
+call f1();
+s1
+1
+2
+s1
+1
+2
+call f3();
+s1
+1
+2
+s1
+1
+call f3();
+s1
+1
+2
+s1
+1
+call f1();
+s1
+1
+2
+s1
+1
+2
drop procedure f1;
+drop procedure f2;
+drop procedure f3;
+drop procedure f4;
drop table t1;
set GLOBAL query_cache_size=0;
--- 1.47/mysql-test/t/query_cache.test 2005-08-07 23:32:24 +02:00
+++ 1.48/mysql-test/t/query_cache.test 2005-09-23 12:22:45 +02:00
@@ -776,6 +776,7 @@
#
# query in QC from normal execution and SP (BUG#6897)
+# improved to also test BUG#3583 and BUG#12990
#
flush query cache;
reset query cache;
@@ -786,6 +787,20 @@
select sql_cache * from t1;
select sql_cache * from t1;
end;//
+create procedure f2 () begin
+select sql_cache * from t1 where s1=1;
+select sql_cache * from t1;
+end;//
+create procedure f3 () begin
+select sql_cache * from t1;
+select sql_cache * from t1 where s1=1;
+end;//
+create procedure f4 () begin
+select sql_cache * from t1;
+select sql_cache * from t1 where s1=1;
+select sql_cache * from t1;
+select sql_cache * from t1 where s1=1;
+end;//
delimiter ;//
call f1();
show status like "Qcache_queries_in_cache";
@@ -811,7 +826,31 @@
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
+flush query cache;
+reset query cache;
+flush status;
+select sql_cache * from t1;
+select sql_cache * from t1 where s1=1;
+call f1();
+call f2();
+call f3();
+call f4();
+call f4();
+call f3();
+call f2();
+insert into t1 values (2);
+call f1();
+select sql_cache * from t1 where s1=1;
+select sql_cache * from t1;
+call f1();
+call f3();
+call f3();
+call f1();
+
drop procedure f1;
+drop procedure f2;
+drop procedure f3;
+drop procedure f4;
drop table t1;
set GLOBAL query_cache_size=0;
--- 1.30/sql/sql_cache.h 2005-09-06 19:51:08 +02:00
+++ 1.31/sql/sql_cache.h 2005-09-23 12:22:45 +02:00
@@ -112,7 +112,6 @@
NET *wri;
ulong len;
uint8 tbls_type;
- unsigned int last_pkt_nr;
inline void init_n_lock();
void unlock_n_destroy();
| Thread |
|---|
| • bk commit into 5.0 tree (msvensson:1.1965) BUG#13231 | msvensson | 23 Sep |