summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorbell@sanja.is.com.ua <>2003-05-28 16:52:56 +0300
committerbell@sanja.is.com.ua <>2003-05-28 16:52:56 +0300
commitfe6175c40da04f619fbedefeeb1b4a6acef422f7 (patch)
treebdd4144655cde94721e38ddd9dd17c703d52e14c /sql
parent7df5635ff2845bd708711f6b790997a3c68d5f2a (diff)
downloadmariadb-git-fe6175c40da04f619fbedefeeb1b4a6acef422f7.tar.gz
added mem_root switching for subselect if it is necessary
(bug #518 fixed)
Diffstat (limited to 'sql')
-rw-r--r--sql/item_subselect.cc38
-rw-r--r--sql/item_subselect.h3
2 files changed, 30 insertions, 11 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index c749fba616f..8c9b3eeebde 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -79,8 +79,10 @@ void Item_subselect::select_transformer(THD *thd, st_select_lex_unit *unit)
}
-bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
+bool Item_subselect::fix_fields(THD *thd_param, TABLE_LIST *tables, Item **ref)
{
+ thd= thd_param;
+
if (substitution)
{
(*ref)= substitution;
@@ -115,6 +117,20 @@ bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
return res;
}
+bool Item_subselect::exec()
+{
+ MEM_ROOT *old_root= my_pthread_getspecific_ptr(MEM_ROOT*, THR_MALLOC);
+ if (&thd->mem_root != old_root)
+ {
+ my_pthread_setspecific_ptr(THR_MALLOC, &thd->mem_root);
+ int res= engine->exec();
+ my_pthread_setspecific_ptr(THR_MALLOC, old_root);
+ return (res);
+ }
+ else
+ return engine->exec();
+}
+
Item::Type Item_subselect::type() const
{
return SUBSELECT_ITEM;
@@ -253,12 +269,12 @@ bool Item_singlerow_subselect::null_inside()
void Item_singlerow_subselect::bring_value()
{
- engine->exec();
+ exec();
}
double Item_singlerow_subselect::val ()
{
- if (!engine->exec() && !value->null_value)
+ if (!exec() && !value->null_value)
{
null_value= 0;
return value->val();
@@ -272,7 +288,7 @@ double Item_singlerow_subselect::val ()
longlong Item_singlerow_subselect::val_int ()
{
- if (!engine->exec() && !value->null_value)
+ if (!exec() && !value->null_value)
{
null_value= 0;
return value->val_int();
@@ -286,7 +302,7 @@ longlong Item_singlerow_subselect::val_int ()
String *Item_singlerow_subselect::val_str (String *str)
{
- if (!engine->exec() && !value->null_value)
+ if (!exec() && !value->null_value)
{
null_value= 0;
return value->val_str(str);
@@ -354,7 +370,7 @@ void Item_exists_subselect::fix_length_and_dec()
double Item_exists_subselect::val ()
{
- if (engine->exec())
+ if (exec())
{
reset();
return 0;
@@ -364,7 +380,7 @@ double Item_exists_subselect::val ()
longlong Item_exists_subselect::val_int ()
{
- if (engine->exec())
+ if (exec())
{
reset();
return 0;
@@ -374,7 +390,7 @@ longlong Item_exists_subselect::val_int ()
String *Item_exists_subselect::val_str(String *str)
{
- if (engine->exec())
+ if (exec())
{
reset();
return 0;
@@ -385,7 +401,7 @@ String *Item_exists_subselect::val_str(String *str)
double Item_in_subselect::val ()
{
- if (engine->exec())
+ if (exec())
{
reset();
null_value= 1;
@@ -398,7 +414,7 @@ double Item_in_subselect::val ()
longlong Item_in_subselect::val_int ()
{
- if (engine->exec())
+ if (exec())
{
reset();
null_value= 1;
@@ -411,7 +427,7 @@ longlong Item_in_subselect::val_int ()
String *Item_in_subselect::val_str(String *str)
{
- if (engine->exec())
+ if (exec())
{
reset();
null_value= 1;
diff --git a/sql/item_subselect.h b/sql/item_subselect.h
index fc4dad5a6b3..3ed3f2af0e9 100644
--- a/sql/item_subselect.h
+++ b/sql/item_subselect.h
@@ -36,6 +36,8 @@ class Item_subselect :public Item_result_field
my_bool engine_owner; /* Is this item owner of engine */
my_bool value_assigned; /* value already assigned to subselect */
protected:
+ /* thread handler, will be assigned in fix_fields only */
+ THD *thd;
/* substitution instead of subselect in case of optimization */
Item *substitution;
/* engine that perform execution of subselect (single select or union) */
@@ -81,6 +83,7 @@ public:
return null_value;
}
bool fix_fields(THD *thd, TABLE_LIST *tables, Item **ref);
+ bool exec();
virtual void fix_length_and_dec();
table_map used_tables() const;