diff --git a/mysql-test/r/derived.result b/mysql-test/r/derived.result
index f3b09164dda3c41f72dd210a2f13eb220ee78394..f9e521744692a2bb2f535971db74a52b1f7cef98 100644
--- a/mysql-test/r/derived.result
+++ b/mysql-test/r/derived.result
@@ -192,3 +192,7 @@ id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	6	Using where
 2	DERIVED	mp	ALL	NULL	NULL	NULL	NULL	9	Using temporary; Using filesort
 2	DERIVED	m2	index	NULL	PRIMARY	3	NULL	9	Using index
+drop table t1,t2;
+SELECT a.x FROM (SELECT 1 AS x) AS a HAVING a.x = 1;
+x
+1
diff --git a/mysql-test/t/derived.test b/mysql-test/t/derived.test
index c998de7ae6edd9ea951e1ee2dd0053539cb8a16d..c3edbabcd53c288dc12c43c3acbe5a5b82b32cfd 100644
--- a/mysql-test/t/derived.test
+++ b/mysql-test/t/derived.test
@@ -88,5 +88,9 @@ SELECT d.pla_id, m2.test FROM t1 m2  INNER JOIN (SELECT mp.pla_id, MIN(m1.matint
 
 explain SELECT d.pla_id, m2.mat_id FROM t1 m2 INNER JOIN (SELECT mp.pla_id, MIN(m1.matintnum) AS matintnum FROM t2 mp INNER JOIN t1 m1 ON mp.mat_id=m1.mat_id GROUP BY mp.pla_id) d ON d.matintnum=m2.matintnum;
 explain SELECT d.pla_id, m2.test FROM t1 m2  INNER JOIN (SELECT mp.pla_id, MIN(m1.matintnum) AS matintnum FROM t2 mp INNER JOIN t1 m1 ON mp.mat_id=m1.mat_id GROUP BY mp.pla_id) d ON d.matintnum=m2.matintnum;
+drop table t1,t2;
 
-drop table t1,t2
+#
+# derived table reference
+#
+SELECT a.x FROM (SELECT 1 AS x) AS a HAVING a.x = 1;
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index 0da2725f3ab4bde6318f5c29e1603962a653ffb3..71c4fe9f4b87c59139578ad91d490eaea62a10e0 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -1147,7 +1147,7 @@ bool Item_sum_count_distinct::setup(THD *thd)
   if (!(table= create_tmp_table(thd, tmp_table_param, list, (ORDER*) 0, 1,
 				0,
 				select_lex->options | thd->options,
-				HA_POS_ERROR)))
+				HA_POS_ERROR, (char*)"")))
     return 1;
   table->file->extra(HA_EXTRA_NO_ROWS);		// Don't update rows
   table->no_rows=1;
@@ -1834,7 +1834,8 @@ bool Item_func_group_concat::setup(THD *thd)
     (types, sizes and so on).
   */
   if (!(table=create_tmp_table(thd, tmp_table_param, all_fields, 0,
-			       0, 0, 0,select_lex->options | thd->options)))
+			       0, 0, 0,select_lex->options | thd->options,
+			       (char *) "")))
     DBUG_RETURN(1);
   table->file->extra(HA_EXTRA_NO_ROWS);
   table->no_rows= 1;
diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc
index 81439a199180dd65c7a6eba92af005b41ac5ef8f..7f70cecdb04a2134c47d0e64a676470be00bdebf 100644
--- a/sql/sql_derived.cc
+++ b/sql/sql_derived.cc
@@ -157,7 +157,8 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit,
 				  is_union && !unit->union_option, 1,
 				  (select_cursor->options | thd->options |
 				   TMP_TABLE_ALL_COLUMNS),
-				  HA_POS_ERROR)))
+				  HA_POS_ERROR,
+				  org_table_list->alias)))
     {
       res= -1;
       goto exit;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 71c0d0bdddce895a12a08864ccf6903143609ca6..a2ef96b79907626121ff7baa12b1d17c5b997024 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -787,7 +787,8 @@ JOIN::optimize()
 			   group_list && simple_group,
 			   select_options,
 			   (order == 0 || skip_sort_order) ? select_limit :
-			   HA_POS_ERROR)))
+			   HA_POS_ERROR,
+			   (char *) "")))
       DBUG_RETURN(1);
 
     /*
@@ -1120,7 +1121,8 @@ JOIN::exec()
 						curr_join->select_distinct && 
 						!curr_join->group_list,
 						1, curr_join->select_options,
-						HA_POS_ERROR)))
+						HA_POS_ERROR,
+						(char *) "")))
 	  DBUG_VOID_RETURN;
 	curr_join->exec_tmp_table2= exec_tmp_table2;
       }
@@ -4321,7 +4323,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
 TABLE *
 create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
 		 ORDER *group, bool distinct, bool save_sum_fields,
-		 ulong select_options, ha_rows rows_limit)
+		 ulong select_options, ha_rows rows_limit,
+		 char *table_alias)
 {
   TABLE *table;
   uint	i,field_count,reclength,null_count,null_pack_length,
@@ -4410,10 +4413,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
   table->field=reg_field;
   table->blob_field= (Field_blob**) blob_field;
   table->real_name=table->path=tmpname;
-  /*
-    This must be "" as field may refer to it after tempory table is dropped
-  */
-  table->table_name= (char*) "";
+  table->table_name= table_alias;
   table->reginfo.lock_type=TL_WRITE;	/* Will be updated */
   table->db_stat=HA_OPEN_KEYFILE+HA_OPEN_RNDFILE;
   table->blob_ptr_size=mi_portable_sizeof_char_ptr;
diff --git a/sql/sql_select.h b/sql/sql_select.h
index 76960876158625ad40fee6275a19f512c61c6dc9..72ea42db87c7fcaa432f12bbf53103127f36ac5b 100644
--- a/sql/sql_select.h
+++ b/sql/sql_select.h
@@ -274,7 +274,8 @@ void TEST_join(JOIN *join);
 bool store_val_in_field(Field *field,Item *val);
 TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
 			ORDER *group, bool distinct, bool save_sum_fields,
-			ulong select_options, ha_rows rows_limit);
+			ulong select_options, ha_rows rows_limit,
+			char* alias);
 void free_tmp_table(THD *thd, TABLE *entry);
 void count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields,
 		       bool reset_with_sum_func);
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index 41fc754e754a75463d9a531c5a6b378b8d14d029..16c70d046dc513dc32d20fb176d6947d32ce5290 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -178,7 +178,7 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result,
 				(ORDER*) 0, !union_option,
 				1, (select_cursor->options | thd->options |
 				    TMP_TABLE_ALL_COLUMNS),
-				HA_POS_ERROR)))
+				HA_POS_ERROR, (char*) "")))
     goto err;
   table->file->extra(HA_EXTRA_WRITE_CACHE);
   table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index e1c28dd0e4db8b72f4a246dce20d1b70133369d7..21d0a5aeb42d8ac3bdb693d04692fd2c47d28164 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -640,7 +640,8 @@ multi_update::initialize_tables(JOIN *join)
 					   temp_fields,
 					   (ORDER*) &group, 0, 0,
 					   TMP_TABLE_ALL_COLUMNS,
-					   HA_POS_ERROR)))
+					   HA_POS_ERROR,
+					   (char *) "")))
       DBUG_RETURN(1);
     tmp_tables[cnt]->file->extra(HA_EXTRA_WRITE_CACHE);
   }