summaryrefslogtreecommitdiff
path: root/sql/item_subselect.cc
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2002-11-27 11:32:09 +0200
committerunknown <bell@sanja.is.com.ua>2002-11-27 11:32:09 +0200
commit9767982aedb23183e8fc9d5ba636971e0d81a2b5 (patch)
tree5823bb4d6eb700331dfdc95fbb346bc60f6a7348 /sql/item_subselect.cc
parent6987b41456dff437195beb6b6974e48fd0fcf633 (diff)
parente9f96cf92a82db9afda5cb9fe9d392b29bbdfb9c (diff)
downloadmariadb-git-9767982aedb23183e8fc9d5ba636971e0d81a2b5.tar.gz
merging
sql/item.cc: Auto merged sql/item.h: Auto merged sql/item_cmpfunc.cc: Auto merged sql/item_cmpfunc.h: Auto merged sql/item_subselect.cc: Auto merged sql/item_subselect.h: Auto merged sql/item_sum.cc: Auto merged sql/item_sum.h: Auto merged sql/lex.h: Auto merged sql/mysql_priv.h: Auto merged sql/sql_lex.cc: Auto merged sql/sql_lex.h: Auto merged sql/sql_parse.cc: Auto merged
Diffstat (limited to 'sql/item_subselect.cc')
-rw-r--r--sql/item_subselect.cc42
1 files changed, 40 insertions, 2 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index d8e1fee2277..750fca5a4f8 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -33,7 +33,7 @@ SUBSELECT TODO:
#include "sql_select.h"
Item_subselect::Item_subselect():
- Item(), engine_owner(1), value_assigned(0)
+ Item_result_field(), engine_owner(1), value_assigned(0)
{
assign_null();
/*
@@ -89,6 +89,7 @@ void Item_subselect::make_field (Send_field *tmp_field)
bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
{
+ char const *save_where= thd->where;
int res= engine->prepare();
if (!res)
{
@@ -100,9 +101,20 @@ bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
}
fix_length_and_dec();
}
+ fixed= 1;
+ thd->where= save_where;
return res;
}
+bool Item_subselect::check_loop(uint id)
+{
+ DBUG_ENTER("Item_subselect::check_loop");
+ if (Item_result_field::check_loop(id))
+ DBUG_RETURN(1);
+
+ DBUG_RETURN(engine->check_loop(id));
+}
+
void Item_subselect::fix_length_and_dec()
{
engine->fix_length_and_dec();
@@ -339,6 +351,7 @@ subselect_single_select_engine::subselect_single_select_engine(THD *thd,
thd->fatal_error= 1;
my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
}
+ unit->item= item;
this->select_lex= select_lex;
}
@@ -412,11 +425,13 @@ void subselect_union_engine::fix_length_and_dec()
int subselect_single_select_engine::exec()
{
DBUG_ENTER("subselect_single_select_engine::exec");
+ char const *save_where= join->thd->where;
if (!optimized)
{
optimized=1;
if (join->optimize())
{
+ join->thd->where= save_where;
executed= 1;
DBUG_RETURN(join->error?join->error:1);
}
@@ -424,7 +439,10 @@ int subselect_single_select_engine::exec()
if (select_lex->dependent && executed)
{
if (join->reinit())
+ {
+ join->thd->where= save_where;
DBUG_RETURN(1);
+ }
item->assign_null();
item->assigned((executed= 0));
}
@@ -435,14 +453,19 @@ int subselect_single_select_engine::exec()
join->exec();
join->thd->lex.current_select= save_select;
executed= 1;
+ join->thd->where= save_where;
DBUG_RETURN(join->error||thd->fatal_error);
}
+ join->thd->where= save_where;
DBUG_RETURN(0);
}
int subselect_union_engine::exec()
{
- return unit->exec();
+ char const *save_where= unit->thd->where;
+ int res= unit->exec();
+ unit->thd->where= save_where;
+ return res;
}
uint subselect_single_select_engine::cols()
@@ -464,3 +487,18 @@ bool subselect_union_engine::depended()
{
return unit->dependent;
}
+
+bool subselect_single_select_engine::check_loop(uint id)
+{
+ DBUG_ENTER("subselect_single_select_engine::check_loop");
+ DBUG_RETURN(join->check_loop(id));
+}
+
+bool subselect_union_engine::check_loop(uint id)
+{
+ DBUG_ENTER("subselect_union_engine::check_loop");
+ for (SELECT_LEX *sl= unit->first_select(); sl; sl= sl->next_select())
+ if (sl->join && sl->join->check_loop(id))
+ DBUG_RETURN(1);
+ DBUG_RETURN(0);
+}