Commit 1c3f8cc2 authored by unknown's avatar unknown
Browse files

sql_select.cc:

  Fixed bug #11412.
  Reversed the patch of cs 1.1934 for the function 
  create_tmp_table. Modified the function to support
  tem_ref objects created for view fields.
item_buff.cc:
  Fixed bug #11412.
  Modified implementation of new_Cached_item to support
  cacheing of view fields.
item.h:
  Fixed bug #11412.
  Changed implementation of Item_ref::get_tmp_table_field and
  added Item_ref::get_tmp_table_item to support Item_ref objects
  created for view fields.
view.test, view.result:
  Added a test case for bug #11412.


mysql-test/r/view.result:
  Added a test case for bug #11412.
mysql-test/t/view.test:
  Added a test case for bug #11412.
sql/item.h:
  Fixed bug #11412.
  Changed implementation of Item_ref::get_tmp_table_field and
  added Item_ref::get_tmp_table_item to support Item_ref objects
  created for view fields.
sql/item_buff.cc:
  Fixed bug #11412.
  Modified implementation of new_Cached_item to support
  cacheing of view fields.
sql/sql_select.cc:
  Fixed bug #11412.
  Reversed the patch of cs 1.1934 for the function 
  create_tmp_table. Modified the function to support
  tem_ref objects created for view fields.
parent 9a0d9c35
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -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;
+25 −1
Original line number Diff line number Diff line
@@ -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;
+5 −2
Original line number Diff line number Diff line
@@ -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(); 
+3 −3
Original line number Diff line number Diff line
@@ -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);
+23 −24
Original line number Diff line number Diff line
@@ -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:
  {
@@ -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:
@@ -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,
@@ -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