Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
0955163b
Commit
0955163b
authored
Oct 19, 2005
by
elliot@mysql.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
BUG#14056 Column prefix index on UTF-8 primary key column causes 'Can't find record..'
Applying InnoDB patch from Jan Lindstrom
parent
5db97a8d
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
327 additions
and
7 deletions
+327
-7
innobase/include/rem0rec.h
innobase/include/rem0rec.h
+9
-0
innobase/include/rem0rec.ic
innobase/include/rem0rec.ic
+16
-0
innobase/row/row0upd.c
innobase/row/row0upd.c
+12
-0
mysql-test/r/innodb.result
mysql-test/r/innodb.result
+109
-0
mysql-test/t/innodb.test
mysql-test/t/innodb.test
+116
-0
sql/ha_innodb.cc
sql/ha_innodb.cc
+65
-7
No files found.
innobase/include/rem0rec.h
View file @
0955163b
...
...
@@ -312,6 +312,15 @@ rec_offs_nth_extern(
const
ulint
*
offsets
,
/* in: array returned by rec_get_offsets() */
ulint
n
);
/* in: nth field */
/**********************************************************
Returns nonzero if the SQL NULL bit is set in nth field of rec. */
UNIV_INLINE
ulint
rec_offs_nth_sql_null
(
/*==================*/
/* out: nonzero if SQL NULL */
const
ulint
*
offsets
,
/* in: array returned by rec_get_offsets() */
ulint
n
);
/* in: nth field */
/**********************************************************
Gets the physical size of a field. */
UNIV_INLINE
ulint
...
...
innobase/include/rem0rec.ic
View file @
0955163b
...
...
@@ -954,6 +954,22 @@ rec_offs_nth_extern(
& REC_OFFS_EXTERNAL));
}
/**********************************************************
Returns nonzero if the SQL NULL bit is set in nth field of rec. */
UNIV_INLINE
ulint
rec_offs_nth_sql_null(
/*==================*/
/* out: nonzero if SQL NULL */
const ulint* offsets,/* in: array returned by rec_get_offsets() */
ulint n) /* in: nth field */
{
ut_ad(rec_offs_validate(NULL, NULL, offsets));
ut_ad(n < rec_offs_n_fields(offsets));
return(UNIV_UNLIKELY(rec_offs_base(offsets)[1 + n]
& REC_OFFS_SQL_NULL));
}
/**********************************************************
Gets the physical size of a field. */
UNIV_INLINE
...
...
innobase/row/row0upd.c
View file @
0955163b
...
...
@@ -395,6 +395,18 @@ row_upd_changes_field_size_or_external(
old_len
=
rec_offs_nth_size
(
offsets
,
upd_field
->
field_no
);
if
(
rec_offs_comp
(
offsets
)
&&
rec_offs_nth_sql_null
(
offsets
,
upd_field
->
field_no
))
{
/* Note that in the compact table format, for a
variable length field, an SQL NULL will use zero
bytes in the offset array at the start of the physical
record, but a zero-length value (empty string) will
use one byte! Thus, we cannot use update-in-place
if we update an SQL NULL varchar to an empty string! */
old_len
=
UNIV_SQL_NULL
;
}
if
(
old_len
!=
new_len
)
{
return
(
TRUE
);
...
...
mysql-test/r/innodb.result
View file @
0955163b
...
...
@@ -2663,3 +2663,112 @@ rollback;
rollback;
drop table t1;
drop function f1;
create table t1 (
a int, b char(10), c char(10), filler char(10), primary key(a, b(2)), unique key (a, c(2))
)
character set utf8 engine = innodb;
create table t2 (
a int, b char(10), c char(10), filler char(10), primary key(a, b(2)), unique key (a, c(2))
)
character set ucs2 engine = innodb;
insert into t1 values (1,'abcdefg','abcdefg','one');
insert into t1 values (2,'ijkilmn','ijkilmn','two');
insert into t1 values (3,'qrstuvw','qrstuvw','three');
insert into t1 values (4,_utf8 0xe880bd,_utf8 0xe880bd,'four');
insert into t1 values (4,_utf8 0x5b,_utf8 0x5b,'five');
insert into t1 values (4,_utf8 0xe880bde880bd,_utf8 0xe880bde880bd,'six');
insert into t1 values (4,_utf8 0xe880bdD0B1e880bd,_utf8 0xe880bdD0B1e880bd,'seven');
insert into t1 values (4,_utf8 0xD0B1,_utf8 0xD0B1,'eight');
insert into t2 values (1,'abcdefg','abcdefg','one');
insert into t2 values (2,'ijkilmn','ijkilmn','two');
insert into t2 values (3,'qrstuvw','qrstuvw','three');
insert into t2 values (4,_ucs2 0x00e400,_ucs2 0x00e400,'four');
insert into t2 values (4,_ucs2 0x00640065,_ucs2 0x00640065,'five');
insert into t2 values (4,_ucs2 0x00e400e50068,_ucs2 0x00e400e50068,'six');
insert into t2 values (4,_ucs2 0x01fc,_ucs2 0x01fc,'seven');
insert into t2 values (4,_ucs2 0x0120,_ucs2 0x0120,'eight');
insert into t2 values (4,_ucs2 0x0563,_ucs2 0x0563,'ten');
insert into t2 values (4,_ucs2 0x05630563,_ucs2 0x05630563,'eleven');
insert into t2 values (4,_ucs2 0x0563001fc0563,_ucs2 0x0563001fc0563,'point');
insert into t2 values (4,_ucs2 0x05612020,_ucs2 0x05612020,'taken');
drop table t1;
drop table t2;
create table t1 (
a int, b varchar(10), c varchar(10), filler varchar(10), primary key(a, b(2)), unique key (a, c(2))
)
character set utf8 engine = innodb;
create table t2 (
a int, b varchar(10), c varchar(10), filler varchar(10), primary key(a, b(2)), unique key (a, c(2))
)
character set ucs2 engine = innodb;
insert into t1 values (1,'abcdefg','abcdefg','one');
insert into t1 values (2,'ijkilmn','ijkilmn','two');
insert into t1 values (3,'qrstuvw','qrstuvw','three');
insert into t1 values (4,_utf8 0xe880bd,_utf8 0xe880bd,'four');
insert into t1 values (4,_utf8 0x5b,_utf8 0x5b,'five');
insert into t1 values (4,_utf8 0xe880bde880bd,_utf8 0xe880bde880bd,'six');
insert into t1 values (4,_utf8 0xe880bdD0B1e880bd,_utf8 0xe880bdD0B1e880bd,'seven');
insert into t1 values (4,_utf8 0xD0B1,_utf8 0xD0B1,'eight');
insert into t2 values (1,'abcdefg','abcdefg','one');
insert into t2 values (2,'ijkilmn','ijkilmn','two');
insert into t2 values (3,'qrstuvw','qrstuvw','three');
insert into t2 values (4,_ucs2 0x00e400,_ucs2 0x00e400,'four');
insert into t2 values (4,_ucs2 0x00640065,_ucs2 0x00640065,'five');
insert into t2 values (4,_ucs2 0x00e400e50068,_ucs2 0x00e400e50068,'six');
insert into t2 values (4,_ucs2 0x01fc,_ucs2 0x01fc,'seven');
insert into t2 values (4,_ucs2 0x0120,_ucs2 0x0120,'eight');
insert into t2 values (4,_ucs2 0x0563,_ucs2 0x0563,'ten');
insert into t2 values (4,_ucs2 0x05630563,_ucs2 0x05630563,'eleven');
insert into t2 values (4,_ucs2 0x0563001fc0563,_ucs2 0x0563001fc0563,'point');
insert into t2 values (4,_ucs2 0x05612020,_ucs2 0x05612020,'taken');
drop table t1;
drop table t2;
create table t1 (
a int, b text(10), c text(10), filler text(10), primary key(a, b(2)), unique key (a, c(2))
)
character set utf8 engine = innodb;
create table t2 (
a int, b text(10), c text(10), filler text(10), primary key(a, b(2)), unique key (a, c(2))
)
character set ucs2 engine = innodb;
insert into t1 values (1,'abcdefg','abcdefg','one');
insert into t1 values (2,'ijkilmn','ijkilmn','two');
insert into t1 values (3,'qrstuvw','qrstuvw','three');
insert into t1 values (4,_utf8 0xe880bd,_utf8 0xe880bd,'four');
insert into t1 values (4,_utf8 0x5b,_utf8 0x5b,'five');
insert into t1 values (4,_utf8 0xe880bde880bd,_utf8 0xe880bde880bd,'six');
insert into t1 values (4,_utf8 0xe880bdD0B1e880bd,_utf8 0xe880bdD0B1e880bd,'seven');
insert into t1 values (4,_utf8 0xD0B1,_utf8 0xD0B1,'eight');
insert into t2 values (1,'abcdefg','abcdefg','one');
insert into t2 values (2,'ijkilmn','ijkilmn','two');
insert into t2 values (3,'qrstuvw','qrstuvw','three');
insert into t2 values (4,_ucs2 0x00e400,_ucs2 0x00e400,'four');
insert into t2 values (4,_ucs2 0x00640065,_ucs2 0x00640065,'five');
insert into t2 values (4,_ucs2 0x00e400e50068,_ucs2 0x00e400e50068,'six');
insert into t2 values (4,_ucs2 0x01fc,_ucs2 0x01fc,'seven');
insert into t2 values (4,_ucs2 0x0120,_ucs2 0x0120,'eight');
insert into t2 values (4,_ucs2 0x0563,_ucs2 0x0563,'ten');
insert into t2 values (4,_ucs2 0x05630563,_ucs2 0x05630563,'eleven');
insert into t2 values (4,_ucs2 0x0563001fc0563,_ucs2 0x0563001fc0563,'point');
insert into t2 values (4,_ucs2 0x05612020,_ucs2 0x05612020,'taken');
drop table t1;
drop table t2;
create table t1 (
a int, b blob(10), c blob(10), filler blob(10), primary key(a, b(2)), unique key (a, c(2))
)
character set utf8 engine = innodb;
create table t2 (
a int, b blob(10), c blob(10), filler blob(10), primary key(a, b(2)), unique key (a, c(2))
)
character set ucs2 engine = innodb;
insert into t1 values (1,'abcdefg','abcdefg','one');
insert into t1 values (2,'ijkilmn','ijkilmn','two');
insert into t1 values (3,'qrstuvw','qrstuvw','three');
insert into t1 values (4,_utf8 0xe880bd,_utf8 0xe880bd,'four');
insert into t1 values (4,_utf8 0x5b,_utf8 0x5b,'five');
insert into t1 values (4,_utf8 0xD0B1,_utf8 0xD0B1,'eight');
insert into t2 values (1,'abcdefg','abcdefg','one');
insert into t2 values (2,'ijkilmn','ijkilmn','two');
insert into t2 values (3,'qrstuvw','qrstuvw','three');
insert into t2 values (4,_ucs2 0x00e400,_ucs2 0x00e400,'four');
insert into t2 values (4,_ucs2 0x00640065,_ucs2 0x00640065,'five');
insert into t2 values (4,_ucs2 0x00e400e50068,_ucs2 0x00e400e50068,'six');
insert into t2 values (4,_ucs2 0x01fc,_ucs2 0x01fc,'seven');
insert into t2 values (4,_ucs2 0x0120,_ucs2 0x0120,'eight');
insert into t2 values (4,_ucs2 0x0563,_ucs2 0x0563,'ten');
insert into t2 values (4,_ucs2 0x05612020,_ucs2 0x05612020,'taken');
drop table t1;
drop table t2;
commit;
mysql-test/t/innodb.test
View file @
0955163b
...
...
@@ -1635,3 +1635,119 @@ drop function f1;
disconnect
a
;
disconnect
b
;
#
# BUG 14056 Column prefix index on UTF-8 primary key column causes: Can't find record..
#
create
table
t1
(
a
int
,
b
char
(
10
),
c
char
(
10
),
filler
char
(
10
),
primary
key
(
a
,
b
(
2
)),
unique
key
(
a
,
c
(
2
))
)
character
set
utf8
engine
=
innodb
;
create
table
t2
(
a
int
,
b
char
(
10
),
c
char
(
10
),
filler
char
(
10
),
primary
key
(
a
,
b
(
2
)),
unique
key
(
a
,
c
(
2
))
)
character
set
ucs2
engine
=
innodb
;
insert
into
t1
values
(
1
,
'abcdefg'
,
'abcdefg'
,
'one'
);
insert
into
t1
values
(
2
,
'ijkilmn'
,
'ijkilmn'
,
'two'
);
insert
into
t1
values
(
3
,
'qrstuvw'
,
'qrstuvw'
,
'three'
);
insert
into
t1
values
(
4
,
_utf8
0xe880bd
,
_utf8
0xe880bd
,
'four'
);
insert
into
t1
values
(
4
,
_utf8
0x5b
,
_utf8
0x5b
,
'five'
);
insert
into
t1
values
(
4
,
_utf8
0xe880bde880bd
,
_utf8
0xe880bde880bd
,
'six'
);
insert
into
t1
values
(
4
,
_utf8
0xe880bdD0B1e880bd
,
_utf8
0xe880bdD0B1e880bd
,
'seven'
);
insert
into
t1
values
(
4
,
_utf8
0xD0B1
,
_utf8
0xD0B1
,
'eight'
);
insert
into
t2
values
(
1
,
'abcdefg'
,
'abcdefg'
,
'one'
);
insert
into
t2
values
(
2
,
'ijkilmn'
,
'ijkilmn'
,
'two'
);
insert
into
t2
values
(
3
,
'qrstuvw'
,
'qrstuvw'
,
'three'
);
insert
into
t2
values
(
4
,
_ucs2
0x00e400
,
_ucs2
0x00e400
,
'four'
);
insert
into
t2
values
(
4
,
_ucs2
0x00640065
,
_ucs2
0x00640065
,
'five'
);
insert
into
t2
values
(
4
,
_ucs2
0x00e400e50068
,
_ucs2
0x00e400e50068
,
'six'
);
insert
into
t2
values
(
4
,
_ucs2
0x01fc
,
_ucs2
0x01fc
,
'seven'
);
insert
into
t2
values
(
4
,
_ucs2
0x0120
,
_ucs2
0x0120
,
'eight'
);
insert
into
t2
values
(
4
,
_ucs2
0x0563
,
_ucs2
0x0563
,
'ten'
);
insert
into
t2
values
(
4
,
_ucs2
0x05630563
,
_ucs2
0x05630563
,
'eleven'
);
insert
into
t2
values
(
4
,
_ucs2
0x0563001fc0563
,
_ucs2
0x0563001fc0563
,
'point'
);
insert
into
t2
values
(
4
,
_ucs2
0x05612020
,
_ucs2
0x05612020
,
'taken'
);
drop
table
t1
;
drop
table
t2
;
create
table
t1
(
a
int
,
b
varchar
(
10
),
c
varchar
(
10
),
filler
varchar
(
10
),
primary
key
(
a
,
b
(
2
)),
unique
key
(
a
,
c
(
2
))
)
character
set
utf8
engine
=
innodb
;
create
table
t2
(
a
int
,
b
varchar
(
10
),
c
varchar
(
10
),
filler
varchar
(
10
),
primary
key
(
a
,
b
(
2
)),
unique
key
(
a
,
c
(
2
))
)
character
set
ucs2
engine
=
innodb
;
insert
into
t1
values
(
1
,
'abcdefg'
,
'abcdefg'
,
'one'
);
insert
into
t1
values
(
2
,
'ijkilmn'
,
'ijkilmn'
,
'two'
);
insert
into
t1
values
(
3
,
'qrstuvw'
,
'qrstuvw'
,
'three'
);
insert
into
t1
values
(
4
,
_utf8
0xe880bd
,
_utf8
0xe880bd
,
'four'
);
insert
into
t1
values
(
4
,
_utf8
0x5b
,
_utf8
0x5b
,
'five'
);
insert
into
t1
values
(
4
,
_utf8
0xe880bde880bd
,
_utf8
0xe880bde880bd
,
'six'
);
insert
into
t1
values
(
4
,
_utf8
0xe880bdD0B1e880bd
,
_utf8
0xe880bdD0B1e880bd
,
'seven'
);
insert
into
t1
values
(
4
,
_utf8
0xD0B1
,
_utf8
0xD0B1
,
'eight'
);
insert
into
t2
values
(
1
,
'abcdefg'
,
'abcdefg'
,
'one'
);
insert
into
t2
values
(
2
,
'ijkilmn'
,
'ijkilmn'
,
'two'
);
insert
into
t2
values
(
3
,
'qrstuvw'
,
'qrstuvw'
,
'three'
);
insert
into
t2
values
(
4
,
_ucs2
0x00e400
,
_ucs2
0x00e400
,
'four'
);
insert
into
t2
values
(
4
,
_ucs2
0x00640065
,
_ucs2
0x00640065
,
'five'
);
insert
into
t2
values
(
4
,
_ucs2
0x00e400e50068
,
_ucs2
0x00e400e50068
,
'six'
);
insert
into
t2
values
(
4
,
_ucs2
0x01fc
,
_ucs2
0x01fc
,
'seven'
);
insert
into
t2
values
(
4
,
_ucs2
0x0120
,
_ucs2
0x0120
,
'eight'
);
insert
into
t2
values
(
4
,
_ucs2
0x0563
,
_ucs2
0x0563
,
'ten'
);
insert
into
t2
values
(
4
,
_ucs2
0x05630563
,
_ucs2
0x05630563
,
'eleven'
);
insert
into
t2
values
(
4
,
_ucs2
0x0563001fc0563
,
_ucs2
0x0563001fc0563
,
'point'
);
insert
into
t2
values
(
4
,
_ucs2
0x05612020
,
_ucs2
0x05612020
,
'taken'
);
drop
table
t1
;
drop
table
t2
;
create
table
t1
(
a
int
,
b
text
(
10
),
c
text
(
10
),
filler
text
(
10
),
primary
key
(
a
,
b
(
2
)),
unique
key
(
a
,
c
(
2
))
)
character
set
utf8
engine
=
innodb
;
create
table
t2
(
a
int
,
b
text
(
10
),
c
text
(
10
),
filler
text
(
10
),
primary
key
(
a
,
b
(
2
)),
unique
key
(
a
,
c
(
2
))
)
character
set
ucs2
engine
=
innodb
;
insert
into
t1
values
(
1
,
'abcdefg'
,
'abcdefg'
,
'one'
);
insert
into
t1
values
(
2
,
'ijkilmn'
,
'ijkilmn'
,
'two'
);
insert
into
t1
values
(
3
,
'qrstuvw'
,
'qrstuvw'
,
'three'
);
insert
into
t1
values
(
4
,
_utf8
0xe880bd
,
_utf8
0xe880bd
,
'four'
);
insert
into
t1
values
(
4
,
_utf8
0x5b
,
_utf8
0x5b
,
'five'
);
insert
into
t1
values
(
4
,
_utf8
0xe880bde880bd
,
_utf8
0xe880bde880bd
,
'six'
);
insert
into
t1
values
(
4
,
_utf8
0xe880bdD0B1e880bd
,
_utf8
0xe880bdD0B1e880bd
,
'seven'
);
insert
into
t1
values
(
4
,
_utf8
0xD0B1
,
_utf8
0xD0B1
,
'eight'
);
insert
into
t2
values
(
1
,
'abcdefg'
,
'abcdefg'
,
'one'
);
insert
into
t2
values
(
2
,
'ijkilmn'
,
'ijkilmn'
,
'two'
);
insert
into
t2
values
(
3
,
'qrstuvw'
,
'qrstuvw'
,
'three'
);
insert
into
t2
values
(
4
,
_ucs2
0x00e400
,
_ucs2
0x00e400
,
'four'
);
insert
into
t2
values
(
4
,
_ucs2
0x00640065
,
_ucs2
0x00640065
,
'five'
);
insert
into
t2
values
(
4
,
_ucs2
0x00e400e50068
,
_ucs2
0x00e400e50068
,
'six'
);
insert
into
t2
values
(
4
,
_ucs2
0x01fc
,
_ucs2
0x01fc
,
'seven'
);
insert
into
t2
values
(
4
,
_ucs2
0x0120
,
_ucs2
0x0120
,
'eight'
);
insert
into
t2
values
(
4
,
_ucs2
0x0563
,
_ucs2
0x0563
,
'ten'
);
insert
into
t2
values
(
4
,
_ucs2
0x05630563
,
_ucs2
0x05630563
,
'eleven'
);
insert
into
t2
values
(
4
,
_ucs2
0x0563001fc0563
,
_ucs2
0x0563001fc0563
,
'point'
);
insert
into
t2
values
(
4
,
_ucs2
0x05612020
,
_ucs2
0x05612020
,
'taken'
);
drop
table
t1
;
drop
table
t2
;
create
table
t1
(
a
int
,
b
blob
(
10
),
c
blob
(
10
),
filler
blob
(
10
),
primary
key
(
a
,
b
(
2
)),
unique
key
(
a
,
c
(
2
))
)
character
set
utf8
engine
=
innodb
;
create
table
t2
(
a
int
,
b
blob
(
10
),
c
blob
(
10
),
filler
blob
(
10
),
primary
key
(
a
,
b
(
2
)),
unique
key
(
a
,
c
(
2
))
)
character
set
ucs2
engine
=
innodb
;
insert
into
t1
values
(
1
,
'abcdefg'
,
'abcdefg'
,
'one'
);
insert
into
t1
values
(
2
,
'ijkilmn'
,
'ijkilmn'
,
'two'
);
insert
into
t1
values
(
3
,
'qrstuvw'
,
'qrstuvw'
,
'three'
);
insert
into
t1
values
(
4
,
_utf8
0xe880bd
,
_utf8
0xe880bd
,
'four'
);
insert
into
t1
values
(
4
,
_utf8
0x5b
,
_utf8
0x5b
,
'five'
);
insert
into
t1
values
(
4
,
_utf8
0xD0B1
,
_utf8
0xD0B1
,
'eight'
);
insert
into
t2
values
(
1
,
'abcdefg'
,
'abcdefg'
,
'one'
);
insert
into
t2
values
(
2
,
'ijkilmn'
,
'ijkilmn'
,
'two'
);
insert
into
t2
values
(
3
,
'qrstuvw'
,
'qrstuvw'
,
'three'
);
insert
into
t2
values
(
4
,
_ucs2
0x00e400
,
_ucs2
0x00e400
,
'four'
);
insert
into
t2
values
(
4
,
_ucs2
0x00640065
,
_ucs2
0x00640065
,
'five'
);
insert
into
t2
values
(
4
,
_ucs2
0x00e400e50068
,
_ucs2
0x00e400e50068
,
'six'
);
insert
into
t2
values
(
4
,
_ucs2
0x01fc
,
_ucs2
0x01fc
,
'seven'
);
insert
into
t2
values
(
4
,
_ucs2
0x0120
,
_ucs2
0x0120
,
'eight'
);
insert
into
t2
values
(
4
,
_ucs2
0x0563
,
_ucs2
0x0563
,
'ten'
);
insert
into
t2
values
(
4
,
_ucs2
0x05612020
,
_ucs2
0x05612020
,
'taken'
);
drop
table
t1
;
drop
table
t2
;
commit
;
sql/ha_innodb.cc
View file @
0955163b
...
...
@@ -2872,6 +2872,9 @@ ha_innobase::store_key_val_for_row(
ulint
lenlen
;
ulint
len
;
byte
*
data
;
ulint
key_len
;
CHARSET_INFO
*
cs
;
int
error
=
0
;
if
(
is_null
)
{
buff
+=
key_part
->
length
+
2
;
...
...
@@ -2890,8 +2893,20 @@ ha_innobase::store_key_val_for_row(
/* In a column prefix index, we may need to truncate
the stored value: */
if
(
len
>
key_part
->
length
)
{
len
=
key_part
->
length
;
cs
=
key_part
->
field
->
charset
();
if
(
cs
->
mbmaxlen
>
1
&&
key_part
->
length
>
0
)
{
key_len
=
(
ulint
)
cs
->
cset
->
well_formed_len
(
cs
,
(
const
char
*
)
data
,
(
const
char
*
)
data
+
key_part
->
length
,
key_part
->
length
/
cs
->
mbmaxlen
,
&
error
);
}
else
{
key_len
=
key_part
->
length
;
}
if
(
len
>
key_len
)
{
len
=
key_len
;
}
/* The length in a key value is always stored in 2
...
...
@@ -2915,6 +2930,11 @@ ha_innobase::store_key_val_for_row(
||
mysql_type
==
FIELD_TYPE_BLOB
||
mysql_type
==
FIELD_TYPE_LONG_BLOB
)
{
CHARSET_INFO
*
cs
;
ulint
key_len
;
ulint
len
;
int
error
=
0
;
ut_a
(
key_part
->
key_part_flag
&
HA_PART_KEY_SEG
);
if
(
is_null
)
{
...
...
@@ -2935,8 +2955,21 @@ ha_innobase::store_key_val_for_row(
indexes, and we may need to truncate the data to be
stored in the key value: */
if
(
blob_len
>
key_part
->
length
)
{
blob_len
=
key_part
->
length
;
cs
=
key_part
->
field
->
charset
();
if
(
cs
->
mbmaxlen
>
1
&&
key_part
->
length
>
0
)
{
key_len
=
(
ulint
)
cs
->
cset
->
well_formed_len
(
cs
,
(
const
char
*
)
blob_data
,
(
const
char
*
)
blob_data
+
key_part
->
length
,
key_part
->
length
/
cs
->
mbmaxlen
,
&
error
);
}
else
{
key_len
=
key_part
->
length
;
}
if
(
blob_len
>
key_len
)
{
blob_len
=
key_len
;
}
/* MySQL reserves 2 bytes for the length and the
...
...
@@ -2958,15 +2991,40 @@ ha_innobase::store_key_val_for_row(
value we store may be also in a column prefix
index. */
CHARSET_INFO
*
cs
;
ulint
len
;
const
mysql_byte
*
src_start
;
int
error
=
0
;
if
(
is_null
)
{
buff
+=
key_part
->
length
;
continue
;
}
memcpy
(
buff
,
record
+
key_part
->
offset
,
key_part
->
length
);
buff
+=
key_part
->
length
;
cs
=
key_part
->
field
->
charset
();
src_start
=
record
+
key_part
->
offset
;
if
(
key_part
->
length
>
0
&&
cs
->
mbmaxlen
>
1
)
{
len
=
(
ulint
)
cs
->
cset
->
well_formed_len
(
cs
,
src_start
,
src_start
+
key_part
->
length
,
key_part
->
length
/
cs
->
mbmaxlen
,
&
error
);
}
else
{
len
=
key_part
->
length
;
}
memcpy
(
buff
,
src_start
,
len
);
buff
+=
len
;
/* Pad the unused space with spaces */
if
(
len
<
key_part
->
length
)
{
len
=
key_part
->
length
-
len
;
memset
(
buff
,
' '
,
len
);
buff
+=
len
;
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment