summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <ramil@mysql.com>2006-04-11 18:14:34 +0500
committerunknown <ramil@mysql.com>2006-04-11 18:14:34 +0500
commit961725aa518b283cf5a45aa3910a08c723710625 (patch)
tree89eb97cebc7c7572776307c6c15b3816cf272bf0
parent3d860b131abd2315ce40f6caebd8740809508865 (diff)
parent1ef739636a275f1c0e7bb56f891160b77d4cf43b (diff)
downloadmariadb-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.result9
-rw-r--r--mysql-test/t/innodb.test12
-rw-r--r--sql/item_timefunc.cc35
-rw-r--r--sql/item_timefunc.h1
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);
};