mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge bk-internal.mysql.com:/home/bk/mysql-5.0-maint
into zippy.cornsilk.net:/home/cmiller/work/mysql/mysql-5.0-maint
This commit is contained in:
@ -456,7 +456,11 @@ static int run_query(const char *query, DYNAMIC_STRING *ds_res,
|
|||||||
|
|
||||||
if (my_write(fd, query, strlen(query),
|
if (my_write(fd, query, strlen(query),
|
||||||
MYF(MY_FNABP | MY_WME)))
|
MYF(MY_FNABP | MY_WME)))
|
||||||
|
{
|
||||||
|
my_close(fd, MYF(0));
|
||||||
|
my_delete(query_file_path, MYF(0));
|
||||||
die("Failed to write to '%s'", query_file_path);
|
die("Failed to write to '%s'", query_file_path);
|
||||||
|
}
|
||||||
|
|
||||||
ret= run_tool(mysql_path,
|
ret= run_tool(mysql_path,
|
||||||
ds_res,
|
ds_res,
|
||||||
|
@ -1580,10 +1580,21 @@ void check_result(DYNAMIC_STRING* ds)
|
|||||||
and then show the diff
|
and then show the diff
|
||||||
*/
|
*/
|
||||||
char reject_file[FN_REFLEN];
|
char reject_file[FN_REFLEN];
|
||||||
str_to_file(fn_format(reject_file, result_file_name, opt_logdir, ".reject",
|
dirname_part(reject_file, result_file_name);
|
||||||
*opt_logdir ? MY_REPLACE_DIR | MY_REPLACE_EXT :
|
|
||||||
MY_REPLACE_EXT),
|
if (access(reject_file, W_OK) == 0)
|
||||||
ds->str, ds->length);
|
{
|
||||||
|
/* Result file directory is writable, save reject file there */
|
||||||
|
fn_format(reject_file, result_file_name, NULL,
|
||||||
|
".reject", MY_REPLACE_EXT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Put reject file in opt_logdir */
|
||||||
|
fn_format(reject_file, result_file_name, opt_logdir,
|
||||||
|
".reject", MY_REPLACE_DIR | MY_REPLACE_EXT);
|
||||||
|
}
|
||||||
|
str_to_file(reject_file, ds->str, ds->length);
|
||||||
|
|
||||||
dynstr_set(ds, NULL); /* Don't create a .log file */
|
dynstr_set(ds, NULL); /* Don't create a .log file */
|
||||||
|
|
||||||
|
@ -167,6 +167,7 @@ int main(int argc, char *argv[])
|
|||||||
DBUG_ENTER("main");
|
DBUG_ENTER("main");
|
||||||
|
|
||||||
charsets_dir= DEFAULT_CHARSET_DIR;
|
charsets_dir= DEFAULT_CHARSET_DIR;
|
||||||
|
my_umask_dir= 0777;
|
||||||
if (get_options(&argc, &argv))
|
if (get_options(&argc, &argv))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
if (!(row_count= parse_input_file(TXTFILE, &error_head, &lang_head)))
|
if (!(row_count= parse_input_file(TXTFILE, &error_head, &lang_head)))
|
||||||
|
@ -27,6 +27,26 @@ sub collect_one_test_case ($$$$$$$);
|
|||||||
|
|
||||||
sub mtr_options_from_test_file($$);
|
sub mtr_options_from_test_file($$);
|
||||||
|
|
||||||
|
my $do_test;
|
||||||
|
my $skip_test;
|
||||||
|
|
||||||
|
sub init_pattern {
|
||||||
|
my ($from, $what)= @_;
|
||||||
|
if ( $from =~ /[a-z0-9]/ ) {
|
||||||
|
# Does not contain any regex, make the pattern match
|
||||||
|
# beginning of string
|
||||||
|
$from= "^$from";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
# Check that pattern is a valid regex
|
||||||
|
eval { "" =~/$from/; 1 } or
|
||||||
|
mtr_error("Invalid regex '$from' passed to $what\nPerl says: $@");
|
||||||
|
}
|
||||||
|
return $from;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
#
|
#
|
||||||
# Collect information about test cases we are to run
|
# Collect information about test cases we are to run
|
||||||
@ -39,6 +59,9 @@ sub collect_test_cases ($) {
|
|||||||
my $testdir;
|
my $testdir;
|
||||||
my $resdir;
|
my $resdir;
|
||||||
|
|
||||||
|
$do_test= init_pattern($::opt_do_test, "--do-test");
|
||||||
|
$skip_test= init_pattern($::opt_skip_test, "--skip-test");
|
||||||
|
|
||||||
if ( $suite eq "main" )
|
if ( $suite eq "main" )
|
||||||
{
|
{
|
||||||
$testdir= "$::glob_mysql_test_dir/t";
|
$testdir= "$::glob_mysql_test_dir/t";
|
||||||
@ -162,8 +185,7 @@ sub collect_test_cases ($) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Skip tests that does not match the --do-test= filter
|
# Skip tests that does not match the --do-test= filter
|
||||||
next if $::opt_do_test and
|
next if ($do_test and not $tname =~ /$do_test/o);
|
||||||
! defined mtr_match_prefix($elem,$::opt_do_test);
|
|
||||||
|
|
||||||
collect_one_test_case($testdir,$resdir,$tname,$elem,$cases,\%disabled,
|
collect_one_test_case($testdir,$resdir,$tname,$elem,$cases,\%disabled,
|
||||||
$component_id);
|
$component_id);
|
||||||
@ -288,7 +310,7 @@ sub collect_one_test_case($$$$$$$) {
|
|||||||
# Skip some tests but include in list, just mark them to skip
|
# Skip some tests but include in list, just mark them to skip
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
if ( $::opt_skip_test and defined mtr_match_prefix($tname,$::opt_skip_test) )
|
if ( $skip_test and $tname =~ /$skip_test/o )
|
||||||
{
|
{
|
||||||
$tinfo->{'skip'}= 1;
|
$tinfo->{'skip'}= 1;
|
||||||
return;
|
return;
|
||||||
|
@ -1334,12 +1334,13 @@ sub datadir_list_setup () {
|
|||||||
|
|
||||||
sub collect_mysqld_features () {
|
sub collect_mysqld_features () {
|
||||||
my $found_variable_list_start= 0;
|
my $found_variable_list_start= 0;
|
||||||
|
my $tmpdir= tempdir(CLEANUP => 0); # Directory removed by this function
|
||||||
|
|
||||||
#
|
#
|
||||||
# Execute "mysqld --no-defaults --help --verbose" to get a
|
# Execute "mysqld --no-defaults --help --verbose" to get a
|
||||||
# list of all features and settings
|
# list of all features and settings
|
||||||
#
|
#
|
||||||
my $list= `$exe_mysqld --no-defaults --verbose --help`;
|
my $list= `$exe_mysqld --no-defaults --datadir=$tmpdir --verbose --help`;
|
||||||
|
|
||||||
foreach my $line (split('\n', $list))
|
foreach my $line (split('\n', $list))
|
||||||
{
|
{
|
||||||
@ -1394,7 +1395,7 @@ sub collect_mysqld_features () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rmtree($tmpdir);
|
||||||
mtr_error("Could not find version of MySQL") unless $mysql_version_id;
|
mtr_error("Could not find version of MySQL") unless $mysql_version_id;
|
||||||
mtr_error("Could not find variabes list") unless $found_variable_list_start;
|
mtr_error("Could not find variabes list") unless $found_variable_list_start;
|
||||||
|
|
||||||
@ -5006,7 +5007,7 @@ sub valgrind_arguments {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Add valgrind options, can be overriden by user
|
# Add valgrind options, can be overriden by user
|
||||||
mtr_add_arg($args, '%s', $_) for (split(' ', $opt_valgrind_options));
|
mtr_add_arg($args, '%s', $opt_valgrind_options);
|
||||||
|
|
||||||
mtr_add_arg($args, $$exe);
|
mtr_add_arg($args, $$exe);
|
||||||
|
|
||||||
@ -5079,12 +5080,16 @@ Options to control what test suites or cases to run
|
|||||||
skip-ndb[cluster] Skip all tests that need cluster
|
skip-ndb[cluster] Skip all tests that need cluster
|
||||||
skip-ndb[cluster]-slave Skip all tests that need a slave cluster
|
skip-ndb[cluster]-slave Skip all tests that need a slave cluster
|
||||||
ndb-extra Run extra tests from ndb directory
|
ndb-extra Run extra tests from ndb directory
|
||||||
do-test=PREFIX Run test cases which name are prefixed with PREFIX
|
do-test=PREFIX or REGEX
|
||||||
|
Run test cases which name are prefixed with PREFIX
|
||||||
|
or fulfills REGEX
|
||||||
|
skip-test=PREFIX or REGEX
|
||||||
|
Skip test cases which name are prefixed with PREFIX
|
||||||
|
or fulfills REGEX
|
||||||
start-from=PREFIX Run test cases starting from test prefixed with PREFIX
|
start-from=PREFIX Run test cases starting from test prefixed with PREFIX
|
||||||
suite=NAME Run the test suite named NAME. The default is "main"
|
suite=NAME Run the test suite named NAME. The default is "main"
|
||||||
skip-rpl Skip the replication test cases.
|
skip-rpl Skip the replication test cases.
|
||||||
skip-im Don't start IM, and skip the IM test cases
|
skip-im Don't start IM, and skip the IM test cases
|
||||||
skip-test=PREFIX Skip test cases which name are prefixed with PREFIX
|
|
||||||
big-test Set the environment variable BIG_TEST, which can be
|
big-test Set the environment variable BIG_TEST, which can be
|
||||||
checked from test cases.
|
checked from test cases.
|
||||||
|
|
||||||
|
@ -1121,6 +1121,9 @@ SELECT * FROM test.t1;
|
|||||||
f1 f2
|
f1 f2
|
||||||
1 1
|
1 1
|
||||||
2 2
|
2 2
|
||||||
|
REVOKE UPDATE (f1) ON `test`.`t1` FROM 'mysqltest_1'@'localhost';
|
||||||
|
REVOKE SELECT ON `test`.* FROM 'mysqltest_1'@'localhost';
|
||||||
|
REVOKE ALL ON db27878.* FROM 'mysqltest_1'@'localhost';
|
||||||
DROP DATABASE db27878;
|
DROP DATABASE db27878;
|
||||||
use test;
|
use test;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -16,3 +16,125 @@ delete from mysql.db where user like 'mysqltest\_%';
|
|||||||
delete from mysql.tables_priv where user like 'mysqltest\_%';
|
delete from mysql.tables_priv where user like 'mysqltest\_%';
|
||||||
delete from mysql.columns_priv where user like 'mysqltest\_%';
|
delete from mysql.columns_priv where user like 'mysqltest\_%';
|
||||||
flush privileges;
|
flush privileges;
|
||||||
|
grant select on test.* to CUser@localhost;
|
||||||
|
grant select on test.* to CUser@LOCALHOST;
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser LOCALHOST
|
||||||
|
CUser localhost
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||||
|
user host db select_priv
|
||||||
|
CUser LOCALHOST test Y
|
||||||
|
CUser localhost test Y
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser LOCALHOST
|
||||||
|
CUser localhost
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||||
|
user host db select_priv
|
||||||
|
CUser localhost test Y
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser LOCALHOST
|
||||||
|
CUser localhost
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||||
|
user host db select_priv
|
||||||
|
DROP USER CUser@localhost;
|
||||||
|
DROP USER CUser@LOCALHOST;
|
||||||
|
create table t1 (a int);
|
||||||
|
grant select on test.t1 to CUser@localhost;
|
||||||
|
grant select on test.t1 to CUser@LOCALHOST;
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser LOCALHOST
|
||||||
|
CUser localhost
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
user host db Table_name Table_priv Column_priv
|
||||||
|
CUser LOCALHOST test t1 Select
|
||||||
|
CUser localhost test t1 Select
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser LOCALHOST
|
||||||
|
CUser localhost
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
user host db Table_name Table_priv Column_priv
|
||||||
|
CUser localhost test t1 Select
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser LOCALHOST
|
||||||
|
CUser localhost
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
user host db Table_name Table_priv Column_priv
|
||||||
|
DROP USER CUser@localhost;
|
||||||
|
DROP USER CUser@LOCALHOST;
|
||||||
|
grant select(a) on test.t1 to CUser@localhost;
|
||||||
|
grant select(a) on test.t1 to CUser@LOCALHOST;
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser LOCALHOST
|
||||||
|
CUser localhost
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
user host db Table_name Table_priv Column_priv
|
||||||
|
CUser LOCALHOST test t1 Select
|
||||||
|
CUser localhost test t1 Select
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser LOCALHOST
|
||||||
|
CUser localhost
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
user host db Table_name Table_priv Column_priv
|
||||||
|
CUser localhost test t1 Select
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser LOCALHOST
|
||||||
|
CUser localhost
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
user host db Table_name Table_priv Column_priv
|
||||||
|
DROP USER CUser@localhost;
|
||||||
|
DROP USER CUser@LOCALHOST;
|
||||||
|
drop table t1;
|
||||||
|
grant select on test.* to CUser2@localhost;
|
||||||
|
grant select on test.* to CUser2@LOCALHOST;
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser2 LOCALHOST
|
||||||
|
CUser2 localhost
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||||
|
user host db select_priv
|
||||||
|
CUser2 LOCALHOST test Y
|
||||||
|
CUser2 localhost test Y
|
||||||
|
REVOKE SELECT ON test.* FROM 'CUser2'@'LOCALHOST';
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser2 LOCALHOST
|
||||||
|
CUser2 localhost
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||||
|
user host db select_priv
|
||||||
|
CUser2 localhost test Y
|
||||||
|
REVOKE SELECT ON test.* FROM 'CUser2'@'localhost';
|
||||||
|
flush privileges;
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||||
|
user host
|
||||||
|
CUser2 LOCALHOST
|
||||||
|
CUser2 localhost
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||||
|
user host db select_priv
|
||||||
|
DROP USER CUser2@localhost;
|
||||||
|
DROP USER CUser2@LOCALHOST;
|
||||||
|
@ -427,3 +427,26 @@ f1
|
|||||||
Warnings:
|
Warnings:
|
||||||
Warning 1292 Incorrect datetime value: '2007010100000' for column 'f1' at row 1
|
Warning 1292 Incorrect datetime value: '2007010100000' for column 'f1' at row 1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 (f1 time);
|
||||||
|
insert into t1 set f1 = '45:44:44';
|
||||||
|
insert into t1 set f1 = '15:44:44';
|
||||||
|
select * from t1 where (convert(f1,datetime)) != 1;
|
||||||
|
f1
|
||||||
|
15:44:44
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect datetime value: '0000-00-00 45:44:44'
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (a tinyint);
|
||||||
|
insert into t1 values (), (), ();
|
||||||
|
select sum(a) from t1 group by convert(a, datetime);
|
||||||
|
sum(a)
|
||||||
|
NULL
|
||||||
|
select convert(a, datetime) from t1;
|
||||||
|
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||||
|
def convert(a, datetime) 12 29 0 Y 128 6 63
|
||||||
|
convert(a, datetime)
|
||||||
|
NULL
|
||||||
|
NULL
|
||||||
|
NULL
|
||||||
|
drop table t1;
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -1144,6 +1144,9 @@ UPDATE v1 SET f2 = 4;
|
|||||||
SELECT * FROM test.t1;
|
SELECT * FROM test.t1;
|
||||||
disconnect user1;
|
disconnect user1;
|
||||||
connection default;
|
connection default;
|
||||||
|
REVOKE UPDATE (f1) ON `test`.`t1` FROM 'mysqltest_1'@'localhost';
|
||||||
|
REVOKE SELECT ON `test`.* FROM 'mysqltest_1'@'localhost';
|
||||||
|
REVOKE ALL ON db27878.* FROM 'mysqltest_1'@'localhost';
|
||||||
DROP DATABASE db27878;
|
DROP DATABASE db27878;
|
||||||
use test;
|
use test;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -34,3 +34,103 @@ delete from mysql.db where user like 'mysqltest\_%';
|
|||||||
delete from mysql.tables_priv where user like 'mysqltest\_%';
|
delete from mysql.tables_priv where user like 'mysqltest\_%';
|
||||||
delete from mysql.columns_priv where user like 'mysqltest\_%';
|
delete from mysql.columns_priv where user like 'mysqltest\_%';
|
||||||
flush privileges;
|
flush privileges;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug: #19828 Case sensitivity in Grant/Revoke
|
||||||
|
#
|
||||||
|
|
||||||
|
grant select on test.* to CUser@localhost;
|
||||||
|
grant select on test.* to CUser@LOCALHOST;
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||||
|
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||||
|
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||||
|
|
||||||
|
DROP USER CUser@localhost;
|
||||||
|
DROP USER CUser@LOCALHOST;
|
||||||
|
|
||||||
|
#### table grants
|
||||||
|
create table t1 (a int);
|
||||||
|
grant select on test.t1 to CUser@localhost;
|
||||||
|
grant select on test.t1 to CUser@LOCALHOST;
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
|
||||||
|
DROP USER CUser@localhost;
|
||||||
|
DROP USER CUser@LOCALHOST;
|
||||||
|
|
||||||
|
### column grants
|
||||||
|
|
||||||
|
grant select(a) on test.t1 to CUser@localhost;
|
||||||
|
grant select(a) on test.t1 to CUser@LOCALHOST;
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
|
||||||
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||||
|
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||||
|
|
||||||
|
DROP USER CUser@localhost;
|
||||||
|
DROP USER CUser@LOCALHOST;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
# revoke on a specific DB only
|
||||||
|
|
||||||
|
grant select on test.* to CUser2@localhost;
|
||||||
|
grant select on test.* to CUser2@LOCALHOST;
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||||
|
|
||||||
|
REVOKE SELECT ON test.* FROM 'CUser2'@'LOCALHOST';
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||||
|
|
||||||
|
REVOKE SELECT ON test.* FROM 'CUser2'@'localhost';
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||||
|
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||||
|
|
||||||
|
DROP USER CUser2@localhost;
|
||||||
|
DROP USER CUser2@LOCALHOST;
|
||||||
|
@ -1435,7 +1435,10 @@ select "this will be executed";
|
|||||||
--exec $MYSQL_TEST -x $MYSQLTEST_VARDIR/tmp/query.sql -R $MYSQLTEST_VARDIR/tmp/zero_length_file.result > /dev/null 2>&1
|
--exec $MYSQL_TEST -x $MYSQLTEST_VARDIR/tmp/query.sql -R $MYSQLTEST_VARDIR/tmp/zero_length_file.result > /dev/null 2>&1
|
||||||
|
|
||||||
remove_file $MYSQLTEST_VARDIR/tmp/zero_length_file.result;
|
remove_file $MYSQLTEST_VARDIR/tmp/zero_length_file.result;
|
||||||
|
--error 0,1
|
||||||
remove_file $MYSQLTEST_VARDIR/log/zero_length_file.reject;
|
remove_file $MYSQLTEST_VARDIR/log/zero_length_file.reject;
|
||||||
|
--error 0,1
|
||||||
|
remove_file $MYSQL_TEST_DIR/r/zero_length_file.reject;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test that a test file that does not generate any output fails.
|
# Test that a test file that does not generate any output fails.
|
||||||
|
@ -282,3 +282,26 @@ select * from t1 where f1 between 20020101 and 20070101000000;
|
|||||||
select * from t1 where f1 between 2002010 and 20070101000000;
|
select * from t1 where f1 between 2002010 and 20070101000000;
|
||||||
select * from t1 where f1 between 20020101 and 2007010100000;
|
select * from t1 where f1 between 20020101 and 2007010100000;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #31253: crash comparing datetime to double
|
||||||
|
# Should return 1st row only. Crashes if NULL propagation fails.
|
||||||
|
#
|
||||||
|
create table t1 (f1 time);
|
||||||
|
insert into t1 set f1 = '45:44:44';
|
||||||
|
insert into t1 set f1 = '15:44:44';
|
||||||
|
select * from t1 where (convert(f1,datetime)) != 1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #31249: problem with convert(..., datetime)
|
||||||
|
#
|
||||||
|
create table t1 (a tinyint);
|
||||||
|
insert into t1 values (), (), ();
|
||||||
|
select sum(a) from t1 group by convert(a, datetime);
|
||||||
|
--enable_metadata
|
||||||
|
select convert(a, datetime) from t1;
|
||||||
|
--disable_metadata
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo End of 5.0 tests
|
||||||
|
@ -274,6 +274,7 @@ my_decimal *Item::val_decimal_from_date(my_decimal *decimal_value)
|
|||||||
if (get_date(<ime, TIME_FUZZY_DATE))
|
if (get_date(<ime, TIME_FUZZY_DATE))
|
||||||
{
|
{
|
||||||
my_decimal_set_zero(decimal_value);
|
my_decimal_set_zero(decimal_value);
|
||||||
|
null_value= 1; // set NULL, stop processing
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return date2my_decimal(<ime, decimal_value);
|
return date2my_decimal(<ime, decimal_value);
|
||||||
|
@ -844,7 +844,9 @@ public:
|
|||||||
enum_field_types field_type() const { return MYSQL_TYPE_DATETIME; }
|
enum_field_types field_type() const { return MYSQL_TYPE_DATETIME; }
|
||||||
void fix_length_and_dec()
|
void fix_length_and_dec()
|
||||||
{
|
{
|
||||||
Item_typecast_maybe_null::fix_length_and_dec();
|
collation.set(&my_charset_bin);
|
||||||
|
maybe_null= 1;
|
||||||
|
max_length= MAX_DATETIME_FULL_WIDTH * MY_CHARSET_BIN_MB_MAXLEN;
|
||||||
decimals= DATETIME_DEC;
|
decimals= DATETIME_DEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1132,7 +1132,7 @@ static void acl_update_db(const char *user, const char *host, const char *db,
|
|||||||
{
|
{
|
||||||
if (!acl_db->host.hostname && !host[0] ||
|
if (!acl_db->host.hostname && !host[0] ||
|
||||||
acl_db->host.hostname &&
|
acl_db->host.hostname &&
|
||||||
!my_strcasecmp(system_charset_info, host, acl_db->host.hostname))
|
!strcmp(host, acl_db->host.hostname))
|
||||||
{
|
{
|
||||||
if (!acl_db->db && !db[0] ||
|
if (!acl_db->db && !db[0] ||
|
||||||
acl_db->db && !strcmp(db,acl_db->db))
|
acl_db->db && !strcmp(db,acl_db->db))
|
||||||
@ -4344,6 +4344,13 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
|||||||
if (!(host=acl_db->host.hostname))
|
if (!(host=acl_db->host.hostname))
|
||||||
host= "";
|
host= "";
|
||||||
|
|
||||||
|
/*
|
||||||
|
We do not make SHOW GRANTS case-sensitive here (like REVOKE),
|
||||||
|
but make it case-insensitive because that's the way they are
|
||||||
|
actually applied, and showing fewer privileges than are applied
|
||||||
|
would be wrong from a security point of view.
|
||||||
|
*/
|
||||||
|
|
||||||
if (!strcmp(lex_user->user.str,user) &&
|
if (!strcmp(lex_user->user.str,user) &&
|
||||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||||
{
|
{
|
||||||
@ -4379,8 +4386,8 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
|||||||
db.append(lex_user->user.str, lex_user->user.length,
|
db.append(lex_user->user.str, lex_user->user.length,
|
||||||
system_charset_info);
|
system_charset_info);
|
||||||
db.append (STRING_WITH_LEN("'@'"));
|
db.append (STRING_WITH_LEN("'@'"));
|
||||||
db.append(lex_user->host.str, lex_user->host.length,
|
// host and lex_user->host are equal except for case
|
||||||
system_charset_info);
|
db.append(host, strlen(host), system_charset_info);
|
||||||
db.append ('\'');
|
db.append ('\'');
|
||||||
if (want_access & GRANT_ACL)
|
if (want_access & GRANT_ACL)
|
||||||
db.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
db.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
||||||
@ -4407,6 +4414,13 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
|||||||
if (!(host= grant_table->host.hostname))
|
if (!(host= grant_table->host.hostname))
|
||||||
host= "";
|
host= "";
|
||||||
|
|
||||||
|
/*
|
||||||
|
We do not make SHOW GRANTS case-sensitive here (like REVOKE),
|
||||||
|
but make it case-insensitive because that's the way they are
|
||||||
|
actually applied, and showing fewer privileges than are applied
|
||||||
|
would be wrong from a security point of view.
|
||||||
|
*/
|
||||||
|
|
||||||
if (!strcmp(lex_user->user.str,user) &&
|
if (!strcmp(lex_user->user.str,user) &&
|
||||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||||
{
|
{
|
||||||
@ -4487,8 +4501,8 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
|||||||
global.append(lex_user->user.str, lex_user->user.length,
|
global.append(lex_user->user.str, lex_user->user.length,
|
||||||
system_charset_info);
|
system_charset_info);
|
||||||
global.append(STRING_WITH_LEN("'@'"));
|
global.append(STRING_WITH_LEN("'@'"));
|
||||||
global.append(lex_user->host.str,lex_user->host.length,
|
// host and lex_user->host are equal except for case
|
||||||
system_charset_info);
|
global.append(host, strlen(host), system_charset_info);
|
||||||
global.append('\'');
|
global.append('\'');
|
||||||
if (table_access & GRANT_ACL)
|
if (table_access & GRANT_ACL)
|
||||||
global.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
global.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
||||||
@ -4543,6 +4557,13 @@ static int show_routine_grants(THD* thd, LEX_USER *lex_user, HASH *hash,
|
|||||||
if (!(host= grant_proc->host.hostname))
|
if (!(host= grant_proc->host.hostname))
|
||||||
host= "";
|
host= "";
|
||||||
|
|
||||||
|
/*
|
||||||
|
We do not make SHOW GRANTS case-sensitive here (like REVOKE),
|
||||||
|
but make it case-insensitive because that's the way they are
|
||||||
|
actually applied, and showing fewer privileges than are applied
|
||||||
|
would be wrong from a security point of view.
|
||||||
|
*/
|
||||||
|
|
||||||
if (!strcmp(lex_user->user.str,user) &&
|
if (!strcmp(lex_user->user.str,user) &&
|
||||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||||
{
|
{
|
||||||
@ -4586,8 +4607,8 @@ static int show_routine_grants(THD* thd, LEX_USER *lex_user, HASH *hash,
|
|||||||
global.append(lex_user->user.str, lex_user->user.length,
|
global.append(lex_user->user.str, lex_user->user.length,
|
||||||
system_charset_info);
|
system_charset_info);
|
||||||
global.append(STRING_WITH_LEN("'@'"));
|
global.append(STRING_WITH_LEN("'@'"));
|
||||||
global.append(lex_user->host.str,lex_user->host.length,
|
// host and lex_user->host are equal except for case
|
||||||
system_charset_info);
|
global.append(host, strlen(host), system_charset_info);
|
||||||
global.append('\'');
|
global.append('\'');
|
||||||
if (proc_access & GRANT_ACL)
|
if (proc_access & GRANT_ACL)
|
||||||
global.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
global.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
||||||
@ -5541,7 +5562,7 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
|||||||
host= "";
|
host= "";
|
||||||
|
|
||||||
if (!strcmp(lex_user->user.str,user) &&
|
if (!strcmp(lex_user->user.str,user) &&
|
||||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
!strcmp(lex_user->host.str, host))
|
||||||
{
|
{
|
||||||
if (!replace_db_table(tables[1].table, acl_db->db, *lex_user, ~(ulong)0, 1))
|
if (!replace_db_table(tables[1].table, acl_db->db, *lex_user, ~(ulong)0, 1))
|
||||||
{
|
{
|
||||||
@ -5572,7 +5593,7 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
|||||||
host= "";
|
host= "";
|
||||||
|
|
||||||
if (!strcmp(lex_user->user.str,user) &&
|
if (!strcmp(lex_user->user.str,user) &&
|
||||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
!strcmp(lex_user->host.str, host))
|
||||||
{
|
{
|
||||||
if (replace_table_table(thd,grant_table,tables[2].table,*lex_user,
|
if (replace_table_table(thd,grant_table,tables[2].table,*lex_user,
|
||||||
grant_table->db,
|
grant_table->db,
|
||||||
@ -5618,7 +5639,7 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
|||||||
host= "";
|
host= "";
|
||||||
|
|
||||||
if (!strcmp(lex_user->user.str,user) &&
|
if (!strcmp(lex_user->user.str,user) &&
|
||||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
!strcmp(lex_user->host.str, host))
|
||||||
{
|
{
|
||||||
if (!replace_routine_table(thd,grant_proc,tables[4].table,*lex_user,
|
if (!replace_routine_table(thd,grant_proc,tables[4].table,*lex_user,
|
||||||
grant_proc->db,
|
grant_proc->db,
|
||||||
|
@ -13902,13 +13902,31 @@ calc_group_buffer(JOIN *join,ORDER *group)
|
|||||||
group_item->decimals);
|
group_item->decimals);
|
||||||
break;
|
break;
|
||||||
case STRING_RESULT:
|
case STRING_RESULT:
|
||||||
|
{
|
||||||
|
enum enum_field_types type= group_item->field_type();
|
||||||
/*
|
/*
|
||||||
Group strings are taken as varstrings and require an length field.
|
As items represented as DATE/TIME fields in the group buffer
|
||||||
A field is not yet created by create_tmp_field()
|
have STRING_RESULT result type, we increase the length
|
||||||
and the sizes should match up.
|
by 8 as maximum pack length of such fields.
|
||||||
*/
|
*/
|
||||||
key_length+= group_item->max_length + HA_KEY_BLOB_LENGTH;
|
if (type == MYSQL_TYPE_TIME ||
|
||||||
|
type == MYSQL_TYPE_DATE ||
|
||||||
|
type == MYSQL_TYPE_DATETIME ||
|
||||||
|
type == MYSQL_TYPE_TIMESTAMP)
|
||||||
|
{
|
||||||
|
key_length+= 8;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Group strings are taken as varstrings and require an length field.
|
||||||
|
A field is not yet created by create_tmp_field()
|
||||||
|
and the sizes should match up.
|
||||||
|
*/
|
||||||
|
key_length+= group_item->max_length + HA_KEY_BLOB_LENGTH;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
/* This case should never be choosen */
|
/* This case should never be choosen */
|
||||||
DBUG_ASSERT(0);
|
DBUG_ASSERT(0);
|
||||||
|
Reference in New Issue
Block a user