Commit 809ea732 authored by unknown's avatar unknown

Bugs: #7111: server crashes when regexp is used

parent e539f5bd
......@@ -2375,3 +2375,14 @@ DROP DATABASE d1;
USE test;
SET character_set_server= @safe_character_set_server;
SET collation_server= @safe_collation_server;
create table t1 (a varchar(1)) character set utf8 collate utf8_estonian_ci;
insert into t1 values ('A'),('B'),('C'),('a'),('b'),('c');
select a, a regexp '[a]' from t1 order by binary a;
a a regexp '[a]'
A 1
B 0
C 0
a 1
b 0
c 0
drop table t1;
......@@ -444,3 +444,11 @@ DROP TABLE t1;
SET @test_character_set= 'utf8';
SET @test_collation= 'utf8_swedish_ci';
-- source include/ctype_common.inc
#
# Bug 7111 server crashes when regexp is used
#
create table t1 (a varchar(1)) character set utf8 collate utf8_estonian_ci;
insert into t1 values ('A'),('B'),('C'),('a'),('b'),('c');
select a, a regexp '[a]' from t1 order by binary a;
drop table t1;
......@@ -860,11 +860,28 @@ othercase(charset,ch)
CHARSET_INFO *charset;
int ch;
{
/*
In MySQL some multi-byte character sets
have 'ctype' array but don't have 'to_lower'
and 'to_upper' arrays. In this case we handle
only basic latin letters a..z and A..Z.
If 'to_lower' and 'to_upper' arrays are empty in a character set,
then my_isalpha(cs, ch) should never return TRUE for characters
other than basic latin letters. Otherwise it should be
considered as a mistake in character set definition.
*/
assert(my_isalpha(charset,ch));
if (my_isupper(charset,ch))
return(my_tolower(charset,ch));
{
return(charset->to_lower ? my_tolower(charset,ch) :
ch - 'A' + 'a');
}
else if (my_islower(charset,ch))
return(my_toupper(charset,ch));
{
return(charset->to_upper ? my_toupper(charset,ch) :
ch - 'a' + 'A');
}
else /* peculiar, but could happen */
return(ch);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment