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_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[]=
|
|||||||
"copy_file",
|
"copy_file",
|
||||||
"perl",
|
"perl",
|
||||||
"die",
|
"die",
|
||||||
|
"chmod",
|
||||||
0
|
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
|
SYNOPSIS
|
||||||
do_file_exists
|
do_file_exists
|
||||||
@ -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 ";
|
|||||||
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;
|
|||||||
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
|
||||||
|
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
|
--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;
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
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*)
|
|||||||
// 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()
|
|||||||
{
|
{
|
||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user