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
33b4154c
Commit
33b4154c
authored
Oct 19, 2005
by
unknown
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
723b28a2
Changes
6
Hide 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 @
33b4154c
...
...
@@ -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 @
33b4154c
...
...
@@ -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 @
33b4154c
...
...
@@ -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 @
33b4154c
...
...
@@ -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 @
33b4154c
...
...
@@ -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 @
33b4154c
...
...
@@ -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