postreview fix
This commit is contained in:
parent
2f723e07fb
commit
d201a34e8c
@ -180,6 +180,7 @@ void Item_singlerow_subselect::fix_length_and_dec()
|
|||||||
engine->fix_length_and_dec(row);
|
engine->fix_length_and_dec(row);
|
||||||
value= *row;
|
value= *row;
|
||||||
}
|
}
|
||||||
|
maybe_null= engine->may_be_null();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint Item_singlerow_subselect::cols()
|
uint Item_singlerow_subselect::cols()
|
||||||
@ -663,7 +664,7 @@ int subselect_union_engine::prepare()
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Item_result set_row(SELECT_LEX *select_lex, Item * item,
|
static Item_result set_row(SELECT_LEX *select_lex, Item * item,
|
||||||
Item_cache **row)
|
Item_cache **row, bool *maybe_null)
|
||||||
{
|
{
|
||||||
Item_result res_type= STRING_RESULT;
|
Item_result res_type= STRING_RESULT;
|
||||||
Item *sel_item;
|
Item *sel_item;
|
||||||
@ -673,6 +674,7 @@ static Item_result set_row(SELECT_LEX *select_lex, Item * item,
|
|||||||
item->max_length= sel_item->max_length;
|
item->max_length= sel_item->max_length;
|
||||||
res_type= sel_item->result_type();
|
res_type= sel_item->result_type();
|
||||||
item->decimals= sel_item->decimals;
|
item->decimals= sel_item->decimals;
|
||||||
|
*maybe_null= sel_item->maybe_null;
|
||||||
if (row)
|
if (row)
|
||||||
{
|
{
|
||||||
if (!(row[i]= Item_cache::get_cache(res_type)))
|
if (!(row[i]= Item_cache::get_cache(res_type)))
|
||||||
@ -692,7 +694,9 @@ static Item_result set_row(SELECT_LEX *select_lex, Item * item,
|
|||||||
void subselect_single_select_engine::fix_length_and_dec(Item_cache **row)
|
void subselect_single_select_engine::fix_length_and_dec(Item_cache **row)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(row || select_lex->item_list.elements==1);
|
DBUG_ASSERT(row || select_lex->item_list.elements==1);
|
||||||
res_type= set_row(select_lex, item, row);
|
res_type= set_row(select_lex, item, row, &maybe_null);
|
||||||
|
if (cols() != 1)
|
||||||
|
maybe_null= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void subselect_union_engine::fix_length_and_dec(Item_cache **row)
|
void subselect_union_engine::fix_length_and_dec(Item_cache **row)
|
||||||
@ -711,6 +715,7 @@ void subselect_union_engine::fix_length_and_dec(Item_cache **row)
|
|||||||
mlen= len;
|
mlen= len;
|
||||||
if (!sel_item)
|
if (!sel_item)
|
||||||
sel_item= s_item;
|
sel_item= s_item;
|
||||||
|
maybe_null!= s_item->maybe_null;
|
||||||
}
|
}
|
||||||
item->max_length= mlen;
|
item->max_length= mlen;
|
||||||
res_type= sel_item->result_type();
|
res_type= sel_item->result_type();
|
||||||
@ -729,7 +734,8 @@ void subselect_union_engine::fix_length_and_dec(Item_cache **row)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
SELECT_LEX *sl= unit->first_select();
|
SELECT_LEX *sl= unit->first_select();
|
||||||
res_type= set_row(sl, item, row);
|
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);
|
List_iterator_fast<Item> li(sl->item_list);
|
||||||
|
@ -197,19 +197,15 @@ public:
|
|||||||
virtual void select_transformer(st_select_lex_unit *unit);
|
virtual void select_transformer(st_select_lex_unit *unit);
|
||||||
};
|
};
|
||||||
|
|
||||||
class subselect_engine
|
class subselect_engine: public Sql_alloc
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
select_subselect *result; /* results storage class */
|
select_subselect *result; /* results storage class */
|
||||||
THD *thd; /* pointer to current THD */
|
THD *thd; /* pointer to current THD */
|
||||||
Item_subselect *item; /* item, that use this engine */
|
Item_subselect *item; /* item, that use this engine */
|
||||||
enum Item_result res_type; /* type of results */
|
enum Item_result res_type; /* type of results */
|
||||||
|
bool maybe_null; /* may be null (first item in select) */
|
||||||
public:
|
public:
|
||||||
static void *operator new(size_t size)
|
|
||||||
{
|
|
||||||
return (void*) sql_alloc((uint) size);
|
|
||||||
}
|
|
||||||
static void operator delete(void *ptr, size_t size) {}
|
|
||||||
|
|
||||||
subselect_engine(THD *thd, Item_subselect *si, select_subselect *res)
|
subselect_engine(THD *thd, Item_subselect *si, select_subselect *res)
|
||||||
{
|
{
|
||||||
@ -217,7 +213,9 @@ public:
|
|||||||
item= si;
|
item= si;
|
||||||
this->thd= thd;
|
this->thd= thd;
|
||||||
res_type= STRING_RESULT;
|
res_type= STRING_RESULT;
|
||||||
|
maybe_null= 0;
|
||||||
}
|
}
|
||||||
|
virtual ~subselect_engine() {}; // to satisfy compiler
|
||||||
|
|
||||||
virtual int prepare()= 0;
|
virtual int prepare()= 0;
|
||||||
virtual void fix_length_and_dec(Item_cache** row)= 0;
|
virtual void fix_length_and_dec(Item_cache** row)= 0;
|
||||||
@ -227,6 +225,7 @@ public:
|
|||||||
enum Item_result type() { return res_type; }
|
enum Item_result type() { return res_type; }
|
||||||
virtual bool check_loop(uint id)= 0;
|
virtual bool check_loop(uint id)= 0;
|
||||||
virtual void exclude()= 0;
|
virtual void exclude()= 0;
|
||||||
|
bool may_be_null() { return maybe_null; };
|
||||||
};
|
};
|
||||||
|
|
||||||
class subselect_single_select_engine: public subselect_engine
|
class subselect_single_select_engine: public subselect_engine
|
||||||
|
Loading…
x
Reference in New Issue
Block a user