summaryrefslogtreecommitdiff
path: root/sql/field.h
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2016-07-03 19:12:20 +0400
committerAlexander Barkov <bar@mariadb.org>2016-07-03 19:12:20 +0400
commit59ec3973aabbdb8f23897883c6531d44e5e91664 (patch)
treec1db944c2ee7349bd4f41a807525da47e465d434 /sql/field.h
parentb258f911032a04394b8e0f8f092da799d804a205 (diff)
downloadmariadb-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.h38
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 *);