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
This commit is contained in:
parent
9c73436b2e
commit
59b45b5b0a
@ -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;//
|
|||||||
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)
|
|||||||
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,
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user