Commit 5ae1639c authored by Alexander Barkov's avatar Alexander Barkov

Backporting a cleanup in boolean function from 10.1:

Moving Item_bool_func2 and Item_func_opt_neg from Item_int_func to
Item_bool_func. Now all functions that return is_bool_func()=true
have a common root class Item_bool_func.
This change is needed to fix MDEV-7149 properly.
parent e15a83c0
...@@ -122,6 +122,8 @@ public: ...@@ -122,6 +122,8 @@ public:
Item_bool_func() :Item_int_func() {} Item_bool_func() :Item_int_func() {}
Item_bool_func(Item *a) :Item_int_func(a) {} Item_bool_func(Item *a) :Item_int_func(a) {}
Item_bool_func(Item *a,Item *b) :Item_int_func(a,b) {} Item_bool_func(Item *a,Item *b) :Item_int_func(a,b) {}
Item_bool_func(Item *a, Item *b, Item *c) :Item_int_func(a, b, c) {}
Item_bool_func(List<Item> &list) :Item_int_func(list) { }
Item_bool_func(THD *thd, Item_bool_func *item) :Item_int_func(thd, item) {} Item_bool_func(THD *thd, Item_bool_func *item) :Item_int_func(thd, item) {}
bool is_bool_func() { return 1; } bool is_bool_func() { return 1; }
void fix_length_and_dec() { decimals=0; max_length=1; } void fix_length_and_dec() { decimals=0; max_length=1; }
...@@ -364,7 +366,7 @@ public: ...@@ -364,7 +366,7 @@ public:
virtual bool l_op() const { return 1; } virtual bool l_op() const { return 1; }
}; };
class Item_bool_func2 :public Item_int_func class Item_bool_func2 :public Item_bool_func
{ /* Bool with 2 string args */ { /* Bool with 2 string args */
protected: protected:
Arg_comparator cmp; Arg_comparator cmp;
...@@ -372,7 +374,7 @@ protected: ...@@ -372,7 +374,7 @@ protected:
public: public:
Item_bool_func2(Item *a,Item *b) Item_bool_func2(Item *a,Item *b)
:Item_int_func(a,b), cmp(tmp_arg, tmp_arg+1), :Item_bool_func(a,b), cmp(tmp_arg, tmp_arg+1),
abort_on_null(FALSE) { sargable= TRUE; } abort_on_null(FALSE) { sargable= TRUE; }
void fix_length_and_dec(); void fix_length_and_dec();
int set_cmp_func() int set_cmp_func()
...@@ -389,14 +391,12 @@ public: ...@@ -389,14 +391,12 @@ public:
} }
bool is_null() { return MY_TEST(args[0]->is_null() || args[1]->is_null()); } bool is_null() { return MY_TEST(args[0]->is_null() || args[1]->is_null()); }
bool is_bool_func() { return 1; }
CHARSET_INFO *compare_collation() { return cmp.cmp_collation.collation; } CHARSET_INFO *compare_collation() { return cmp.cmp_collation.collation; }
uint decimal_precision() const { return 1; }
void top_level_item() { abort_on_null= TRUE; } void top_level_item() { abort_on_null= TRUE; }
Arg_comparator *get_comparator() { return &cmp; } Arg_comparator *get_comparator() { return &cmp; }
void cleanup() void cleanup()
{ {
Item_int_func::cleanup(); Item_bool_func::cleanup();
cmp.cleanup(); cmp.cleanup();
} }
...@@ -646,16 +646,16 @@ public: ...@@ -646,16 +646,16 @@ public:
*/ */
class Item_func_opt_neg :public Item_int_func class Item_func_opt_neg :public Item_bool_func
{ {
public: public:
bool negated; /* <=> the item represents NOT <func> */ bool negated; /* <=> the item represents NOT <func> */
bool pred_level; /* <=> [NOT] <func> is used on a predicate level */ bool pred_level; /* <=> [NOT] <func> is used on a predicate level */
public: public:
Item_func_opt_neg(Item *a, Item *b, Item *c) Item_func_opt_neg(Item *a, Item *b, Item *c)
:Item_int_func(a, b, c), negated(0), pred_level(0) {} :Item_bool_func(a, b, c), negated(0), pred_level(0) {}
Item_func_opt_neg(List<Item> &list) Item_func_opt_neg(List<Item> &list)
:Item_int_func(list), negated(0), pred_level(0) {} :Item_bool_func(list), negated(0), pred_level(0) {}
public: public:
inline void negate() { negated= !negated; } inline void negate() { negated= !negated; }
inline void top_level_item() { pred_level= 1; } inline void top_level_item() { pred_level= 1; }
...@@ -686,9 +686,7 @@ public: ...@@ -686,9 +686,7 @@ public:
bool fix_fields(THD *, Item **); bool fix_fields(THD *, Item **);
void fix_length_and_dec(); void fix_length_and_dec();
virtual void print(String *str, enum_query_type query_type); virtual void print(String *str, enum_query_type query_type);
bool is_bool_func() { return 1; }
CHARSET_INFO *compare_collation() { return cmp_collation.collation; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
uint decimal_precision() const { return 1; }
bool eval_not_null_tables(uchar *opt_arg); bool eval_not_null_tables(uchar *opt_arg);
void fix_after_pullout(st_select_lex *new_parent, Item **ref); void fix_after_pullout(st_select_lex *new_parent, Item **ref);
bool count_sargable_conds(uchar *arg); bool count_sargable_conds(uchar *arg);
...@@ -1316,7 +1314,6 @@ public: ...@@ -1316,7 +1314,6 @@ public:
longlong val_int(); longlong val_int();
bool fix_fields(THD *, Item **); bool fix_fields(THD *, Item **);
void fix_length_and_dec(); void fix_length_and_dec();
uint decimal_precision() const { return 1; }
void cleanup() void cleanup()
{ {
uint i; uint i;
...@@ -1337,7 +1334,6 @@ public: ...@@ -1337,7 +1334,6 @@ public:
enum Functype functype() const { return IN_FUNC; } enum Functype functype() const { return IN_FUNC; }
const char *func_name() const { return " IN "; } const char *func_name() const { return " IN "; }
bool nulls_in_row(); bool nulls_in_row();
bool is_bool_func() { return 1; }
CHARSET_INFO *compare_collation() { return cmp_collation.collation; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
bool eval_not_null_tables(uchar *opt_arg); bool eval_not_null_tables(uchar *opt_arg);
void fix_after_pullout(st_select_lex *new_parent, Item **ref); void fix_after_pullout(st_select_lex *new_parent, Item **ref);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment