summaryrefslogtreecommitdiff
path: root/sql/item_subselect.cc
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2002-12-28 01:01:05 +0200
committerunknown <bell@sanja.is.com.ua>2002-12-28 01:01:05 +0200
commit3ab0ddc294891f31b65f92fb7af265047db15d52 (patch)
tree6675c15be87ddec825795b1d2a861d6bc696f109 /sql/item_subselect.cc
parent7388e9bd5b4604b351386e9d86888d94e4ac4d30 (diff)
downloadmariadb-git-3ab0ddc294891f31b65f92fb7af265047db15d52.tar.gz
postreview fix (SCRUM)
fixed layout sql/filesort.cc: fixed layout sql/gstream.cc: fixed layout sql/item.cc: postreview fix sql/item.h: postreview fix sql/item_cmpfunc.cc: postreview fix sql/item_cmpfunc.h: fixed layout sql/item_func.h: fixed layout sql/item_row.h: fixed layout sql/item_strfunc.cc: fixed layout sql/item_subselect.cc: postreview fix sql/item_subselect.h: postreview fix sql/nt_servc.cc: fixed layout sql/opt_range.cc: fixed layout sql/password.c: fixed layout sql/spatial.cc: fixed layout sql/sql_help.cc: fixed layout sql/sql_lex.cc: fixed layout sql/sql_olap.cc: fixed layout sql/sql_select.cc: fixed layout sql/sql_show.cc: fixed layout sql/sql_string.cc: fixed layout sql/sql_table.cc: fixed layout sql/stacktrace.c: fixed layout
Diffstat (limited to 'sql/item_subselect.cc')
-rw-r--r--sql/item_subselect.cc113
1 files changed, 37 insertions, 76 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index d14d2114d7e..8763701b7a3 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -32,6 +32,11 @@ SUBSELECT TODO:
#include "mysql_priv.h"
#include "sql_select.h"
+inline Item * and_items(Item* cond, Item *item)
+{
+ return (cond? (new Item_cond_and(cond, item)) : item);
+}
+
Item_subselect::Item_subselect():
Item_result_field(), engine_owner(1), value_assigned(0), substitution(0),
have_to_be_excluded(0)
@@ -51,7 +56,7 @@ void Item_subselect::init(THD *thd, st_select_lex *select_lex,
DBUG_ENTER("Item_subselect::init");
DBUG_PRINT("subs", ("select_lex 0x%xl", (ulong) select_lex));
- select_transformer(select_lex->master_unit());
+ select_transformer(thd, select_lex->master_unit());
if (select_lex->next_select())
engine= new subselect_union_engine(thd, select_lex->master_unit(), result,
this);
@@ -67,7 +72,7 @@ Item_subselect::~Item_subselect()
delete engine;
}
-void Item_subselect::select_transformer(st_select_lex_unit *unit)
+void Item_subselect::select_transformer(THD *thd, st_select_lex_unit *unit)
{
DBUG_ENTER("Item_subselect::select_transformer");
DBUG_VOID_RETURN;
@@ -146,7 +151,8 @@ void Item_singlerow_subselect::reset()
value->null_value= 1;
}
-void Item_singlerow_subselect::select_transformer(st_select_lex_unit *unit)
+void Item_singlerow_subselect::select_transformer(THD *thd,
+ st_select_lex_unit *unit)
{
SELECT_LEX *select_lex= unit->first_select();
@@ -155,7 +161,6 @@ void Item_singlerow_subselect::select_transformer(st_select_lex_unit *unit)
{
have_to_be_excluded= 1;
- THD *thd= current_thd;
if (thd->lex.describe)
{
char warn_buff[MYSQL_ERRMSG_SIZE];
@@ -178,18 +183,10 @@ void Item_singlerow_subselect::select_transformer(st_select_lex_unit *unit)
cond= select_lex->having;
else
if (!(cond= new Item_cond_and(select_lex->having, select_lex->where)))
- {
- my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
- thd->fatal_error= 1;
return;
- }
if (!(substitution= new Item_func_if(cond, substitution,
new Item_null())))
- {
- my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
- thd->fatal_error= 1;
return;
- }
}
}
}
@@ -210,21 +207,13 @@ void Item_singlerow_subselect::fix_length_and_dec()
{
engine->fix_length_and_dec(row= &value);
if (!(value= Item_cache::get_cache(engine->type())))
- {
- my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
- current_thd->fatal_error= 1;
return;
- }
}
else
{
THD *thd= current_thd;
if (!(row= (Item_cache**)thd->alloc(sizeof(Item_cache*)*max_columns)))
- {
- my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
- thd->fatal_error= 1;
return;
- }
engine->fix_length_and_dec(row);
value= *row;
}
@@ -443,7 +432,8 @@ Item_allany_subselect::Item_allany_subselect(Item_allany_subselect *item):
func= item->func;
}
-void Item_in_subselect::single_value_transformer(st_select_lex_unit *unit,
+void Item_in_subselect::single_value_transformer(THD *thd,
+ st_select_lex_unit *unit,
Item *left_expr,
compare_func_creator func)
{
@@ -457,10 +447,8 @@ void Item_in_subselect::single_value_transformer(st_select_lex_unit *unit,
Item_in_optimizer *optimizer;
substitution= optimizer= new Item_in_optimizer(left_expr, this);
if (!optimizer)
- {
- current_thd->fatal_error= 1;
DBUG_VOID_RETURN;
- }
+
/*
As far as Item_ref_in_optimizer do not substitude itself on fix_fields
we can use same item for all selects.
@@ -497,15 +485,9 @@ void Item_in_subselect::single_value_transformer(st_select_lex_unit *unit,
(char *)"<no matter>",
(char*)"<result>"));
if (sl->having || sl->with_sum_func || sl->group_list.first)
- if (sl->having)
- sl->having= new Item_cond_and(sl->having, item);
- else
- sl->having= item;
+ sl->having= and_items(sl->having, item);
else
- if (sl->where)
- sl->where= new Item_cond_and(sl->where, item);
- else
- sl->where= item;
+ sl->where= and_items(sl->where, item);
}
else
{
@@ -516,10 +498,7 @@ void Item_in_subselect::single_value_transformer(st_select_lex_unit *unit,
item= (*func)(expr, new Item_asterisk_remover(this, item,
(char *)"<no matter>",
(char*)"<result>"));
- if (sl->where)
- sl->where= new Item_cond_and(sl->where, item);
- else
- sl->where= item;
+ sl->where= and_items(sl->where, item);
}
else
{
@@ -546,7 +525,6 @@ void Item_in_subselect::single_value_transformer(st_select_lex_unit *unit,
item= (*func)(left_expr, item);
substitution= item;
have_to_be_excluded= 1;
- THD *thd= current_thd;
if (thd->lex.describe)
{
char warn_buff[MYSQL_ERRMSG_SIZE];
@@ -561,7 +539,8 @@ void Item_in_subselect::single_value_transformer(st_select_lex_unit *unit,
DBUG_VOID_RETURN;
}
-void Item_in_subselect::row_value_transformer(st_select_lex_unit *unit,
+void Item_in_subselect::row_value_transformer(THD *thd,
+ st_select_lex_unit *unit,
Item *left_expr)
{
DBUG_ENTER("Item_in_subselect::row_value_transformer");
@@ -575,10 +554,8 @@ void Item_in_subselect::row_value_transformer(st_select_lex_unit *unit,
Item_in_optimizer *optimizer;
substitution= optimizer= new Item_in_optimizer(left_expr, this);
if (!optimizer)
- {
- current_thd->fatal_error= 1;
DBUG_VOID_RETURN;
- }
+
unit->dependent= 1;
uint n= left_expr->cols();
if (optimizer->preallocate_row() || (*optimizer->get_cache())->allocate(n))
@@ -608,40 +585,32 @@ void Item_in_subselect::row_value_transformer(st_select_lex_unit *unit,
(char *)"<no matter>",
(char *)"<left expr>"),
func);
- if (!item)
- item= func;
- else
- item= new Item_cond_and(item, func);
+ item= and_items(item, func);
}
if (sl->having || sl->with_sum_func || sl->group_list.first ||
!sl->table_list.elements)
- if (sl->having)
- sl->having= new Item_cond_and(sl->having, item);
- else
- sl->having= item;
+ sl->having= and_items(sl->having, item);
else
- if (sl->where)
- sl->where= new Item_cond_and(sl->where, item);
- else
- sl->where= item;
+ sl->where= and_items(sl->where, item);
}
DBUG_VOID_RETURN;
}
-void Item_in_subselect::select_transformer(st_select_lex_unit *unit)
+void Item_in_subselect::select_transformer(THD *thd, st_select_lex_unit *unit)
{
if (left_expr->cols() == 1)
- single_value_transformer(unit, left_expr,
+ single_value_transformer(thd, unit, left_expr,
&Item_bool_func2::eq_creator);
else
- row_value_transformer(unit, left_expr);
+ row_value_transformer(thd, unit, left_expr);
}
-void Item_allany_subselect::select_transformer(st_select_lex_unit *unit)
+void Item_allany_subselect::select_transformer(THD *thd,
+ st_select_lex_unit *unit)
{
- single_value_transformer(unit, left_expr, func);
+ single_value_transformer(thd, unit, left_expr, func);
}
subselect_single_select_engine::subselect_single_select_engine(THD *thd,
@@ -678,7 +647,7 @@ subselect_union_engine::subselect_union_engine(THD *thd,
subselect_engine(thd, item, result)
{
unit= u;
- if( !result)
+ if (!result)
{
//out of memory
thd->fatal_error= 1;
@@ -694,13 +663,13 @@ int subselect_single_select_engine::prepare()
prepared= 1;
SELECT_LEX_NODE *save_select= thd->lex.current_select;
thd->lex.current_select= select_lex;
- if(join->prepare((TABLE_LIST*) select_lex->table_list.first,
- select_lex->where,
- (ORDER*) select_lex->order_list.first,
- (ORDER*) select_lex->group_list.first,
- select_lex->having,
- (ORDER*) 0, select_lex,
- select_lex->master_unit(), 0))
+ if (join->prepare((TABLE_LIST*) select_lex->table_list.first,
+ select_lex->where,
+ (ORDER*) select_lex->order_list.first,
+ (ORDER*) select_lex->group_list.first,
+ select_lex->having,
+ (ORDER*) 0, select_lex,
+ select_lex->master_unit(), 0))
return 1;
thd->lex.current_select= save_select;
return 0;
@@ -726,11 +695,7 @@ static Item_result set_row(SELECT_LEX *select_lex, Item * item,
if (row)
{
if (!(row[i]= Item_cache::get_cache(res_type)))
- {
- my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
- current_thd->fatal_error= 1;
return STRING_RESULT; // we should return something
- }
row[i]->set_len_n_dec(sel_item->max_length, sel_item->decimals);
}
}
@@ -763,7 +728,7 @@ void subselect_union_engine::fix_length_and_dec(Item_cache **row)
mlen= len;
if (!sel_item)
sel_item= s_item;
- maybe_null!= s_item->maybe_null;
+ maybe_null= s_item->maybe_null;
}
item->max_length= mlen;
res_type= sel_item->result_type();
@@ -771,11 +736,7 @@ void subselect_union_engine::fix_length_and_dec(Item_cache **row)
if (row)
{
if (!(row[0]= Item_cache::get_cache(res_type)))
- {
- my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
- current_thd->fatal_error= 1;
return;
- }
row[0]->set_len_n_dec(mlen, sel_item->decimals);
}
}
@@ -784,7 +745,7 @@ void subselect_union_engine::fix_length_and_dec(Item_cache **row)
SELECT_LEX *sl= unit->first_select();
bool fake= 0;
res_type= set_row(sl, item, row, &fake);
- for(sl= sl->next_select(); sl; sl->next_select())
+ for (sl= sl->next_select(); sl; sl->next_select())
{
List_iterator_fast<Item> li(sl->item_list);
Item *sel_item;