mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
Merge bk@192.168.21.1:mysql-4.1
into mysql.com:/home/hf/mysql-5.0.mrg include/m_ctype.h: Auto merged mysql-test/r/ctype_utf8.result: Auto merged mysql-test/r/type_enum.result: Auto merged mysql-test/t/ctype_utf8.test: Auto merged sql/item_func.cc: Auto merged sql/sql_select.cc: Auto merged sql/table.cc: Auto merged sql/unireg.cc: Auto merged strings/ctype-mb.c: SCCS merged strings/ctype-utf8.c: SCCS merged
This commit is contained in:
@@ -112,6 +112,8 @@ enum my_lex_states
|
|||||||
|
|
||||||
struct charset_info_st;
|
struct charset_info_st;
|
||||||
|
|
||||||
|
|
||||||
|
/* See strings/CHARSET_INFO.txt for information about this structure */
|
||||||
typedef struct my_collation_handler_st
|
typedef struct my_collation_handler_st
|
||||||
{
|
{
|
||||||
my_bool (*init)(struct charset_info_st *, void *(*alloc)(uint));
|
my_bool (*init)(struct charset_info_st *, void *(*alloc)(uint));
|
||||||
@@ -154,6 +156,7 @@ extern MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler;
|
|||||||
extern MY_COLLATION_HANDLER my_collation_ucs2_uca_handler;
|
extern MY_COLLATION_HANDLER my_collation_ucs2_uca_handler;
|
||||||
|
|
||||||
|
|
||||||
|
/* See strings/CHARSET_INFO.txt about information on this structure */
|
||||||
typedef struct my_charset_handler_st
|
typedef struct my_charset_handler_st
|
||||||
{
|
{
|
||||||
my_bool (*init)(struct charset_info_st *, void *(*alloc)(uint));
|
my_bool (*init)(struct charset_info_st *, void *(*alloc)(uint));
|
||||||
@@ -216,6 +219,7 @@ extern MY_CHARSET_HANDLER my_charset_8bit_handler;
|
|||||||
extern MY_CHARSET_HANDLER my_charset_ucs2_handler;
|
extern MY_CHARSET_HANDLER my_charset_ucs2_handler;
|
||||||
|
|
||||||
|
|
||||||
|
/* See strings/CHARSET_INFO.txt about information on this structure */
|
||||||
typedef struct charset_info_st
|
typedef struct charset_info_st
|
||||||
{
|
{
|
||||||
uint number;
|
uint number;
|
||||||
|
@@ -1155,6 +1155,81 @@ check table t1;
|
|||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 check status OK
|
test.t1 check status OK
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (s1 char(5) character set utf8);
|
||||||
|
insert into t1 values
|
||||||
|
('a'),('b'),(null),('ペテルグル'),('ü'),('Y');
|
||||||
|
create index it1 on t1 (s1);
|
||||||
|
select s1 as before_delete_general_ci from t1 where s1 like 'ペテ%';
|
||||||
|
before_delete_general_ci
|
||||||
|
ペテルグル
|
||||||
|
delete from t1 where s1 = 'Y';
|
||||||
|
select s1 as after_delete_general_ci from t1 where s1 like 'ペテ%';
|
||||||
|
after_delete_general_ci
|
||||||
|
ペテルグル
|
||||||
|
drop table t1;
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (s1 char(5) character set utf8 collate utf8_unicode_ci);
|
||||||
|
insert into t1 values
|
||||||
|
('a'),('b'),(null),('ペテルグル'),('ü'),('Y');
|
||||||
|
create index it1 on t1 (s1);
|
||||||
|
select s1 as before_delete_unicode_ci from t1 where s1 like 'ペテ%';
|
||||||
|
before_delete_unicode_ci
|
||||||
|
ペテルグル
|
||||||
|
delete from t1 where s1 = 'Y';
|
||||||
|
select s1 as after_delete_unicode_ci from t1 where s1 like 'ペテ%';
|
||||||
|
after_delete_unicode_ci
|
||||||
|
ペテルグル
|
||||||
|
drop table t1;
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (s1 char(5) character set utf8 collate utf8_bin);
|
||||||
|
insert into t1 values
|
||||||
|
('a'),('b'),(null),('ペテルグル'),('ü'),('Y');
|
||||||
|
create index it1 on t1 (s1);
|
||||||
|
select s1 as before_delete_bin from t1 where s1 like 'ペテ%';
|
||||||
|
before_delete_bin
|
||||||
|
ペテルグル
|
||||||
|
delete from t1 where s1 = 'Y';
|
||||||
|
select s1 as after_delete_bin from t1 where s1 like 'ペテ%';
|
||||||
|
after_delete_bin
|
||||||
|
ペテルグル
|
||||||
|
drop table t1;
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (a varchar(30) not null primary key)
|
||||||
|
engine=innodb default character set utf8 collate utf8_general_ci;
|
||||||
|
insert into t1 values ('あいうえおかきくけこさしすせそ');
|
||||||
|
insert into t1 values ('さしすせそかきくけこあいうえお');
|
||||||
|
select a as gci1 from t1 where a like 'さしすせそかきくけこあいうえお%';
|
||||||
|
gci1
|
||||||
|
さしすせそかきくけこあいうえお
|
||||||
|
select a as gci2 from t1 where a like 'あいうえおかきくけこさしすせそ';
|
||||||
|
gci2
|
||||||
|
あいうえおかきくけこさしすせそ
|
||||||
|
drop table t1;
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (a varchar(30) not null primary key)
|
||||||
|
engine=innodb default character set utf8 collate utf8_unicode_ci;
|
||||||
|
insert into t1 values ('あいうえおかきくけこさしすせそ');
|
||||||
|
insert into t1 values ('さしすせそかきくけこあいうえお');
|
||||||
|
select a as uci1 from t1 where a like 'さしすせそかきくけこあいうえお%';
|
||||||
|
uci1
|
||||||
|
さしすせそかきくけこあいうえお
|
||||||
|
select a as uci2 from t1 where a like 'あいうえおかきくけこさしすせそ';
|
||||||
|
uci2
|
||||||
|
あいうえおかきくけこさしすせそ
|
||||||
|
drop table t1;
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (a varchar(30) not null primary key)
|
||||||
|
engine=innodb default character set utf8 collate utf8_bin;
|
||||||
|
insert into t1 values ('あいうえおかきくけこさしすせそ');
|
||||||
|
insert into t1 values ('さしすせそかきくけこあいうえお');
|
||||||
|
select a as bin1 from t1 where a like 'さしすせそかきくけこあいうえお%';
|
||||||
|
bin1
|
||||||
|
さしすせそかきくけこあいうえお
|
||||||
|
select a as bin2 from t1 where a like 'あいうえおかきくけこさしすせそ';
|
||||||
|
bin2
|
||||||
|
あいうえおかきくけこさしすせそ
|
||||||
|
drop table t1;
|
||||||
SET NAMES utf8;
|
SET NAMES utf8;
|
||||||
CREATE TABLE t1 (id int PRIMARY KEY,
|
CREATE TABLE t1 (id int PRIMARY KEY,
|
||||||
a varchar(16) collate utf8_unicode_ci NOT NULL default '',
|
a varchar(16) collate utf8_unicode_ci NOT NULL default '',
|
||||||
|
@@ -1745,3 +1745,12 @@ create table t1 (a set('x','y') default 'x');
|
|||||||
alter table t1 alter a set default 'z';
|
alter table t1 alter a set default 'z';
|
||||||
ERROR 42000: Invalid default value for 'a'
|
ERROR 42000: Invalid default value for 'a'
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 (f1 int);
|
||||||
|
alter table t1 add f2 enum(0xFFFF);
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`f1` int(11) default NULL,
|
||||||
|
`f2` enum('<27><>') default NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
|
@@ -941,6 +941,76 @@ INSERT INTO t1 VALUES('uUABCDEFGHIGKLMNOPRSTUVWXYZ̈bbbbbbbbbbbbbbbbbbbbbbbbbbbb
|
|||||||
check table t1;
|
check table t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#20471 LIKE search fails with indexed utf8 char column
|
||||||
|
#
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (s1 char(5) character set utf8);
|
||||||
|
insert into t1 values
|
||||||
|
('a'),('b'),(null),('ペテルグル'),('ü'),('Y');
|
||||||
|
create index it1 on t1 (s1);
|
||||||
|
select s1 as before_delete_general_ci from t1 where s1 like 'ペテ%';
|
||||||
|
delete from t1 where s1 = 'Y';
|
||||||
|
select s1 as after_delete_general_ci from t1 where s1 like 'ペテ%';
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (s1 char(5) character set utf8 collate utf8_unicode_ci);
|
||||||
|
insert into t1 values
|
||||||
|
('a'),('b'),(null),('ペテルグル'),('ü'),('Y');
|
||||||
|
create index it1 on t1 (s1);
|
||||||
|
select s1 as before_delete_unicode_ci from t1 where s1 like 'ペテ%';
|
||||||
|
delete from t1 where s1 = 'Y';
|
||||||
|
select s1 as after_delete_unicode_ci from t1 where s1 like 'ペテ%';
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (s1 char(5) character set utf8 collate utf8_bin);
|
||||||
|
insert into t1 values
|
||||||
|
('a'),('b'),(null),('ペテルグル'),('ü'),('Y');
|
||||||
|
create index it1 on t1 (s1);
|
||||||
|
select s1 as before_delete_bin from t1 where s1 like 'ペテ%';
|
||||||
|
delete from t1 where s1 = 'Y';
|
||||||
|
select s1 as after_delete_bin from t1 where s1 like 'ペテ%';
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
# additional tests from duplicate bug#20744 MySQL return no result
|
||||||
|
|
||||||
|
set names utf8;
|
||||||
|
--disable_warnings
|
||||||
|
create table t1 (a varchar(30) not null primary key)
|
||||||
|
engine=innodb default character set utf8 collate utf8_general_ci;
|
||||||
|
--enable_warnings
|
||||||
|
insert into t1 values ('あいうえおかきくけこさしすせそ');
|
||||||
|
insert into t1 values ('さしすせそかきくけこあいうえお');
|
||||||
|
select a as gci1 from t1 where a like 'さしすせそかきくけこあいうえお%';
|
||||||
|
select a as gci2 from t1 where a like 'あいうえおかきくけこさしすせそ';
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
set names utf8;
|
||||||
|
--disable_warnings
|
||||||
|
create table t1 (a varchar(30) not null primary key)
|
||||||
|
engine=innodb default character set utf8 collate utf8_unicode_ci;
|
||||||
|
--enable_warnings
|
||||||
|
insert into t1 values ('あいうえおかきくけこさしすせそ');
|
||||||
|
insert into t1 values ('さしすせそかきくけこあいうえお');
|
||||||
|
select a as uci1 from t1 where a like 'さしすせそかきくけこあいうえお%';
|
||||||
|
select a as uci2 from t1 where a like 'あいうえおかきくけこさしすせそ';
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
set names utf8;
|
||||||
|
--disable_warnings
|
||||||
|
create table t1 (a varchar(30) not null primary key)
|
||||||
|
engine=innodb default character set utf8 collate utf8_bin;
|
||||||
|
--enable_warnings
|
||||||
|
insert into t1 values ('あいうえおかきくけこさしすせそ');
|
||||||
|
insert into t1 values ('さしすせそかきくけこあいうえお');
|
||||||
|
select a as bin1 from t1 where a like 'さしすせそかきくけこあいうえお%';
|
||||||
|
select a as bin2 from t1 where a like 'あいうえおかきくけこさしすせそ';
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug#14896: Comparison with a key in a partial index over mb chararacter field
|
# Bug#14896: Comparison with a key in a partial index over mb chararacter field
|
||||||
#
|
#
|
||||||
|
@@ -127,4 +127,13 @@ create table t1 (a set('x','y') default 'x');
|
|||||||
alter table t1 alter a set default 'z';
|
alter table t1 alter a set default 'z';
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#20922 mysql removes a name of first column in a table
|
||||||
|
#
|
||||||
|
create table t1 (f1 int);
|
||||||
|
alter table t1 add f2 enum(0xFFFF);
|
||||||
|
show create table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
16
sql/table.cc
16
sql/table.cc
@@ -468,7 +468,21 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat,
|
|||||||
count)))
|
count)))
|
||||||
goto err;
|
goto err;
|
||||||
for (count= 0; count < interval->count; count++)
|
for (count= 0; count < interval->count; count++)
|
||||||
interval->type_lengths[count]= strlen(interval->type_names[count]);
|
{
|
||||||
|
char *val= (char*) interval->type_names[count];
|
||||||
|
interval->type_lengths[count]= strlen(val);
|
||||||
|
/*
|
||||||
|
Replace all ',' symbols with NAMES_SEP_CHAR.
|
||||||
|
See the comment in unireg.cc, pack_fields() function
|
||||||
|
for details.
|
||||||
|
*/
|
||||||
|
for (uint cnt= 0 ; cnt < interval->type_lengths[count] ; cnt++)
|
||||||
|
{
|
||||||
|
char c= val[cnt];
|
||||||
|
if (c == ',')
|
||||||
|
val[cnt]= NAMES_SEP_CHAR;
|
||||||
|
}
|
||||||
|
}
|
||||||
interval->type_lengths[count]= 0;
|
interval->type_lengths[count]= 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -718,6 +718,21 @@ static bool pack_fields(File file, List<create_field> &create_fields,
|
|||||||
tmp.append(NAMES_SEP_CHAR);
|
tmp.append(NAMES_SEP_CHAR);
|
||||||
for (const char **pos=field->interval->type_names ; *pos ; pos++)
|
for (const char **pos=field->interval->type_names ; *pos ; pos++)
|
||||||
{
|
{
|
||||||
|
char *val= (char*) *pos;
|
||||||
|
uint str_len= strlen(val);
|
||||||
|
/*
|
||||||
|
Note, hack: in old frm NAMES_SEP_CHAR is used to separate
|
||||||
|
names in the interval (ENUM/SET). To allow names to contain
|
||||||
|
NAMES_SEP_CHAR, we replace it with a comma before writing frm.
|
||||||
|
Backward conversion is done during frm file opening,
|
||||||
|
See table.cc, openfrm() function
|
||||||
|
*/
|
||||||
|
for (uint cnt= 0 ; cnt < str_len ; cnt++)
|
||||||
|
{
|
||||||
|
char c= val[cnt];
|
||||||
|
if (c == NAMES_SEP_CHAR)
|
||||||
|
val[cnt]= ',';
|
||||||
|
}
|
||||||
tmp.append(*pos);
|
tmp.append(*pos);
|
||||||
tmp.append(NAMES_SEP_CHAR);
|
tmp.append(NAMES_SEP_CHAR);
|
||||||
}
|
}
|
||||||
|
@@ -33,7 +33,7 @@ typedef struct charset_info_st
|
|||||||
uint strxfrm_multiply;
|
uint strxfrm_multiply;
|
||||||
uint mbminlen;
|
uint mbminlen;
|
||||||
uint mbmaxlen;
|
uint mbmaxlen;
|
||||||
char max_sort_char; /* For LIKE optimization */
|
uint16 max_sort_char; /* For LIKE optimization */
|
||||||
|
|
||||||
MY_CHARSET_HANDLER *cset;
|
MY_CHARSET_HANDLER *cset;
|
||||||
MY_COLLATION_HANDLER *coll;
|
MY_COLLATION_HANDLER *coll;
|
||||||
@@ -134,7 +134,15 @@ Misc fields
|
|||||||
mbmaxlen - maximum multibyte sequence length.
|
mbmaxlen - maximum multibyte sequence length.
|
||||||
1 for 8bit charsets. Can be also 2 or 3.
|
1 for 8bit charsets. Can be also 2 or 3.
|
||||||
|
|
||||||
|
max_sort_char - for LIKE range
|
||||||
|
in case of 8bit character sets - native code
|
||||||
|
of maximum character (max_str pad byte);
|
||||||
|
in case of UTF8 and UCS2 - Unicode code of the maximum
|
||||||
|
possible character (usually U+FFFF). This code is
|
||||||
|
converted to multibyte representation (usually 0xEFBFBF)
|
||||||
|
and then used as a pad sequence for max_str.
|
||||||
|
in case of other multibyte character sets -
|
||||||
|
max_str pad byte (usually 0xFF).
|
||||||
|
|
||||||
MY_CHARSET_HANDLER
|
MY_CHARSET_HANDLER
|
||||||
==================
|
==================
|
||||||
|
@@ -474,15 +474,35 @@ static void my_hash_sort_mb_bin(CHARSET_INFO *cs __attribute__((unused)),
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Write max key: create a buffer with multibyte
|
Fill the given buffer with 'maximum character' for given charset
|
||||||
representation of the max_sort_char character,
|
SYNOPSIS
|
||||||
and copy it into max_str in a loop.
|
pad_max_char()
|
||||||
|
cs Character set
|
||||||
|
str Start of buffer to fill
|
||||||
|
end End of buffer to fill
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Write max key:
|
||||||
|
- for non-Unicode character sets:
|
||||||
|
just set to 255.
|
||||||
|
- for Unicode character set (utf-8):
|
||||||
|
create a buffer with multibyte representation of the max_sort_char
|
||||||
|
character, and copy it into max_str in a loop.
|
||||||
*/
|
*/
|
||||||
static void pad_max_char(CHARSET_INFO *cs, char *str, char *end)
|
static void pad_max_char(CHARSET_INFO *cs, char *str, char *end)
|
||||||
{
|
{
|
||||||
char buf[10];
|
char buf[10];
|
||||||
char buflen= cs->cset->wc_mb(cs, cs->max_sort_char, (uchar*) buf,
|
char buflen;
|
||||||
(uchar*) buf + sizeof(buf));
|
|
||||||
|
if (!(cs->state & MY_CS_UNICODE))
|
||||||
|
{
|
||||||
|
bfill(str, end - str, 255);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
buflen= cs->cset->wc_mb(cs, cs->max_sort_char, (uchar*) buf,
|
||||||
|
(uchar*) buf + sizeof(buf));
|
||||||
|
|
||||||
DBUG_ASSERT(buflen > 0);
|
DBUG_ASSERT(buflen > 0);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -927,7 +947,7 @@ MY_COLLATION_HANDLER my_collation_mb_bin_handler =
|
|||||||
my_strnncollsp_mb_bin,
|
my_strnncollsp_mb_bin,
|
||||||
my_strnxfrm_mb_bin,
|
my_strnxfrm_mb_bin,
|
||||||
my_strnxfrmlen_simple,
|
my_strnxfrmlen_simple,
|
||||||
my_like_range_simple,
|
my_like_range_mb,
|
||||||
my_wildcmp_mb_bin,
|
my_wildcmp_mb_bin,
|
||||||
my_strcasecmp_mb_bin,
|
my_strcasecmp_mb_bin,
|
||||||
my_instr_mb,
|
my_instr_mb,
|
||||||
|
@@ -2612,7 +2612,7 @@ CHARSET_INFO my_charset_utf8_bin=
|
|||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
255, /* max_sort_char */
|
0xFFFF, /* max_sort_char */
|
||||||
' ', /* pad char */
|
' ', /* pad char */
|
||||||
0, /* escape_with_backslash_is_dangerous */
|
0, /* escape_with_backslash_is_dangerous */
|
||||||
&my_charset_utf8_handler,
|
&my_charset_utf8_handler,
|
||||||
|
Reference in New Issue
Block a user