diff options
Diffstat (limited to 'sql/item_timefunc.cc')
-rw-r--r-- | sql/item_timefunc.cc | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 99cb7078eba..6fbd6db1a89 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -2002,6 +2002,41 @@ longlong Item_date_add_interval::val_int() ((date*100L + ltime.hour)*100L+ ltime.minute)*100L + ltime.second; } + + +bool Item_date_add_interval::eq(const Item *item, bool binary_cmp) const +{ + INTERVAL interval, other_interval; + String val= value; // Because of const + + if (this == item) + return TRUE; + + if ((item->type() != FUNC_ITEM) || + (arg_count != ((Item_func*) item)->arg_count) || + (func_name() != ((Item_func*) item)->func_name())) + return FALSE; + + Item_date_add_interval *other= (Item_date_add_interval*) item; + + if ((int_type != other->int_type) || + (!args[0]->eq(other->args[0], binary_cmp)) || + (get_interval_value(args[1], int_type, &val, &interval))) + return FALSE; + + val= other->value; + + if ((get_interval_value(other->args[1], other->int_type, &val, + &other_interval)) || + ((date_sub_interval ^ interval.neg) ^ + (other->date_sub_interval ^ other_interval.neg))) + return FALSE; + + // Assume comparing same types here due to earlier check + return memcmp(&interval, &other_interval, sizeof(INTERVAL)) == 0; +} + + static const char *interval_names[]= { "year", "quarter", "month", "day", "hour", |