Loading mysql-test/r/view.result +23 −0 Original line number Diff line number Diff line Loading @@ -2024,3 +2024,26 @@ f1 sb 2005-01-01 12:00:00 2005-01-01 10:58:59 drop view v1; drop table t1; CREATE TABLE t1 ( aid int PRIMARY KEY, fn varchar(20) NOT NULL, ln varchar(20) NOT NULL ); CREATE TABLE t2 ( aid int NOT NULL, pid int NOT NULL ); INSERT INTO t1 VALUES(1,'a','b'), (2,'c','d'); INSERT INTO t2 values (1,1), (2,1), (2,2); CREATE VIEW v1 AS SELECT t1.*,t2.pid FROM t1,t2 WHERE t1.aid = t2.aid; SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM t1,t2 WHERE t1.aid = t2.aid GROUP BY pid; pid GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) 1 a b,c d 2 c d SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM v1 GROUP BY pid; pid GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) 1 a b,c d 2 c d DROP VIEW v1; DROP TABLE t1,t2; mysql-test/t/view.test +25 −1 Original line number Diff line number Diff line Loading @@ -1863,3 +1863,27 @@ create view v1 as select f1, subtime(f1, '1:1:1') as sb from t1; select * from v1; drop view v1; drop table t1; # # Test for bug #11412: query over a multitable view with GROUP_CONCAT # CREATE TABLE t1 ( aid int PRIMARY KEY, fn varchar(20) NOT NULL, ln varchar(20) NOT NULL ); CREATE TABLE t2 ( aid int NOT NULL, pid int NOT NULL ); INSERT INTO t1 VALUES(1,'a','b'), (2,'c','d'); INSERT INTO t2 values (1,1), (2,1), (2,2); CREATE VIEW v1 AS SELECT t1.*,t2.pid FROM t1,t2 WHERE t1.aid = t2.aid; SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM t1,t2 WHERE t1.aid = t2.aid GROUP BY pid; SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM v1 GROUP BY pid; DROP VIEW v1; DROP TABLE t1,t2; sql/item.h +5 −2 Original line number Diff line number Diff line Loading @@ -1464,7 +1464,10 @@ class Item_ref :public Item_ident void save_org_in_field(Field *field) { (*ref)->save_org_in_field(field); } enum Item_result result_type () const { return (*ref)->result_type(); } enum_field_types field_type() const { return (*ref)->field_type(); } Field *get_tmp_table_field() { return result_field; } Field *get_tmp_table_field() { return result_field ? result_field : (*ref)->get_tmp_table_field(); } Item *get_tmp_table_item(THD *thd) { return (*ref)->get_tmp_table_item(thd); } table_map used_tables() const { return depended_from ? OUTER_REF_TABLE_BIT : (*ref)->used_tables(); Loading sql/item_buff.cc +3 −3 Original line number Diff line number Diff line Loading @@ -25,9 +25,9 @@ Cached_item *new_Cached_item(THD *thd, Item *item) { if (item->type() == Item::FIELD_ITEM && !(((Item_field *) item)->field->flags & BLOB_FLAG)) return new Cached_item_field((Item_field *) item); if (item->real_item()->type() == Item::FIELD_ITEM && !(((Item_field *) (item->real_item()))->field->flags & BLOB_FLAG)) return new Cached_item_field((Item_field *) (item->real_item())); switch (item->result_type()) { case STRING_RESULT: return new Cached_item_str(thd, (Item_field *) item); Loading sql/sql_select.cc +23 −24 Original line number Diff line number Diff line Loading @@ -8026,6 +8026,12 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, bool table_cant_handle_bit_fields, uint convert_blob_length) { Item *org_item= item; if (item->real_item()->type() == Item::FIELD_ITEM) { item= item->real_item(); type= item->type(); } switch (type) { case Item::SUM_FUNC_ITEM: { Loading @@ -8037,31 +8043,23 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, } case Item::FIELD_ITEM: case Item::DEFAULT_VALUE_ITEM: { if (org_item->type() != Item::REF_ITEM || !((Item_ref *)org_item)->depended_from) { Item_field *field= (Item_field*) item; if (table_cant_handle_bit_fields && field->field->type() == FIELD_TYPE_BIT) if (table_cant_handle_bit_fields && field->field->type() == FIELD_TYPE_BIT) return create_tmp_field_from_item(thd, item, table, copy_func, modify_item, convert_blob_length); return create_tmp_field_from_field(thd, (*from_field= field->field), item->name, table, modify_item ? (Item_field*) item : NULL, convert_blob_length); } case Item::REF_ITEM: { Item *tmp_item; if ((tmp_item= item->real_item())->type() == Item::FIELD_ITEM) { Item_field *field= (Item_field*) tmp_item; Field *new_field= create_tmp_field_from_field(thd, (*from_field= field->field), item->name, table, modify_item ? (Item_field*) item : NULL, convert_blob_length); if (modify_item) item->set_result_field(new_field); return new_field; } else item= org_item; } case Item::FUNC_ITEM: case Item::COND_ITEM: Loading @@ -8074,6 +8072,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, case Item::REAL_ITEM: case Item::DECIMAL_ITEM: case Item::STRING_ITEM: case Item::REF_ITEM: case Item::NULL_ITEM: case Item::VARBIN_ITEM: return create_tmp_field_from_item(thd, item, table, copy_func, modify_item, Loading Loading @@ -10904,12 +10903,12 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit, usable_keys.set_all(); for (ORDER *tmp_order=order; tmp_order ; tmp_order=tmp_order->next) { if ((*tmp_order->item)->type() != Item::FIELD_ITEM) if ((*tmp_order->item)->real_item()->type() != Item::FIELD_ITEM) { usable_keys.clear_all(); DBUG_RETURN(0); } usable_keys.intersect(((Item_field*) (*tmp_order->item))-> usable_keys.intersect(((Item_field*) (*tmp_order->item)->real_item())-> field->part_of_sortkey); if (usable_keys.is_clear_all()) DBUG_RETURN(0); // No usable keys Loading Loading
mysql-test/r/view.result +23 −0 Original line number Diff line number Diff line Loading @@ -2024,3 +2024,26 @@ f1 sb 2005-01-01 12:00:00 2005-01-01 10:58:59 drop view v1; drop table t1; CREATE TABLE t1 ( aid int PRIMARY KEY, fn varchar(20) NOT NULL, ln varchar(20) NOT NULL ); CREATE TABLE t2 ( aid int NOT NULL, pid int NOT NULL ); INSERT INTO t1 VALUES(1,'a','b'), (2,'c','d'); INSERT INTO t2 values (1,1), (2,1), (2,2); CREATE VIEW v1 AS SELECT t1.*,t2.pid FROM t1,t2 WHERE t1.aid = t2.aid; SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM t1,t2 WHERE t1.aid = t2.aid GROUP BY pid; pid GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) 1 a b,c d 2 c d SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM v1 GROUP BY pid; pid GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) 1 a b,c d 2 c d DROP VIEW v1; DROP TABLE t1,t2;
mysql-test/t/view.test +25 −1 Original line number Diff line number Diff line Loading @@ -1863,3 +1863,27 @@ create view v1 as select f1, subtime(f1, '1:1:1') as sb from t1; select * from v1; drop view v1; drop table t1; # # Test for bug #11412: query over a multitable view with GROUP_CONCAT # CREATE TABLE t1 ( aid int PRIMARY KEY, fn varchar(20) NOT NULL, ln varchar(20) NOT NULL ); CREATE TABLE t2 ( aid int NOT NULL, pid int NOT NULL ); INSERT INTO t1 VALUES(1,'a','b'), (2,'c','d'); INSERT INTO t2 values (1,1), (2,1), (2,2); CREATE VIEW v1 AS SELECT t1.*,t2.pid FROM t1,t2 WHERE t1.aid = t2.aid; SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM t1,t2 WHERE t1.aid = t2.aid GROUP BY pid; SELECT pid,GROUP_CONCAT(CONCAT(fn,' ',ln) ORDER BY 1) FROM v1 GROUP BY pid; DROP VIEW v1; DROP TABLE t1,t2;
sql/item.h +5 −2 Original line number Diff line number Diff line Loading @@ -1464,7 +1464,10 @@ class Item_ref :public Item_ident void save_org_in_field(Field *field) { (*ref)->save_org_in_field(field); } enum Item_result result_type () const { return (*ref)->result_type(); } enum_field_types field_type() const { return (*ref)->field_type(); } Field *get_tmp_table_field() { return result_field; } Field *get_tmp_table_field() { return result_field ? result_field : (*ref)->get_tmp_table_field(); } Item *get_tmp_table_item(THD *thd) { return (*ref)->get_tmp_table_item(thd); } table_map used_tables() const { return depended_from ? OUTER_REF_TABLE_BIT : (*ref)->used_tables(); Loading
sql/item_buff.cc +3 −3 Original line number Diff line number Diff line Loading @@ -25,9 +25,9 @@ Cached_item *new_Cached_item(THD *thd, Item *item) { if (item->type() == Item::FIELD_ITEM && !(((Item_field *) item)->field->flags & BLOB_FLAG)) return new Cached_item_field((Item_field *) item); if (item->real_item()->type() == Item::FIELD_ITEM && !(((Item_field *) (item->real_item()))->field->flags & BLOB_FLAG)) return new Cached_item_field((Item_field *) (item->real_item())); switch (item->result_type()) { case STRING_RESULT: return new Cached_item_str(thd, (Item_field *) item); Loading
sql/sql_select.cc +23 −24 Original line number Diff line number Diff line Loading @@ -8026,6 +8026,12 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, bool table_cant_handle_bit_fields, uint convert_blob_length) { Item *org_item= item; if (item->real_item()->type() == Item::FIELD_ITEM) { item= item->real_item(); type= item->type(); } switch (type) { case Item::SUM_FUNC_ITEM: { Loading @@ -8037,31 +8043,23 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, } case Item::FIELD_ITEM: case Item::DEFAULT_VALUE_ITEM: { if (org_item->type() != Item::REF_ITEM || !((Item_ref *)org_item)->depended_from) { Item_field *field= (Item_field*) item; if (table_cant_handle_bit_fields && field->field->type() == FIELD_TYPE_BIT) if (table_cant_handle_bit_fields && field->field->type() == FIELD_TYPE_BIT) return create_tmp_field_from_item(thd, item, table, copy_func, modify_item, convert_blob_length); return create_tmp_field_from_field(thd, (*from_field= field->field), item->name, table, modify_item ? (Item_field*) item : NULL, convert_blob_length); } case Item::REF_ITEM: { Item *tmp_item; if ((tmp_item= item->real_item())->type() == Item::FIELD_ITEM) { Item_field *field= (Item_field*) tmp_item; Field *new_field= create_tmp_field_from_field(thd, (*from_field= field->field), item->name, table, modify_item ? (Item_field*) item : NULL, convert_blob_length); if (modify_item) item->set_result_field(new_field); return new_field; } else item= org_item; } case Item::FUNC_ITEM: case Item::COND_ITEM: Loading @@ -8074,6 +8072,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, case Item::REAL_ITEM: case Item::DECIMAL_ITEM: case Item::STRING_ITEM: case Item::REF_ITEM: case Item::NULL_ITEM: case Item::VARBIN_ITEM: return create_tmp_field_from_item(thd, item, table, copy_func, modify_item, Loading Loading @@ -10904,12 +10903,12 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit, usable_keys.set_all(); for (ORDER *tmp_order=order; tmp_order ; tmp_order=tmp_order->next) { if ((*tmp_order->item)->type() != Item::FIELD_ITEM) if ((*tmp_order->item)->real_item()->type() != Item::FIELD_ITEM) { usable_keys.clear_all(); DBUG_RETURN(0); } usable_keys.intersect(((Item_field*) (*tmp_order->item))-> usable_keys.intersect(((Item_field*) (*tmp_order->item)->real_item())-> field->part_of_sortkey); if (usable_keys.is_clear_all()) DBUG_RETURN(0); // No usable keys Loading