summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/group_by.result11
-rw-r--r--mysql-test/t/group_by.test17
-rw-r--r--sql/item.h4
-rw-r--r--sql/item_buff.cc9
-rw-r--r--sql/sql_select.cc2
5 files changed, 38 insertions, 5 deletions
diff --git a/mysql-test/r/group_by.result b/mysql-test/r/group_by.result
index 88b43c7ce35..937ed401f40 100644
--- a/mysql-test/r/group_by.result
+++ b/mysql-test/r/group_by.result
@@ -711,3 +711,14 @@ select min(b) from t1;
min(b)
3000000000
drop table t1;
+CREATE TABLE t1 (id int PRIMARY KEY, user_id int, hostname longtext);
+INSERT INTO t1 VALUES
+(1, 7, 'cache-dtc-af05.proxy.aol.com'),
+(2, 3, 'what.ever.com'),
+(3, 7, 'cache-dtc-af05.proxy.aol.com'),
+(4, 7, 'cache-dtc-af05.proxy.aol.com');
+SELECT hostname, COUNT(DISTINCT user_id) as no FROM t1
+WHERE hostname LIKE '%aol%'
+ GROUP BY hostname;
+hostname no
+cache-dtc-af05.proxy.aol.com 1
diff --git a/mysql-test/t/group_by.test b/mysql-test/t/group_by.test
index fbd39019e6d..21d5abcc287 100644
--- a/mysql-test/t/group_by.test
+++ b/mysql-test/t/group_by.test
@@ -522,3 +522,20 @@ insert into t1 values(3000000000);
select * from t1;
select min(b) from t1;
drop table t1;
+
+#
+# Test for bug #11088: GROUP BY a BLOB colimn with COUNT(DISTINCT column1)
+#
+
+CREATE TABLE t1 (id int PRIMARY KEY, user_id int, hostname longtext);
+
+INSERT INTO t1 VALUES
+ (1, 7, 'cache-dtc-af05.proxy.aol.com'),
+ (2, 3, 'what.ever.com'),
+ (3, 7, 'cache-dtc-af05.proxy.aol.com'),
+ (4, 7, 'cache-dtc-af05.proxy.aol.com');
+
+SELECT hostname, COUNT(DISTINCT user_id) as no FROM t1
+ WHERE hostname LIKE '%aol%'
+ GROUP BY hostname;
+
diff --git a/sql/item.h b/sql/item.h
index 1d8f44d4e29..87c1bc889a9 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -1503,7 +1503,7 @@ class Item_str_buff :public Item_buff
Item *item;
String value,tmp_value;
public:
- Item_str_buff(Item *arg) :item(arg),value(arg->max_length) {}
+ Item_str_buff(THD *thd, Item *arg);
bool cmp(void);
~Item_str_buff(); // Deallocate String:s
};
@@ -1872,7 +1872,7 @@ void mark_select_range_as_dependent(THD *thd,
Field *found_field, Item *found_item,
Item_ident *resolved_item);
-extern Item_buff *new_Item_buff(Item *item);
+extern Item_buff *new_Item_buff(THD *thd, Item *item);
extern Item_result item_cmp_type(Item_result a,Item_result b);
extern void resolve_const_item(THD *thd, Item **ref, Item *cmp_item);
extern bool field_is_equal_to_item(Field *field,Item *item);
diff --git a/sql/item_buff.cc b/sql/item_buff.cc
index af17d377e31..9e0fc096304 100644
--- a/sql/item_buff.cc
+++ b/sql/item_buff.cc
@@ -23,14 +23,14 @@
** Create right type of item_buffer for an item
*/
-Item_buff *new_Item_buff(Item *item)
+Item_buff *new_Item_buff(THD *thd, Item *item)
{
if (item->type() == Item::FIELD_ITEM &&
!(((Item_field *) item)->field->flags & BLOB_FLAG))
return new Item_field_buff((Item_field *) item);
switch (item->result_type()) {
case STRING_RESULT:
- return new Item_str_buff((Item_field *) item);
+ return new Item_str_buff(thd, (Item_field *) item);
case INT_RESULT:
return new Item_int_buff((Item_field *) item);
case REAL_RESULT:
@@ -51,12 +51,17 @@ Item_buff::~Item_buff() {}
** Return true if values have changed
*/
+Item_str_buff::Item_str_buff(THD *thd, Item *arg)
+ :item(arg), value(min(arg->max_length, thd->variables. max_sort_length))
+{}
+
bool Item_str_buff::cmp(void)
{
String *res;
bool tmp;
res=item->val_str(&tmp_value);
+ res->length(min(res->length(), value.alloced_length()));
if (null_value != item->null_value)
{
if ((null_value= item->null_value))
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index c4e4c31680b..82e26e13615 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -12281,7 +12281,7 @@ alloc_group_fields(JOIN *join,ORDER *group)
{
for (; group ; group=group->next)
{
- Item_buff *tmp=new_Item_buff(*group->item);
+ Item_buff *tmp=new_Item_buff(join->thd, *group->item);
if (!tmp || join->group_fields.push_front(tmp))
return TRUE;
}