summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/derived.result4
-rw-r--r--mysql-test/t/derived.test6
-rw-r--r--sql/item_sum.cc5
-rw-r--r--sql/sql_derived.cc3
-rw-r--r--sql/sql_select.cc14
-rw-r--r--sql/sql_select.h3
-rw-r--r--sql/sql_union.cc2
-rw-r--r--sql/sql_update.cc3
8 files changed, 26 insertions, 14 deletions
diff --git a/mysql-test/r/derived.result b/mysql-test/r/derived.result
index f3b09164dda..f9e52174469 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 c998de7ae6e..c3edbabcd53 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 0da2725f3ab..71c4fe9f4b8 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 81439a19918..7f70cecdb04 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 71c0d0bdddc..a2ef96b7990 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 76960876158..72ea42db87c 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 41fc754e754..16c70d046dc 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 e1c28dd0e4d..21d0a5aeb42 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);
}