Commit a50f8063 authored by msvensson@neptunus.(none)'s avatar msvensson@neptunus.(none)

Merge neptunus.(none):/home/msvensson/mysql/bug19731/my50-bug19731

into  neptunus.(none):/home/msvensson/mysql/bug19731/my51-bug19731
parents e32b743f 68724b3a
...@@ -265,6 +265,7 @@ enum enum_commands { ...@@ -265,6 +265,7 @@ enum enum_commands {
Q_DISABLE_PARSING, Q_ENABLE_PARSING, Q_DISABLE_PARSING, Q_ENABLE_PARSING,
Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST, Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST,
Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE,
Q_CHMOD_FILE,
Q_UNKNOWN, /* Unknown command. */ Q_UNKNOWN, /* Unknown command. */
Q_COMMENT, /* Comments, ignored. */ Q_COMMENT, /* Comments, ignored. */
...@@ -345,6 +346,7 @@ const char *command_names[]= ...@@ -345,6 +346,7 @@ const char *command_names[]=
"copy_file", "copy_file",
"perl", "perl",
"die", "die",
"chmod",
0 0
}; };
...@@ -1751,6 +1753,48 @@ void do_copy_file(struct st_command *command) ...@@ -1751,6 +1753,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;
DYNAMIC_STRING ds_mode;
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 SYNOPSIS
do_file_exists do_file_exists
...@@ -5604,6 +5648,7 @@ int main(int argc, char **argv) ...@@ -5604,6 +5648,7 @@ int main(int argc, char **argv)
case Q_FILE_EXIST: do_file_exist(command); break; case Q_FILE_EXIST: do_file_exist(command); break;
case Q_WRITE_FILE: do_write_file(command); break; case Q_WRITE_FILE: do_write_file(command); break;
case Q_COPY_FILE: do_copy_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_PERL: do_perl(command); break;
case Q_DELIMITER: case Q_DELIMITER:
do_delimiter(command); do_delimiter(command);
......
...@@ -512,6 +512,12 @@ mysqltest: At line 1: End of line junk detected: "write_file filename "; ...@@ -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 '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 '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 '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 hello
hello hello
......
...@@ -26,3 +26,55 @@ select x,xx from t1; ...@@ -26,3 +26,55 @@ select x,xx from t1;
x xx x xx
1 2 1 2
drop table t1; 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
...@@ -1521,6 +1521,45 @@ remove_file $MYSQLTEST_VARDIR/tmp/file2.tmp; ...@@ -1521,6 +1521,45 @@ remove_file $MYSQLTEST_VARDIR/tmp/file2.tmp;
--error 1 --error 1
--exec echo "copy_file from_file;" | $MYSQL_TEST 2>&1 --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 # test for perl
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
......
...@@ -37,3 +37,46 @@ select x,xx from t1; ...@@ -37,3 +37,46 @@ select x,xx from t1;
drop table t1; drop table t1;
# End of 4.1 tests # 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;
...@@ -308,6 +308,21 @@ static void do_field_string(Copy_field *copy) ...@@ -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) static void do_field_int(Copy_field *copy)
{ {
longlong value= copy->from_field->val_int(); longlong value= copy->from_field->val_int();
...@@ -569,6 +584,15 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*) ...@@ -569,6 +584,15 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*)
// Check if identical fields // Check if identical fields
if (from->result_type() == STRING_RESULT) 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 are copying date or datetime's we have to check the dates
if we don't allow 'all' dates. if we don't allow 'all' dates.
......
...@@ -2300,6 +2300,10 @@ int handler::check_old_types() ...@@ -2300,6 +2300,10 @@ int handler::check_old_types()
{ {
return HA_ADMIN_NEEDS_ALTER; return HA_ADMIN_NEEDS_ALTER;
} }
if ((*field)->type() == MYSQL_TYPE_VAR_STRING)
{
return HA_ADMIN_NEEDS_ALTER;
}
} }
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment