Merge neptunus.(none):/home/msvensson/mysql/bug19731/my50-bug19731
into neptunus.(none):/home/msvensson/mysql/bug19731/my51-bug19731 client/mysqltest.c: Auto merged mysql-test/r/mysqltest.result: Auto merged mysql-test/r/varbinary.result: Auto merged mysql-test/t/mysqltest.test: Auto merged sql/field_conv.cc: Auto merged sql/handler.cc: Auto merged
This commit is contained in:
commit
e5bfeab3fd
@ -265,6 +265,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_CHMOD_FILE,
|
||||
|
||||
Q_UNKNOWN, /* Unknown command. */
|
||||
Q_COMMENT, /* Comments, ignored. */
|
||||
@ -345,6 +346,7 @@ const char *command_names[]=
|
||||
"copy_file",
|
||||
"perl",
|
||||
"die",
|
||||
"chmod",
|
||||
0
|
||||
};
|
||||
|
||||
@ -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
|
||||
do_file_exists
|
||||
@ -5604,6 +5648,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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
BIN
mysql-test/std_data/bug19371.MYD
Normal file
BIN
mysql-test/std_data/bug19371.MYD
Normal file
Binary file not shown.
BIN
mysql-test/std_data/bug19371.MYI
Normal file
BIN
mysql-test/std_data/bug19371.MYI
Normal file
Binary file not shown.
BIN
mysql-test/std_data/bug19371.frm
Normal file
BIN
mysql-test/std_data/bug19371.frm
Normal file
Binary file not shown.
@ -1521,6 +1521,45 @@ remove_file $MYSQLTEST_VARDIR/tmp/file2.tmp;
|
||||
--error 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
|
||||
# ----------------------------------------------------------------------------
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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(©->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();
|
||||
@ -569,6 +584,15 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*)
|
||||
// Check if identical fields
|
||||
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.
|
||||
|
@ -2300,6 +2300,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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user