diff --git a/mysql-test/r/metadata.result b/mysql-test/r/metadata.result
index 50b0b6ae2943bf4f3fe3e1cbb91dbd2a9c028935..34e961395c44ed66aba91389e085d97055a44699 100644
--- a/mysql-test/r/metadata.result
+++ b/mysql-test/r/metadata.result
@@ -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;
diff --git a/mysql-test/t/metadata.test b/mysql-test/t/metadata.test
index 65338448555abe185af2c92c4cde310bda8d127c..a6ebfdc14c165138ef3d5b1cada0c6d5db171bea 100644
--- a/mysql-test/t/metadata.test
+++ b/mysql-test/t/metadata.test
@@ -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
diff --git a/sql/item.cc b/sql/item.cc
index dc92edd651d36e7248b4e503b80061a83812c889..76f0332b4ab4ec9694f00a550cdf195f82387ab1 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -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;
 }
 
 
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index cfc068cec866202da8166c0a75a5d87374a6ffaf..17feae7f120e418c4f8a00ff976d5c76114edfa8 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -13596,9 +13596,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)
       {