summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <msvensson@neptunus.(none)>2006-11-29 23:09:57 +0100
committerunknown <msvensson@neptunus.(none)>2006-11-29 23:09:57 +0100
commit2b58a8ec48ea5b5cf14798106b1ce6eff9dc787d (patch)
tree7bb763da1c2df6c52aedb8e0e98b75f6b0f415cc
parent6981993e4798009f8ef8072ad18700dde5ba7767 (diff)
parente5bfeab3fd659f37b8363abd32e77d4fe29716f9 (diff)
downloadmariadb-git-2b58a8ec48ea5b5cf14798106b1ce6eff9dc787d.tar.gz
Merge neptunus.(none):/home/msvensson/mysql/bug19731/my51-bug19731
into neptunus.(none):/home/msvensson/mysql/mysql-5.1-maint mysql-test/r/mysqltest.result: Auto merged mysql-test/t/mysqltest.test: Auto merged sql/handler.cc: Auto merged client/mysqltest.c: Manual merge
-rw-r--r--client/mysqltest.c45
-rw-r--r--mysql-test/r/mysqltest.result6
-rw-r--r--mysql-test/r/varbinary.result52
-rw-r--r--mysql-test/std_data/bug19371.MYDbin0 -> 40 bytes
-rw-r--r--mysql-test/std_data/bug19371.MYIbin0 -> 1024 bytes
-rw-r--r--mysql-test/std_data/bug19371.frmbin0 -> 8578 bytes
-rw-r--r--mysql-test/t/mysqltest.test39
-rw-r--r--mysql-test/t/varbinary.test43
-rw-r--r--sql/field_conv.cc24
-rw-r--r--sql/handler.cc4
10 files changed, 213 insertions, 0 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c
index 6871701e691..1d7c3f0575d 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -264,6 +264,7 @@ enum enum_commands {
Q_DISABLE_PARSING, Q_ENABLE_PARSING,
Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST,
Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT,
+ Q_CHMOD_FILE,
Q_UNKNOWN, /* Unknown command. */
Q_COMMENT, /* Comments, ignored. */
@@ -346,6 +347,7 @@ const char *command_names[]=
"die",
/* Don't execute any more commands, compare result */
"exit",
+ "chmod",
0
};
@@ -1754,6 +1756,48 @@ void do_copy_file(struct st_command *command)
/*
SYNOPSIS
+ do_chmod_file
+ command command handle
+
+ DESCRIPTION
+ chmod <octal> <file>
+ Change file permission of <file>
+
+ NOTE! Simplified version, only supports +r, -r, +w, -w
+*/
+
+void do_chmod_file(struct st_command *command)
+{
+ mode_t mode= 0;
+ static DYNAMIC_STRING ds_mode;
+ static DYNAMIC_STRING ds_file;
+ const struct command_arg chmod_file_args[] = {
+ "mode", ARG_STRING, TRUE, &ds_mode, "Mode of file",
+ "file", ARG_STRING, TRUE, &ds_file, "Filename of file to modify"
+ };
+ DBUG_ENTER("do_chmod_file");
+
+ check_command_args(command, command->first_argument,
+ chmod_file_args,
+ sizeof(chmod_file_args)/sizeof(struct command_arg),
+ ' ');
+
+ /* Parse what mode to set */
+ if (ds_mode.length != 4)
+ die("You must write a 4 digit octal number for mode");
+
+ str2int(ds_mode.str, 8, 0, INT_MAX, (long*)&mode);
+
+ DBUG_PRINT("info", ("chmod %o %s", mode, ds_file.str));
+ handle_command_error(command, chmod(ds_file.str, mode));
+ dynstr_free(&ds_mode);
+ dynstr_free(&ds_file);
+ DBUG_VOID_RETURN;
+}
+
+
+/*
+ SYNOPSIS
do_file_exists
command called command
@@ -5624,6 +5668,7 @@ int main(int argc, char **argv)
case Q_FILE_EXIST: do_file_exist(command); break;
case Q_WRITE_FILE: do_write_file(command); break;
case Q_COPY_FILE: do_copy_file(command); break;
+ case Q_CHMOD_FILE: do_chmod_file(command); break;
case Q_PERL: do_perl(command); break;
case Q_DELIMITER:
do_delimiter(command);
diff --git a/mysql-test/r/mysqltest.result b/mysql-test/r/mysqltest.result
index 1cfc482416e..a560b811cce 100644
--- a/mysql-test/r/mysqltest.result
+++ b/mysql-test/r/mysqltest.result
@@ -512,6 +512,12 @@ mysqltest: At line 1: End of line junk detected: "write_file filename ";
mysqltest: At line 1: Missing required argument 'filename' to command 'file_exists'
mysqltest: At line 1: Missing required argument 'from_file' to command 'copy_file'
mysqltest: At line 1: Missing required argument 'to_file' to command 'copy_file'
+mysqltest: At line 1: Missing required argument 'mode' to command 'chmod'
+mysqltest: At line 1: You must write a 4 digit octal number for mode
+mysqltest: At line 1: You must write a 4 digit octal number for mode
+mysqltest: At line 1: Missing required argument 'file' to command 'chmod'
+mysqltest: At line 1: command "chmod" failed with error -1
+mysqltest: At line 1: You must write a 4 digit octal number for mode
hello
hello
hello
diff --git a/mysql-test/r/varbinary.result b/mysql-test/r/varbinary.result
index 1841dc9f0a9..60445c022c6 100644
--- a/mysql-test/r/varbinary.result
+++ b/mysql-test/r/varbinary.result
@@ -26,3 +26,55 @@ select x,xx from t1;
x xx
1 2
drop table t1;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` varbinary(255) default NULL,
+ `b` varchar(255) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+select length(a), length(b) from t1;
+length(a) length(b)
+255 3
+255 3
+CHECK TABLE t1 FOR UPGRADE;
+Table Op Msg_type Msg_text
+test.t1 check error Table upgrade required. Please do "REPAIR TABLE `t1`" to fix it!
+REPAIR TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 repair status OK
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` varbinary(255) default NULL,
+ `b` varchar(255) default NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+select length(a), length(b) from t1;
+length(a) length(b)
+3 3
+3 3
+insert into t1 values("ccc", "ddd");
+select length(a), length(b) from t1;
+length(a) length(b)
+3 3
+3 3
+3 3
+select hex(a), hex(b) from t1;
+hex(a) hex(b)
+616161 636363
+626262 646464
+636363 646464
+select concat("'", a, "'"), concat("'", b, "'") from t1;
+concat("'", a, "'") concat("'", b, "'")
+'aaa' 'ccc'
+'bbb' 'ddd'
+'ccc' 'ddd'
+drop table t1;
+create table t1(a varbinary(255));
+insert into t1 values("aaa ");
+select length(a) from t1;
+length(a)
+6
+alter table t1 modify a varchar(255);
+select length(a) from t1;
+length(a)
+6
diff --git a/mysql-test/std_data/bug19371.MYD b/mysql-test/std_data/bug19371.MYD
new file mode 100644
index 00000000000..1b58a70832f
--- /dev/null
+++ b/mysql-test/std_data/bug19371.MYD
Binary files differ
diff --git a/mysql-test/std_data/bug19371.MYI b/mysql-test/std_data/bug19371.MYI
new file mode 100644
index 00000000000..06ee5b2d766
--- /dev/null
+++ b/mysql-test/std_data/bug19371.MYI
Binary files differ
diff --git a/mysql-test/std_data/bug19371.frm b/mysql-test/std_data/bug19371.frm
new file mode 100644
index 00000000000..7be45d6f8da
--- /dev/null
+++ b/mysql-test/std_data/bug19371.frm
Binary files differ
diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test
index 3c20b38722f..e16c72d4e5e 100644
--- a/mysql-test/t/mysqltest.test
+++ b/mysql-test/t/mysqltest.test
@@ -1522,6 +1522,45 @@ remove_file $MYSQLTEST_VARDIR/tmp/file2.tmp;
--exec echo "copy_file from_file;" | $MYSQL_TEST 2>&1
# ----------------------------------------------------------------------------
+# test for chmod
+# ----------------------------------------------------------------------------
+--write_file $MYSQLTEST_VARDIR/tmp/file1.tmp
+file1
+EOF
+
+chmod 0000 $MYSQLTEST_VARDIR/tmp/file1.tmp;
+# The below write fails, but --error is not implemented
+# for write_file
+#--write_file $MYSQLTEST_VARDIR/tmp/file1.tmp
+#test should fail
+#EOF
+
+chmod 0777 $MYSQLTEST_VARDIR/tmp/file1.tmp;
+--write_file $MYSQLTEST_VARDIR/tmp/file1.tmp
+test2
+EOF
+
+remove_file $MYSQLTEST_VARDIR/tmp/file1.tmp;
+
+--error 1
+--exec echo "chmod ;" | $MYSQL_TEST 2>&1
+
+--error 1
+--exec echo "chmod 0 from_file;" | $MYSQL_TEST 2>&1
+
+--error 1
+--exec echo "chmod 08 from_file;" | $MYSQL_TEST 2>&1
+
+--error 1
+--exec echo "chmod from_file;" | $MYSQL_TEST 2>&1
+
+--error 1
+--exec echo "chmod ABZD from_file;" | $MYSQL_TEST 2>&1
+
+--error 1
+--exec echo "chmod 06789 from_file;" | $MYSQL_TEST 2>&1
+
+# ----------------------------------------------------------------------------
# test for perl
# ----------------------------------------------------------------------------
--perl
diff --git a/mysql-test/t/varbinary.test b/mysql-test/t/varbinary.test
index 5fbd116d7b8..0e45bfb5e1b 100644
--- a/mysql-test/t/varbinary.test
+++ b/mysql-test/t/varbinary.test
@@ -37,3 +37,46 @@ select x,xx from t1;
drop table t1;
# End of 4.1 tests
+
+#
+# Bug #19371 VARBINARY() have trailing zeros after upgrade from 4.1
+#
+
+# Test with a saved table from 4.1
+copy_file std_data/bug19371.frm $MYSQLTEST_VARDIR/master-data/test/t1.frm;
+chmod 0777 $MYSQLTEST_VARDIR/master-data/test/t1.frm;
+copy_file std_data/bug19371.MYD $MYSQLTEST_VARDIR/master-data/test/t1.MYD;
+chmod 0777 $MYSQLTEST_VARDIR/master-data/test/t1.MYD;
+copy_file std_data/bug19371.MYI $MYSQLTEST_VARDIR/master-data/test/t1.MYI;
+chmod 0777 $MYSQLTEST_VARDIR/master-data/test/t1.MYI;
+
+# Everything _looks_ fine
+show create table t1;
+
+# But the length of the varbinary columns are too long
+select length(a), length(b) from t1;
+
+# Run CHECK TABLE, it should indicate table need a REPAIR TABLE
+CHECK TABLE t1 FOR UPGRADE;
+
+# Run REPAIR TABLE to alter the table and repair
+# the varbinary fields
+REPAIR TABLE t1;
+
+# Now check it's back to normal
+show create table t1;
+select length(a), length(b) from t1;
+insert into t1 values("ccc", "ddd");
+select length(a), length(b) from t1;
+select hex(a), hex(b) from t1;
+select concat("'", a, "'"), concat("'", b, "'") from t1;
+
+drop table t1;
+
+# Check that the fix does not affect table created with current version
+create table t1(a varbinary(255));
+insert into t1 values("aaa ");
+select length(a) from t1;
+alter table t1 modify a varchar(255);
+select length(a) from t1;
+
diff --git a/sql/field_conv.cc b/sql/field_conv.cc
index 7bc6c432d1c..593044ce7f0 100644
--- a/sql/field_conv.cc
+++ b/sql/field_conv.cc
@@ -308,6 +308,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();
@@ -570,6 +585,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.
*/
diff --git a/sql/handler.cc b/sql/handler.cc
index f16876f2ffd..1436e6fcef1 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -2304,6 +2304,10 @@ int handler::check_old_types()
{
return HA_ADMIN_NEEDS_ALTER;
}
+ if ((*field)->type() == MYSQL_TYPE_VAR_STRING)
+ {
+ return HA_ADMIN_NEEDS_ALTER;
+ }
}
}
return 0;