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
79aa9c17
Commit
79aa9c17
authored
Aug 10, 2011
by
Marko Mäkelä
Browse files
Options
Browse Files
Download
Plain Diff
Merge mysql-5.1 to mysql-5.5.
parents
5962cadc
7645c5ee
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
64 additions
and
24 deletions
+64
-24
storage/innobase/row/row0sel.c
storage/innobase/row/row0sel.c
+64
-24
No files found.
storage/innobase/row/row0sel.c
View file @
79aa9c17
...
...
@@ -2541,6 +2541,8 @@ row_sel_field_store_in_mysql_format(
ut_ad
(
len
!=
UNIV_SQL_NULL
);
UNIV_MEM_ASSERT_RW
(
data
,
len
);
UNIV_MEM_ASSERT_W
(
dest
,
templ
->
mysql_col_len
);
UNIV_MEM_INVALID
(
dest
,
templ
->
mysql_col_len
);
switch
(
templ
->
type
)
{
const
byte
*
field_end
;
...
...
@@ -2579,14 +2581,16 @@ row_sel_field_store_in_mysql_format(
dest
=
row_mysql_store_true_var_len
(
dest
,
len
,
templ
->
mysql_length_bytes
);
/* Copy the actual data. Leave the rest of the
buffer uninitialized. */
memcpy
(
dest
,
data
,
len
);
break
;
}
/* Copy the actual data */
ut_memcpy
(
dest
,
data
,
len
);
/* Pad with trailing spaces. We pad with spaces also the
unused end of a >= 5.0.3 true VARCHAR column, just in case
MySQL expects its contents to be deterministic. */
/* Pad with trailing spaces. */
pad
=
dest
+
len
;
...
...
@@ -3112,6 +3116,39 @@ sel_restore_position_for_mysql(
return
(
TRUE
);
}
/********************************************************************//**
Copies a cached field for MySQL from the fetch cache. */
static
void
row_sel_copy_cached_field_for_mysql
(
/*================================*/
byte
*
buf
,
/*!< in/out: row buffer */
const
byte
*
cache
,
/*!< in: cached row */
const
mysql_row_templ_t
*
templ
)
/*!< in: column template */
{
ulint
len
;
buf
+=
templ
->
mysql_col_offset
;
cache
+=
templ
->
mysql_col_offset
;
UNIV_MEM_ASSERT_W
(
buf
,
templ
->
mysql_col_len
);
if
(
templ
->
mysql_type
==
DATA_MYSQL_TRUE_VARCHAR
&&
templ
->
type
!=
DATA_INT
)
{
/* Check for != DATA_INT to make sure we do
not treat MySQL ENUM or SET as a true VARCHAR!
Find the actual length of the true VARCHAR field. */
row_mysql_read_true_varchar
(
&
len
,
cache
,
templ
->
mysql_length_bytes
);
len
+=
templ
->
mysql_length_bytes
;
UNIV_MEM_INVALID
(
buf
,
templ
->
mysql_col_len
);
}
else
{
len
=
templ
->
mysql_col_len
;
}
ut_memcpy
(
buf
,
cache
,
len
);
}
/********************************************************************//**
Pops a cached row for MySQL from the fetch cache. */
UNIV_INLINE
...
...
@@ -3124,26 +3161,22 @@ row_sel_pop_cached_row_for_mysql(
{
ulint
i
;
const
mysql_row_templ_t
*
templ
;
byte
*
cached_rec
;
const
byte
*
cached_rec
;
ut_ad
(
prebuilt
->
n_fetch_cached
>
0
);
ut_ad
(
prebuilt
->
mysql_prefix_len
<=
prebuilt
->
mysql_row_len
);
UNIV_MEM_ASSERT_W
(
buf
,
prebuilt
->
mysql_row_len
);
cached_rec
=
prebuilt
->
fetch_cache
[
prebuilt
->
fetch_cache_first
];
if
(
UNIV_UNLIKELY
(
prebuilt
->
keep_other_fields_on_keyread
))
{
/* Copy cache record field by field, don't touch fields that
are not covered by current key */
cached_rec
=
prebuilt
->
fetch_cache
[
prebuilt
->
fetch_cache_first
];
for
(
i
=
0
;
i
<
prebuilt
->
n_template
;
i
++
)
{
templ
=
prebuilt
->
mysql_template
+
i
;
#if 0 /* Some of the cached_rec may legitimately be uninitialized. */
UNIV_MEM_ASSERT_RW(cached_rec
+ templ->mysql_col_offset,
templ->mysql_col_len);
#endif
ut_memcpy
(
buf
+
templ
->
mysql_col_offset
,
cached_rec
+
templ
->
mysql_col_offset
,
templ
->
mysql_col_len
);
row_sel_copy_cached_field_for_mysql
(
buf
,
cached_rec
,
templ
);
/* Copy NULL bit of the current field from cached_rec
to buf */
if
(
templ
->
mysql_null_bit_mask
)
{
...
...
@@ -3153,17 +3186,24 @@ row_sel_pop_cached_row_for_mysql(
&
(
byte
)
templ
->
mysql_null_bit_mask
;
}
}
}
else
if
(
prebuilt
->
mysql_prefix_len
>
63
)
{
/* The record is long. Copy it field by field, in case
there are some long VARCHAR column of which only a
small length is being used. */
UNIV_MEM_INVALID
(
buf
,
prebuilt
->
mysql_prefix_len
);
/* First copy the NULL bits. */
ut_memcpy
(
buf
,
cached_rec
,
prebuilt
->
null_bitmap_len
);
/* Then copy the requested fields. */
for
(
i
=
0
;
i
<
prebuilt
->
n_template
;
i
++
)
{
row_sel_copy_cached_field_for_mysql
(
buf
,
cached_rec
,
prebuilt
->
mysql_template
+
i
);
}
}
else
{
ut_memcpy
(
buf
,
cached_rec
,
prebuilt
->
mysql_prefix_len
);
}
else
{
#if 0 /* Some of the cached_rec may legitimately be uninitialized. */
UNIV_MEM_ASSERT_RW(prebuilt->fetch_cache
[prebuilt->fetch_cache_first],
prebuilt->mysql_prefix_len);
#endif
ut_memcpy
(
buf
,
prebuilt
->
fetch_cache
[
prebuilt
->
fetch_cache_first
],
prebuilt
->
mysql_prefix_len
);
}
prebuilt
->
n_fetch_cached
--
;
prebuilt
->
fetch_cache_first
++
;
...
...
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