diff options
author | Alexander Barkov <bar@mariadb.org> | 2016-07-03 19:12:20 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2016-07-03 19:12:20 +0400 |
commit | 59ec3973aabbdb8f23897883c6531d44e5e91664 (patch) | |
tree | c1db944c2ee7349bd4f41a807525da47e465d434 /sql/field.h | |
parent | b258f911032a04394b8e0f8f092da799d804a205 (diff) | |
download | mariadb-git-59ec3973aabbdb8f23897883c6531d44e5e91664.tar.gz |
Removing duplicate code in double-to-longlong conversion.
Adding Converter_double_to_longlong and reusing it in:
1. Field_longlong::store(double nr)
2. Field_double::val_int()
3. Item::val_int_from_real()
4. Item_dyncol_get::val_int()
As a good side efferct, now overflow in conversion in the mentioned
val_xxx() methods return exactly the same warning.
Diffstat (limited to 'sql/field.h')
-rw-r--r-- | sql/field.h | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/sql/field.h b/sql/field.h index 05e0615a163..13a0e914845 100644 --- a/sql/field.h +++ b/sql/field.h @@ -80,6 +80,35 @@ protected: Warn_filter_all() :Warn_filter(true, true) { } }; + class Converter_double_to_longlong + { + protected: + bool m_error; + longlong m_result; + public: + Converter_double_to_longlong(double nr, bool unsigned_flag); + longlong result() const { return m_result; } + bool error() const { return m_error; } + void push_warning(THD *thd, double nr, bool unsigned_flag); + }; + class Converter_double_to_longlong_with_warn: + public Converter_double_to_longlong + { + public: + Converter_double_to_longlong_with_warn(THD *thd, double nr, + bool unsigned_flag) + :Converter_double_to_longlong(nr, unsigned_flag) + { + if (m_error) + push_warning(thd, nr, unsigned_flag); + } + Converter_double_to_longlong_with_warn(double nr, bool unsigned_flag) + :Converter_double_to_longlong(nr, unsigned_flag) + { + if (m_error) + push_warning(current_thd, nr, unsigned_flag); + } + }; // String-to-number converters class Converter_string_to_number @@ -406,7 +435,6 @@ struct st_cache_field; int field_conv(Field *to,Field *from); int truncate_double(double *nr, uint field_length, uint dec, bool unsigned_flag, double max_value); -longlong double_to_longlong(double nr, bool unsigned_flag, bool *error); inline uint get_enum_pack_length(int elements) { @@ -2148,7 +2176,13 @@ public: int store(longlong nr, bool unsigned_val); int reset(void) { bzero(ptr,sizeof(double)); return 0; } double val_real(void); - longlong val_int(void); + longlong val_int(void) + { + Converter_double_to_longlong conv(Field_double::val_real(), false); + if (conv.error()) + conv.push_warning(get_thd(), Field_double::val_real(), false); + return conv.result(); + } String *val_str(String*,String *); bool send_binary(Protocol *protocol); int cmp(const uchar *,const uchar *); |