Skip to content

Commit 6b36fb9

Browse files
author
Alexander Barkov
committed
Clean-up: sharing duplicate code in Item_field::val_bool_result() and
Item_ref::val_bool_result().
1 parent 38f3b99 commit 6b36fb9

File tree

2 files changed

+17
-40
lines changed

2 files changed

+17
-40
lines changed

sql/field.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

sql/item.cc

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2560,27 +2560,8 @@ my_decimal *Item_field::val_decimal_result(my_decimal *decimal_value)
25602560
bool Item_field::val_bool_result()
25612561
{
25622562
if ((null_value= result_field->is_null()))
2563-
return FALSE;
2564-
switch (result_field->result_type()) {
2565-
case INT_RESULT:
2566-
return result_field->val_int() != 0;
2567-
case DECIMAL_RESULT:
2568-
{
2569-
my_decimal decimal_value;
2570-
my_decimal *val= result_field->val_decimal(&decimal_value);
2571-
if (val)
2572-
return !my_decimal_is_zero(val);
2573-
return 0;
2574-
}
2575-
case REAL_RESULT:
2576-
case STRING_RESULT:
2577-
return result_field->val_real() != 0.0;
2578-
case ROW_RESULT:
2579-
case TIME_RESULT:
2580-
DBUG_ASSERT(0);
2581-
return 0; // Shut up compiler
2582-
}
2583-
return 0;
2563+
return false;
2564+
return result_field->val_bool();
25842565
}
25852566

25862567

@@ -7204,25 +7185,8 @@ bool Item_ref::val_bool_result()
72047185
if (result_field)
72057186
{
72067187
if ((null_value= result_field->is_null()))
7207-
return 0;
7208-
switch (result_field->result_type()) {
7209-
case INT_RESULT:
7210-
return result_field->val_int() != 0;
7211-
case DECIMAL_RESULT:
7212-
{
7213-
my_decimal decimal_value;
7214-
my_decimal *val= result_field->val_decimal(&decimal_value);
7215-
if (val)
7216-
return !my_decimal_is_zero(val);
7217-
return 0;
7218-
}
7219-
case REAL_RESULT:
7220-
case STRING_RESULT:
7221-
return result_field->val_real() != 0.0;
7222-
case ROW_RESULT:
7223-
case TIME_RESULT:
7224-
DBUG_ASSERT(0);
7225-
}
7188+
return false;
7189+
return result_field->val_bool();
72267190
}
72277191
return val_bool();
72287192
}

0 commit comments

Comments
 (0)