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 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 &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 &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 &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 &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); }