Loading mysql-test/r/olap.result +22 −0 Original line number Diff line number Diff line Loading @@ -555,3 +555,25 @@ IFNULL(a, 'TEST') COALESCE(b, 'TEST') 4 TEST TEST TEST 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; mysql-test/r/view.result +1 −1 Original line number Diff line number Diff line Loading @@ -1563,7 +1563,7 @@ one 1025,2025,3025 two 1050,1050 select col1,group_concat(col2,col3) from v1 group by col1; col1 group_concat(col2,col3) two 1025,2025,3025 one 1025,2025,3025 two 1050,1050 drop view v1; drop table t1; Loading mysql-test/t/olap.test +16 −0 Original line number Diff line number Diff line Loading @@ -250,3 +250,19 @@ SELECT IFNULL(a, 'TEST'), COALESCE(b, 'TEST') FROM 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; sql/item.h +4 −1 Original line number Diff line number Diff line Loading @@ -1440,7 +1440,10 @@ class Item_ref :public Item_ident :Item_ident(thd, item), result_field(item->result_field), ref(item->ref) {} enum Type type() const { return REF_ITEM; } 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(); longlong val_int(); my_decimal *val_decimal(my_decimal *); Loading sql/sql_select.cc +4 −3 Original line number Diff line number Diff line Loading @@ -12157,7 +12157,7 @@ count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields, param->quick_group=1; while ((field=li++)) { Item::Type type=field->type(); Item::Type type=field->real_item()->type(); if (type == Item::FIELD_ITEM) param->field_count++; else if (type == Item::SUM_FUNC_ITEM) Loading @@ -12171,7 +12171,7 @@ count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields, 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++; else param->func_count++; Loading Loading @@ -12418,9 +12418,10 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param, param->copy_funcs.empty(); for (i= 0; (pos= li++); i++) { if (pos->type() == Item::FIELD_ITEM) if (pos->real_item()->type() == Item::FIELD_ITEM) { Item_field *item; pos= pos->real_item(); if (!(item= new Item_field(thd, ((Item_field*) pos)))) goto err; pos= item; Loading Loading
mysql-test/r/olap.result +22 −0 Original line number Diff line number Diff line Loading @@ -555,3 +555,25 @@ IFNULL(a, 'TEST') COALESCE(b, 'TEST') 4 TEST TEST TEST 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;
mysql-test/r/view.result +1 −1 Original line number Diff line number Diff line Loading @@ -1563,7 +1563,7 @@ one 1025,2025,3025 two 1050,1050 select col1,group_concat(col2,col3) from v1 group by col1; col1 group_concat(col2,col3) two 1025,2025,3025 one 1025,2025,3025 two 1050,1050 drop view v1; drop table t1; Loading
mysql-test/t/olap.test +16 −0 Original line number Diff line number Diff line Loading @@ -250,3 +250,19 @@ SELECT IFNULL(a, 'TEST'), COALESCE(b, 'TEST') FROM 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;
sql/item.h +4 −1 Original line number Diff line number Diff line Loading @@ -1440,7 +1440,10 @@ class Item_ref :public Item_ident :Item_ident(thd, item), result_field(item->result_field), ref(item->ref) {} enum Type type() const { return REF_ITEM; } 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(); longlong val_int(); my_decimal *val_decimal(my_decimal *); Loading
sql/sql_select.cc +4 −3 Original line number Diff line number Diff line Loading @@ -12157,7 +12157,7 @@ count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields, param->quick_group=1; while ((field=li++)) { Item::Type type=field->type(); Item::Type type=field->real_item()->type(); if (type == Item::FIELD_ITEM) param->field_count++; else if (type == Item::SUM_FUNC_ITEM) Loading @@ -12171,7 +12171,7 @@ count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields, 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++; else param->func_count++; Loading Loading @@ -12418,9 +12418,10 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param, param->copy_funcs.empty(); for (i= 0; (pos= li++); i++) { if (pos->type() == Item::FIELD_ITEM) if (pos->real_item()->type() == Item::FIELD_ITEM) { Item_field *item; pos= pos->real_item(); if (!(item= new Item_field(thd, ((Item_field*) pos)))) goto err; pos= item; Loading