Commit ba924c0a authored by mskold@mysql.com's avatar mskold@mysql.com

Merge mskold@build.mysql.com:/home/bk/mysql-4.1

into mysql.com:/usr/local/home/marty/MySQL/mysql-4.1-ndb
parents 99eef36f 2d7f4c30
...@@ -159,28 +159,28 @@ enum enum_field_types { FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY, ...@@ -159,28 +159,28 @@ enum enum_field_types { FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY,
/* Shutdown/kill enums and constants */ /* Shutdown/kill enums and constants */
/* Bits for THD::killable. */ /* Bits for THD::killable. */
#define KILLABLE_CONNECT (unsigned char)(1 << 0) #define MYSQL_SHUTDOWN_KILLABLE_CONNECT (unsigned char)(1 << 0)
#define KILLABLE_TRANS (unsigned char)(1 << 1) #define MYSQL_SHUTDOWN_KILLABLE_TRANS (unsigned char)(1 << 1)
#define KILLABLE_LOCK_TABLE (unsigned char)(1 << 2) #define MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE (unsigned char)(1 << 2)
#define KILLABLE_UPDATE (unsigned char)(1 << 3) #define MYSQL_SHUTDOWN_KILLABLE_UPDATE (unsigned char)(1 << 3)
enum enum_shutdown_level { enum mysql_enum_shutdown_level {
/* /*
We want levels to be in growing order of hardness (because we use number We want levels to be in growing order of hardness (because we use number
comparisons). Note that DEFAULT does not respect the growing property, but comparisons). Note that DEFAULT does not respect the growing property, but
it's ok. it's ok.
*/ */
SHUTDOWN_DEFAULT= 0, DEFAULT= 0,
/* wait for existing connections to finish */ /* wait for existing connections to finish */
SHUTDOWN_WAIT_CONNECTIONS= KILLABLE_CONNECT, WAIT_CONNECTIONS= MYSQL_SHUTDOWN_KILLABLE_CONNECT,
/* wait for existing trans to finish */ /* wait for existing trans to finish */
SHUTDOWN_WAIT_TRANSACTIONS= KILLABLE_TRANS, WAIT_TRANSACTIONS= MYSQL_SHUTDOWN_KILLABLE_TRANS,
/* wait for existing updates to finish (=> no partial MyISAM update) */ /* wait for existing updates to finish (=> no partial MyISAM update) */
SHUTDOWN_WAIT_UPDATES= KILLABLE_UPDATE, WAIT_UPDATES= MYSQL_SHUTDOWN_KILLABLE_UPDATE,
/* flush InnoDB buffers and other storage engines' buffers*/ /* flush InnoDB buffers and other storage engines' buffers*/
SHUTDOWN_WAIT_ALL_BUFFERS= (KILLABLE_UPDATE << 1), WAIT_ALL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1),
/* don't flush InnoDB buffers, flush other storage engines' buffers*/ /* don't flush InnoDB buffers, flush other storage engines' buffers*/
SHUTDOWN_WAIT_CRITICAL_BUFFERS= (KILLABLE_UPDATE << 1) + 1, WAIT_CRITICAL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1) + 1,
/* Now the 2 levels of the KILL command */ /* Now the 2 levels of the KILL command */
#if MYSQL_VERSION_ID >= 50000 #if MYSQL_VERSION_ID >= 50000
KILL_QUERY= 254, KILL_QUERY= 254,
...@@ -188,10 +188,6 @@ enum enum_shutdown_level { ...@@ -188,10 +188,6 @@ enum enum_shutdown_level {
KILL_CONNECTION= 255 KILL_CONNECTION= 255
}; };
/* Same value and type (0, enum_shutdown_level) but not same meaning */
#define NOT_KILLED SHUTDOWN_DEFAULT
extern unsigned long max_allowed_packet; extern unsigned long max_allowed_packet;
extern unsigned long net_buffer_length; extern unsigned long net_buffer_length;
......
...@@ -454,7 +454,7 @@ int STDCALL mysql_add_slave(MYSQL* mysql, const char* host, ...@@ -454,7 +454,7 @@ int STDCALL mysql_add_slave(MYSQL* mysql, const char* host,
const char* passwd); const char* passwd);
int STDCALL mysql_shutdown(MYSQL *mysql, int STDCALL mysql_shutdown(MYSQL *mysql,
enum enum_shutdown_level enum mysql_enum_shutdown_level
shutdown_level); shutdown_level);
int STDCALL mysql_dump_debug_info(MYSQL *mysql); int STDCALL mysql_dump_debug_info(MYSQL *mysql);
int STDCALL mysql_refresh(MYSQL *mysql, int STDCALL mysql_refresh(MYSQL *mysql,
......
...@@ -227,28 +227,28 @@ enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY, ...@@ -227,28 +227,28 @@ enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
/* Shutdown/kill enums and constants */ /* Shutdown/kill enums and constants */
/* Bits for THD::killable. */ /* Bits for THD::killable. */
#define KILLABLE_CONNECT (unsigned char)(1 << 0) #define MYSQL_SHUTDOWN_KILLABLE_CONNECT (unsigned char)(1 << 0)
#define KILLABLE_TRANS (unsigned char)(1 << 1) #define MYSQL_SHUTDOWN_KILLABLE_TRANS (unsigned char)(1 << 1)
#define KILLABLE_LOCK_TABLE (unsigned char)(1 << 2) #define MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE (unsigned char)(1 << 2)
#define KILLABLE_UPDATE (unsigned char)(1 << 3) #define MYSQL_SHUTDOWN_KILLABLE_UPDATE (unsigned char)(1 << 3)
enum enum_shutdown_level { enum mysql_enum_shutdown_level {
/* /*
We want levels to be in growing order of hardness (because we use number We want levels to be in growing order of hardness (because we use number
comparisons). Note that DEFAULT does not respect the growing property, but comparisons). Note that DEFAULT does not respect the growing property, but
it's ok. it's ok.
*/ */
SHUTDOWN_DEFAULT= 0, SHUTDOWN_DEFAULT = 0,
/* wait for existing connections to finish */ /* wait for existing connections to finish */
SHUTDOWN_WAIT_CONNECTIONS= KILLABLE_CONNECT, SHUTDOWN_WAIT_CONNECTIONS= MYSQL_SHUTDOWN_KILLABLE_CONNECT,
/* wait for existing trans to finish */ /* wait for existing trans to finish */
SHUTDOWN_WAIT_TRANSACTIONS= KILLABLE_TRANS, SHUTDOWN_WAIT_TRANSACTIONS= MYSQL_SHUTDOWN_KILLABLE_TRANS,
/* wait for existing updates to finish (=> no partial MyISAM update) */ /* wait for existing updates to finish (=> no partial MyISAM update) */
SHUTDOWN_WAIT_UPDATES= KILLABLE_UPDATE, SHUTDOWN_WAIT_UPDATES= MYSQL_SHUTDOWN_KILLABLE_UPDATE,
/* flush InnoDB buffers and other storage engines' buffers*/ /* flush InnoDB buffers and other storage engines' buffers*/
SHUTDOWN_WAIT_ALL_BUFFERS= (KILLABLE_UPDATE << 1), SHUTDOWN_WAIT_ALL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1),
/* don't flush InnoDB buffers, flush other storage engines' buffers*/ /* don't flush InnoDB buffers, flush other storage engines' buffers*/
SHUTDOWN_WAIT_CRITICAL_BUFFERS= (KILLABLE_UPDATE << 1) + 1, SHUTDOWN_WAIT_CRITICAL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1) + 1,
/* Now the 2 levels of the KILL command */ /* Now the 2 levels of the KILL command */
#if MYSQL_VERSION_ID >= 50000 #if MYSQL_VERSION_ID >= 50000
KILL_QUERY= 254, KILL_QUERY= 254,
...@@ -256,10 +256,6 @@ enum enum_shutdown_level { ...@@ -256,10 +256,6 @@ enum enum_shutdown_level {
KILL_CONNECTION= 255 KILL_CONNECTION= 255
}; };
/* Same value and type (0, enum_shutdown_level) but not same meaning */
#define NOT_KILLED SHUTDOWN_DEFAULT
/* options for mysql_set_option */ /* options for mysql_set_option */
enum enum_mysql_set_option enum enum_mysql_set_option
{ {
......
...@@ -1291,7 +1291,7 @@ mysql_drop_db(MYSQL *mysql, const char *db) ...@@ -1291,7 +1291,7 @@ mysql_drop_db(MYSQL *mysql, const char *db)
int STDCALL int STDCALL
mysql_shutdown(MYSQL *mysql, enum enum_shutdown_level shutdown_level) mysql_shutdown(MYSQL *mysql, enum mysql_enum_shutdown_level shutdown_level)
{ {
uchar level[1]; uchar level[1];
DBUG_ENTER("mysql_shutdown"); DBUG_ENTER("mysql_shutdown");
......
...@@ -396,9 +396,18 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, ...@@ -396,9 +396,18 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
matched=prefix_len+left; matched=prefix_len+left;
if (sort_order)
{
for (my_flag=0;left;left--) for (my_flag=0;left;left--)
if ((my_flag= (int) sort_order[*vseg++] - (int) sort_order[*k++])) if ((my_flag= (int) sort_order[*vseg++] - (int) sort_order[*k++]))
break; break;
}
else
{
for (my_flag=0;left;left--)
if ((my_flag= (int) *vseg++ - (int) *k++))
break;
}
if (my_flag>0) /* mismatch */ if (my_flag>0) /* mismatch */
break; break;
......
...@@ -59,8 +59,10 @@ concat("-",a,"-",b,"-") ...@@ -59,8 +59,10 @@ concat("-",a,"-",b,"-")
-hello-hello- -hello-hello-
select concat("-",a,"-",b,"-") from t1 where b="hello "; select concat("-",a,"-",b,"-") from t1 where b="hello ";
concat("-",a,"-",b,"-") concat("-",a,"-",b,"-")
-hello-hello-
select concat("-",a,"-",b,"-") from t1 ignore index (b) where b="hello "; select concat("-",a,"-",b,"-") from t1 ignore index (b) where b="hello ";
concat("-",a,"-",b,"-") concat("-",a,"-",b,"-")
-hello-hello-
alter table t1 modify b tinytext not null, drop key b, add key (b(100)); alter table t1 modify b tinytext not null, drop key b, add key (b(100));
select concat("-",a,"-",b,"-") from t1; select concat("-",a,"-",b,"-") from t1;
concat("-",a,"-",b,"-") concat("-",a,"-",b,"-")
......
...@@ -79,6 +79,21 @@ SELECT 'a\t' < 'a'; ...@@ -79,6 +79,21 @@ SELECT 'a\t' < 'a';
SELECT 'a\t' < 'a '; SELECT 'a\t' < 'a ';
'a\t' < 'a ' 'a\t' < 'a '
1 1
SELECT 'a' = 'a ' collate utf8_bin;
'a' = 'a ' collate utf8_bin
1
SELECT 'a\0' < 'a' collate utf8_bin;
'a\0' < 'a' collate utf8_bin
1
SELECT 'a\0' < 'a ' collate utf8_bin;
'a\0' < 'a ' collate utf8_bin
1
SELECT 'a\t' < 'a' collate utf8_bin;
'a\t' < 'a' collate utf8_bin
1
SELECT 'a\t' < 'a ' collate utf8_bin;
'a\t' < 'a ' collate utf8_bin
1
CREATE TABLE t1 (a char(10) character set utf8 not null); CREATE TABLE t1 (a char(10) character set utf8 not null);
INSERT INTO t1 VALUES ('a'),('a\0'),('a\t'),('a '); INSERT INTO t1 VALUES ('a'),('a\0'),('a\t'),('a ');
SELECT hex(a),STRCMP(a,'a'), STRCMP(a,'a ') FROM t1; SELECT hex(a),STRCMP(a,'a'), STRCMP(a,'a ') FROM t1;
...@@ -362,6 +377,134 @@ c_a ...@@ -362,6 +377,134 @@ c_a
б б
drop table t1; drop table t1;
create table t1 ( create table t1 (
c char(10) character set utf8,
unique key a using btree (c(1))
) engine=heap;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c` char(10) character set utf8 default NULL,
UNIQUE KEY `a` TYPE BTREE (`c`(1))
) ENGINE=HEAP DEFAULT CHARSET=latin1
insert into t1 values ('a'),('b'),('c'),('d'),('e'),('f');
insert into t1 values ('aa');
ERROR 23000: Duplicate entry 'aa' for key 1
insert into t1 values ('aaa');
ERROR 23000: Duplicate entry 'aaa' for key 1
insert into t1 values ('б');
insert into t1 values ('бб');
ERROR 23000: Duplicate entry 'б' for key 1
insert into t1 values ('ббб');
ERROR 23000: Duplicate entry 'б' for key 1
select c as c_all from t1 order by c;
c_all
a
b
c
d
e
f
б
select c as c_a from t1 where c='a';
c_a
a
select c as c_a from t1 where c='б';
c_a
б
drop table t1;
create table t1 (c varchar(30) character set utf8 collate utf8_bin, unique(c(10)));
insert into t1 values ('1'),('2'),('3'),('x'),('y'),('z');
insert into t1 values ('aaaaaaaaaa');
insert into t1 values ('aaaaaaaaaaa');
ERROR 23000: Duplicate entry 'aaaaaaaaaaa' for key 1
insert into t1 values ('aaaaaaaaaaaa');
ERROR 23000: Duplicate entry 'aaaaaaaaaaaa' for key 1
insert into t1 values (repeat('b',20));
select c c1 from t1 where c='1';
c1
1
select c c2 from t1 where c='2';
c2
2
select c c3 from t1 where c='3';
c3
3
select c cx from t1 where c='x';
cx
x
select c cy from t1 where c='y';
cy
y
select c cz from t1 where c='z';
cz
z
select c ca10 from t1 where c='aaaaaaaaaa';
ca10
aaaaaaaaaa
select c cb20 from t1 where c=repeat('b',20);
cb20
bbbbbbbbbbbbbbbbbbbb
drop table t1;
create table t1 (c char(3) character set utf8 collate utf8_bin, unique (c(2)));
insert into t1 values ('1'),('2'),('3'),('4'),('x'),('y'),('z');
insert into t1 values ('a');
insert into t1 values ('aa');
insert into t1 values ('aaa');
ERROR 23000: Duplicate entry 'aaa' for key 1
insert into t1 values ('b');
insert into t1 values ('bb');
insert into t1 values ('bbb');
ERROR 23000: Duplicate entry 'bbb' for key 1
insert into t1 values ('а');
insert into t1 values ('аа');
insert into t1 values ('ааа');
ERROR 23000: Duplicate entry 'ааа' for key 1
insert into t1 values ('б');
insert into t1 values ('бб');
insert into t1 values ('ббб');
ERROR 23000: Duplicate entry 'ббб' for key 1
insert into t1 values ('ꪪ');
insert into t1 values ('ꪪꪪ');
insert into t1 values ('ꪪꪪꪪ');
ERROR 23000: Duplicate entry 'ꪪꪪ' for key 1
drop table t1;
create table t1 (
c char(10) character set utf8 collate utf8_bin,
unique key a using hash (c(1))
) engine=heap;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c` char(10) character set utf8 collate utf8_bin default NULL,
UNIQUE KEY `a` (`c`(1))
) ENGINE=HEAP DEFAULT CHARSET=latin1
insert into t1 values ('a'),('b'),('c'),('d'),('e'),('f');
insert into t1 values ('aa');
ERROR 23000: Duplicate entry 'aa' for key 1
insert into t1 values ('aaa');
ERROR 23000: Duplicate entry 'aaa' for key 1
insert into t1 values ('б');
insert into t1 values ('бб');
ERROR 23000: Duplicate entry 'б' for key 1
insert into t1 values ('ббб');
ERROR 23000: Duplicate entry 'б' for key 1
select c as c_all from t1 order by c;
c_all
a
b
c
d
e
f
б
select c as c_a from t1 where c='a';
c_a
a
select c as c_a from t1 where c='б';
c_a
б
drop table t1;
create table t1 (
c char(10) character set utf8 collate utf8_bin, c char(10) character set utf8 collate utf8_bin,
unique key a using btree (c(1)) unique key a using btree (c(1))
) engine=heap; ) engine=heap;
......
...@@ -19,7 +19,7 @@ select 'a a' > 'a', 'a \0' < 'a'; ...@@ -19,7 +19,7 @@ select 'a a' > 'a', 'a \0' < 'a';
1 1 1 1
select binary 'a a' > 'a', binary 'a \0' > 'a', binary 'a\0' > 'a'; select binary 'a a' > 'a', binary 'a \0' > 'a', binary 'a\0' > 'a';
binary 'a a' > 'a' binary 'a \0' > 'a' binary 'a\0' > 'a' binary 'a a' > 'a' binary 'a \0' > 'a' binary 'a\0' > 'a'
1 1 1 1 0 0
create table t1 (text1 varchar(32) not NULL, KEY key1 (text1)); create table t1 (text1 varchar(32) not NULL, KEY key1 (text1));
insert into t1 values ('teststring'), ('nothing'), ('teststring\t'); insert into t1 values ('teststring'), ('nothing'), ('teststring\t');
check table t1; check table t1;
......
...@@ -412,6 +412,7 @@ aaa. ...@@ -412,6 +412,7 @@ aaa.
aaa . aaa .
select concat(a,'.') from t1 where binary a='aaa'; select concat(a,'.') from t1 where binary a='aaa';
concat(a,'.') concat(a,'.')
aaa .
aaa. aaa.
update t1 set a='bbb' where a='aaa'; update t1 set a='bbb' where a='aaa';
select concat(a,'.') from t1; select concat(a,'.') from t1;
......
...@@ -46,6 +46,15 @@ SELECT 'a\0' < 'a '; ...@@ -46,6 +46,15 @@ SELECT 'a\0' < 'a ';
SELECT 'a\t' < 'a'; SELECT 'a\t' < 'a';
SELECT 'a\t' < 'a '; SELECT 'a\t' < 'a ';
#
# The same for binary collation
#
SELECT 'a' = 'a ' collate utf8_bin;
SELECT 'a\0' < 'a' collate utf8_bin;
SELECT 'a\0' < 'a ' collate utf8_bin;
SELECT 'a\t' < 'a' collate utf8_bin;
SELECT 'a\t' < 'a ' collate utf8_bin;
CREATE TABLE t1 (a char(10) character set utf8 not null); CREATE TABLE t1 (a char(10) character set utf8 not null);
INSERT INTO t1 VALUES ('a'),('a\0'),('a\t'),('a '); INSERT INTO t1 VALUES ('a'),('a\0'),('a\t'),('a ');
SELECT hex(a),STRCMP(a,'a'), STRCMP(a,'a ') FROM t1; SELECT hex(a),STRCMP(a,'a'), STRCMP(a,'a ') FROM t1;
...@@ -189,7 +198,7 @@ drop table t2; ...@@ -189,7 +198,7 @@ drop table t2;
# #
# Bug 4521: unique key prefix interacts poorly with utf8 # Bug 4521: unique key prefix interacts poorly with utf8
# Check keys with prefix compression # MYISAM: keys with prefix compression, case insensitive collation.
# #
create table t1 (c varchar(30) character set utf8, unique(c(10))); create table t1 (c varchar(30) character set utf8, unique(c(10)));
insert into t1 values ('1'),('2'),('3'),('x'),('y'),('z'); insert into t1 values ('1'),('2'),('3'),('x'),('y'),('z');
...@@ -211,7 +220,8 @@ drop table t1; ...@@ -211,7 +220,8 @@ drop table t1;
# #
# Bug 4521: unique key prefix interacts poorly with utf8 # Bug 4521: unique key prefix interacts poorly with utf8
# Check fixed length keys # MYISAM: fixed length keys, case insensitive collation
#
create table t1 (c char(3) character set utf8, unique (c(2))); create table t1 (c char(3) character set utf8, unique (c(2)));
insert into t1 values ('1'),('2'),('3'),('4'),('x'),('y'),('z'); insert into t1 values ('1'),('2'),('3'),('4'),('x'),('y'),('z');
insert into t1 values ('a'); insert into t1 values ('a');
...@@ -265,6 +275,105 @@ drop table t1; ...@@ -265,6 +275,105 @@ drop table t1;
# Check HEAP+BTREE, case insensitive collation # Check HEAP+BTREE, case insensitive collation
# #
create table t1 ( create table t1 (
c char(10) character set utf8,
unique key a using btree (c(1))
) engine=heap;
show create table t1;
insert into t1 values ('a'),('b'),('c'),('d'),('e'),('f');
--error 1062
insert into t1 values ('aa');
--error 1062
insert into t1 values ('aaa');
insert into t1 values ('б');
--error 1062
insert into t1 values ('бб');
--error 1062
insert into t1 values ('ббб');
select c as c_all from t1 order by c;
select c as c_a from t1 where c='a';
select c as c_a from t1 where c='б';
drop table t1;
#
# Bug 4521: unique key prefix interacts poorly with utf8
# MYISAM: keys with prefix compression, binary collation.
#
create table t1 (c varchar(30) character set utf8 collate utf8_bin, unique(c(10)));
insert into t1 values ('1'),('2'),('3'),('x'),('y'),('z');
insert into t1 values ('aaaaaaaaaa');
--error 1062
insert into t1 values ('aaaaaaaaaaa');
--error 1062
insert into t1 values ('aaaaaaaaaaaa');
insert into t1 values (repeat('b',20));
select c c1 from t1 where c='1';
select c c2 from t1 where c='2';
select c c3 from t1 where c='3';
select c cx from t1 where c='x';
select c cy from t1 where c='y';
select c cz from t1 where c='z';
select c ca10 from t1 where c='aaaaaaaaaa';
select c cb20 from t1 where c=repeat('b',20);
drop table t1;
#
# Bug 4521: unique key prefix interacts poorly with utf8
# MYISAM: fixed length keys, binary collation
#
create table t1 (c char(3) character set utf8 collate utf8_bin, unique (c(2)));
insert into t1 values ('1'),('2'),('3'),('4'),('x'),('y'),('z');
insert into t1 values ('a');
insert into t1 values ('aa');
--error 1062
insert into t1 values ('aaa');
insert into t1 values ('b');
insert into t1 values ('bb');
--error 1062
insert into t1 values ('bbb');
insert into t1 values ('а');
insert into t1 values ('аа');
--error 1062
insert into t1 values ('ааа');
insert into t1 values ('б');
insert into t1 values ('бб');
--error 1062
insert into t1 values ('ббб');
insert into t1 values ('ꪪ');
insert into t1 values ('ꪪꪪ');
--error 1062
insert into t1 values ('ꪪꪪꪪ');
drop table t1;
#
# Bug 4531: unique key prefix interacts poorly with utf8
# Check HEAP+HASH, binary collation
#
create table t1 (
c char(10) character set utf8 collate utf8_bin,
unique key a using hash (c(1))
) engine=heap;
show create table t1;
insert into t1 values ('a'),('b'),('c'),('d'),('e'),('f');
--error 1062
insert into t1 values ('aa');
--error 1062
insert into t1 values ('aaa');
insert into t1 values ('б');
--error 1062
insert into t1 values ('бб');
--error 1062
insert into t1 values ('ббб');
select c as c_all from t1 order by c;
select c as c_a from t1 where c='a';
select c as c_a from t1 where c='б';
drop table t1;
#
# Bug 4531: unique key prefix interacts poorly with utf8
# Check HEAP+BTREE, binary collation
#
create table t1 (
c char(10) character set utf8 collate utf8_bin, c char(10) character set utf8 collate utf8_bin,
unique key a using btree (c(1)) unique key a using btree (c(1))
) engine=heap; ) engine=heap;
......
...@@ -357,7 +357,7 @@ class Field_str :public Field { ...@@ -357,7 +357,7 @@ class Field_str :public Field {
uint size_of() const { return sizeof(*this); } uint size_of() const { return sizeof(*this); }
CHARSET_INFO *charset(void) const { return field_charset; } CHARSET_INFO *charset(void) const { return field_charset; }
void set_charset(CHARSET_INFO *charset) { field_charset=charset; } void set_charset(CHARSET_INFO *charset) { field_charset=charset; }
bool binary() const { return field_charset->state & MY_CS_BINSORT ? 1 : 0; } bool binary() const { return field_charset == &my_charset_bin; }
uint32 max_length() { return field_length; } uint32 max_length() { return field_length; }
friend class create_field; friend class create_field;
}; };
......
...@@ -357,8 +357,10 @@ ulong ha_berkeley::index_flags(uint idx, uint part, bool all_parts) const ...@@ -357,8 +357,10 @@ ulong ha_berkeley::index_flags(uint idx, uint part, bool all_parts) const
case HA_KEYTYPE_VARTEXT: case HA_KEYTYPE_VARTEXT:
/* /*
As BDB stores only one copy of equal strings, we can't use key read As BDB stores only one copy of equal strings, we can't use key read
on these on these. Binary collations do support key read though.
*/ */
if (!(table->key_info[idx].key_part[i].field->charset()->state
& MY_CS_BINSORT))
flags&= ~HA_KEYREAD_ONLY; flags&= ~HA_KEYREAD_ONLY;
break; break;
default: // Keep compiler happy default: // Keep compiler happy
......
...@@ -430,7 +430,7 @@ int ha_heap::create(const char *name, TABLE *table_arg, ...@@ -430,7 +430,7 @@ int ha_heap::create(const char *name, TABLE *table_arg,
{ {
if (!f_is_packed(flag) && if (!f_is_packed(flag) &&
f_packtype(flag) == (int) FIELD_TYPE_DECIMAL && f_packtype(flag) == (int) FIELD_TYPE_DECIMAL &&
!(flag & FIELDFLAG_BINARY)) !(field->charset() == &my_charset_bin))
seg->type= (int) HA_KEYTYPE_TEXT; seg->type= (int) HA_KEYTYPE_TEXT;
else else
seg->type= (int) HA_KEYTYPE_BINARY; seg->type= (int) HA_KEYTYPE_BINARY;
......
...@@ -303,10 +303,10 @@ int Arg_comparator::set_compare_func(Item_bool_func2 *item, Item_result type) ...@@ -303,10 +303,10 @@ int Arg_comparator::set_compare_func(Item_bool_func2 *item, Item_result type)
my_coll_agg_error((*a)->collation, (*b)->collation, owner->func_name()); my_coll_agg_error((*a)->collation, (*b)->collation, owner->func_name());
return 1; return 1;
} }
if (my_binary_compare(cmp_collation.collation)) if (cmp_collation.collation == &my_charset_bin)
{ {
/* /*
We are using binary collation, change to compare byte by byte, We are using BLOB/BINARY/VARBINARY, change to compare byte by byte,
without removing end space without removing end space
*/ */
if (func == &Arg_comparator::compare_string) if (func == &Arg_comparator::compare_string)
......
...@@ -1643,8 +1643,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -1643,8 +1643,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
SHUTDOWN_DEFAULT is 0. If client is >= 4.1.3, the shutdown level is in SHUTDOWN_DEFAULT is 0. If client is >= 4.1.3, the shutdown level is in
packet[0]. packet[0].
*/ */
enum enum_shutdown_level level= enum mysql_enum_shutdown_level level=
(enum enum_shutdown_level) (uchar) packet[0]; (enum mysql_enum_shutdown_level) (uchar) packet[0];
DBUG_PRINT("quit",("Got shutdown command for level %u", level)); DBUG_PRINT("quit",("Got shutdown command for level %u", level));
if (level == SHUTDOWN_DEFAULT) if (level == SHUTDOWN_DEFAULT)
level= SHUTDOWN_WAIT_ALL_BUFFERS; // soon default will be configurable level= SHUTDOWN_WAIT_ALL_BUFFERS; // soon default will be configurable
......
...@@ -68,11 +68,22 @@ static uchar bin_char_array[] = ...@@ -68,11 +68,22 @@ static uchar bin_char_array[] =
static int my_strnncoll_binary(CHARSET_INFO * cs __attribute__((unused)),
const uchar *s, uint slen,
const uchar *t, uint tlen,
my_bool t_is_prefix)
{
uint len=min(slen,tlen);
int cmp= memcmp(s,t,len);
return cmp ? cmp : (int)((t_is_prefix ? len : slen) - tlen);
}
/* /*
Compare two strings. Result is sign(first_argument - second_argument) Compare two strings. Result is sign(first_argument - second_argument)
SYNOPSIS SYNOPSIS
my_strnncoll_binary() my_strnncollsp_binary()
cs Chararacter set cs Chararacter set
s String to compare s String to compare
slen Length of 's' slen Length of 's'
...@@ -80,8 +91,9 @@ static uchar bin_char_array[] = ...@@ -80,8 +91,9 @@ static uchar bin_char_array[] =
tlen Length of 't' tlen Length of 't'
NOTE NOTE
This is used also when comparing with end space removal, as end space This function is used for real binary strings, i.e. for
is significant for binary strings BLOB, BINARY(N) and VARBINARY(N).
It does not ignore trailing spaces.
RETURN RETURN
< 0 s < t < 0 s < t
...@@ -89,7 +101,15 @@ static uchar bin_char_array[] = ...@@ -89,7 +101,15 @@ static uchar bin_char_array[] =
> 0 s > t > 0 s > t
*/ */
static int my_strnncoll_binary(CHARSET_INFO * cs __attribute__((unused)), static int my_strnncollsp_binary(CHARSET_INFO * cs __attribute__((unused)),
const uchar *s, uint slen,
const uchar *t, uint tlen)
{
return my_strnncoll_binary(cs,s,slen,t,tlen,0);
}
static int my_strnncoll_8bit_bin(CHARSET_INFO * cs __attribute__((unused)),
const uchar *s, uint slen, const uchar *s, uint slen,
const uchar *t, uint tlen, const uchar *t, uint tlen,
my_bool t_is_prefix) my_bool t_is_prefix)
...@@ -100,11 +120,61 @@ static int my_strnncoll_binary(CHARSET_INFO * cs __attribute__((unused)), ...@@ -100,11 +120,61 @@ static int my_strnncoll_binary(CHARSET_INFO * cs __attribute__((unused)),
} }
static int my_strnncollsp_binary(CHARSET_INFO * cs __attribute__((unused)), /*
const uchar *s, uint slen, Compare two strings. Result is sign(first_argument - second_argument)
const uchar *t, uint tlen)
SYNOPSIS
my_strnncollsp_8bit_bin()
cs Chararacter set
s String to compare
slen Length of 's'
t String to compare
tlen Length of 't'
NOTE
This function is used for character strings with binary collations.
It ignores trailing spaces.
RETURN
< 0 s < t
0 s == t
> 0 s > t
*/
static int my_strnncollsp_8bit_bin(CHARSET_INFO * cs __attribute__((unused)),
const uchar *a, uint a_length,
const uchar *b, uint b_length)
{ {
return my_strnncoll_binary(cs,s,slen,t,tlen,0); const uchar *end;
uint length;
end= a + (length= min(a_length, b_length));
while (a < end)
{
if (*a++ != *b++)
return ((int) a[-1] - (int) b[-1]);
}
if (a_length != b_length)
{
int swap= 0;
/*
Check the next not space character of the longer key. If it's < ' ',
then it's smaller than the other key.
*/
if (a_length < b_length)
{
/* put shorter key in s */
a_length= b_length;
a= b;
swap= -1; /* swap sign of result */
}
for (end= a + a_length-length; a < end ; a++)
{
if (*a != ' ')
return ((int) *a - (int) ' ') ^ swap;
}
}
return 0;
} }
...@@ -342,6 +412,20 @@ uint my_instr_bin(CHARSET_INFO *cs __attribute__((unused)), ...@@ -342,6 +412,20 @@ uint my_instr_bin(CHARSET_INFO *cs __attribute__((unused)),
MY_COLLATION_HANDLER my_collation_8bit_bin_handler = MY_COLLATION_HANDLER my_collation_8bit_bin_handler =
{
NULL, /* init */
my_strnncoll_8bit_bin,
my_strnncollsp_8bit_bin,
my_strnxfrm_bin,
my_like_range_simple,
my_wildcmp_bin,
my_strcasecmp_bin,
my_instr_bin,
my_hash_sort_bin
};
static MY_COLLATION_HANDLER my_collation_binary_handler =
{ {
NULL, /* init */ NULL, /* init */
my_strnncoll_binary, my_strnncoll_binary,
...@@ -407,5 +491,5 @@ CHARSET_INFO my_charset_bin = ...@@ -407,5 +491,5 @@ CHARSET_INFO my_charset_bin =
0, /* min_sort_char */ 0, /* min_sort_char */
255, /* max_sort_char */ 255, /* max_sort_char */
&my_charset_handler, &my_charset_handler,
&my_collation_8bit_bin_handler &my_collation_binary_handler
}; };
...@@ -360,11 +360,62 @@ static int my_strnncoll_mb_bin(CHARSET_INFO * cs __attribute__((unused)), ...@@ -360,11 +360,62 @@ static int my_strnncoll_mb_bin(CHARSET_INFO * cs __attribute__((unused)),
return cmp ? cmp : (int) ((t_is_prefix ? len : slen) - tlen); return cmp ? cmp : (int) ((t_is_prefix ? len : slen) - tlen);
} }
/*
Compare two strings.
SYNOPSIS
my_strnncollsp_mb_bin()
cs Chararacter set
s String to compare
slen Length of 's'
t String to compare
tlen Length of 't'
NOTE
This function is used for character strings with binary collations.
It ignores trailing spaces.
RETURN
A negative number if s < t
A positive number if s > t
0 if strings are equal
*/
static int my_strnncollsp_mb_bin(CHARSET_INFO * cs __attribute__((unused)), static int my_strnncollsp_mb_bin(CHARSET_INFO * cs __attribute__((unused)),
const uchar *s, uint slen, const uchar *a, uint a_length,
const uchar *t, uint tlen) const uchar *b, uint b_length)
{ {
return my_strnncoll_mb_bin(cs,s,slen,t,tlen,0); const uchar *end;
uint length;
end= a + (length= min(a_length, b_length));
while (a < end)
{
if (*a++ != *b++)
return ((int) a[-1] - (int) b[-1]);
}
if (a_length != b_length)
{
int swap= 0;
/*
Check the next not space character of the longer key. If it's < ' ',
then it's smaller than the other key.
*/
if (a_length < b_length)
{
/* put shorter key in s */
a_length= b_length;
a= b;
swap= -1; /* swap sign of result */
}
for (end= a + a_length-length; a < end ; a++)
{
if (*a != ' ')
return ((int) *a - (int) ' ') ^ swap;
}
}
return 0;
} }
......
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