Commit 1e292442 authored by ramil@mysql.com's avatar ramil@mysql.com

Fix for bug #14360: Date Between Interval Broken.

parent abf41982
...@@ -3232,3 +3232,12 @@ drop trigger t2t; ...@@ -3232,3 +3232,12 @@ drop trigger t2t;
drop trigger t3t; drop trigger t3t;
drop trigger t4t; drop trigger t4t;
drop table t1, t2, t3, t4, t5; 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;
...@@ -2127,3 +2127,15 @@ drop table t1, t2, t3, t4, t5; ...@@ -2127,3 +2127,15 @@ drop table t1, t2, t3, t4, t5;
connection default; connection default;
disconnect a; disconnect a;
disconnect b; 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;
...@@ -2125,6 +2125,41 @@ longlong Item_date_add_interval::val_int() ...@@ -2125,6 +2125,41 @@ longlong Item_date_add_interval::val_int()
((date*100L + ltime.hour)*100L+ ltime.minute)*100L + ltime.second; ((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[]= static const char *interval_names[]=
{ {
"year", "quarter", "month", "day", "hour", "year", "quarter", "month", "day", "hour",
......
...@@ -656,6 +656,7 @@ public: ...@@ -656,6 +656,7 @@ public:
double val_real() { DBUG_ASSERT(fixed == 1); return (double) val_int(); } double val_real() { DBUG_ASSERT(fixed == 1); return (double) val_int(); }
longlong val_int(); longlong val_int();
bool get_date(TIME *res, uint fuzzy_date); bool get_date(TIME *res, uint fuzzy_date);
bool eq(const Item *item, bool binary_cmp) const;
void print(String *str); void print(String *str);
}; };
......
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