mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
More windows changes for 32 bit unsigned timestamp:
MDEV-32188 make TIMESTAMP use whole 32-bit unsigned range - Changed usage of timeval to my_timeval as the timeval parts on windows are 32-bit long, which causes some compiler issues on windows.
This commit is contained in:
parent
b8ffd99cee
commit
b879b8a5c8
16 changed files with 79 additions and 58 deletions
|
@ -130,6 +130,13 @@ static inline void my_time_status_init(MYSQL_TIME_STATUS *status)
|
||||||
status->nanoseconds= 0;
|
status->nanoseconds= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct my_timeval
|
||||||
|
{
|
||||||
|
longlong tv_sec;
|
||||||
|
ulong tv_usec;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
my_bool check_date(const MYSQL_TIME *ltime, my_bool not_zero_date,
|
my_bool check_date(const MYSQL_TIME *ltime, my_bool not_zero_date,
|
||||||
ulonglong flags, int *was_cut);
|
ulonglong flags, int *was_cut);
|
||||||
my_bool str_to_DDhhmmssff(const char *str, size_t length, MYSQL_TIME *l_time,
|
my_bool str_to_DDhhmmssff(const char *str, size_t length, MYSQL_TIME *l_time,
|
||||||
|
@ -227,7 +234,7 @@ int my_date_to_str(const MYSQL_TIME *l_time, char *to);
|
||||||
int my_datetime_to_str(const MYSQL_TIME *l_time, char *to, uint digits);
|
int my_datetime_to_str(const MYSQL_TIME *l_time, char *to, uint digits);
|
||||||
int my_TIME_to_str(const MYSQL_TIME *l_time, char *to, uint digits);
|
int my_TIME_to_str(const MYSQL_TIME *l_time, char *to, uint digits);
|
||||||
|
|
||||||
int my_timeval_to_str(const struct timeval *tm, char *to, uint dec);
|
int my_timeval_to_str(const struct my_timeval *tm, char *to, uint dec);
|
||||||
|
|
||||||
static inline longlong sec_part_shift(longlong second_part, uint digits)
|
static inline longlong sec_part_shift(longlong second_part, uint digits)
|
||||||
{
|
{
|
||||||
|
@ -258,11 +265,6 @@ static inline void my_time_trunc(MYSQL_TIME *ltime, uint decimals)
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define suseconds_t long
|
#define suseconds_t long
|
||||||
#endif
|
#endif
|
||||||
static inline void my_timeval_trunc(struct timeval *tv, uint decimals)
|
|
||||||
{
|
|
||||||
tv->tv_usec-= (suseconds_t) my_time_fraction_remainder(tv->tv_usec, decimals);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define hrtime_to_my_time(X) ((my_time_t)hrtime_to_time(X))
|
#define hrtime_to_my_time(X) ((my_time_t)hrtime_to_time(X))
|
||||||
|
|
||||||
|
|
|
@ -1755,7 +1755,7 @@ int my_TIME_to_str(const MYSQL_TIME *l_time, char *to, uint digits)
|
||||||
@param dec Precision, in the range 0..6.
|
@param dec Precision, in the range 0..6.
|
||||||
@return The length of the result string.
|
@return The length of the result string.
|
||||||
*/
|
*/
|
||||||
int my_timeval_to_str(const struct timeval *tm, char *to, uint dec)
|
int my_timeval_to_str(const struct my_timeval *tm, char *to, uint dec)
|
||||||
{
|
{
|
||||||
char *pos= longlong10_to_str((longlong) tm->tv_sec, to, 10);
|
char *pos= longlong10_to_str((longlong) tm->tv_sec, to, 10);
|
||||||
if (dec)
|
if (dec)
|
||||||
|
|
|
@ -20,8 +20,7 @@
|
||||||
#include "myisampack.h"
|
#include "myisampack.h"
|
||||||
#include "my_time.h"
|
#include "my_time.h"
|
||||||
|
|
||||||
|
static const ulong my_max_usec_value[7]
|
||||||
static const int my_max_usec_value[7]
|
|
||||||
{
|
{
|
||||||
0,
|
0,
|
||||||
900000,
|
900000,
|
||||||
|
@ -401,7 +400,7 @@ uint my_timestamp_binary_length(uint dec)
|
||||||
@param ptr The pointer to read the value from.
|
@param ptr The pointer to read the value from.
|
||||||
@param dec Precision.
|
@param dec Precision.
|
||||||
*/
|
*/
|
||||||
void my_timestamp_from_binary(struct timeval *tm, const uchar *ptr, uint dec)
|
void my_timestamp_from_binary(struct my_timeval *tm, const uchar *ptr, uint dec)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(dec <= TIME_SECOND_PART_DIGITS);
|
DBUG_ASSERT(dec <= TIME_SECOND_PART_DIGITS);
|
||||||
tm->tv_sec= mi_uint4korr(ptr);
|
tm->tv_sec= mi_uint4korr(ptr);
|
||||||
|
@ -413,7 +412,7 @@ void my_timestamp_from_binary(struct timeval *tm, const uchar *ptr, uint dec)
|
||||||
return;
|
return;
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
tm->tv_usec= ((int) ptr[4]) * 10000;
|
tm->tv_usec= ((uint) ptr[4]) * 10000;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
case 4:
|
case 4:
|
||||||
|
@ -427,6 +426,18 @@ void my_timestamp_from_binary(struct timeval *tm, const uchar *ptr, uint dec)
|
||||||
set_if_smaller(tm->tv_usec, my_max_usec_value[dec]);
|
set_if_smaller(tm->tv_usec, my_max_usec_value[dec]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This is here mainly for ColumnStore until it is using my_timeval
|
||||||
|
*/
|
||||||
|
|
||||||
|
void my_timestamp_from_binary(struct timeval *tm, const uchar *ptr, uint dec)
|
||||||
|
{
|
||||||
|
my_timeval tmp;
|
||||||
|
my_timestamp_from_binary(&tmp, ptr, dec);
|
||||||
|
tm->tv_sec= (ulong) tmp.tv_sec;
|
||||||
|
tm->tv_usec= tmp.tv_usec;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Convert MySQL56 in-memory timestamp representation to on-disk representation.
|
Convert MySQL56 in-memory timestamp representation to on-disk representation.
|
||||||
|
@ -435,7 +446,7 @@ void my_timestamp_from_binary(struct timeval *tm, const uchar *ptr, uint dec)
|
||||||
@param OUT ptr The pointer to store the value to.
|
@param OUT ptr The pointer to store the value to.
|
||||||
@param dec Precision.
|
@param dec Precision.
|
||||||
*/
|
*/
|
||||||
void my_timestamp_to_binary(const struct timeval *tm, uchar *ptr, uint dec)
|
void my_timestamp_to_binary(const struct my_timeval *tm, uchar *ptr, uint dec)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(dec <= TIME_SECOND_PART_DIGITS);
|
DBUG_ASSERT(dec <= TIME_SECOND_PART_DIGITS);
|
||||||
/* Stored value must have been previously properly rounded or truncated */
|
/* Stored value must have been previously properly rounded or truncated */
|
||||||
|
|
|
@ -47,7 +47,9 @@ void my_time_packed_to_binary(longlong nr, uchar *ptr, uint dec);
|
||||||
longlong my_time_packed_from_binary(const uchar *ptr, uint dec);
|
longlong my_time_packed_from_binary(const uchar *ptr, uint dec);
|
||||||
uint my_time_binary_length(uint dec);
|
uint my_time_binary_length(uint dec);
|
||||||
|
|
||||||
void my_timestamp_to_binary(const struct timeval *tm, uchar *ptr, uint dec);
|
void my_timestamp_to_binary(const struct my_timeval *tm, uchar *ptr, uint dec);
|
||||||
|
void my_timestamp_from_binary(struct my_timeval *tm, const uchar *ptr, uint dec);
|
||||||
|
/* For ColumnStore */
|
||||||
void my_timestamp_from_binary(struct timeval *tm, const uchar *ptr, uint dec);
|
void my_timestamp_from_binary(struct timeval *tm, const uchar *ptr, uint dec);
|
||||||
uint my_timestamp_binary_length(uint dec);
|
uint my_timestamp_binary_length(uint dec);
|
||||||
/** End of MySQL routines and macros **/
|
/** End of MySQL routines and macros **/
|
||||||
|
|
18
sql/field.cc
18
sql/field.cc
|
@ -2048,7 +2048,7 @@ int Field::store_text(const char *to, size_t length, CHARSET_INFO *cs,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Field::store_timestamp_dec(const timeval &ts, uint dec)
|
int Field::store_timestamp_dec(const my_timeval &ts, uint dec)
|
||||||
{
|
{
|
||||||
return store_time_dec(Datetime(get_thd(), ts).get_mysql_time(), dec);
|
return store_time_dec(Datetime(get_thd(), ts).get_mysql_time(), dec);
|
||||||
}
|
}
|
||||||
|
@ -5403,13 +5403,13 @@ int Field_timestamp::store(longlong nr, bool unsigned_val)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Field_timestamp::store_timestamp_dec(const timeval &tv, uint dec)
|
int Field_timestamp::store_timestamp_dec(const my_timeval &tv, uint dec)
|
||||||
{
|
{
|
||||||
int warn= 0;
|
int warn= 0;
|
||||||
time_round_mode_t mode= Datetime::default_round_mode(get_thd());
|
time_round_mode_t mode= Datetime::default_round_mode(get_thd());
|
||||||
const Timestamp ts= Timestamp(tv).round(decimals(), mode, &warn);
|
const Timestamp ts= Timestamp(tv).round(decimals(), mode, &warn);
|
||||||
store_TIMESTAMP(ts);
|
store_TIMESTAMP(ts);
|
||||||
if (ts.tv().tv_sec == 0 && ts.tv().tv_usec == 0)
|
if (ts.tv_sec == 0 && ts.tv_usec == 0)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
The value {tv_sec==0, tv_usec==0} here means '1970-01-01 00:00:00 +00'.
|
The value {tv_sec==0, tv_usec==0} here means '1970-01-01 00:00:00 +00'.
|
||||||
|
@ -5474,7 +5474,7 @@ int Field_timestamp::store_native(const Native &value)
|
||||||
Field_timestamp*::store_timestamp_dec() do not use the "dec" parameter.
|
Field_timestamp*::store_timestamp_dec() do not use the "dec" parameter.
|
||||||
Passing TIME_SECOND_PART_DIGITS is OK.
|
Passing TIME_SECOND_PART_DIGITS is OK.
|
||||||
*/
|
*/
|
||||||
return store_timestamp_dec(Timestamp(value).tv(), TIME_SECOND_PART_DIGITS);
|
return store_timestamp_dec(Timestamp(value), TIME_SECOND_PART_DIGITS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -5675,7 +5675,7 @@ static longlong read_native(const uchar *from, uint bytes)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void Field_timestamp_hires::store_TIMEVAL(const timeval &tv)
|
void Field_timestamp_hires::store_TIMEVAL(const my_timeval &tv)
|
||||||
{
|
{
|
||||||
mi_int4store(ptr, tv.tv_sec);
|
mi_int4store(ptr, tv.tv_sec);
|
||||||
store_bigendian(sec_part_shift(tv.tv_usec, dec), ptr+4, sec_part_bytes(dec));
|
store_bigendian(sec_part_shift(tv.tv_usec, dec), ptr+4, sec_part_bytes(dec));
|
||||||
|
@ -5693,7 +5693,7 @@ my_time_t Field_timestamp_hires::get_timestamp(const uchar *pos,
|
||||||
bool Field_timestamp_hires::val_native(Native *to)
|
bool Field_timestamp_hires::val_native(Native *to)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(marked_for_read());
|
DBUG_ASSERT(marked_for_read());
|
||||||
struct timeval tm;
|
struct my_timeval tm;
|
||||||
tm.tv_sec= mi_uint4korr(ptr);
|
tm.tv_sec= mi_uint4korr(ptr);
|
||||||
tm.tv_usec= (ulong) sec_part_unshift(read_bigendian(ptr+4, sec_part_bytes(dec)), dec);
|
tm.tv_usec= (ulong) sec_part_unshift(read_bigendian(ptr+4, sec_part_bytes(dec)), dec);
|
||||||
return Timestamp_or_zero_datetime(Timestamp(tm), tm.tv_sec == 0).
|
return Timestamp_or_zero_datetime(Timestamp(tm), tm.tv_sec == 0).
|
||||||
|
@ -5770,7 +5770,7 @@ void Field_timestamp_with_dec::make_send_field(Send_field *field)
|
||||||
** MySQL-5.6 compatible TIMESTAMP(N)
|
** MySQL-5.6 compatible TIMESTAMP(N)
|
||||||
**************************************************************/
|
**************************************************************/
|
||||||
|
|
||||||
void Field_timestampf::store_TIMEVAL(const timeval &tm)
|
void Field_timestampf::store_TIMEVAL(const my_timeval &tm)
|
||||||
{
|
{
|
||||||
my_timestamp_to_binary(&tm, ptr, dec);
|
my_timestamp_to_binary(&tm, ptr, dec);
|
||||||
}
|
}
|
||||||
|
@ -5803,10 +5803,10 @@ bool Field_timestampf::is_max()
|
||||||
my_time_t Field_timestampf::get_timestamp(const uchar *pos,
|
my_time_t Field_timestampf::get_timestamp(const uchar *pos,
|
||||||
ulong *sec_part) const
|
ulong *sec_part) const
|
||||||
{
|
{
|
||||||
struct timeval tm;
|
struct my_timeval tm;
|
||||||
my_timestamp_from_binary(&tm, pos, dec);
|
my_timestamp_from_binary(&tm, pos, dec);
|
||||||
*sec_part= tm.tv_usec;
|
*sec_part= tm.tv_usec;
|
||||||
return tm.tv_sec;
|
return (my_time_t) tm.tv_sec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
20
sql/field.h
20
sql/field.h
|
@ -969,11 +969,13 @@ public:
|
||||||
virtual int store(longlong nr, bool unsigned_val)=0;
|
virtual int store(longlong nr, bool unsigned_val)=0;
|
||||||
virtual int store_decimal(const my_decimal *d)=0;
|
virtual int store_decimal(const my_decimal *d)=0;
|
||||||
virtual int store_time_dec(const MYSQL_TIME *ltime, uint dec);
|
virtual int store_time_dec(const MYSQL_TIME *ltime, uint dec);
|
||||||
virtual int store_timestamp_dec(const timeval &ts, uint dec);
|
virtual int store_timestamp_dec(const my_timeval &ts, uint dec);
|
||||||
int store_timestamp(my_time_t timestamp, ulong sec_part)
|
int store_timestamp(my_time_t timestamp, ulong sec_part)
|
||||||
{
|
{
|
||||||
return store_timestamp_dec(Timeval(timestamp, sec_part),
|
struct my_timeval tmp;
|
||||||
TIME_SECOND_PART_DIGITS);
|
tmp.tv_sec= (longlong) timestamp;
|
||||||
|
tmp.tv_usec= (long) sec_part;
|
||||||
|
return store_timestamp_dec(tmp, TIME_SECOND_PART_DIGITS);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
Store a value represented in native format
|
Store a value represented in native format
|
||||||
|
@ -3236,10 +3238,10 @@ class Field_timestamp :public Field_temporal {
|
||||||
protected:
|
protected:
|
||||||
int store_TIME_with_warning(THD *, const Datetime *,
|
int store_TIME_with_warning(THD *, const Datetime *,
|
||||||
const ErrConv *, int warn);
|
const ErrConv *, int warn);
|
||||||
virtual void store_TIMEVAL(const timeval &tv)= 0;
|
virtual void store_TIMEVAL(const my_timeval &tv)= 0;
|
||||||
void store_TIMESTAMP(const Timestamp &ts)
|
void store_TIMESTAMP(const Timestamp &ts)
|
||||||
{
|
{
|
||||||
store_TIMEVAL(ts.tv());
|
store_TIMEVAL(ts);
|
||||||
}
|
}
|
||||||
int zero_time_stored_return_code_with_warning();
|
int zero_time_stored_return_code_with_warning();
|
||||||
public:
|
public:
|
||||||
|
@ -3260,7 +3262,7 @@ public:
|
||||||
int store(longlong nr, bool unsigned_val) override;
|
int store(longlong nr, bool unsigned_val) override;
|
||||||
int store_time_dec(const MYSQL_TIME *ltime, uint dec) override;
|
int store_time_dec(const MYSQL_TIME *ltime, uint dec) override;
|
||||||
int store_decimal(const my_decimal *) override;
|
int store_decimal(const my_decimal *) override;
|
||||||
int store_timestamp_dec(const timeval &ts, uint dec) override;
|
int store_timestamp_dec(const my_timeval &ts, uint dec) override;
|
||||||
int save_in_field(Field *to) override;
|
int save_in_field(Field *to) override;
|
||||||
longlong val_int() override;
|
longlong val_int() override;
|
||||||
String *val_str(String *, String *) override;
|
String *val_str(String *, String *) override;
|
||||||
|
@ -3290,7 +3292,7 @@ public:
|
||||||
|
|
||||||
class Field_timestamp0 :public Field_timestamp
|
class Field_timestamp0 :public Field_timestamp
|
||||||
{
|
{
|
||||||
void store_TIMEVAL(const timeval &tv) override
|
void store_TIMEVAL(const my_timeval &tv) override
|
||||||
{
|
{
|
||||||
int4store(ptr, tv.tv_sec);
|
int4store(ptr, tv.tv_sec);
|
||||||
}
|
}
|
||||||
|
@ -3382,7 +3384,7 @@ class Field_timestamp_hires :public Field_timestamp_with_dec {
|
||||||
{
|
{
|
||||||
return Type_handler_timestamp::sec_part_bytes(dec);
|
return Type_handler_timestamp::sec_part_bytes(dec);
|
||||||
}
|
}
|
||||||
void store_TIMEVAL(const timeval &tv) override;
|
void store_TIMEVAL(const my_timeval &tv) override;
|
||||||
public:
|
public:
|
||||||
Field_timestamp_hires(uchar *ptr_arg,
|
Field_timestamp_hires(uchar *ptr_arg,
|
||||||
uchar *null_ptr_arg, uchar null_bit_arg,
|
uchar *null_ptr_arg, uchar null_bit_arg,
|
||||||
|
@ -3411,7 +3413,7 @@ public:
|
||||||
TIMESTAMP(0..6) - MySQL56 version
|
TIMESTAMP(0..6) - MySQL56 version
|
||||||
*/
|
*/
|
||||||
class Field_timestampf :public Field_timestamp_with_dec {
|
class Field_timestampf :public Field_timestamp_with_dec {
|
||||||
void store_TIMEVAL(const timeval &tv) override;
|
void store_TIMEVAL(const my_timeval &tv) override;
|
||||||
public:
|
public:
|
||||||
Field_timestampf(uchar *ptr_arg,
|
Field_timestampf(uchar *ptr_arg,
|
||||||
uchar *null_ptr_arg, uchar null_bit_arg,
|
uchar *null_ptr_arg, uchar null_bit_arg,
|
||||||
|
|
|
@ -1253,8 +1253,8 @@ bool Item_func_unix_timestamp::get_timestamp_value(my_time_t *seconds,
|
||||||
if ((null_value= native.is_null() || native.is_zero_datetime()))
|
if ((null_value= native.is_null() || native.is_zero_datetime()))
|
||||||
return true;
|
return true;
|
||||||
Timestamp tm(native);
|
Timestamp tm(native);
|
||||||
*seconds= tm.tv().tv_sec;
|
*seconds= (my_time_t) tm.tv_sec;
|
||||||
*second_part= tm.tv().tv_usec;
|
*second_part= tm.tv_usec;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -685,7 +685,7 @@ log_event_print_value(IO_CACHE *file, PRINT_EVENT_INFO *print_event_info,
|
||||||
goto return_null;
|
goto return_null;
|
||||||
|
|
||||||
char buf[MAX_DATE_STRING_REP_LENGTH];
|
char buf[MAX_DATE_STRING_REP_LENGTH];
|
||||||
struct timeval tm;
|
struct my_timeval tm;
|
||||||
my_timestamp_from_binary(&tm, ptr, meta);
|
my_timestamp_from_binary(&tm, ptr, meta);
|
||||||
int buflen= my_timeval_to_str(&tm, buf, meta);
|
int buflen= my_timeval_to_str(&tm, buf, meta);
|
||||||
my_b_write(file, (uchar*)buf, buflen);
|
my_b_write(file, (uchar*)buf, buflen);
|
||||||
|
|
|
@ -3388,7 +3388,7 @@ public:
|
||||||
WT_THD wt; ///< for deadlock detection
|
WT_THD wt; ///< for deadlock detection
|
||||||
Rows_log_event *m_pending_rows_event;
|
Rows_log_event *m_pending_rows_event;
|
||||||
|
|
||||||
struct st_trans_time : public timeval
|
struct st_trans_time : public my_timeval
|
||||||
{
|
{
|
||||||
void reset(THD *thd)
|
void reset(THD *thd)
|
||||||
{
|
{
|
||||||
|
@ -4299,7 +4299,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
timeval transaction_time()
|
my_timeval transaction_time()
|
||||||
{
|
{
|
||||||
if (!in_multi_stmt_transaction_mode())
|
if (!in_multi_stmt_transaction_mode())
|
||||||
transaction->start_time.reset(this);
|
transaction->start_time.reset(this);
|
||||||
|
|
|
@ -390,7 +390,7 @@ bool Timestamp::to_native(Native *to, uint decimals) const
|
||||||
|
|
||||||
bool Timestamp::to_TIME(THD *thd, MYSQL_TIME *to, date_mode_t fuzzydate) const
|
bool Timestamp::to_TIME(THD *thd, MYSQL_TIME *to, date_mode_t fuzzydate) const
|
||||||
{
|
{
|
||||||
return thd->timestamp_to_TIME(to, tv_sec, tv_usec, fuzzydate);
|
return thd->timestamp_to_TIME(to, (my_time_t) tv_sec, tv_usec, fuzzydate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -450,7 +450,7 @@ int Timestamp_or_zero_datetime_native::save_in_field(Field *field,
|
||||||
static Datetime zero(Datetime::zero());
|
static Datetime zero(Datetime::zero());
|
||||||
return field->store_time_dec(zero.get_mysql_time(), decimals);
|
return field->store_time_dec(zero.get_mysql_time(), decimals);
|
||||||
}
|
}
|
||||||
return field->store_timestamp_dec(Timestamp(*this).tv(), decimals);
|
return field->store_timestamp_dec(Timestamp(*this), decimals);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -782,9 +782,9 @@ void Timestamp::round_or_set_max(uint dec, int *warn)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(dec <= TIME_SECOND_PART_DIGITS);
|
DBUG_ASSERT(dec <= TIME_SECOND_PART_DIGITS);
|
||||||
if (add_nanoseconds_usec(msec_round_add[dec]) &&
|
if (add_nanoseconds_usec(msec_round_add[dec]) &&
|
||||||
(ulonglong) tv_sec++ >= TIMESTAMP_MAX_VALUE)
|
tv_sec++ >= TIMESTAMP_MAX_VALUE)
|
||||||
{
|
{
|
||||||
tv_sec= (time_t) TIMESTAMP_MAX_VALUE;
|
tv_sec= TIMESTAMP_MAX_VALUE;
|
||||||
tv_usec= TIME_MAX_SECOND_PART;
|
tv_usec= TIME_MAX_SECOND_PART;
|
||||||
*warn|= MYSQL_TIME_WARN_OUT_OF_RANGE;
|
*warn|= MYSQL_TIME_WARN_OUT_OF_RANGE;
|
||||||
}
|
}
|
||||||
|
@ -1053,9 +1053,9 @@ void Datetime::make_from_datetime(THD *thd, int *warn, const MYSQL_TIME *from,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Datetime::Datetime(THD *thd, const timeval &tv)
|
Datetime::Datetime(THD *thd, const my_timeval &tv)
|
||||||
{
|
{
|
||||||
thd->variables.time_zone->gmt_sec_to_TIME(this, tv.tv_sec);
|
thd->variables.time_zone->gmt_sec_to_TIME(this, (my_time_t) tv.tv_sec);
|
||||||
second_part= tv.tv_usec;
|
second_part= tv.tv_usec;
|
||||||
thd->used|= THD::TIME_ZONE_USED;
|
thd->used|= THD::TIME_ZONE_USED;
|
||||||
DBUG_ASSERT(is_valid_value_slow());
|
DBUG_ASSERT(is_valid_value_slow());
|
||||||
|
|
|
@ -2480,7 +2480,7 @@ public:
|
||||||
Datetime(THD *thd, int *warn, const my_decimal *d, date_mode_t fuzzydate)
|
Datetime(THD *thd, int *warn, const my_decimal *d, date_mode_t fuzzydate)
|
||||||
:Datetime(thd, warn, Sec9(d), fuzzydate)
|
:Datetime(thd, warn, Sec9(d), fuzzydate)
|
||||||
{ }
|
{ }
|
||||||
Datetime(THD *thd, const timeval &tv);
|
Datetime(THD *thd, const my_timeval &tv);
|
||||||
|
|
||||||
Datetime(THD *thd, Item *item, date_mode_t fuzzydate, uint dec)
|
Datetime(THD *thd, Item *item, date_mode_t fuzzydate, uint dec)
|
||||||
:Datetime(thd, item, fuzzydate)
|
:Datetime(thd, item, fuzzydate)
|
||||||
|
@ -2765,7 +2765,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Timestamp: protected Timeval
|
class Timestamp: public Timeval
|
||||||
{
|
{
|
||||||
static uint binary_length_to_precision(uint length);
|
static uint binary_length_to_precision(uint length);
|
||||||
protected:
|
protected:
|
||||||
|
@ -2798,12 +2798,11 @@ public:
|
||||||
Timestamp(my_time_t timestamp, ulong sec_part)
|
Timestamp(my_time_t timestamp, ulong sec_part)
|
||||||
:Timeval(timestamp, sec_part)
|
:Timeval(timestamp, sec_part)
|
||||||
{ }
|
{ }
|
||||||
explicit Timestamp(const timeval &tv)
|
explicit Timestamp(const my_timeval &tv)
|
||||||
:Timeval(tv)
|
:Timeval(tv)
|
||||||
{ }
|
{ }
|
||||||
explicit Timestamp(const Native &native);
|
explicit Timestamp(const Native &native);
|
||||||
Timestamp(THD *thd, const MYSQL_TIME *ltime, uint *error_code);
|
Timestamp(THD *thd, const MYSQL_TIME *ltime, uint *error_code);
|
||||||
const struct timeval &tv() const { return *this; }
|
|
||||||
int cmp(const Timestamp &other) const
|
int cmp(const Timestamp &other) const
|
||||||
{
|
{
|
||||||
return tv_sec < other.tv_sec ? -1 :
|
return tv_sec < other.tv_sec ? -1 :
|
||||||
|
@ -2934,7 +2933,7 @@ public:
|
||||||
{
|
{
|
||||||
return is_zero_datetime() ?
|
return is_zero_datetime() ?
|
||||||
Datetime::zero() :
|
Datetime::zero() :
|
||||||
Datetime(thd, Timestamp(*this).tv());
|
Datetime(thd, Timestamp(*this));
|
||||||
}
|
}
|
||||||
bool is_zero_datetime() const
|
bool is_zero_datetime() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -1032,27 +1032,32 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Timeval: public timeval
|
class Timeval: public my_timeval
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
Timeval() = default;
|
Timeval() = default;
|
||||||
public:
|
public:
|
||||||
Timeval(my_time_t sec, ulong usec)
|
Timeval(my_time_t sec, ulong usec)
|
||||||
{
|
{
|
||||||
tv_sec= (time_t) sec;
|
tv_sec= (longlong) sec;
|
||||||
/*
|
/*
|
||||||
Since tv_usec is not always of type ulong, cast usec parameter
|
Since tv_usec is not always of type ulong, cast usec parameter
|
||||||
explicitly to uint to avoid compiler warnings about losing
|
explicitly to uint to avoid compiler warnings about losing
|
||||||
integer precision.
|
integer precision.
|
||||||
*/
|
*/
|
||||||
DBUG_ASSERT(usec < 1000000);
|
DBUG_ASSERT(usec < 1000000);
|
||||||
tv_usec= (uint)usec;
|
tv_usec= usec;
|
||||||
}
|
}
|
||||||
explicit Timeval(const timeval &tv)
|
explicit Timeval(const my_timeval &tv)
|
||||||
:timeval(tv)
|
:my_timeval(tv)
|
||||||
{ }
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline void my_timeval_trunc(struct my_timeval *tv, uint decimals)
|
||||||
|
{
|
||||||
|
tv->tv_usec-= (suseconds_t) my_time_fraction_remainder(tv->tv_usec, decimals);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
A value that's either a Timeval or SQL NULL
|
A value that's either a Timeval or SQL NULL
|
||||||
|
|
|
@ -10396,7 +10396,7 @@ void TR_table::store(uint field_id, ulonglong val)
|
||||||
table->field[field_id]->set_notnull();
|
table->field[field_id]->set_notnull();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TR_table::store(uint field_id, timeval ts)
|
void TR_table::store(uint field_id, my_timeval ts)
|
||||||
{
|
{
|
||||||
table->field[field_id]->store_timestamp(ts.tv_sec, ts.tv_usec);
|
table->field[field_id]->store_timestamp(ts.tv_sec, ts.tv_usec);
|
||||||
table->field[field_id]->set_notnull();
|
table->field[field_id]->set_notnull();
|
||||||
|
@ -10416,7 +10416,7 @@ bool TR_table::update(ulonglong start_id, ulonglong end_id)
|
||||||
|
|
||||||
store(FLD_BEGIN_TS, thd->transaction_time());
|
store(FLD_BEGIN_TS, thd->transaction_time());
|
||||||
thd->set_time();
|
thd->set_time();
|
||||||
timeval end_time= { (time_t) thd->query_start(), int(thd->query_start_sec_part())};
|
my_timeval end_time= { thd->query_start(), thd->query_start_sec_part()};
|
||||||
store(FLD_TRX_ID, start_id);
|
store(FLD_TRX_ID, start_id);
|
||||||
store(FLD_COMMIT_ID, end_id);
|
store(FLD_COMMIT_ID, end_id);
|
||||||
store(FLD_COMMIT_TS, end_time);
|
store(FLD_COMMIT_TS, end_time);
|
||||||
|
|
|
@ -3537,7 +3537,7 @@ public:
|
||||||
@param[in] field number in a TABLE
|
@param[in] field number in a TABLE
|
||||||
@param[in] value to store
|
@param[in] value to store
|
||||||
*/
|
*/
|
||||||
void store(uint field_id, timeval ts);
|
void store(uint field_id, my_timeval ts);
|
||||||
/**
|
/**
|
||||||
Update the transaction_registry right before commit.
|
Update the transaction_registry right before commit.
|
||||||
@param start_id transaction identifier at start
|
@param start_id transaction identifier at start
|
||||||
|
|
|
@ -1075,7 +1075,7 @@ void
|
||||||
Time_zone_system::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const
|
Time_zone_system::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const
|
||||||
{
|
{
|
||||||
struct tm tmp_tm;
|
struct tm tmp_tm;
|
||||||
time_t tmp_t= (time_t)t;
|
time_t tmp_t= (time_t) t;
|
||||||
|
|
||||||
localtime_r(&tmp_t, &tmp_tm);
|
localtime_r(&tmp_t, &tmp_tm);
|
||||||
localtime_to_TIME(tmp, &tmp_tm);
|
localtime_to_TIME(tmp, &tmp_tm);
|
||||||
|
|
|
@ -11781,7 +11781,7 @@ int ha_mroonga::storage_encode_key_timestamp2(Field *field, const uchar *key,
|
||||||
bool truncated = false;
|
bool truncated = false;
|
||||||
|
|
||||||
Field_timestampf *timestamp2_field = (Field_timestampf *)field;
|
Field_timestampf *timestamp2_field = (Field_timestampf *)field;
|
||||||
struct timeval tm;
|
struct my_timeval tm;
|
||||||
my_timestamp_from_binary(&tm, key, timestamp2_field->decimals());
|
my_timestamp_from_binary(&tm, key, timestamp2_field->decimals());
|
||||||
MYSQL_TIME mysql_time;
|
MYSQL_TIME mysql_time;
|
||||||
mrn_my_tz_UTC->gmt_sec_to_TIME(&mysql_time, (my_time_t)tm.tv_sec);
|
mrn_my_tz_UTC->gmt_sec_to_TIME(&mysql_time, (my_time_t)tm.tv_sec);
|
||||||
|
|
Loading…
Reference in a new issue