summaryrefslogtreecommitdiff
path: root/sql/item_cmpfunc.h
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2007-04-27 00:40:35 +0400
committerunknown <evgen@moonbone.local>2007-04-27 00:40:35 +0400
commit7216281eabfbdc4141222fbd7a70660435852366 (patch)
treeca99d93705be2634e180bb12395f4ea580de154e /sql/item_cmpfunc.h
parented7a9e8bd4e75264a511b8b71f1a0e25af49b841 (diff)
downloadmariadb-git-7216281eabfbdc4141222fbd7a70660435852366.tar.gz
Bug#16377: Wrong DATE/DATETIME comparison in BETWEEN function.
The BETWEEN function was comparing DATE/DATETIME values either as ints or as strings. Both methods have their disadvantages and may lead to a wrong result. Now BETWEEN function checks whether all of its arguments has the STRING result types and at least one of them is a DATE/DATETIME item. If so it sets up two Arg_comparator obects to compare with the compare_datetime() comparator and uses them to compare such items. Added two Arg_comparator object members and one flag to the Item_func_between class for the correct DATE/DATETIME comparison. The Item_func_between::fix_length_and_dec() function now detects whether it's used for DATE/DATETIME comparison and sets up newly added Arg_comparator objects to do this. The Item_func_between::val_int() now uses Arg_comparator objects to perform correct DATE/DATETIME comparison. The owner variable of the Arg_comparator class now can be set to NULL if the caller wants to handle NULL values by itself. Now the Item_date_add_interval::get_date() function ajusts cached_field type according to the detected type. mysql-test/t/type_datetime.test: Added a test case for the bug#16377: Wrong DATE/DATETIME comparison in BETWEEN function. mysql-test/r/type_datetime.result: Added a test case for the bug#16377: Wrong DATE/DATETIME comparison in BETWEEN function. mysql-test/r/query_cache.result: A test case result corrected after the fix for bug#16377. sql/item_timefunc.cc: Bug#16377: Wrong DATE/DATETIME comparison in BETWEEN function. Now the Item_date_add_interval::get_date() function ajusts cached_field type according to the detected type. sql/item_cmpfunc.cc: Bug#16377: Wrong DATE/DATETIME comparison in BETWEEN function. The Item_func_between::fix_length_and_dec() function now detects whether it's used for DATE/DATETIME comparison and sets up newly added Arg_comparator objects to do this. The Item_func_between::val_int() now uses Arg_comparators to perform correct DATE/DATETIME comparison. The owner variable of the Arg_comparator class now can be set to NULL if the caller wants to handle NULL values by itself. sql/item_cmpfunc.h: Bug#16377: Wrong DATE/DATETIME comparison in BETWEEN function. Added two Arg_comparator object members and one flag to the Item_func_between class for the correct DATE/DATETIME comparison.
Diffstat (limited to 'sql/item_cmpfunc.h')
-rw-r--r--sql/item_cmpfunc.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h
index 6318c7444de..761ca90d0a7 100644
--- a/sql/item_cmpfunc.h
+++ b/sql/item_cmpfunc.h
@@ -91,6 +91,7 @@ public:
static enum enum_date_cmp_type can_compare_as_dates(Item *a, Item *b,
ulonglong *const_val_arg);
+ void set_datetime_cmp_func(Item **a1, Item **b1);
static arg_cmp_func comparator_matrix [5][2];
friend class Item_func;
@@ -579,8 +580,12 @@ class Item_func_between :public Item_func_opt_neg
public:
Item_result cmp_type;
String value0,value1,value2;
+ /* TRUE <=> arguments will be compared as dates. */
+ bool compare_as_dates;
+ /* Comparators used for DATE/DATETIME comparison. */
+ Arg_comparator ge_cmp, le_cmp;
Item_func_between(Item *a, Item *b, Item *c)
- :Item_func_opt_neg(a, b, c) {}
+ :Item_func_opt_neg(a, b, c), compare_as_dates(FALSE) {}
longlong val_int();
optimize_type select_optimize() const { return OPTIMIZE_KEY; }
enum Functype functype() const { return BETWEEN; }