mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
Allow cp932 characters to be stored in a SJIS column
This commit is contained in:
@@ -41,3 +41,9 @@ C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
|
||||
select hex(CONVERT(@utf84 USING sjis));
|
||||
hex(CONVERT(@utf84 USING sjis))
|
||||
D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF
|
||||
create table t1 (a char(10) character set sjis);
|
||||
insert into t1 values (0x878A);
|
||||
select hex(a) from t1;
|
||||
hex(a)
|
||||
878A
|
||||
drop table t1;
|
||||
|
||||
@@ -32,3 +32,12 @@ select hex(CONVERT(@utf81 USING sjis));
|
||||
select hex(CONVERT(@utf82 USING sjis));
|
||||
select hex(CONVERT(@utf83 USING sjis));
|
||||
select hex(CONVERT(@utf84 USING sjis));
|
||||
|
||||
#
|
||||
# Allow to insert extra CP932 characters
|
||||
# into a SJIS column
|
||||
#
|
||||
create table t1 (a char(10) character set sjis);
|
||||
insert into t1 values (0x878A);
|
||||
select hex(a) from t1;
|
||||
drop table t1;
|
||||
|
||||
@@ -4563,6 +4563,40 @@ uint my_numcells_sjis(CHARSET_INFO *cs __attribute__((unused)),
|
||||
return clen;
|
||||
}
|
||||
|
||||
/*
|
||||
Returns a well formed length of a SJIS string.
|
||||
CP932 additional characters are also accepted.
|
||||
*/
|
||||
static
|
||||
uint my_well_formed_len_sjis(CHARSET_INFO *cs __attribute__((unused)),
|
||||
const char *b, const char *e, uint pos)
|
||||
{
|
||||
const char *b0= b;
|
||||
while (pos && b < e)
|
||||
{
|
||||
/*
|
||||
Cast to int8 for extra safety.
|
||||
"char" can be unsigned by default
|
||||
on some platforms.
|
||||
*/
|
||||
if (((int8)b[0]) >= 0)
|
||||
{
|
||||
/* Single byte character */
|
||||
b+= 1;
|
||||
}
|
||||
else if (issjishead((uchar)*b) && (e-b)>1 && issjistail((uchar)b[1]))
|
||||
{
|
||||
/* Double byte character */
|
||||
b+= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Wrong byte sequence */
|
||||
break;
|
||||
}
|
||||
}
|
||||
return b - b0;
|
||||
}
|
||||
|
||||
|
||||
static MY_COLLATION_HANDLER my_collation_ci_handler =
|
||||
@@ -4586,7 +4620,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
|
||||
mbcharlen_sjis,
|
||||
my_numchars_mb,
|
||||
my_charpos_mb,
|
||||
my_well_formed_len_mb,
|
||||
my_well_formed_len_sjis,
|
||||
my_lengthsp_8bit,
|
||||
my_numcells_sjis,
|
||||
my_mb_wc_sjis, /* mb_wc */
|
||||
|
||||
@@ -2126,8 +2126,13 @@ int my_strcasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t)
|
||||
while (s[0] && t[0])
|
||||
{
|
||||
my_wc_t s_wc,t_wc;
|
||||
|
||||
if (s[0] >= 0)
|
||||
|
||||
/*
|
||||
Cast to int8 for extra safety.
|
||||
char can be unsigned by default
|
||||
on some platforms.
|
||||
*/
|
||||
if (((int8)s[0]) >= 0)
|
||||
{
|
||||
/*
|
||||
s[0] is between 0 and 127.
|
||||
|
||||
Reference in New Issue
Block a user