mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-20079 When setting back the system time while mysqld is running, NOW() and UNIX_TIMESTAMP() results get stuck
typo. system_time.start wasn't updated when system_time.sec and system_time.sec_part were.
This commit is contained in:
16
mysql-test/main/system_time_debug.result
Normal file
16
mysql-test/main/system_time_debug.result
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
set @old_dbug=@@debug_dbug;
|
||||||
|
select timestampdiff(minute,now(),sysdate()) as 'must be 0', (unix_timestamp(sysdate()) - unix_timestamp()) div 60 as 'must be 0';
|
||||||
|
must be 0 must be 0
|
||||||
|
0 0
|
||||||
|
set @@debug_dbug='+d,system_time_plus_one_hour';
|
||||||
|
select timestampdiff(minute,now(),sysdate()) as 'must be 0', (unix_timestamp(sysdate()) - unix_timestamp()) div 60 as 'must be 0';
|
||||||
|
must be 0 must be 0
|
||||||
|
0 0
|
||||||
|
set @@debug_dbug='+d,system_time_minus_one_hour:-d,system_time_plus_one_hour';
|
||||||
|
select timestampdiff(minute,now(),sysdate()) as 'must be 0', (unix_timestamp(sysdate()) - unix_timestamp()) div 60 as 'must be 0';
|
||||||
|
must be 0 must be 0
|
||||||
|
0 0
|
||||||
|
set @@debug_dbug=@old_dbug;
|
||||||
|
select timestampdiff(minute,now(),sysdate()) as 'must be 0', (unix_timestamp(sysdate()) - unix_timestamp()) div 60 as 'must be 0';
|
||||||
|
must be 0 must be 0
|
||||||
|
0 0
|
16
mysql-test/main/system_time_debug.test
Normal file
16
mysql-test/main/system_time_debug.test
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
source include/have_debug.inc;
|
||||||
|
#
|
||||||
|
# MDEV-20079 When setting back the system time while mysqld is running, NOW() and UNIX_TIMESTAMP() results get stuck
|
||||||
|
#
|
||||||
|
set @old_dbug=@@debug_dbug;
|
||||||
|
|
||||||
|
# because NOW() is taken at the beginning of the query and sysdate() is the actual
|
||||||
|
# time when sysdate() was evaluated, they don't necessarily have to be equal.
|
||||||
|
# but hopefully they're less than within a minute from each other.
|
||||||
|
select timestampdiff(minute,now(),sysdate()) as 'must be 0', (unix_timestamp(sysdate()) - unix_timestamp()) div 60 as 'must be 0';
|
||||||
|
set @@debug_dbug='+d,system_time_plus_one_hour';
|
||||||
|
select timestampdiff(minute,now(),sysdate()) as 'must be 0', (unix_timestamp(sysdate()) - unix_timestamp()) div 60 as 'must be 0';
|
||||||
|
set @@debug_dbug='+d,system_time_minus_one_hour:-d,system_time_plus_one_hour';
|
||||||
|
select timestampdiff(minute,now(),sysdate()) as 'must be 0', (unix_timestamp(sysdate()) - unix_timestamp()) div 60 as 'must be 0';
|
||||||
|
set @@debug_dbug=@old_dbug;
|
||||||
|
select timestampdiff(minute,now(),sysdate()) as 'must be 0', (unix_timestamp(sysdate()) - unix_timestamp()) div 60 as 'must be 0';
|
@ -99,6 +99,8 @@ my_hrtime_t my_hrtime()
|
|||||||
while (gettimeofday(&t, NULL) != 0) {}
|
while (gettimeofday(&t, NULL) != 0) {}
|
||||||
hrtime.val= t.tv_sec*1000000ULL + t.tv_usec;
|
hrtime.val= t.tv_sec*1000000ULL + t.tv_usec;
|
||||||
#endif
|
#endif
|
||||||
|
DBUG_EXECUTE_IF("system_time_plus_one_hour", hrtime.val += 3600*1000000ULL;);
|
||||||
|
DBUG_EXECUTE_IF("system_time_minus_one_hour", hrtime.val -= 3600*1000000ULL;);
|
||||||
return hrtime;
|
return hrtime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3443,6 +3443,7 @@ private:
|
|||||||
{
|
{
|
||||||
system_time.sec= sec;
|
system_time.sec= sec;
|
||||||
system_time.sec_part= sec_part;
|
system_time.sec_part= sec_part;
|
||||||
|
system_time.start= hrtime;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user