diff options
author | Alexander Barkov <bar@mariadb.com> | 2018-12-12 10:39:06 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2018-12-12 10:39:06 +0400 |
commit | c353b2a8fc10e16107ee6c7e26877f4243d4eaef (patch) | |
tree | 6bb3d15613d83be28e8720f25ba4072bdbe0582f /sql/item.h | |
parent | 4abb8216a054e14afbeb81e8529e02bab6fa14ac (diff) | |
download | mariadb-git-c353b2a8fc10e16107ee6c7e26877f4243d4eaef.tar.gz |
--echo #
--echo # MDEV-17979 Assertion `0' failed in Item::val_native upon SELECT with timestamp, NULLIF, GROUP BY
--echo #
Diffstat (limited to 'sql/item.h')
-rw-r--r-- | sql/item.h | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/sql/item.h b/sql/item.h index 5d0f2cd43f5..9c53f731f6e 100644 --- a/sql/item.h +++ b/sql/item.h @@ -6021,6 +6021,62 @@ public: }; +/** + We need a separate class Item_copy_timestamp because + TIMESTAMP->string->TIMESTAMP conversion is not round trip safe + near the DST change, e.g. '2010-10-31 02:25:26' can mean: + - my_time_t(1288477526) - summer time in Moscow + - my_time_t(1288481126) - winter time in Moscow, one hour later +*/ +class Item_copy_timestamp: public Item_copy +{ + Timestamp_or_zero_datetime m_value; +public: + Item_copy_timestamp(THD *thd, Item *arg): Item_copy(thd, arg) { } + const Type_handler *type_handler() const { return &type_handler_timestamp2; } + void copy() + { + Timestamp_or_zero_datetime_native_null tmp(current_thd, item, false); + null_value= tmp.is_null(); + m_value= tmp.is_null() ? Timestamp_or_zero_datetime() : + Timestamp_or_zero_datetime(tmp); + } + int save_in_field(Field *field, bool no_conversions) + { + Timestamp_or_zero_datetime_native native(m_value, decimals); + return native.save_in_field(field, decimals); + } + longlong val_int() + { + return m_value.to_datetime(current_thd).to_longlong(); + } + double val_real() + { + return m_value.to_datetime(current_thd).to_double(); + } + String *val_str(String *to) + { + return m_value.to_datetime(current_thd).to_string(to, decimals); + } + my_decimal *val_decimal(my_decimal *to) + { + return m_value.to_datetime(current_thd).to_decimal(to); + } + bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) + { + bool res= m_value.to_TIME(thd, ltime, fuzzydate); + DBUG_ASSERT(!res); + return res; + } + bool val_native(THD *thd, Native *to) + { + return m_value.to_native(to, decimals); + } + Item *get_copy(THD *thd) + { return get_item_copy<Item_copy_timestamp>(thd, this); } +}; + + /* Cached_item_XXX objects are not exactly caches. They do the following: |