Commit f8ff8fc6 authored by bell@sanja.is.com.ua's avatar bell@sanja.is.com.ua

after review changes in IN/ALL/ANY/SOME (SCRUM)

parent aa9bfb44
......@@ -457,30 +457,52 @@ bool Item_asterisk_remover::fix_fields(THD *thd,
{
DBUG_ENTER("Item_asterisk_remover::fix_fields");
bool res;
bool res= 1;
if (item)
if (item->type() == Item::FIELD_ITEM &&
((Item_field*) item)->field_name[0] == '*')
{
List<Item> fields;
fields.push_back(item);
List_iterator<Item> it(fields);
it++;
uint elem=fields.elements;
if (insert_fields(thd, list, ((Item_field*) item)->db_name,
((Item_field*) item)->table_name, &it))
res= -1;
else
if (fields.elements > 1)
Item_field *fitem= (Item_field*) item;
if (!list->next || fitem->db_name || fitem->table_name)
{
TABLE_LIST *table= find_table_in_list(thd, list,
fitem->db_name,
fitem->table_name);
if (table)
{
TABLE * tb= table->table;
if (find_table_in_list(thd, table->next, fitem->db_name,
fitem->table_name) != 0 ||
tb->fields == 1)
{
my_message(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0));
res= -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= 1; // can't create Item => out of memory
}
else
my_message(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL),
MYF(0));
}
else
if (!fitem->table_name)
my_error(ER_NO_TABLES_USED, MYF(0));
else
my_error(ER_BAD_TABLE_ERROR, MYF(0), fitem->table_name);
}
else
my_message(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL),
MYF(0));
}
else
res= item->fix_fields(thd, list, &item);
else
res= -1;
thd->fatal_error= 1; // no item given => out of memory
*ref= item;
DBUG_RETURN(res);
}
......
......@@ -124,9 +124,9 @@ public:
class Item_outer_select_context_saver :public Item_wrapper
{
public:
Item_outer_select_context_saver(Item *i)
Item_outer_select_context_saver(Item *it)
{
item= i;
item= it;
}
bool fix_fields(THD *, struct st_table_list *, Item ** ref);
};
......@@ -137,9 +137,9 @@ public:
class Item_asterisk_remover :public Item_wrapper
{
public:
Item_asterisk_remover(Item *i)
Item_asterisk_remover(Item *it)
{
item= i;
item= it;
}
bool fix_fields(THD *, struct st_table_list *, Item ** ref);
};
......
......@@ -280,13 +280,13 @@ void Item_in_subselect::single_value_transformer(st_select_lex *select_lex,
compare_func_creator func)
{
DBUG_ENTER("Item_in_subselect::single_value_transformer");
for(SELECT_LEX * sl= select_lex; sl; sl= sl->next_select())
for (SELECT_LEX * sl= select_lex; sl; sl= sl->next_select())
{
Item *item;
if (sl->item_list.elements > 1)
{
my_message(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0));
item= 0; // Item_asterisk_remover mast fail
item= 0; // Item_asterisk_remover must fail
}
else
item= (Item*) sl->item_list.pop();
......@@ -408,7 +408,7 @@ void subselect_union_engine::fix_length_and_dec()
{
uint32 mlen= 0, len;
Item *sel_item= 0;
for(SELECT_LEX *sl= unit->first_select(); sl; sl= sl->next_select())
for (SELECT_LEX *sl= unit->first_select(); sl; sl= sl->next_select())
{
List_iterator_fast<Item> li(sl->item_list);
Item *s_item= li++;
......
......@@ -578,6 +578,8 @@ bool close_thread_table(THD *thd, TABLE **table_ptr);
void close_thread_tables(THD *thd,bool locked=0);
bool close_thread_table(THD *thd, TABLE **table_ptr);
void close_temporary_tables(THD *thd);
TABLE_LIST * find_table_in_list(TABLE_LIST *table,
const char *db_name, const char *table_name);
TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name);
bool close_temporary_table(THD *thd, const char *db, const char *table_name);
void close_temporary(TABLE *table, bool delete_table=1);
......
......@@ -743,6 +743,29 @@ void close_temporary_tables(THD *thd)
thd->temporary_tables=0;
}
/*
Find first suitable table in given list.
SYNOPSIS
find_table_in_list()
table - pointer to table list
db_name - data base name or 0 for any
table_name - table name or 0 for any
RETURN VALUES
NULL Table not found
# Pointer to found table.
*/
TABLE_LIST * find_table_in_list(TABLE_LIST *table,
const char *db_name, const char *table_name)
{
for (; table; table= table->next)
if ((!db_name || !strcmp(table->db, db_name)) &&
(!table_name || !strcmp(table->alias, table_name)))
break;
return table;
}
TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name)
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment