summaryrefslogtreecommitdiff
path: root/sql/sql_cache.cc
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mnogosearch.org>2013-05-17 10:16:56 +0400
committerAlexander Barkov <bar@mnogosearch.org>2013-05-17 10:16:56 +0400
commit3ef880cb595084de968c6663b382589edf7f03a8 (patch)
tree66d0878cd2fb9b43f63bae6db7fdc504e2d6eab9 /sql/sql_cache.cc
parent0fa7729954c1be9ad20f1a39fc89d3e485a4d9eb (diff)
downloadmariadb-git-3ef880cb595084de968c6663b382589edf7f03a8.tar.gz
Bug#MDEV-4518 Server crashes in is_white_space when it's run
with query cache, charset ucs2 and collation ucs2_unicode_ci @ mysql-test/r/ctype_ucs2_query_cache.result @ mysql-test/t/ctype_ucs2_query_cache-master.opt @ mysql-test/t/ctype_ucs2_query_cache.test Adding tests @ sql/sql_cache.cc Fixing not to use default_character_set->state_map, which can point to a non-ASCII character set (utc2, utf16, utf32) and thus have state_map undefined.
Diffstat (limited to 'sql/sql_cache.cc')
-rw-r--r--sql/sql_cache.cc25
1 files changed, 24 insertions, 1 deletions
diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc
index ab08b496dcd..1e5c99822ff 100644
--- a/sql/sql_cache.cc
+++ b/sql/sql_cache.cc
@@ -466,6 +466,8 @@ static void make_base_query(String *new_query,
/* The following is guaranteed by the query_cache interface */
DBUG_ASSERT(query[query_length] == 0);
DBUG_ASSERT(!is_white_space(query[0]));
+ /* We do not support UCS2, UTF16, UTF32 as a client character set */
+ DBUG_ASSERT(current_thd->variables.character_set_client->mbminlen == 1);
new_query->length(0); // Don't copy anything from old buffer
if (new_query->realloc(query_length + additional_length))
@@ -2430,7 +2432,28 @@ void Query_cache::init()
m_cache_status= Query_cache::OK;
m_requests_in_progress= 0;
initialized = 1;
- query_state_map= default_charset_info->state_map;
+ /*
+ Using state_map from latin1 should be fine in all cases:
+ 1. We do not support UCS2, UTF16, UTF32 as a client character set.
+ 2. The other character sets are compatible on the lower ASCII-range
+ 0x00-0x20, and have the following characters marked as spaces:
+
+ 0x09 TAB
+ 0x0A LINE FEED
+ 0x0B VERTICAL TAB
+ 0x0C FORM FEED
+ 0x0D CARRIAGE RETUR
+ 0x20 SPACE
+
+ Additionally, only some of the ASCII-compatible character sets
+ (including latin1) can have 0xA0 mapped to "NON-BREAK SPACE"
+ and thus marked as space.
+ That should not be a problem for those charsets that map 0xA0
+ to something else: the parser will just return syntax error
+ if this character appears straight in the query
+ (i.e. not inside a string literal or comment).
+ */
+ query_state_map= my_charset_latin1.state_map;
/*
If we explicitly turn off query cache from the command line query
cache will be disabled for the reminder of the server life