Commit 809ea732 authored by unknown's avatar unknown
Browse files

Bugs: #7111: server crashes when regexp is used

parent e539f5bd
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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;
+8 −0
Original line number Diff line number Diff line
@@ -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;
+19 −2
Original line number Diff line number Diff line
@@ -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);
}