diff options
author | unknown <ramil@mysql.com> | 2006-04-11 18:14:34 +0500 |
---|---|---|
committer | unknown <ramil@mysql.com> | 2006-04-11 18:14:34 +0500 |
commit | 961725aa518b283cf5a45aa3910a08c723710625 (patch) | |
tree | 89eb97cebc7c7572776307c6c15b3816cf272bf0 | |
parent | 3d860b131abd2315ce40f6caebd8740809508865 (diff) | |
parent | 1ef739636a275f1c0e7bb56f891160b77d4cf43b (diff) | |
download | mariadb-git-961725aa518b283cf5a45aa3910a08c723710625.tar.gz |
Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/usr/home/ram/work/5.0.b14360
-rw-r--r-- | mysql-test/r/innodb.result | 9 | ||||
-rw-r--r-- | mysql-test/t/innodb.test | 12 | ||||
-rw-r--r-- | sql/item_timefunc.cc | 35 | ||||
-rw-r--r-- | sql/item_timefunc.h | 1 |
4 files changed, 57 insertions, 0 deletions
diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index c5658d22eb6..9a190557211 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -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; diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test index 832c4635815..b0835cd8419 100644 --- a/mysql-test/t/innodb.test +++ b/mysql-test/t/innodb.test @@ -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; diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index e139eba385e..ee74d30ce53 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -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", diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index 71f595184ec..761faf85e63 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -656,6 +656,7 @@ public: 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); }; |