mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
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
4 changed files with 66 additions and 2 deletions
|
@ -96,3 +96,37 @@ i
|
|||
2
|
||||
affected rows: 1
|
||||
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 ;//
|
||||
--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
|
||||
|
|
|
@ -4202,6 +4202,10 @@ void Item_field::make_field(Send_field *tmp_field)
|
|||
DBUG_ASSERT(tmp_field->table_name != 0);
|
||||
if (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)
|
||||
{
|
||||
Item_field *item;
|
||||
pos= real_pos;
|
||||
if (!(item= new Item_field(thd, ((Item_field*) pos))))
|
||||
if (!(item= new Item_field(thd, ((Item_field*) real_pos))))
|
||||
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;
|
||||
if (item->field->flags & BLOB_FLAG)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue