summaryrefslogtreecommitdiff
path: root/sql/sql_cache.cc
diff options
context:
space:
mode:
authorunknown <monty@hundin.mysql.fi>2001-12-23 02:43:46 +0200
committerunknown <monty@hundin.mysql.fi>2001-12-23 02:43:46 +0200
commit953ac1a5cf2acc464c3214e715679e61c4d18c24 (patch)
treec49964609935e7b3c7d648539cf1122a6b4a39b9 /sql/sql_cache.cc
parentf70786085b43200a38b022c517dec14bd1041f54 (diff)
downloadmariadb-git-953ac1a5cf2acc464c3214e715679e61c4d18c24.tar.gz
Limit created keys to MAX_KEY_LENGTH.
Fix problem with query cache and database names mysql-test/mysql-test-run.sh: Portability fixes mysql-test/r/query_cache.result: More tests when using different databases mysql-test/t/query_cache.test: More tests when using different databases sql-bench/test-wisconsin.sh: Portability fix sql/sql_cache.cc: Fix problem with query cache and database names sql/sql_parse.cc: Remove pre and end space in query. sql/sql_table.cc: Limit created keys to MAX_KEY_LENGTH.
Diffstat (limited to 'sql/sql_cache.cc')
-rw-r--r--sql/sql_cache.cc39
1 files changed, 19 insertions, 20 deletions
diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc
index 399f0dda04e..523e835f472 100644
--- a/sql/sql_cache.cc
+++ b/sql/sql_cache.cc
@@ -743,7 +743,7 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used)
/* Key is query + database + flag */
if (thd->db_length)
{
- memcpy(thd->query+thd->query_length, thd->db, thd->db_length);
+ memcpy(thd->query+thd->query_length+1, thd->db, thd->db_length);
DBUG_PRINT("qcache", ("database : %s length %u",
thd->db, thd->db_length));
}
@@ -761,7 +761,7 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used)
flags|= (byte) thd->convert_set->number();
DBUG_ASSERT(thd->convert_set->number() < 128);
}
- tot_length=thd->query_length+1+thd->db_length;
+ tot_length=thd->query_length+thd->db_length+2;
thd->query[tot_length-1] = (char) flags;
/* Check if another thread is processing the same query? */
@@ -832,7 +832,6 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used)
statistic_increment(refused, &structure_guard_mutex);
end:
- thd->query[thd->query_length]= 0; // Restore end null
DBUG_VOID_RETURN;
}
@@ -890,12 +889,10 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
goto err;
}
- /* Test if the query is a SELECT */
- while (*sql == ' ' || *sql == '\t')
- {
- sql++;
- query_length--;
- }
+ /*
+ Test if the query is a SELECT
+ (pre-space is removed in dispatch_command)
+ */
if (toupper(sql[0]) != 'S' || toupper(sql[1]) != 'E' ||
toupper(sql[2]) !='L')
{
@@ -911,10 +908,10 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
}
Query_cache_block *query_block;
- tot_length=query_length+thd->db_length+1;
+ tot_length=query_length+thd->db_length+2;
if (thd->db_length)
{
- memcpy(sql+query_length, thd->db, thd->db_length);
+ memcpy(sql+query_length+1, thd->db, thd->db_length);
DBUG_PRINT("qcache", ("database: '%s' length %u",
thd->db, thd->db_length));
}
@@ -936,9 +933,6 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
sql[tot_length-1] = (char) flags;
query_block = (Query_cache_block *) hash_search(&queries, (byte*) sql,
tot_length);
-
- sql[query_length] = '\0'; // Restore end null
-
/* Quick abort on unlocked data */
if (query_block == 0 ||
query_block->query()->result() == 0 ||
@@ -2582,8 +2576,11 @@ my_bool Query_cache::move_by_type(byte **border,
pthread_cond_init(&new_query->lock, NULL);
pthread_mutex_init(&new_query->clients_guard,MY_MUTEX_INIT_FAST);
+ /*
+ If someone is writing to this block, inform the writer that the block
+ has been moved.
+ */
NET *net = new_block->query()->writer();
- /* QQ: When could this happen ? */
if (net != 0)
{
net->query_cache_query= (gptr) new_block;
@@ -2877,15 +2874,17 @@ void Query_cache::queries_dump()
{
uint len;
char *str = (char*) query_cache_query_get_key((byte*) block, &len, 0);
- uint flags = (uint) (uchar) str[len-1];
- DBUG_PRINT("qcache", ("%u (%u,%u) %.*s",len,
+ len--; // Point at flags
+ uint flags = (uint) (uchar) str[len];
+ str[len]=0;
+ DBUG_PRINT("qcache", ("%u (%u,%u) '%s' '%s'",
((flags & QUERY_CACHE_CLIENT_LONG_FLAG_MASK)? 1:0),
- (flags & QUERY_CACHE_CHARSET_CONVERT_MASK), len-1,
- str));
+ (flags & QUERY_CACHE_CHARSET_CONVERT_MASK), len,
+ str,strend(str)+1));
DBUG_PRINT("qcache", ("-b- 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx", (ulong) block,
(ulong) block->next, (ulong) block->prev,
(ulong)block->pnext, (ulong)block->pprev));
-
+ str[len]=(char) flags;
for (TABLE_COUNTER_TYPE t = 0; t < block->n_tables; t++)
{
Query_cache_table *table = block->table(t)->parent;