Commit 6422def9 authored by unknown's avatar unknown

view.result:

  Fixed the results of a test for group_concat.
  After the fix foor bug #11639 the results became
  correct.
olap.result, olap.test:
  Added a test case for bug #11639.
sql_select.cc:
  Fixed bug #11639: a wrong result set when using a view
  instead of the underlying table in a rollup query 
  executed through filesort.
  The old code did not take into account that we always
  use an Item_ref object when referring to a view column.
item.h:
  Fixed bug #11639.
  Now if two Item_ref items ref1 and ref2 refer to the same field
  then ref1->eq(ref2) returns 1.


sql/item.h:
  Fixed bug #11639.
  Now if two Item_ref items ref1 and ref2 refer to the same field
  then ref1->eq(ref2) returns 1.
sql/sql_select.cc:
  Fixed bug #11639: a wrong result set when using a view
  instead of the underlying table in a rollup query 
  executed through filesort.
  The old code did not take into account that we always
  use an Item_ref object when referring to a view column.
mysql-test/t/olap.test:
  Added a test case for bug #11639.
mysql-test/r/olap.result:
  Added a test case for bug #11639.
mysql-test/r/view.result:
  Fixed the results of a test for group_concat.
  After the fix foor bug #11639 the results became
  correct.
parent 22dc7f6f
...@@ -555,3 +555,25 @@ IFNULL(a, 'TEST') COALESCE(b, 'TEST') ...@@ -555,3 +555,25 @@ IFNULL(a, 'TEST') COALESCE(b, 'TEST')
4 TEST 4 TEST
TEST TEST TEST TEST
DROP TABLE t1,t2; DROP TABLE t1,t2;
CREATE TABLE t1(id int, type char(1));
INSERT INTO t1 VALUES
(1,"A"),(2,"C"),(3,"A"),(4,"A"),(5,"B"),
(6,"B"),(7,"A"),(8,"C"),(9,"A"),(10,"C");
CREATE VIEW v1 AS SELECT * FROM t1;
SELECT type FROM t1 GROUP BY type WITH ROLLUP;
type
A
B
C
NULL
SELECT type FROM v1 GROUP BY type WITH ROLLUP;
type
A
B
C
NULL
EXPLAIN SELECT type FROM v1 GROUP BY type WITH ROLLUP;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 10 Using filesort
DROP VIEW v1;
DROP TABLE t1;
...@@ -1561,7 +1561,7 @@ one 1025,2025,3025 ...@@ -1561,7 +1561,7 @@ one 1025,2025,3025
two 1050,1050 two 1050,1050
select col1,group_concat(col2,col3) from v1 group by col1; select col1,group_concat(col2,col3) from v1 group by col1;
col1 group_concat(col2,col3) col1 group_concat(col2,col3)
two 1025,2025,3025 one 1025,2025,3025
two 1050,1050 two 1050,1050
drop view v1; drop view v1;
drop table t1; drop table t1;
......
...@@ -250,3 +250,19 @@ SELECT IFNULL(a, 'TEST'), COALESCE(b, 'TEST') FROM t2 ...@@ -250,3 +250,19 @@ SELECT IFNULL(a, 'TEST'), COALESCE(b, 'TEST') FROM t2
DROP TABLE t1,t2; DROP TABLE t1,t2;
#
# Tests for bug #11639: ROLLUP over view executed through filesort
#
CREATE TABLE t1(id int, type char(1));
INSERT INTO t1 VALUES
(1,"A"),(2,"C"),(3,"A"),(4,"A"),(5,"B"),
(6,"B"),(7,"A"),(8,"C"),(9,"A"),(10,"C");
CREATE VIEW v1 AS SELECT * FROM t1;
SELECT type FROM t1 GROUP BY type WITH ROLLUP;
SELECT type FROM v1 GROUP BY type WITH ROLLUP;
EXPLAIN SELECT type FROM v1 GROUP BY type WITH ROLLUP;
DROP VIEW v1;
DROP TABLE t1;
...@@ -1340,7 +1340,10 @@ class Item_ref :public Item_ident ...@@ -1340,7 +1340,10 @@ class Item_ref :public Item_ident
Item_ref(THD *thd, Item_ref *item) :Item_ident(thd, item), result_field(item->result_field), ref(item->ref) {} Item_ref(THD *thd, Item_ref *item) :Item_ident(thd, item), result_field(item->result_field), ref(item->ref) {}
enum Type type() const { return REF_ITEM; } enum Type type() const { return REF_ITEM; }
bool eq(const Item *item, bool binary_cmp) const bool eq(const Item *item, bool binary_cmp) const
{ return ref && (*ref)->eq(item, binary_cmp); } {
Item *it= ((Item *) item)->real_item();
return ref && (*ref)->eq(it, binary_cmp);
}
double val_real(); double val_real();
longlong val_int(); longlong val_int();
my_decimal *val_decimal(my_decimal *); my_decimal *val_decimal(my_decimal *);
......
...@@ -12150,7 +12150,7 @@ count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields, ...@@ -12150,7 +12150,7 @@ count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields,
param->quick_group=1; param->quick_group=1;
while ((field=li++)) while ((field=li++))
{ {
Item::Type type=field->type(); Item::Type type=field->real_item()->type();
if (type == Item::FIELD_ITEM) if (type == Item::FIELD_ITEM)
param->field_count++; param->field_count++;
else if (type == Item::SUM_FUNC_ITEM) else if (type == Item::SUM_FUNC_ITEM)
...@@ -12164,7 +12164,7 @@ count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields, ...@@ -12164,7 +12164,7 @@ count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields,
for (uint i=0 ; i < sum_item->arg_count ; i++) for (uint i=0 ; i < sum_item->arg_count ; i++)
{ {
if (sum_item->args[0]->type() == Item::FIELD_ITEM) if (sum_item->args[0]->real_item()->type() == Item::FIELD_ITEM)
param->field_count++; param->field_count++;
else else
param->func_count++; param->func_count++;
...@@ -12411,9 +12411,10 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param, ...@@ -12411,9 +12411,10 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param,
param->copy_funcs.empty(); param->copy_funcs.empty();
for (i= 0; (pos= li++); i++) for (i= 0; (pos= li++); i++)
{ {
if (pos->type() == Item::FIELD_ITEM) if (pos->real_item()->type() == Item::FIELD_ITEM)
{ {
Item_field *item; Item_field *item;
pos= pos->real_item();
if (!(item= new Item_field(thd, ((Item_field*) pos)))) if (!(item= new Item_field(thd, ((Item_field*) pos))))
goto err; goto err;
pos= item; pos= item;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment