diff options
author | aivanov@mysql.com <> | 2005-09-06 23:49:54 +0400 |
---|---|---|
committer | aivanov@mysql.com <> | 2005-09-06 23:49:54 +0400 |
commit | 21651672006eda1ae75e4f5e0ef8f7d5b0687c8d (patch) | |
tree | 1af15a439fb22ebeb88a4f36cf2daea85f70faae /sql/item_cmpfunc.h | |
parent | 0cf9ca5856e2abc6d91e842aa0527e81b8bad047 (diff) | |
parent | fa51afedeb4bc53117b909352558b98ed4ab5882 (diff) | |
download | mariadb-git-21651672006eda1ae75e4f5e0ef8f7d5b0687c8d.tar.gz |
Merge mysql.com:/home/alexi/dev/mysql-4.1-0
into mysql.com:/home/alexi/dev/mysql-5.0-0
Diffstat (limited to 'sql/item_cmpfunc.h')
-rw-r--r-- | sql/item_cmpfunc.h | 55 |
1 files changed, 38 insertions, 17 deletions
diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 1915dbaabf6..6ee1a1cb080 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -401,17 +401,49 @@ public: }; -class Item_func_between :public Item_int_func +/* + The class Item_func_opt_neg is defined to factor out the functionality + common for the classes Item_func_between and Item_func_in. The objects + of these classes can express predicates or there negations. + The alternative approach would be to create pairs Item_func_between, + Item_func_notbetween and Item_func_in, Item_func_notin. + +*/ + +class Item_func_opt_neg :public Item_int_func +{ +public: + bool negated; /* <=> the item represents NOT <func> */ + bool pred_level; /* <=> [NOT] <func> is used on a predicate level */ +public: + Item_func_opt_neg(Item *a, Item *b, Item *c) + :Item_int_func(a, b, c), negated(0), pred_level(0) {} + Item_func_opt_neg(List<Item> &list) + :Item_int_func(list), negated(0), pred_level(0) {} +public: + inline void negate() { negated= !negated; } + inline void top_level_item() { pred_level= 1; } + Item *neg_transformer(THD *thd) + { + negated= !negated; + return this; + } +}; + + +class Item_func_between :public Item_func_opt_neg { DTCollation cmp_collation; public: Item_result cmp_type; String value0,value1,value2; - Item_func_between(Item *a,Item *b,Item *c) :Item_int_func(a,b,c) {} + Item_func_between(Item *a, Item *b, Item *c) + :Item_func_opt_neg(a, b, c) {} longlong val_int(); optimize_type select_optimize() const { return OPTIMIZE_KEY; } enum Functype functype() const { return BETWEEN; } const char *func_name() const { return "between"; } + bool fix_fields(THD *, Item **); void fix_length_and_dec(); void print(String *str); bool is_bool_func() { return 1; } @@ -505,16 +537,10 @@ public: String *val_str(String *str); my_decimal *val_decimal(my_decimal *); enum Item_result result_type () const { return cached_result_type; } - bool fix_fields(THD *thd, Item **ref) - { - DBUG_ASSERT(fixed == 0); - args[0]->top_level_item(); - return Item_func::fix_fields(thd, ref); - } + bool fix_fields(THD *, Item **); void fix_length_and_dec(); uint decimal_precision() const; const char *func_name() const { return "if"; } - table_map not_null_tables() const { return 0; } }; @@ -819,7 +845,7 @@ public: } }; -class Item_func_in :public Item_int_func +class Item_func_in :public Item_func_opt_neg { Item_result cmp_type; in_vector *array; @@ -828,11 +854,12 @@ class Item_func_in :public Item_int_func DTCollation cmp_collation; public: Item_func_in(List<Item> &list) - :Item_int_func(list), array(0), in_item(0), have_null(0) + :Item_func_opt_neg(list), array(0), in_item(0), have_null(0) { allowed_arg_cols= 0; // Fetch this value from first argument } longlong val_int(); + bool fix_fields(THD *, Item **); void fix_length_and_dec(); uint decimal_precision() const { return 1; } void cleanup() @@ -853,12 +880,6 @@ class Item_func_in :public Item_int_func bool nulls_in_row(); bool is_bool_func() { return 1; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; } - /* - IN() protect from NULL only first argument, if construction like - "expression IN ()" will be allowed, we will need to check number of - argument here, because "NOT(NULL IN ())" is TRUE. - */ - table_map not_null_tables() const { return args[0]->not_null_tables(); } }; /* Functions used by where clause */ |