summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/group_by.result1
-rw-r--r--mysql-test/t/group_by.test8
-rw-r--r--sql/item.cc11
-rw-r--r--sql/item.h11
4 files changed, 27 insertions, 4 deletions
diff --git a/mysql-test/r/group_by.result b/mysql-test/r/group_by.result
index 113f8325685..0073827056d 100644
--- a/mysql-test/r/group_by.result
+++ b/mysql-test/r/group_by.result
@@ -128,3 +128,4 @@ a MAX(b) ELT(MAX(b), 'a', 'b', 'c', 'd', 'e', 'f')
a MAX(b) MAKE_SET(MAX(b), 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')
1 4 c
10 43 a,b,d,f
+a c count(distinct rand())
diff --git a/mysql-test/t/group_by.test b/mysql-test/t/group_by.test
index 6e256d7896f..20e11713d31 100644
--- a/mysql-test/t/group_by.test
+++ b/mysql-test/t/group_by.test
@@ -346,3 +346,11 @@ select a, MAX(b), CONCAT_WS(MAX(b), '43', '4', '5') from t1 group by a;
select a, MAX(b), ELT(MAX(b), 'a', 'b', 'c', 'd', 'e', 'f') from t1 group by a;
select a, MAX(b), MAKE_SET(MAX(b), 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h') from t1 group by a;
drop table t1;
+
+# not purely group_by bug, but group_by is involved...
+
+create table t1 (a date default null, b date default null);
+insert t1 values ('1999-10-01','2000-01-10'), ('1997-01-01','1998-10-01');
+select a,min(b) c,count(distinct rand()) from t1 group by a having c<a + interval 1 day;
+drop table t1;
+
diff --git a/sql/item.cc b/sql/item.cc
index 9b4274ab71d..a2d9f0b2575 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -194,6 +194,17 @@ bool Item_field::get_date(TIME *ltime,bool fuzzydate)
return 0;
}
+bool Item_field::get_date_result(TIME *ltime,bool fuzzydate)
+{
+ if ((null_value=result_field->is_null()) ||
+ result_field->get_date(ltime,fuzzydate))
+ {
+ bzero((char*) ltime,sizeof(*ltime));
+ return 1;
+ }
+ return 0;
+}
+
bool Item_field::get_time(TIME *ltime)
{
if ((null_value=field->is_null()) || field->get_time(ltime))
diff --git a/sql/item.h b/sql/item.h
index 408010d211a..3cf5a17805c 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -82,6 +82,8 @@ public:
virtual void split_sum_func(List<Item> &fields) {}
virtual bool get_date(TIME *ltime,bool fuzzydate);
virtual bool get_time(TIME *ltime);
+ virtual bool get_date_result(TIME *ltime,bool fuzzydate)
+ { return get_date(ltime,fuzzydate); }
};
@@ -129,8 +131,9 @@ public:
return field->result_type();
}
Field *tmp_table_field() { return result_field; }
- bool get_date(TIME *ltime,bool fuzzydate);
- bool get_time(TIME *ltime);
+ bool get_date(TIME *ltime,bool fuzzydate);
+ bool get_date_result(TIME *ltime,bool fuzzydate);
+ bool get_time(TIME *ltime);
};
@@ -332,8 +335,8 @@ public:
return tmp;
}
bool get_date(TIME *ltime,bool fuzzydate)
- {
- return (null_value=(*ref)->get_date(ltime,fuzzydate));
+ {
+ return (null_value=(*ref)->get_date_result(ltime,fuzzydate));
}
bool send(String *tmp) { return (*ref)->send(tmp); }
void make_field(Send_field *field) { (*ref)->make_field(field); }