mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-17182 Move fractional second truncation outside of Field_xxx::store_TIME_with_warn()
This commit is contained in:
59
sql/field.cc
59
sql/field.cc
@ -5058,8 +5058,9 @@ int Field_timestamp::store_TIME_with_warning(THD *thd, const Datetime *dt,
|
|||||||
return 1; // date was fine but pointed to a DST gap
|
return 1; // date was fine but pointed to a DST gap
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adjust and store the value
|
// Store the value
|
||||||
store_TIMEVAL(Timeval(timestamp, l_time->second_part).trunc(decimals()));
|
DBUG_ASSERT(!dt->fraction_remainder(decimals()));
|
||||||
|
store_TIMEVAL(Timeval(timestamp, l_time->second_part));
|
||||||
|
|
||||||
// Calculate return value and send warnings if needed
|
// Calculate return value and send warnings if needed
|
||||||
if (unlikely(conversion_error)) // e.g. DATETIME in the DST gap
|
if (unlikely(conversion_error)) // e.g. DATETIME in the DST gap
|
||||||
@ -5084,7 +5085,7 @@ int Field_timestamp::store_time_dec(const MYSQL_TIME *ltime, uint dec)
|
|||||||
int warn;
|
int warn;
|
||||||
ErrConvTime str(ltime);
|
ErrConvTime str(ltime);
|
||||||
THD *thd= get_thd();
|
THD *thd= get_thd();
|
||||||
Datetime dt(thd, &warn, ltime, sql_mode_for_timestamp(thd));
|
Datetime dt(thd, &warn, ltime, sql_mode_for_timestamp(thd), decimals());
|
||||||
return store_TIME_with_warning(thd, &dt, &str, warn);
|
return store_TIME_with_warning(thd, &dt, &str, warn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5094,7 +5095,7 @@ int Field_timestamp::store(const char *from,size_t len,CHARSET_INFO *cs)
|
|||||||
ErrConvString str(from, len, cs);
|
ErrConvString str(from, len, cs);
|
||||||
THD *thd= get_thd();
|
THD *thd= get_thd();
|
||||||
MYSQL_TIME_STATUS st;
|
MYSQL_TIME_STATUS st;
|
||||||
Datetime dt(&st, from, len, cs, sql_mode_for_timestamp(thd));
|
Datetime dt(&st, from, len, cs, sql_mode_for_timestamp(thd), decimals());
|
||||||
return store_TIME_with_warning(thd, &dt, &str, st.warnings);
|
return store_TIME_with_warning(thd, &dt, &str, st.warnings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5104,7 +5105,7 @@ int Field_timestamp::store(double nr)
|
|||||||
int error;
|
int error;
|
||||||
ErrConvDouble str(nr);
|
ErrConvDouble str(nr);
|
||||||
THD *thd= get_thd();
|
THD *thd= get_thd();
|
||||||
Datetime dt(&error, nr, sql_mode_for_timestamp(thd));
|
Datetime dt(&error, nr, sql_mode_for_timestamp(thd), decimals());
|
||||||
return store_TIME_with_warning(thd, &dt, &str, error);
|
return store_TIME_with_warning(thd, &dt, &str, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5414,7 +5415,7 @@ int Field_timestamp::store_decimal(const my_decimal *d)
|
|||||||
int error;
|
int error;
|
||||||
THD *thd= get_thd();
|
THD *thd= get_thd();
|
||||||
ErrConvDecimal str(d);
|
ErrConvDecimal str(d);
|
||||||
Datetime dt(&error, d, sql_mode_for_timestamp(thd));
|
Datetime dt(&error, d, sql_mode_for_timestamp(thd), decimals());
|
||||||
return store_TIME_with_warning(thd, &dt, &str, error);
|
return store_TIME_with_warning(thd, &dt, &str, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5556,20 +5557,11 @@ int Field_temporal_with_date::store_TIME_with_warning(const Datetime *dt,
|
|||||||
set_warnings(trunc_level, str, MYSQL_TIME_WARN_TRUNCATED, ts_type);
|
set_warnings(trunc_level, str, MYSQL_TIME_WARN_TRUNCATED, ts_type);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
// Adjust and store the value
|
// Store the value
|
||||||
if (ts_type == MYSQL_TIMESTAMP_DATE)
|
DBUG_ASSERT(!dt->fraction_remainder(decimals()));
|
||||||
{
|
if (ts_type == MYSQL_TIMESTAMP_DATE && !dt->hhmmssff_is_zero())
|
||||||
if (!dt->hhmmssff_is_zero())
|
was_cut|= MYSQL_TIME_NOTE_TRUNCATED;
|
||||||
was_cut|= MYSQL_TIME_NOTE_TRUNCATED;
|
store_TIME(dt->get_mysql_time());
|
||||||
store_TIME(dt->get_mysql_time());
|
|
||||||
}
|
|
||||||
else if (dt->fraction_remainder(decimals()))
|
|
||||||
{
|
|
||||||
Datetime truncated(dt->trunc(decimals()));
|
|
||||||
store_TIME(truncated.get_mysql_time());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
store_TIME(dt->get_mysql_time());
|
|
||||||
// Caclulate return value and send warnings if needed
|
// Caclulate return value and send warnings if needed
|
||||||
return store_TIME_return_code_with_warnings(was_cut, str, ts_type);
|
return store_TIME_return_code_with_warnings(was_cut, str, ts_type);
|
||||||
}
|
}
|
||||||
@ -5579,7 +5571,7 @@ int Field_temporal_with_date::store(const char *from, size_t len, CHARSET_INFO *
|
|||||||
{
|
{
|
||||||
MYSQL_TIME_STATUS st;
|
MYSQL_TIME_STATUS st;
|
||||||
ErrConvString str(from, len, cs);
|
ErrConvString str(from, len, cs);
|
||||||
Datetime dt(&st, from, len, cs, sql_mode_for_dates(get_thd()));
|
Datetime dt(&st, from, len, cs, sql_mode_for_dates(get_thd()), decimals());
|
||||||
return store_TIME_with_warning(&dt, &str, st.warnings);
|
return store_TIME_with_warning(&dt, &str, st.warnings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5587,7 +5579,7 @@ int Field_temporal_with_date::store(double nr)
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
ErrConvDouble str(nr);
|
ErrConvDouble str(nr);
|
||||||
Datetime dt(&error, nr, sql_mode_for_dates(get_thd()));
|
Datetime dt(&error, nr, sql_mode_for_dates(get_thd()), decimals());
|
||||||
return store_TIME_with_warning(&dt, &str, error);
|
return store_TIME_with_warning(&dt, &str, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5605,7 +5597,7 @@ int Field_temporal_with_date::store_time_dec(const MYSQL_TIME *ltime, uint dec)
|
|||||||
int error;
|
int error;
|
||||||
ErrConvTime str(ltime);
|
ErrConvTime str(ltime);
|
||||||
THD *thd= get_thd();
|
THD *thd= get_thd();
|
||||||
Datetime dt(thd, &error, ltime, sql_mode_for_dates(thd));
|
Datetime dt(thd, &error, ltime, sql_mode_for_dates(thd), decimals());
|
||||||
return store_TIME_with_warning(&dt, &str, error);
|
return store_TIME_with_warning(&dt, &str, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5704,14 +5696,9 @@ int Field_time::store_TIME_with_warning(const Time *t,
|
|||||||
set_warnings(Sql_condition::WARN_LEVEL_WARN, str, MYSQL_TIME_WARN_TRUNCATED);
|
set_warnings(Sql_condition::WARN_LEVEL_WARN, str, MYSQL_TIME_WARN_TRUNCATED);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
// Adjust and store the value
|
// Store the value
|
||||||
if (t->fraction_remainder(decimals()))
|
DBUG_ASSERT(!t->fraction_remainder(decimals()));
|
||||||
{
|
store_TIME(t->get_mysql_time());
|
||||||
Time truncated(t->trunc(decimals()));
|
|
||||||
store_TIME(truncated.get_mysql_time());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
store_TIME(t->get_mysql_time());
|
|
||||||
// Calculate return value and send warnings if needed
|
// Calculate return value and send warnings if needed
|
||||||
return store_TIME_return_code_with_warnings(warn, str, MYSQL_TIMESTAMP_TIME);
|
return store_TIME_return_code_with_warnings(warn, str, MYSQL_TIMESTAMP_TIME);
|
||||||
}
|
}
|
||||||
@ -5732,7 +5719,7 @@ int Field_time::store(const char *from,size_t len,CHARSET_INFO *cs)
|
|||||||
{
|
{
|
||||||
ErrConvString str(from, len, cs);
|
ErrConvString str(from, len, cs);
|
||||||
MYSQL_TIME_STATUS st;
|
MYSQL_TIME_STATUS st;
|
||||||
Time tm(&st, from, len, cs, sql_mode_for_dates(get_thd()));
|
Time tm(&st, from, len, cs, sql_mode_for_dates(get_thd()), decimals());
|
||||||
return store_TIME_with_warning(&tm, &str, st.warnings);
|
return store_TIME_with_warning(&tm, &str, st.warnings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5741,7 +5728,7 @@ int Field_time::store_time_dec(const MYSQL_TIME *ltime, uint dec)
|
|||||||
{
|
{
|
||||||
ErrConvTime str(ltime);
|
ErrConvTime str(ltime);
|
||||||
int warn;
|
int warn;
|
||||||
Time tm(&warn, ltime, curdays);
|
Time tm(&warn, ltime, curdays, decimals());
|
||||||
return store_TIME_with_warning(&tm, &str, warn);
|
return store_TIME_with_warning(&tm, &str, warn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5750,7 +5737,7 @@ int Field_time::store(double nr)
|
|||||||
{
|
{
|
||||||
ErrConvDouble str(nr);
|
ErrConvDouble str(nr);
|
||||||
int was_cut;
|
int was_cut;
|
||||||
Time tm(&was_cut, nr);
|
Time tm(&was_cut, nr, decimals());
|
||||||
return store_TIME_with_warning(&tm, &str, was_cut);
|
return store_TIME_with_warning(&tm, &str, was_cut);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5917,7 +5904,7 @@ int Field_time::store_decimal(const my_decimal *d)
|
|||||||
{
|
{
|
||||||
ErrConvDecimal str(d);
|
ErrConvDecimal str(d);
|
||||||
int was_cut;
|
int was_cut;
|
||||||
Time tm(&was_cut, d);
|
Time tm(&was_cut, d, decimals());
|
||||||
return store_TIME_with_warning(&tm, &str, was_cut);
|
return store_TIME_with_warning(&tm, &str, was_cut);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6655,7 +6642,7 @@ int Field_temporal_with_date::store_decimal(const my_decimal *d)
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
ErrConvDecimal str(d);
|
ErrConvDecimal str(d);
|
||||||
Datetime tm(&error, d, sql_mode_for_dates(get_thd()));
|
Datetime tm(&error, d, sql_mode_for_dates(get_thd()), decimals());
|
||||||
return store_TIME_with_warning(&tm, &str, error);
|
return store_TIME_with_warning(&tm, &str, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -771,6 +771,29 @@ public:
|
|||||||
Time(int *warn, const my_decimal *d)
|
Time(int *warn, const my_decimal *d)
|
||||||
:Temporal(Time(warn, Sec6(d), Options()))
|
:Temporal(Time(warn, Sec6(d), Options()))
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
Time(int *warn, const MYSQL_TIME *from, long curdays, uint dec)
|
||||||
|
:Temporal(Time(warn, from, curdays))
|
||||||
|
{
|
||||||
|
trunc(dec);
|
||||||
|
}
|
||||||
|
Time(MYSQL_TIME_STATUS *status, const char *str, size_t len, CHARSET_INFO *cs,
|
||||||
|
const Options &opt, uint dec)
|
||||||
|
:Temporal(Time(status, str, len, cs, opt))
|
||||||
|
{
|
||||||
|
trunc(dec);
|
||||||
|
}
|
||||||
|
Time(int *warn, double nr, uint dec)
|
||||||
|
:Temporal(Time(warn, nr))
|
||||||
|
{
|
||||||
|
trunc(dec);
|
||||||
|
}
|
||||||
|
Time(int *warn, const my_decimal *d, uint dec)
|
||||||
|
:Temporal(Time(warn, d))
|
||||||
|
{
|
||||||
|
trunc(dec);
|
||||||
|
}
|
||||||
|
|
||||||
static sql_mode_t flags_for_get_date()
|
static sql_mode_t flags_for_get_date()
|
||||||
{ return TIME_TIME_ONLY | TIME_INVALID_DATES; }
|
{ return TIME_TIME_ONLY | TIME_INVALID_DATES; }
|
||||||
static sql_mode_t comparison_flags_for_get_date()
|
static sql_mode_t comparison_flags_for_get_date()
|
||||||
@ -846,11 +869,12 @@ public:
|
|||||||
{
|
{
|
||||||
return is_valid_time() ? Temporal::to_packed() : 0;
|
return is_valid_time() ? Temporal::to_packed() : 0;
|
||||||
}
|
}
|
||||||
Time trunc(uint dec) const
|
Time &trunc(uint dec)
|
||||||
{
|
{
|
||||||
Time tm(*this);
|
if (is_valid_time())
|
||||||
my_time_trunc(&tm, dec);
|
my_time_trunc(this, dec);
|
||||||
return tm;
|
DBUG_ASSERT(is_valid_value_slow());
|
||||||
|
return *this;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1101,6 +1125,30 @@ public:
|
|||||||
DBUG_ASSERT(is_valid_value_slow());
|
DBUG_ASSERT(is_valid_value_slow());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Datetime(MYSQL_TIME_STATUS *status,
|
||||||
|
const char *str, size_t len, CHARSET_INFO *cs,
|
||||||
|
sql_mode_t fuzzydate, uint dec)
|
||||||
|
:Temporal_with_date(Datetime(status, str, len, cs, fuzzydate))
|
||||||
|
{
|
||||||
|
trunc(dec);
|
||||||
|
}
|
||||||
|
Datetime(int *warn, double nr, sql_mode_t fuzzydate, uint dec)
|
||||||
|
:Temporal_with_date(Datetime(warn, nr, fuzzydate))
|
||||||
|
{
|
||||||
|
trunc(dec);
|
||||||
|
}
|
||||||
|
Datetime(int *warn, const my_decimal *d, sql_mode_t fuzzydate, uint dec)
|
||||||
|
:Temporal_with_date(Datetime(warn, d, fuzzydate))
|
||||||
|
{
|
||||||
|
trunc(dec);
|
||||||
|
}
|
||||||
|
Datetime(THD *thd, int *warn, const MYSQL_TIME *from,
|
||||||
|
sql_mode_t fuzzydate, uint dec)
|
||||||
|
:Temporal_with_date(Datetime(thd, warn, from, fuzzydate))
|
||||||
|
{
|
||||||
|
trunc(dec);
|
||||||
|
}
|
||||||
|
|
||||||
bool is_valid_datetime() const
|
bool is_valid_datetime() const
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -1173,11 +1221,12 @@ public:
|
|||||||
{
|
{
|
||||||
return is_valid_datetime() ? Temporal::to_packed() : 0;
|
return is_valid_datetime() ? Temporal::to_packed() : 0;
|
||||||
}
|
}
|
||||||
Datetime trunc(uint dec) const
|
Datetime &trunc(uint dec)
|
||||||
{
|
{
|
||||||
Datetime tm(*this);
|
if (is_valid_datetime())
|
||||||
my_time_trunc(&tm, dec);
|
my_time_trunc(this, dec);
|
||||||
return tm;
|
DBUG_ASSERT(is_valid_value_slow());
|
||||||
|
return *this;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user