Commit 59b45b5b authored by unknown's avatar unknown

Bug #20191: getTableName gives wrong or inconsistent result when using VIEWs

When compiling GROUP BY Item_ref instances are dereferenced in 
setup_copy_fields(), i.e. replaced with the corresponding Item_field 
(if they point to one) or Item_copy_string for the other cases.
Since the Item_ref (in the Item_field case) is no longer used the information
about the aliases stored in it is lost.   
Fixed by preserving the column, table and DB alias on dereferencing Item_ref


mysql-test/r/metadata.result:
  Bug #20191: getTableName gives wrong or inconsistent result when using VIEWs
   - test case
mysql-test/t/metadata.test:
  Bug #20191: getTableName gives wrong or inconsistent result when using VIEWs
   - test case
sql/item.cc:
  Bug #20191: getTableName gives wrong or inconsistent result when using VIEWs
   - use the table and db name to fill up the metadata for columns
sql/sql_select.cc:
  Bug #20191: getTableName gives wrong or inconsistent result when using VIEWs
   - preserve the field, table and DB name on dereferencing an Item_ref
parent 9c73436b
...@@ -96,3 +96,37 @@ i ...@@ -96,3 +96,37 @@ i
2 2
affected rows: 1 affected rows: 1
affected rows: 0 affected rows: 0
create table t1 (id int(10));
insert into t1 values (1);
CREATE VIEW v1 AS select t1.id as id from t1;
CREATE VIEW v2 AS select t1.id as renamed from t1;
CREATE VIEW v3 AS select t1.id + 12 as renamed from t1;
select * from v1 group by id limit 1;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def test t1 v1 id id 3 10 1 Y 32768 0 63
id
1
select * from v1 group by id limit 0;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def test t1 v1 id id 3 10 0 Y 32768 0 63
id
select * from v1 where id=1000 group by id;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def test t1 v1 id id 3 10 0 Y 32768 0 63
id
select * from v1 where id=1 group by id;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def test t1 v1 id id 3 10 1 Y 32768 0 63
id
1
select * from v2 where renamed=1 group by renamed;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def test t1 v2 id renamed 3 10 1 Y 32768 0 63
renamed
1
select * from v3 where renamed=1 group by renamed;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def v3 renamed 8 12 0 Y 32896 0 63
renamed
drop table t1;
drop view v1,v2,v3;
...@@ -61,4 +61,23 @@ drop table t1;// ...@@ -61,4 +61,23 @@ drop table t1;//
delimiter ;// delimiter ;//
--disable_info --disable_info
#
# Bug #20191: getTableName gives wrong or inconsistent result when using VIEWs
#
--enable_metadata
create table t1 (id int(10));
insert into t1 values (1);
CREATE VIEW v1 AS select t1.id as id from t1;
CREATE VIEW v2 AS select t1.id as renamed from t1;
CREATE VIEW v3 AS select t1.id + 12 as renamed from t1;
select * from v1 group by id limit 1;
select * from v1 group by id limit 0;
select * from v1 where id=1000 group by id;
select * from v1 where id=1 group by id;
select * from v2 where renamed=1 group by renamed;
select * from v3 where renamed=1 group by renamed;
drop table t1;
drop view v1,v2,v3;
--disable_metadata
# End of 4.1 tests # End of 4.1 tests
...@@ -4202,6 +4202,10 @@ void Item_field::make_field(Send_field *tmp_field) ...@@ -4202,6 +4202,10 @@ void Item_field::make_field(Send_field *tmp_field)
DBUG_ASSERT(tmp_field->table_name != 0); DBUG_ASSERT(tmp_field->table_name != 0);
if (name) if (name)
tmp_field->col_name=name; // Use user supplied name tmp_field->col_name=name; // Use user supplied name
if (table_name)
tmp_field->table_name= table_name;
if (db_name)
tmp_field->db_name= db_name;
} }
......
...@@ -13594,9 +13594,16 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param, ...@@ -13594,9 +13594,16 @@ setup_copy_fields(THD *thd, TMP_TABLE_PARAM *param,
if (real_pos->type() == Item::FIELD_ITEM) if (real_pos->type() == Item::FIELD_ITEM)
{ {
Item_field *item; Item_field *item;
pos= real_pos; if (!(item= new Item_field(thd, ((Item_field*) real_pos))))
if (!(item= new Item_field(thd, ((Item_field*) pos))))
goto err; goto err;
if (pos->type() == Item::REF_ITEM)
{
/* preserve the names of the ref when dereferncing */
Item_ref *ref= (Item_ref *) pos;
item->db_name= ref->db_name;
item->table_name= ref->table_name;
item->name= ref->name;
}
pos= item; pos= item;
if (item->field->flags & BLOB_FLAG) if (item->field->flags & BLOB_FLAG)
{ {
......
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