Commit 55ae2e78 authored by unknown's avatar unknown

After merge fixes


client/mysqldump.c:
  Merge with 4.0 (and reordering of options)
client/mysqltest.c:
  Added DB as a user variable
myisam/mi_check.c:
  Trivial cleanup
mysql-test/r/grant.result:
  Move test to be in same order as in 4.0
mysql-test/r/mix_innodb_myisam_binlog.result:
  Updated results
mysql-test/r/ps_1general.result:
  Updated tests to work after privilege fixes
mysql-test/r/timezone3.result:
  Updated results to 4.1
mysql-test/t/ps_1general.test:
  Updated tests to work after privilege fixes
sql-common/my_time.c:
  Applied sub-second patch from 4.0
sql/sql_acl.cc:
  More debugging
parent 44070705
...@@ -255,6 +255,14 @@ static struct my_option my_long_options[] = ...@@ -255,6 +255,14 @@ static struct my_option my_long_options[] =
"Option automatically turns --lock-tables off.", "Option automatically turns --lock-tables off.",
(gptr*) &opt_master_data, (gptr*) &opt_master_data, 0, (gptr*) &opt_master_data, (gptr*) &opt_master_data, 0,
GET_UINT, REQUIRED_ARG, 0, 0, MYSQL_OPT_MASTER_DATA_COMMENTED_SQL, 0, 0, 0}, GET_UINT, REQUIRED_ARG, 0, 0, MYSQL_OPT_MASTER_DATA_COMMENTED_SQL, 0, 0, 0},
{"max_allowed_packet", OPT_MAX_ALLOWED_PACKET, "",
(gptr*) &opt_max_allowed_packet, (gptr*) &opt_max_allowed_packet, 0,
GET_ULONG, REQUIRED_ARG, 24*1024*1024, 4096,
(longlong) 2L*1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0},
{"net_buffer_length", OPT_NET_BUFFER_LENGTH, "",
(gptr*) &opt_net_buffer_length, (gptr*) &opt_net_buffer_length, 0,
GET_ULONG, REQUIRED_ARG, 1024*1024L-1025, 4096, 16*1024L*1024L,
MALLOC_OVERHEAD-1024, 1024, 0},
{"no-autocommit", OPT_AUTOCOMMIT, {"no-autocommit", OPT_AUTOCOMMIT,
"Wrap tables with autocommit/commit statements.", "Wrap tables with autocommit/commit statements.",
(gptr*) &opt_autocommit, (gptr*) &opt_autocommit, 0, GET_BOOL, NO_ARG, (gptr*) &opt_autocommit, (gptr*) &opt_autocommit, 0, GET_BOOL, NO_ARG,
...@@ -343,14 +351,7 @@ static struct my_option my_long_options[] = ...@@ -343,14 +351,7 @@ static struct my_option my_long_options[] =
(gptr*) &where, (gptr*) &where, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, (gptr*) &where, (gptr*) &where, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"xml", 'X', "Dump a database as well formed XML.", 0, 0, 0, GET_NO_ARG, {"xml", 'X', "Dump a database as well formed XML.", 0, 0, 0, GET_NO_ARG,
NO_ARG, 0, 0, 0, 0, 0, 0}, NO_ARG, 0, 0, 0, 0, 0, 0},
{"max_allowed_packet", OPT_MAX_ALLOWED_PACKET, "", { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
(gptr*) &opt_max_allowed_packet, (gptr*) &opt_max_allowed_packet, 0,
GET_ULONG, REQUIRED_ARG, 24*1024*1024, 4096,
(longlong) 2L*1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0},
{"net_buffer_length", OPT_NET_BUFFER_LENGTH, "",
(gptr*) &opt_net_buffer_length, (gptr*) &opt_net_buffer_length, 0,
GET_ULONG, REQUIRED_ARG, 1024*1024L-1025, 4096, 16*1024L*1024L,
MALLOC_OVERHEAD-1024, 1024, 0}
}; };
static const char *load_default_groups[]= { "mysqldump","client",0 }; static const char *load_default_groups[]= { "mysqldump","client",0 };
...@@ -1679,7 +1680,6 @@ static void dumpTable(uint numFields, char *table) ...@@ -1679,7 +1680,6 @@ static void dumpTable(uint numFields, char *table)
else if (opt_hex_blob && is_blob) else if (opt_hex_blob && is_blob)
{ {
/* sakaik got the idea to to provide blob's in hex notation. */ /* sakaik got the idea to to provide blob's in hex notation. */
ulong counter;
unsigned char *ptr= row[i], *end= ptr+ lengths[i]; unsigned char *ptr= row[i], *end= ptr+ lengths[i];
fputs("0x", md_result_file); fputs("0x", md_result_file);
for (; ptr < end ; ptr++) for (; ptr < end ; ptr++)
......
...@@ -3351,7 +3351,8 @@ static void init_var_hash(MYSQL *mysql) ...@@ -3351,7 +3351,8 @@ static void init_var_hash(MYSQL *mysql)
my_hash_insert(&var_hash, (byte*) v); my_hash_insert(&var_hash, (byte*) v);
v= var_init(0,"SERVER_VERSION", 0, mysql_get_server_info(mysql), 0); v= var_init(0,"SERVER_VERSION", 0, mysql_get_server_info(mysql), 0);
my_hash_insert(&var_hash, (byte*) v); my_hash_insert(&var_hash, (byte*) v);
v= var_init(0,"DB", 2, db, 0);
my_hash_insert(&var_hash, (byte*) v);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -658,10 +658,11 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo, ...@@ -658,10 +658,11 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
goto err; goto err;
if (tmp_keys + subkeys) if (tmp_keys + subkeys)
{ {
mi_check_print_error(param,"Number of words in the 2nd level tree " mi_check_print_error(param,
"does not match the number in the header. " "Number of words in the 2nd level tree "
"Parent word in on the page %s, offset %d", "does not match the number in the header. "
llstr(page,llbuff), old_keypos-buff); "Parent word in on the page %s, offset %u",
llstr(page,llbuff), (uint) (old_keypos-buff));
goto err; goto err;
} }
(*keys)+=tmp_keys-1; (*keys)+=tmp_keys-1;
......
...@@ -134,6 +134,31 @@ ERROR HY000: Incorrect usage of DB GRANT and GLOBAL PRIVILEGES ...@@ -134,6 +134,31 @@ ERROR HY000: Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
select 1; select 1;
1 1
1 1
insert into mysql.user (host, user) values ('localhost', 'test11');
insert into mysql.db (host, db, user, select_priv) values
('localhost', 'a%', 'test11', 'Y'), ('localhost', 'ab%', 'test11', 'Y');
alter table mysql.db order by db asc;
flush privileges;
show grants for test11@localhost;
Grants for test11@localhost
GRANT USAGE ON *.* TO 'test11'@'localhost'
GRANT SELECT ON `ab%`.* TO 'test11'@'localhost'
GRANT SELECT ON `a%`.* TO 'test11'@'localhost'
alter table mysql.db order by db desc;
flush privileges;
show grants for test11@localhost;
Grants for test11@localhost
GRANT USAGE ON *.* TO 'test11'@'localhost'
GRANT SELECT ON `ab%`.* TO 'test11'@'localhost'
GRANT SELECT ON `a%`.* TO 'test11'@'localhost'
delete from mysql.user where user='test11';
delete from mysql.db where user='test11';
create database mysqltest1;
grant usage on mysqltest1.* to test6123 identified by 'magic123';
select host,db,user,select_priv,insert_priv from mysql.db where db="mysqltest1";
host db user select_priv insert_priv
delete from mysql.user where user='test6123';
drop database mysqltest1;
create table t1 (a int); create table t1 (a int);
grant ALL PRIVILEGES on *.* to drop_user2@localhost with GRANT OPTION; grant ALL PRIVILEGES on *.* to drop_user2@localhost with GRANT OPTION;
show grants for drop_user2@localhost; show grants for drop_user2@localhost;
...@@ -229,31 +254,6 @@ GRANT SELECT ( ...@@ -229,31 +254,6 @@ GRANT SELECT (
REVOKE SELECT () ON . FROM @localhost; REVOKE SELECT () ON . FROM @localhost;
DROP DATABASE ; DROP DATABASE ;
SET NAMES latin1; SET NAMES latin1;
insert into mysql.user (host, user) values ('localhost', 'test11');
insert into mysql.db (host, db, user, select_priv) values
('localhost', 'a%', 'test11', 'Y'), ('localhost', 'ab%', 'test11', 'Y');
alter table mysql.db order by db asc;
flush privileges;
show grants for test11@localhost;
Grants for test11@localhost
GRANT USAGE ON *.* TO 'test11'@'localhost'
GRANT SELECT ON `ab%`.* TO 'test11'@'localhost'
GRANT SELECT ON `a%`.* TO 'test11'@'localhost'
alter table mysql.db order by db desc;
flush privileges;
show grants for test11@localhost;
Grants for test11@localhost
GRANT USAGE ON *.* TO 'test11'@'localhost'
GRANT SELECT ON `ab%`.* TO 'test11'@'localhost'
GRANT SELECT ON `a%`.* TO 'test11'@'localhost'
delete from mysql.user where user='test11';
delete from mysql.db where user='test11';
create database db6123;
grant usage on db6123.* to test6123 identified by 'magic123';
select host,db,user,select_priv,insert_priv from mysql.db where db="db6123";
host db user select_priv insert_priv
delete from mysql.user where user='test6123';
drop database db6123;
USE test; USE test;
CREATE TABLE t1 (a int ); CREATE TABLE t1 (a int );
CREATE TABLE t2 LIKE t1; CREATE TABLE t2 LIKE t1;
......
...@@ -194,7 +194,7 @@ select (@before:=unix_timestamp())*0; ...@@ -194,7 +194,7 @@ select (@before:=unix_timestamp())*0;
begin; begin;
select * from t1 for update; select * from t1 for update;
insert into t2 values (20); insert into t2 values (20);
Lock wait timeout exceeded; Try restarting transaction ERROR HY000: Lock wait timeout exceeded; try restarting transaction
select (@after:=unix_timestamp())*0; select (@after:=unix_timestamp())*0;
(@after:=unix_timestamp())*0 (@after:=unix_timestamp())*0
0 0
......
use test; drop table if exists t5, t6, t7, t8;
drop database if exists mysqltest ;
test_sequence test_sequence
------ basic tests ------ ------ basic tests ------
drop table if exists t1, t9 ; drop table if exists t1, t9 ;
...@@ -558,7 +559,6 @@ execute stmt3; ...@@ -558,7 +559,6 @@ execute stmt3;
ERROR 42S01: Table 'new_t2' already exists ERROR 42S01: Table 'new_t2' already exists
rename table new_t2 to t2; rename table new_t2 to t2;
drop table t2; drop table t2;
drop table if exists t5, t6, t7, t8 ;
prepare stmt1 from ' rename table t5 to t6, t7 to t8 ' ; prepare stmt1 from ' rename table t5 to t6, t7 to t8 ' ;
create table t5 (a int) ; create table t5 (a int) ;
execute stmt1 ; execute stmt1 ;
...@@ -810,21 +810,24 @@ test_sequence ...@@ -810,21 +810,24 @@ test_sequence
------ grant/revoke/drop affects a parallel session test ------ ------ grant/revoke/drop affects a parallel session test ------
show grants for second_user@localhost ; show grants for second_user@localhost ;
ERROR 42000: There is no such grant defined for user 'second_user' on host 'localhost' ERROR 42000: There is no such grant defined for user 'second_user' on host 'localhost'
grant usage on test.* to second_user@localhost create database mysqltest;
use mysqltest;
use test;
grant usage on mysqltest.* to second_user@localhost
identified by 'looser' ; identified by 'looser' ;
grant select on test.t9 to second_user@localhost grant select on mysqltest.t9 to second_user@localhost
identified by 'looser' ; identified by 'looser' ;
show grants for second_user@localhost ; show grants for second_user@localhost ;
Grants for second_user@localhost Grants for second_user@localhost
GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3'
GRANT SELECT ON `test`.`t9` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost'
select current_user(); select current_user();
current_user() current_user()
second_user@localhost second_user@localhost
show grants for current_user(); show grants for current_user();
Grants for second_user@localhost Grants for second_user@localhost
GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3'
GRANT SELECT ON `test`.`t9` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost'
prepare s_t9 from 'select c1 as my_col prepare s_t9 from 'select c1 as my_col
from t9 where c1= 1' ; from t9 where c1= 1' ;
execute s_t9 ; execute s_t9 ;
...@@ -832,24 +835,24 @@ my_col ...@@ -832,24 +835,24 @@ my_col
1 1
select a as my_col from t1; select a as my_col from t1;
ERROR 42000: select command denied to user 'second_user'@'localhost' for table 't1' ERROR 42000: select command denied to user 'second_user'@'localhost' for table 't1'
grant select on test.t1 to second_user@localhost grant select on mysqltest.t1 to second_user@localhost
identified by 'looser' ; identified by 'looser' ;
show grants for second_user@localhost ; show grants for second_user@localhost ;
Grants for second_user@localhost Grants for second_user@localhost
GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3'
GRANT SELECT ON `test`.`t1` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost'
GRANT SELECT ON `test`.`t9` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost'
drop table t9 ; drop table mysqltest.t9 ;
show grants for second_user@localhost ; show grants for second_user@localhost ;
Grants for second_user@localhost Grants for second_user@localhost
GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3'
GRANT SELECT ON `test`.`t1` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost'
GRANT SELECT ON `test`.`t9` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost'
show grants for second_user@localhost ; show grants for second_user@localhost ;
Grants for second_user@localhost Grants for second_user@localhost
GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3'
GRANT SELECT ON `test`.`t1` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost'
GRANT SELECT ON `test`.`t9` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost'
prepare s_t1 from 'select a as my_col from t1' ; prepare s_t1 from 'select a as my_col from t1' ;
execute s_t1 ; execute s_t1 ;
my_col my_col
...@@ -858,17 +861,17 @@ my_col ...@@ -858,17 +861,17 @@ my_col
3 3
4 4
execute s_t9 ; execute s_t9 ;
ERROR 42S02: Table 'test.t9' doesn't exist ERROR 42S02: Table 'mysqltest.t9' doesn't exist
revoke all privileges on test.t1 from second_user@localhost revoke all privileges on mysqltest.t1 from second_user@localhost
identified by 'looser' ; identified by 'looser' ;
show grants for second_user@localhost ; show grants for second_user@localhost ;
Grants for second_user@localhost Grants for second_user@localhost
GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3'
GRANT SELECT ON `test`.`t9` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost'
show grants for second_user@localhost ; show grants for second_user@localhost ;
Grants for second_user@localhost Grants for second_user@localhost
GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3' GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3'
GRANT SELECT ON `test`.`t9` TO 'second_user'@'localhost' GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost'
execute s_t1 ; execute s_t1 ;
ERROR 42000: select command denied to user 'second_user'@'localhost' for table 't1' ERROR 42000: select command denied to user 'second_user'@'localhost' for table 't1'
revoke all privileges, grant option from second_user@localhost ; revoke all privileges, grant option from second_user@localhost ;
...@@ -879,4 +882,5 @@ drop user second_user@localhost ; ...@@ -879,4 +882,5 @@ drop user second_user@localhost ;
commit ; commit ;
show grants for second_user@localhost ; show grants for second_user@localhost ;
ERROR 42000: There is no such grant defined for user 'second_user' on host 'localhost' ERROR 42000: There is no such grant defined for user 'second_user' on host 'localhost'
drop table t1 ; drop table t1,t9 ;
drop database mysqltest;
...@@ -36,6 +36,6 @@ create table t1 (ts timestamp); ...@@ -36,6 +36,6 @@ create table t1 (ts timestamp);
insert into t1 values (19730101235900), (20040101235900); insert into t1 values (19730101235900), (20040101235900);
select * from t1; select * from t1;
ts ts
19730101235900 1973-01-01 23:59:00
20040101235900 2004-01-01 23:59:00
drop table t1; drop table t1;
...@@ -8,7 +8,11 @@ ...@@ -8,7 +8,11 @@
# NOTE: PLEASE SEE THE DETAILED DESCRIPTION AT THE BOTTOM OF THIS FILE # NOTE: PLEASE SEE THE DETAILED DESCRIPTION AT THE BOTTOM OF THIS FILE
# BEFORE ADDING NEW TEST CASES HERE !!! # BEFORE ADDING NEW TEST CASES HERE !!!
use test; --disable_warnings
drop table if exists t5, t6, t7, t8;
drop database if exists mysqltest ;
--enable_warnings
--disable_query_log --disable_query_log
select '------ basic tests ------' as test_sequence ; select '------ basic tests ------' as test_sequence ;
--enable_query_log --enable_query_log
...@@ -590,12 +594,9 @@ rename table new_t2 to t2; ...@@ -590,12 +594,9 @@ rename table new_t2 to t2;
drop table t2; drop table t2;
## RENAME more than on TABLE within one statement ## RENAME more than on TABLE within one statement
# cases derived from client_test.c: test_rename() # cases derived from client_test.c: test_rename()
--disable_warnings
drop table if exists t5, t6, t7, t8 ;
--enable_warnings
prepare stmt1 from ' rename table t5 to t6, t7 to t8 ' ; prepare stmt1 from ' rename table t5 to t6, t7 to t8 ' ;
create table t5 (a int) ; create table t5 (a int) ;
# rename must fail, tc does not exist # rename must fail, t7 does not exist
--error 1017 --error 1017
execute stmt1 ; execute stmt1 ;
create table t7 (a int) ; create table t7 (a int) ;
...@@ -864,15 +865,23 @@ select '------ grant/revoke/drop affects a parallel session test ------' ...@@ -864,15 +865,23 @@ select '------ grant/revoke/drop affects a parallel session test ------'
--error 1141 --error 1141
show grants for second_user@localhost ; show grants for second_user@localhost ;
## create a new user account by using GRANT statements on t9 ## create a new user account by using GRANT statements on t9
grant usage on test.* to second_user@localhost create database mysqltest;
# create the tables (t1 and t9) used in many tests
use mysqltest;
--disable_query_log
--source include/ps_create.inc
--source include/ps_renew.inc
--enable_query_log
eval use $DB;
grant usage on mysqltest.* to second_user@localhost
identified by 'looser' ; identified by 'looser' ;
grant select on test.t9 to second_user@localhost grant select on mysqltest.t9 to second_user@localhost
identified by 'looser' ; identified by 'looser' ;
show grants for second_user@localhost ; show grants for second_user@localhost ;
#### establish a second session to the new user account #### establish a second session to the new user account
connect (con3,localhost,second_user,looser,test); connect (con3,localhost,second_user,looser,mysqltest);
## switch to the second session ## switch to the second session
connection con3; connection con3;
# Who am I ? # Who am I ?
...@@ -890,10 +899,10 @@ select a as my_col from t1; ...@@ -890,10 +899,10 @@ select a as my_col from t1;
#### give access rights to t1 and drop table t9 #### give access rights to t1 and drop table t9
## switch back to the first session ## switch back to the first session
connection default; connection default;
grant select on test.t1 to second_user@localhost grant select on mysqltest.t1 to second_user@localhost
identified by 'looser' ; identified by 'looser' ;
show grants for second_user@localhost ; show grants for second_user@localhost ;
drop table t9 ; drop table mysqltest.t9 ;
show grants for second_user@localhost ; show grants for second_user@localhost ;
...@@ -912,7 +921,7 @@ execute s_t9 ; ...@@ -912,7 +921,7 @@ execute s_t9 ;
#### revoke the access rights to t1 #### revoke the access rights to t1
## switch back to the first session ## switch back to the first session
connection default; connection default;
revoke all privileges on test.t1 from second_user@localhost revoke all privileges on mysqltest.t1 from second_user@localhost
identified by 'looser' ; identified by 'looser' ;
show grants for second_user@localhost ; show grants for second_user@localhost ;
...@@ -937,8 +946,8 @@ commit ; ...@@ -937,8 +946,8 @@ commit ;
--error 1141 --error 1141
show grants for second_user@localhost ; show grants for second_user@localhost ;
drop table t1,t9 ;
drop table t1 ; drop database mysqltest;
##### RULES OF THUMB TO PRESERVE THE SYSTEMATICS OF THE PS TEST CASES ##### ##### RULES OF THUMB TO PRESERVE THE SYSTEMATICS OF THE PS TEST CASES #####
......
...@@ -664,6 +664,10 @@ my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap) ...@@ -664,6 +664,10 @@ my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap)
I couldn't come up with a better way to get a repeatable result :( I couldn't come up with a better way to get a repeatable result :(
We can't use mktime() as it's buggy on many platforms and not thread safe. We can't use mktime() as it's buggy on many platforms and not thread safe.
Note: this code assumes that our time_t estimation is not too far away
from real value (we assume that localtime_r(tmp) will return something
within 24 hrs from t) which is probably true for all current time zones.
*/ */
tmp=(time_t) (((calc_daynr((uint) t->year,(uint) t->month,(uint) t->day) - tmp=(time_t) (((calc_daynr((uint) t->year,(uint) t->month,(uint) t->day) -
(long) days_at_timestart)*86400L + (long) t->hour*3600L + (long) days_at_timestart)*86400L + (long) t->hour*3600L +
...@@ -676,7 +680,8 @@ my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap) ...@@ -676,7 +680,8 @@ my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap)
for (loop=0; for (loop=0;
loop < 2 && loop < 2 &&
(t->hour != (uint) l_time->tm_hour || (t->hour != (uint) l_time->tm_hour ||
t->minute != (uint) l_time->tm_min); t->minute != (uint) l_time->tm_min ||
t->second != (uint) l_time->tm_sec);
loop++) loop++)
{ /* One check should be enough ? */ { /* One check should be enough ? */
/* Get difference in days */ /* Get difference in days */
...@@ -686,15 +691,22 @@ my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap) ...@@ -686,15 +691,22 @@ my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap)
else if (days > 1) else if (days > 1)
days= -1; days= -1;
diff=(3600L*(long) (days*24+((int) t->hour - (int) l_time->tm_hour)) + diff=(3600L*(long) (days*24+((int) t->hour - (int) l_time->tm_hour)) +
(long) (60*((int) t->minute - (int) l_time->tm_min))); (long) (60*((int) t->minute - (int) l_time->tm_min)) +
(long) ((int) t->second - (int) l_time->tm_sec));
current_timezone+= diff+3600; /* Compensate for -3600 above */ current_timezone+= diff+3600; /* Compensate for -3600 above */
tmp+= (time_t) diff; tmp+= (time_t) diff;
localtime_r(&tmp,&tm_tmp); localtime_r(&tmp,&tm_tmp);
l_time=&tm_tmp; l_time=&tm_tmp;
} }
/* /*
Fix that if we are in the not existing daylight saving time hour Fix that if we are in the non existing daylight saving time hour
we move the start of the next real hour we move the start of the next real hour.
This code doesn't handle such exotical thing as time-gaps whose length
is more than one hour or non-integer (latter can theoretically happen
if one of seconds will be removed due leap correction, or because of
general time correction like it happened for Africa/Monrovia time zone
in year 1972).
*/ */
if (loop == 2 && t->hour != (uint) l_time->tm_hour) if (loop == 2 && t->hour != (uint) l_time->tm_hour)
{ {
...@@ -704,7 +716,8 @@ my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap) ...@@ -704,7 +716,8 @@ my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, bool *in_dst_time_gap)
else if (days > 1) else if (days > 1)
days= -1; days= -1;
diff=(3600L*(long) (days*24+((int) t->hour - (int) l_time->tm_hour))+ diff=(3600L*(long) (days*24+((int) t->hour - (int) l_time->tm_hour))+
(long) (60*((int) t->minute - (int) l_time->tm_min))); (long) (60*((int) t->minute - (int) l_time->tm_min)) +
(long) ((int) t->second - (int) l_time->tm_sec));
if (diff == 3600) if (diff == 3600)
tmp+=3600 - t->minute*60 - t->second; /* Move to next hour */ tmp+=3600 - t->minute*60 - t->second; /* Move to next hour */
else if (diff == -3600) else if (diff == -3600)
......
...@@ -970,6 +970,7 @@ ulong acl_get(const char *host, const char *ip, ...@@ -970,6 +970,7 @@ ulong acl_get(const char *host, const char *ip,
db_access=0; host_access= ~0; db_access=0; host_access= ~0;
char key[ACL_KEY_LENGTH],*tmp_db,*end; char key[ACL_KEY_LENGTH],*tmp_db,*end;
acl_entry *entry; acl_entry *entry;
DBUG_ENTER("acl_get");
VOID(pthread_mutex_lock(&acl_cache->lock)); VOID(pthread_mutex_lock(&acl_cache->lock));
end=strmov((tmp_db=strmov(strmov(key, ip ? ip : "")+1,user)+1),db); end=strmov((tmp_db=strmov(strmov(key, ip ? ip : "")+1,user)+1),db);
...@@ -983,7 +984,8 @@ ulong acl_get(const char *host, const char *ip, ...@@ -983,7 +984,8 @@ ulong acl_get(const char *host, const char *ip,
{ {
db_access=entry->access; db_access=entry->access;
VOID(pthread_mutex_unlock(&acl_cache->lock)); VOID(pthread_mutex_unlock(&acl_cache->lock));
return db_access; DBUG_PRINT("exit", ("access: 0x%lx", db_access));
DBUG_RETURN(db_access);
} }
/* /*
...@@ -1035,7 +1037,8 @@ ulong acl_get(const char *host, const char *ip, ...@@ -1035,7 +1037,8 @@ ulong acl_get(const char *host, const char *ip,
acl_cache->add(entry); acl_cache->add(entry);
} }
VOID(pthread_mutex_unlock(&acl_cache->lock)); VOID(pthread_mutex_unlock(&acl_cache->lock));
return (db_access & host_access); DBUG_PRINT("exit", ("access: 0x%lx", db_access & host_access));
DBUG_RETURN(db_access & host_access);
} }
/* /*
......
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