mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge with MariaDB 5.1
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
|
||||
/*
|
||||
Copyright (c) 2000, 2010, Oracle and/or its affiliates.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -11,7 +12,8 @@
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
Description of the query cache:
|
||||
@ -1258,8 +1260,8 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
|
||||
/* Key is query + database + flag */
|
||||
if (thd->db_length)
|
||||
{
|
||||
memcpy(thd->query() + thd->query_length() + 1, thd->db,
|
||||
thd->db_length);
|
||||
memcpy(thd->query() + thd->query_length() + 1 + sizeof(size_t),
|
||||
thd->db, thd->db_length);
|
||||
DBUG_PRINT("qcache", ("database: %s length: %u",
|
||||
thd->db, (unsigned) thd->db_length));
|
||||
}
|
||||
@ -1268,7 +1270,7 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
|
||||
DBUG_PRINT("qcache", ("No active database"));
|
||||
}
|
||||
tot_length= thd->query_length() + thd->db_length + 1 +
|
||||
QUERY_CACHE_FLAGS_SIZE;
|
||||
sizeof(size_t) + QUERY_CACHE_FLAGS_SIZE;
|
||||
/*
|
||||
We should only copy structure (don't use it location directly)
|
||||
because of alignment issue
|
||||
@ -1482,7 +1484,29 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
{
|
||||
/*
|
||||
We have allocated buffer space (in alloc_query) to hold the
|
||||
SQL statement(s) + the current database name + a flags struct.
|
||||
If the database name has changed during execution, which might
|
||||
happen if there are multiple statements, we need to make
|
||||
sure the new current database has a name with the same length
|
||||
as the previous one.
|
||||
*/
|
||||
size_t db_len;
|
||||
memcpy((char *) &db_len, (sql + query_length + 1), sizeof(size_t));
|
||||
if (thd->db_length != db_len)
|
||||
{
|
||||
/*
|
||||
We should probably reallocate the buffer in this case,
|
||||
but for now we just leave it uncached
|
||||
*/
|
||||
|
||||
DBUG_PRINT("qcache",
|
||||
("Current database has changed since start of query"));
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
/*
|
||||
Try to obtain an exclusive lock on the query cache. If the cache is
|
||||
disabled or if a full cache flush is in progress, the attempt to
|
||||
@ -1504,10 +1528,12 @@ 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 + QUERY_CACHE_FLAGS_SIZE;
|
||||
tot_length= query_length + 1 + sizeof(size_t) +
|
||||
thd->db_length + QUERY_CACHE_FLAGS_SIZE;
|
||||
|
||||
if (thd->db_length)
|
||||
{
|
||||
memcpy(sql+query_length+1, thd->db, thd->db_length);
|
||||
memcpy(sql + query_length + 1 + sizeof(size_t), thd->db, thd->db_length);
|
||||
DBUG_PRINT("qcache", ("database: '%s' length: %u",
|
||||
thd->db, (unsigned)thd->db_length));
|
||||
}
|
||||
|
Reference in New Issue
Block a user