Loading mysql-test/r/innodb.result +9 −0 Original line number Diff line number Diff line Loading @@ -3232,3 +3232,12 @@ drop trigger t2t; drop trigger t3t; drop trigger t4t; drop table t1, t2, t3, t4, t5; create table t1(a date) engine=innodb; create table t2(a date, key(a)) engine=innodb; insert into t1 values('2005-10-01'); insert into t2 values('2005-10-01'); select * from t1, t2 where t2.a between t1.a - interval 2 day and t1.a + interval 2 day; a a 2005-10-01 2005-10-01 drop table t1, t2; mysql-test/t/innodb.test +12 −0 Original line number Diff line number Diff line Loading @@ -2127,3 +2127,15 @@ drop table t1, t2, t3, t4, t5; connection default; disconnect a; disconnect b; # # Bug #14360: problem with intervals # create table t1(a date) engine=innodb; create table t2(a date, key(a)) engine=innodb; insert into t1 values('2005-10-01'); insert into t2 values('2005-10-01'); select * from t1, t2 where t2.a between t1.a - interval 2 day and t1.a + interval 2 day; drop table t1, t2; sql/item_timefunc.cc +35 −0 Original line number Diff line number Diff line Loading @@ -2125,6 +2125,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", Loading sql/item_timefunc.h +1 −0 Original line number Diff line number Diff line Loading @@ -656,6 +656,7 @@ class Item_date_add_interval :public Item_date_func double val_real() { DBUG_ASSERT(fixed == 1); return (double) val_int(); } longlong val_int(); bool get_date(TIME *res, uint fuzzy_date); bool eq(const Item *item, bool binary_cmp) const; void print(String *str); }; Loading Loading
mysql-test/r/innodb.result +9 −0 Original line number Diff line number Diff line Loading @@ -3232,3 +3232,12 @@ drop trigger t2t; drop trigger t3t; drop trigger t4t; drop table t1, t2, t3, t4, t5; create table t1(a date) engine=innodb; create table t2(a date, key(a)) engine=innodb; insert into t1 values('2005-10-01'); insert into t2 values('2005-10-01'); select * from t1, t2 where t2.a between t1.a - interval 2 day and t1.a + interval 2 day; a a 2005-10-01 2005-10-01 drop table t1, t2;
mysql-test/t/innodb.test +12 −0 Original line number Diff line number Diff line Loading @@ -2127,3 +2127,15 @@ drop table t1, t2, t3, t4, t5; connection default; disconnect a; disconnect b; # # Bug #14360: problem with intervals # create table t1(a date) engine=innodb; create table t2(a date, key(a)) engine=innodb; insert into t1 values('2005-10-01'); insert into t2 values('2005-10-01'); select * from t1, t2 where t2.a between t1.a - interval 2 day and t1.a + interval 2 day; drop table t1, t2;
sql/item_timefunc.cc +35 −0 Original line number Diff line number Diff line Loading @@ -2125,6 +2125,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", Loading
sql/item_timefunc.h +1 −0 Original line number Diff line number Diff line Loading @@ -656,6 +656,7 @@ class Item_date_add_interval :public Item_date_func double val_real() { DBUG_ASSERT(fixed == 1); return (double) val_int(); } longlong val_int(); bool get_date(TIME *res, uint fuzzy_date); bool eq(const Item *item, bool binary_cmp) const; void print(String *str); }; Loading