summaryrefslogtreecommitdiff
path: root/sql/field_conv.cc
diff options
context:
space:
mode:
authorunknown <msvensson@neptunus.(none)>2006-11-09 12:00:27 +0100
committerunknown <msvensson@neptunus.(none)>2006-11-09 12:00:27 +0100
commitf90f1e306fe1b25fabfecc0e64875dd9109b2a20 (patch)
tree540cc2c5d9520784cfc4ef10ec0ae543e79f4550 /sql/field_conv.cc
parentc2699e1a62a3c0df1a386111e2852ca11fef6fd8 (diff)
downloadmariadb-git-f90f1e306fe1b25fabfecc0e64875dd9109b2a20.tar.gz
Bug#19371 VARBINARY() have trailing zeros after upgrade from 4.1
- Detect if a table has field of type MYSQL_TYPE_VAR_STRING while running "CHECK TABLE t FOR UPGRADE" and indicate it need to be fixed with "REPAIR TABLE t". - When running a "REPAIR TABLE t" or "ALTER TABLE t FORCE" on the above table, install a special copy function to trim off the trailing spaces which we safely can say that the pre 5.0 mysqld didn't put there. mysql-test/r/varbinary.result: Add test to see that a table with varbinary from 4.1 can be REPAIRED mysql-test/t/varbinary.test: Add test to see that a table with varbinary from 4.1 can be REPAIRED sql/field_conv.cc: Add new field copy function 'do_field_varbinary_pre50' used for copying between MYSQL_TYPE_VAR_STRING and MYSQL_TYPE_VARCHAR. It will remove trailing spaces from the field as MySQL <= 4.1 never stores the trailing spaces for a MYSQL_TYPE_VAR_STRING. Install this new copy function in ALTER TABLEs list of functions to use for copying data during and alter if from field is a <= 4.1 varbinary and to field is 5.0 varbinary. sql/handler.cc: If the table has a pre 5.0 varbinary, table not to be altered so the field type is upgraded to 5.0 version and trailing space can be trimmed. mysql-test/std_data/bug19371.MYD: New BitKeeper file ``mysql-test/std_data/bug19371.MYD'' mysql-test/std_data/bug19371.MYI: New BitKeeper file ``mysql-test/std_data/bug19371.MYI'' mysql-test/std_data/bug19371.frm: New BitKeeper file ``mysql-test/std_data/bug19371.frm''
Diffstat (limited to 'sql/field_conv.cc')
-rw-r--r--sql/field_conv.cc24
1 files changed, 24 insertions, 0 deletions
diff --git a/sql/field_conv.cc b/sql/field_conv.cc
index 95ff985376d..3286695d733 100644
--- a/sql/field_conv.cc
+++ b/sql/field_conv.cc
@@ -309,6 +309,21 @@ static void do_field_string(Copy_field *copy)
}
+static void do_field_varbinary_pre50(Copy_field *copy)
+{
+ char buff[MAX_FIELD_WIDTH];
+ copy->tmp.set_quick(buff,sizeof(buff),copy->tmp.charset());
+ copy->from_field->val_str(&copy->tmp);
+
+ /* Use the same function as in 4.1 to trim trailing spaces */
+ uint length= my_lengthsp_8bit(&my_charset_bin, copy->tmp.c_ptr_quick(),
+ copy->from_field->field_length);
+
+ copy->to_field->store(copy->tmp.c_ptr_quick(), length,
+ copy->tmp.charset());
+}
+
+
static void do_field_int(Copy_field *copy)
{
longlong value= copy->from_field->val_int();
@@ -571,6 +586,15 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*)
if (from->result_type() == STRING_RESULT)
{
/*
+ Detect copy from pre 5.0 varbinary to varbinary as of 5.0 and
+ use special copy function that removes trailing spaces and thus
+ repairs data.
+ */
+ if (from->type() == MYSQL_TYPE_VAR_STRING && !from->has_charset() &&
+ to->type() == MYSQL_TYPE_VARCHAR && !to->has_charset())
+ return do_field_varbinary_pre50;
+
+ /*
If we are copying date or datetime's we have to check the dates
if we don't allow 'all' dates.
*/