diff --git a/sql/item.cc b/sql/item.cc index 555112c1890..921f588e5d3 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -722,59 +722,6 @@ bool Item::fix_fields(THD *thd, return 0; } -bool Item_asterisk_remover::fix_fields(THD *thd, - struct st_table_list *list, - Item ** ref) -{ - DBUG_ENTER("Item_asterisk_remover::fix_fields"); - - bool res= 1; - if (item) - if (item->type() == Item::FIELD_ITEM && - ((Item_field*) item)->field_name[0] == '*') - { - Item_field *fitem= (Item_field*) item; - if (list) - if (!list->next || fitem->db_name || fitem->table_name) - { - TABLE_LIST *table= find_table_in_list(list, - fitem->db_name, - fitem->table_name); - if (table) - { - TABLE * tb= table->table; - if (find_table_in_list(table->next, fitem->db_name, - fitem->table_name) != 0 || - tb->fields == 1) - { - if ((item= new Item_field(tb->field[0]))) - { - res= 0; - tb->field[0]->query_id= thd->query_id; - tb->used_keys&= tb->field[0]->part_of_key; - tb->used_fields= tb->fields; - } - else - thd->fatal_error(); // can't create Item => out of memory - } - else - my_error(ER_CARDINALITY_COL, MYF(0), 1); - } - else - my_error(ER_BAD_TABLE_ERROR, MYF(0), fitem->table_name); - } - else - my_error(ER_CARDINALITY_COL, MYF(0), 1); - else - my_error(ER_NO_TABLES_USED, MYF(0)); - } - else - res= item->fix_fields(thd, list, &item); - else - thd->fatal_error(); // no item given => out of memory - DBUG_RETURN(res); -} - bool Item_ref_on_list_position::fix_fields(THD *thd, struct st_table_list *tables, Item ** reference) diff --git a/sql/item.h b/sql/item.h index 602d5bd2676..ce8b4062580 100644 --- a/sql/item.h +++ b/sql/item.h @@ -626,6 +626,16 @@ public: } }; +class Item_null_helper :public Item_ref_null_helper +{ + Item *store; +public: + Item_null_helper(Item_in_subselect* master, Item *item, + const char *table_name_par, const char *field_name_par) + :Item_ref_null_helper(master, &store, table_name_par, field_name_par), + store(item) + {} +}; /* Used to find item in list of select items after '*' items processing. @@ -654,32 +664,6 @@ public: bool fix_fields(THD *, struct st_table_list *, Item ** ref); }; -/* - To resolve '*' field moved to condition - and register NULL values -*/ -class Item_asterisk_remover :public Item_ref_null_helper -{ - Item *item; -public: - Item_asterisk_remover(Item_in_subselect *master, Item *it, - char *table, char *field): - Item_ref_null_helper(master, &item, table, field), - item(it) - {} - bool fix_fields(THD *, struct st_table_list *, Item ** ref); - Item **storage() {return &item;} - void print(String *str) - { - str->append("ref_null_helper('"); - if (item) - item->print(str); - else - str->append('?'); - str->append(')'); - } -}; - /* The following class is used to optimize comparing of date columns We need to save the original item, to be able to set the field to the diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index c0171614fae..06418b74b16 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -559,27 +559,6 @@ Item_in_subselect::single_value_transformer(JOIN *join, if (select_lex->table_list.elements) { Item *having= item, *isnull= item; - if (item->type() == Item::FIELD_ITEM && - ((Item_field*) item)->field_name[0] == '*') - { - Item_asterisk_remover *remover; - item= remover= new Item_asterisk_remover(this, item, - (char *)"", - (char *)""); - if (!abort_on_null) - { - having= - new Item_is_not_null_test(this, - new Item_ref(remover->storage(), - (char *)"", - (char *)"")); - isnull= - new Item_is_not_null_test(this, - new Item_ref(remover->storage(), - (char *)"", - (char *)"")); - } - } item= (*func)(expr, item); if (!abort_on_null) { @@ -603,22 +582,12 @@ Item_in_subselect::single_value_transformer(JOIN *join, } else { - if (item->type() == Item::FIELD_ITEM && - ((Item_field*) item)->field_name[0] == '*') - { - my_error(ER_NO_TABLES_USED, MYF(0)); - DBUG_RETURN(ERROR); - } if (select_lex->master_unit()->first_select()->next_select()) { - /* - It is in union => we should perform it. - Item_asterisk_remover used only as wrapper to receine NULL value - */ join->having= (*func)(expr, - new Item_asterisk_remover(this, item, - (char *)"", - (char *)"")); + new Item_null_helper(this, item, + (char *)"", + (char *)"")); select_lex->having_fix_field= 1; if (join->having->fix_fields(thd, join->tables_list, &join->having)) { diff --git a/sql/item_subselect.h b/sql/item_subselect.h index dc26ec3fbca..ddb53ab616a 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -225,7 +225,6 @@ public: void top_level_item() { abort_on_null=1; } bool test_limit(st_select_lex_unit *unit); - friend class Item_asterisk_remover; friend class Item_ref_null_helper; friend class Item_is_not_null_test; friend class subselect_indexin_engine;