mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fix for bug #14360: Date Between Interval Broken.
mysql-test/r/innodb.result: Fix for bug #14360: Date Between Interval Broken. - test case. mysql-test/t/innodb.test: Fix for bug #14360: Date Between Interval Broken. - test case. sql/item_timefunc.cc: Fix for bug #14360: Date Between Interval Broken. - Item_date_add_interval::eq() introduced. sql/item_timefunc.h: Fix for bug #14360: Date Between Interval Broken. - Item_date_add_interval::eq() introduced.
This commit is contained in:
@ -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;
|
|||||||
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()
|
|||||||
((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:
|
|||||||
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user