mirror of
https://github.com/MariaDB/server.git
synced 2025-05-13 01:01:44 +03:00
Merge aivanov@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/alexi/innodb-ss/mysql-4.1-ss14
This commit is contained in:
commit
ab30b3e09c
@ -86,9 +86,10 @@ log. */
|
|||||||
#define OS_FILE_NOT_FOUND 71
|
#define OS_FILE_NOT_FOUND 71
|
||||||
#define OS_FILE_DISK_FULL 72
|
#define OS_FILE_DISK_FULL 72
|
||||||
#define OS_FILE_ALREADY_EXISTS 73
|
#define OS_FILE_ALREADY_EXISTS 73
|
||||||
#define OS_FILE_AIO_RESOURCES_RESERVED 74 /* wait for OS aio resources
|
#define OS_FILE_PATH_ERROR 74
|
||||||
|
#define OS_FILE_AIO_RESOURCES_RESERVED 75 /* wait for OS aio resources
|
||||||
to become available again */
|
to become available again */
|
||||||
#define OS_FILE_ERROR_NOT_SPECIFIED 75
|
#define OS_FILE_ERROR_NOT_SPECIFIED 76
|
||||||
|
|
||||||
/* Types for aio operations */
|
/* Types for aio operations */
|
||||||
#define OS_FILE_READ 10
|
#define OS_FILE_READ 10
|
||||||
|
@ -303,6 +303,8 @@ os_file_get_last_error(
|
|||||||
return(OS_FILE_NOT_FOUND);
|
return(OS_FILE_NOT_FOUND);
|
||||||
} else if (err == EEXIST) {
|
} else if (err == EEXIST) {
|
||||||
return(OS_FILE_ALREADY_EXISTS);
|
return(OS_FILE_ALREADY_EXISTS);
|
||||||
|
} else if (err == EXDEV || err == ENOTDIR || err == EISDIR) {
|
||||||
|
return(OS_FILE_PATH_ERROR);
|
||||||
} else {
|
} else {
|
||||||
return(100 + err);
|
return(100 + err);
|
||||||
}
|
}
|
||||||
@ -352,7 +354,8 @@ os_file_handle_error(
|
|||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
|
|
||||||
} else if (err == OS_FILE_ALREADY_EXISTS) {
|
} else if (err == OS_FILE_ALREADY_EXISTS
|
||||||
|
|| err == OS_FILE_PATH_ERROR) {
|
||||||
|
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
} else {
|
} else {
|
||||||
@ -456,7 +459,8 @@ os_file_handle_error_no_exit(
|
|||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
|
|
||||||
} else if (err == OS_FILE_ALREADY_EXISTS) {
|
} else if (err == OS_FILE_ALREADY_EXISTS
|
||||||
|
|| err == OS_FILE_PATH_ERROR) {
|
||||||
|
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1754,3 +1754,43 @@ rename table t3 to t1;
|
|||||||
ERROR HY000: Error on rename of './test/t3' to './test/t1' (errno: 150)
|
ERROR HY000: Error on rename of './test/t3' to './test/t1' (errno: 150)
|
||||||
set foreign_key_checks=1;
|
set foreign_key_checks=1;
|
||||||
drop table t2,t3;
|
drop table t2,t3;
|
||||||
|
create table t2 (
|
||||||
|
a int, b char(10), filler char(10), primary key(a, b(2))
|
||||||
|
) character set utf8 engine = innodb;
|
||||||
|
insert into t2 values (1,'abcdefg','one');
|
||||||
|
insert into t2 values (2,'ijkilmn','two');
|
||||||
|
insert into t2 values (3, 'qrstuvw','three');
|
||||||
|
update t2 set a=5, filler='booo' where a=1;
|
||||||
|
drop table t2;
|
||||||
|
create table t2 (
|
||||||
|
a int, b char(10), filler char(10), primary key(a, b(2))
|
||||||
|
) character set ucs2 engine = innodb;
|
||||||
|
insert into t2 values (1,'abcdefg','one');
|
||||||
|
insert into t2 values (2,'ijkilmn','two');
|
||||||
|
insert into t2 values (3, 'qrstuvw','three');
|
||||||
|
update t2 set a=5, filler='booo' where a=1;
|
||||||
|
drop table t2;
|
||||||
|
create table t1(a int not null, b char(110),primary key(a,b(100))) engine=innodb default charset=utf8;
|
||||||
|
insert into t1 values(1,'abcdefg'),(2,'defghijk');
|
||||||
|
insert into t1 values(6,_utf8 0xD0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1);
|
||||||
|
insert into t1 values(7,_utf8 0xD0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B2);
|
||||||
|
select a,hex(b) from t1 order by b;
|
||||||
|
a hex(b)
|
||||||
|
1 61626364656667
|
||||||
|
2 6465666768696A6B
|
||||||
|
6 D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1
|
||||||
|
7 D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B2
|
||||||
|
update t1 set b = 'three' where a = 6;
|
||||||
|
drop table t1;
|
||||||
|
create table t1(a int not null, b text(110),primary key(a,b(100))) engine=innodb default charset=utf8;
|
||||||
|
insert into t1 values(1,'abcdefg'),(2,'defghijk');
|
||||||
|
insert into t1 values(6,_utf8 0xD0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1);
|
||||||
|
insert into t1 values(7,_utf8 0xD0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B2);
|
||||||
|
select a,hex(b) from t1 order by b;
|
||||||
|
a hex(b)
|
||||||
|
1 61626364656667
|
||||||
|
2 6465666768696A6B
|
||||||
|
6 D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1
|
||||||
|
7 D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B2
|
||||||
|
update t1 set b = 'three' where a = 6;
|
||||||
|
drop table t1;
|
||||||
|
@ -1329,4 +1329,40 @@ create table t3(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=utf8;
|
|||||||
rename table t3 to t1;
|
rename table t3 to t1;
|
||||||
set foreign_key_checks=1;
|
set foreign_key_checks=1;
|
||||||
drop table t2,t3;
|
drop table t2,t3;
|
||||||
|
|
||||||
|
# tests for bug #14056 Column prefix index on UTF-8 primary key column causes 'Can't find record..'
|
||||||
|
|
||||||
|
create table t2 (
|
||||||
|
a int, b char(10), filler char(10), primary key(a, b(2))
|
||||||
|
) character set utf8 engine = innodb;
|
||||||
|
|
||||||
|
insert into t2 values (1,'abcdefg','one');
|
||||||
|
insert into t2 values (2,'ijkilmn','two');
|
||||||
|
insert into t2 values (3, 'qrstuvw','three');
|
||||||
|
update t2 set a=5, filler='booo' where a=1;
|
||||||
|
drop table t2;
|
||||||
|
create table t2 (
|
||||||
|
a int, b char(10), filler char(10), primary key(a, b(2))
|
||||||
|
) character set ucs2 engine = innodb;
|
||||||
|
|
||||||
|
insert into t2 values (1,'abcdefg','one');
|
||||||
|
insert into t2 values (2,'ijkilmn','two');
|
||||||
|
insert into t2 values (3, 'qrstuvw','three');
|
||||||
|
update t2 set a=5, filler='booo' where a=1;
|
||||||
|
drop table t2;
|
||||||
|
|
||||||
|
create table t1(a int not null, b char(110),primary key(a,b(100))) engine=innodb default charset=utf8;
|
||||||
|
insert into t1 values(1,'abcdefg'),(2,'defghijk');
|
||||||
|
insert into t1 values(6,_utf8 0xD0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1);
|
||||||
|
insert into t1 values(7,_utf8 0xD0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B2);
|
||||||
|
select a,hex(b) from t1 order by b;
|
||||||
|
update t1 set b = 'three' where a = 6;
|
||||||
|
drop table t1;
|
||||||
|
create table t1(a int not null, b text(110),primary key(a,b(100))) engine=innodb default charset=utf8;
|
||||||
|
insert into t1 values(1,'abcdefg'),(2,'defghijk');
|
||||||
|
insert into t1 values(6,_utf8 0xD0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1);
|
||||||
|
insert into t1 values(7,_utf8 0xD0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B1D0B2);
|
||||||
|
select a,hex(b) from t1 order by b;
|
||||||
|
update t1 set b = 'three' where a = 6;
|
||||||
|
drop table t1;
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
131
sql/ha_innodb.cc
131
sql/ha_innodb.cc
@ -2015,6 +2015,22 @@ get_innobase_type_from_mysql_type(
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
Writes an unsigned integer value < 64k to 2 bytes, in the little-endian
|
||||||
|
storage format. */
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
innobase_write_to_2_little_endian(
|
||||||
|
/*==============================*/
|
||||||
|
byte* buf, /* in: where to store */
|
||||||
|
ulint val) /* in: value to write, must be < 64k */
|
||||||
|
{
|
||||||
|
ut_a(val < 256 * 256);
|
||||||
|
|
||||||
|
buf[0] = (byte)(val & 0xFF);
|
||||||
|
buf[1] = (byte)(val / 256);
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
Stores a key value for a row to a buffer. */
|
Stores a key value for a row to a buffer. */
|
||||||
|
|
||||||
@ -2034,8 +2050,6 @@ ha_innobase::store_key_val_for_row(
|
|||||||
char* buff_start = buff;
|
char* buff_start = buff;
|
||||||
enum_field_types mysql_type;
|
enum_field_types mysql_type;
|
||||||
Field* field;
|
Field* field;
|
||||||
ulint blob_len;
|
|
||||||
byte* blob_data;
|
|
||||||
ibool is_null;
|
ibool is_null;
|
||||||
|
|
||||||
DBUG_ENTER("store_key_val_for_row");
|
DBUG_ENTER("store_key_val_for_row");
|
||||||
@ -2084,14 +2098,26 @@ ha_innobase::store_key_val_for_row(
|
|||||||
|| mysql_type == FIELD_TYPE_BLOB
|
|| mysql_type == FIELD_TYPE_BLOB
|
||||||
|| mysql_type == FIELD_TYPE_LONG_BLOB) {
|
|| mysql_type == FIELD_TYPE_LONG_BLOB) {
|
||||||
|
|
||||||
|
CHARSET_INFO* cs;
|
||||||
|
ulint key_len;
|
||||||
|
ulint len;
|
||||||
|
ulint true_len;
|
||||||
|
int error=0;
|
||||||
|
ulint blob_len;
|
||||||
|
byte* blob_data;
|
||||||
|
|
||||||
ut_a(key_part->key_part_flag & HA_PART_KEY_SEG);
|
ut_a(key_part->key_part_flag & HA_PART_KEY_SEG);
|
||||||
|
|
||||||
|
key_len = key_part->length;
|
||||||
|
|
||||||
if (is_null) {
|
if (is_null) {
|
||||||
buff += key_part->length + 2;
|
buff += key_len + 2;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cs = field->charset();
|
||||||
|
|
||||||
blob_data = row_mysql_read_blob_ref(&blob_len,
|
blob_data = row_mysql_read_blob_ref(&blob_len,
|
||||||
(byte*) (record
|
(byte*) (record
|
||||||
+ (ulint)get_field_offset(table, field)),
|
+ (ulint)get_field_offset(table, field)),
|
||||||
@ -2099,29 +2125,108 @@ ha_innobase::store_key_val_for_row(
|
|||||||
|
|
||||||
ut_a(get_field_offset(table, field)
|
ut_a(get_field_offset(table, field)
|
||||||
== key_part->offset);
|
== key_part->offset);
|
||||||
if (blob_len > key_part->length) {
|
|
||||||
blob_len = key_part->length;
|
true_len = blob_len;
|
||||||
|
|
||||||
|
/* For multi byte character sets we need to calculate
|
||||||
|
the true length of the key */
|
||||||
|
|
||||||
|
if (key_len > 0 && cs->mbmaxlen > 1) {
|
||||||
|
true_len = (ulint) cs->cset->well_formed_len(cs,
|
||||||
|
(const char *) blob_data,
|
||||||
|
(const char *) blob_data
|
||||||
|
+ blob_len,
|
||||||
|
key_len / cs->mbmaxlen,
|
||||||
|
&error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* All indexes on BLOB and TEXT are column prefix
|
||||||
|
indexes, and we may need to truncate the data to be
|
||||||
|
stored in the key value: */
|
||||||
|
|
||||||
|
if (true_len > key_len) {
|
||||||
|
true_len = key_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* MySQL reserves 2 bytes for the length and the
|
/* MySQL reserves 2 bytes for the length and the
|
||||||
storage of the number is little-endian */
|
storage of the number is little-endian */
|
||||||
|
|
||||||
ut_a(blob_len < 256);
|
innobase_write_to_2_little_endian(
|
||||||
*((byte*)buff) = (byte)blob_len;
|
(byte*)buff, true_len);
|
||||||
buff += 2;
|
buff += 2;
|
||||||
|
|
||||||
memcpy(buff, blob_data, blob_len);
|
memcpy(buff, blob_data, true_len);
|
||||||
|
|
||||||
buff += key_part->length;
|
/* Note that we always reserve the maximum possible
|
||||||
|
length of the BLOB prefix in the key value. */
|
||||||
|
|
||||||
|
buff += key_len;
|
||||||
} else {
|
} else {
|
||||||
|
/* Here we handle all other data types except the
|
||||||
|
true VARCHAR, BLOB and TEXT. Note that the column
|
||||||
|
value we store may be also in a column prefix
|
||||||
|
index. */
|
||||||
|
|
||||||
|
CHARSET_INFO* cs;
|
||||||
|
ulint true_len;
|
||||||
|
ulint key_len;
|
||||||
|
const mysql_byte* src_start;
|
||||||
|
int error=0;
|
||||||
|
enum_field_types real_type;
|
||||||
|
|
||||||
|
key_len = key_part->length;
|
||||||
|
|
||||||
if (is_null) {
|
if (is_null) {
|
||||||
buff += key_part->length;
|
buff += key_len;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
memcpy(buff, record + key_part->offset,
|
|
||||||
key_part->length);
|
src_start = record + key_part->offset;
|
||||||
buff += key_part->length;
|
real_type = field->real_type();
|
||||||
|
true_len = key_len;
|
||||||
|
|
||||||
|
/* Character set for the field is defined only
|
||||||
|
to fields whose type is string and real field
|
||||||
|
type is not enum or set. For these fields check
|
||||||
|
if character set is multi byte. */
|
||||||
|
|
||||||
|
if (real_type != FIELD_TYPE_ENUM
|
||||||
|
&& real_type != FIELD_TYPE_SET
|
||||||
|
&& ( mysql_type == MYSQL_TYPE_VAR_STRING
|
||||||
|
|| mysql_type == MYSQL_TYPE_STRING)) {
|
||||||
|
|
||||||
|
cs = field->charset();
|
||||||
|
|
||||||
|
/* For multi byte character sets we need to
|
||||||
|
calculate the true length of the key */
|
||||||
|
|
||||||
|
if (key_len > 0 && cs->mbmaxlen > 1) {
|
||||||
|
|
||||||
|
true_len = (ulint)
|
||||||
|
cs->cset->well_formed_len(cs,
|
||||||
|
(const char *)src_start,
|
||||||
|
(const char *)src_start
|
||||||
|
+ key_len,
|
||||||
|
key_len / cs->mbmaxlen,
|
||||||
|
&error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(buff, src_start, true_len);
|
||||||
|
buff += true_len;
|
||||||
|
|
||||||
|
/* Pad the unused space with spaces. Note that no
|
||||||
|
padding is ever needed for UCS-2 because in MySQL,
|
||||||
|
all UCS2 characters are 2 bytes, as MySQL does not
|
||||||
|
support surrogate pairs, which are needed to represent
|
||||||
|
characters in the range U+10000 to U+10FFFF. */
|
||||||
|
|
||||||
|
if (true_len < key_len) {
|
||||||
|
ulint pad_len = key_len - true_len;
|
||||||
|
memset(buff, ' ', pad_len);
|
||||||
|
buff += pad_len;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user