summaryrefslogtreecommitdiff
path: root/innobase/row/row0sel.c
diff options
context:
space:
mode:
authorunknown <marko@hundin.mysql.fi>2005-02-17 18:40:45 +0200
committerunknown <marko@hundin.mysql.fi>2005-02-17 18:40:45 +0200
commitd0dbd41a3bf8ba665689f85891267daed1c25787 (patch)
treef1476a2bcaddc0404258056096a6d640d5afb132 /innobase/row/row0sel.c
parent6075463f0342c0bf178c40dd7f9ecdeb7d5c8235 (diff)
downloadmariadb-git-d0dbd41a3bf8ba665689f85891267daed1c25787.tar.gz
After review fixes (Bug #5682)
innobase/include/data0type.ic: dtype_get_fixed_size(), dtype_get_min_size(): Do not check prtype, mbminlen and mbmaxlen for types other than DATA_MYSQL, as that is the only type that can hold fixed-length strings of variable-length objects (UTF-8 encoded characters). innobase/row/row0sel.c: row_sel_field_store_in_mysql_format(): Document which fields of templ will be used. Add 0x20 padding only to DATA_MYSQL fields. Change related debug assertions to real assertions for now, until 5.0 becomes generally available. Check with assertion that all data types handled in the catch-all branch are appropriate.
Diffstat (limited to 'innobase/row/row0sel.c')
-rw-r--r--innobase/row/row0sel.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/innobase/row/row0sel.c b/innobase/row/row0sel.c
index 84a160cfc0d..22cece487a0 100644
--- a/innobase/row/row0sel.c
+++ b/innobase/row/row0sel.c
@@ -2233,7 +2233,9 @@ row_sel_field_store_in_mysql_format(
are not in themselves stored here: the caller must
allocate and copy the BLOB into buffer before, and pass
the pointer to the BLOB in 'data' */
- const mysql_row_templ_t* templ, /* in: MySQL column template */
+ const mysql_row_templ_t* templ, /* in: MySQL column template.
+ Its following fields are referenced:
+ type, is_unsigned, mysql_col_len, mbminlen, mbmaxlen */
byte* data, /* in: data to store */
ulint len) /* in: length of the data */
{
@@ -2280,16 +2282,17 @@ row_sel_field_store_in_mysql_format(
row_mysql_store_blob_ref(dest, templ->mysql_col_len,
data, len);
- } else {
+ } else if (templ->type == DATA_MYSQL) {
memcpy(dest, data, len);
- ut_ad(templ->mysql_col_len >= len);
- ut_ad(templ->mbmaxlen >= templ->mbminlen);
+ ut_a(templ->mysql_col_len >= len);
+ ut_a(templ->mbmaxlen >= templ->mbminlen);
- ut_ad(templ->mbmaxlen > templ->mbminlen
+ ut_a(templ->mbmaxlen > templ->mbminlen
|| templ->mysql_col_len == len);
- ut_ad(!templ->mbmaxlen
+ ut_a(!templ->mbmaxlen
|| !(templ->mysql_col_len % templ->mbmaxlen));
+ ut_a(len * templ->mbmaxlen >= templ->mysql_col_len);
if (templ->mbminlen != templ->mbmaxlen) {
/* Pad with spaces. This undoes the stripping
@@ -2297,6 +2300,16 @@ row_sel_field_store_in_mysql_format(
row_mysql_store_col_in_innobase_format(). */
memset(dest + len, 0x20, templ->mysql_col_len - len);
}
+ } else {
+ ut_a(templ->type == DATA_CHAR
+ || templ->type == DATA_FIXBINARY
+ /*|| templ->type == DATA_SYS_CHILD
+ || templ->type == DATA_SYS*/
+ || templ->type == DATA_FLOAT
+ || templ->type == DATA_DOUBLE
+ || templ->type == DATA_DECIMAL);
+ ut_ad(templ->mysql_col_len == len);
+ memcpy(dest, data, len);
}
}