@@ -738,6 +738,7 @@ class Field: public Value_source
738738 { return store (ls->str , ls->length , cs); }
739739 virtual double val_real (void )=0;
740740 virtual longlong val_int (void )=0;
741+ virtual bool val_bool (void )= 0;
741742 virtual my_decimal *val_decimal (my_decimal *);
742743 inline String *val_str (String *str) { return val_str (str, str); }
743744 /*
@@ -1491,6 +1492,7 @@ class Field_num :public Field {
14911492 bool eq_def (Field *field);
14921493 int store_decimal (const my_decimal *);
14931494 my_decimal *val_decimal (my_decimal *);
1495+ bool val_bool () { return val_int () != 0 ; }
14941496 uint is_equal (Create_field *new_field);
14951497 uint row_pack_length () const { return pack_length (); }
14961498 uint32 pack_length_from_metadata (uint field_metadata) {
@@ -1537,6 +1539,7 @@ class Field_str :public Field {
15371539 uint32 max_display_length () { return field_length; }
15381540 friend class Create_field ;
15391541 my_decimal *val_decimal (my_decimal *);
1542+ bool val_bool () { return val_real () != 0e0 ; }
15401543 virtual bool str_needs_quotes () { return TRUE ; }
15411544 uint is_equal (Create_field *new_field);
15421545 bool eq_cmp_as_binary () { return MY_TEST (flags & BINARY_FLAG); }
@@ -1609,6 +1612,7 @@ class Field_real :public Field_num {
16091612 int store_time_dec (MYSQL_TIME *ltime, uint dec);
16101613 bool get_date (MYSQL_TIME *ltime, ulonglong fuzzydate);
16111614 my_decimal *val_decimal (my_decimal *);
1615+ bool val_bool () { return val_real () != 0e0 ; }
16121616 uint32 max_display_length () { return field_length; }
16131617 uint size_of () const { return sizeof (*this ); }
16141618 Item *get_equal_const_item (THD *thd, const Context &ctx, Item *const_item);
@@ -1684,6 +1688,12 @@ class Field_new_decimal :public Field_num {
16841688 my_decimal *val_decimal (my_decimal *);
16851689 String *val_str (String*, String *);
16861690 bool get_date (MYSQL_TIME *ltime, ulonglong fuzzydate);
1691+ bool val_bool ()
1692+ {
1693+ my_decimal decimal_value;
1694+ my_decimal *val= val_decimal (&decimal_value);
1695+ return val ? !my_decimal_is_zero (val) : 0 ;
1696+ }
16871697 int cmp (const uchar *, const uchar *);
16881698 void sort_string (uchar *buff, uint length);
16891699 bool zero_pack () const { return 0 ; }
@@ -2009,6 +2019,7 @@ class Field_null :public Field_str {
20092019 int reset (void ) { return 0 ; }
20102020 double val_real (void ) { return 0.0 ;}
20112021 longlong val_int (void ) { return 0 ;}
2022+ bool val_bool (void ) { return false ; }
20122023 my_decimal *val_decimal (my_decimal *) { return 0 ; }
20132024 String *val_str (String *value,String *value2)
20142025 { value2->length (0 ); return value2;}
@@ -2054,6 +2065,7 @@ class Field_temporal: public Field {
20542065 CHARSET_INFO *sort_charset (void ) const { return &my_charset_bin; }
20552066 bool binary () const { return true ; }
20562067 enum Item_result cmp_type () const { return TIME_RESULT; }
2068+ bool val_bool () { return val_real () != 0e0 ; }
20572069 uint is_equal (Create_field *new_field);
20582070 bool eq_def (Field *field)
20592071 {
@@ -3267,6 +3279,7 @@ class Field_bit :public Field {
32673279 String *val_str (String*, String *);
32683280 virtual bool str_needs_quotes () { return TRUE ; }
32693281 my_decimal *val_decimal (my_decimal *);
3282+ bool val_bool () { return val_int () != 0 ; }
32703283 int cmp (const uchar *a, const uchar *b)
32713284 {
32723285 DBUG_ASSERT (ptr == a || ptr == b);
0 commit comments