summaryrefslogtreecommitdiff
path: root/sql/item_subselect.cc
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2002-09-28 18:34:56 +0300
committerunknown <bell@sanja.is.com.ua>2002-09-28 18:34:56 +0300
commitc9a2b58986635015b3f3867999ef3fafa2bd2728 (patch)
tree6fcd2ba5039822ee13c52903e85f243887bac5ba /sql/item_subselect.cc
parentda891a571e49804e3743bf2776bcf2648a4832da (diff)
downloadmariadb-git-c9a2b58986635015b3f3867999ef3fafa2bd2728.tar.gz
fixed bug in string & date types with group function in subselect
mysql-test/r/subselect.result: test suite of string & date types with group function in subselects mysql-test/t/subselect.test: test suite of string & date types with group function in subselects sql/item_subselect.cc: fixed bug in string type with group function sql/item_subselect.h: fixed bug in string type with group function sql/sql_class.cc: fixed bug in date type with group function
Diffstat (limited to 'sql/item_subselect.cc')
-rw-r--r--sql/item_subselect.cc47
1 files changed, 46 insertions, 1 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index a8909430155..99fc0bcdb67 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -82,7 +82,14 @@ bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
my_message(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0));
return 1;
}
- return engine->prepare();
+ int res= engine->prepare();
+ fix_length_and_dec();
+ return res;
+}
+
+void Item_subselect::fix_length_and_dec()
+{
+ engine->fix_length_and_dec();
}
inline table_map Item_subselect::used_tables() const
@@ -98,6 +105,12 @@ Item_singleval_subselect::Item_singleval_subselect(THD *thd,
maybe_null= 1;
}
+void Item_singleval_subselect::fix_length_and_dec()
+{
+ engine->fix_length_and_dec();
+ res_type= engine->type();
+}
+
Item::Type Item_subselect::type() const
{
return SUBSELECT_ITEM;
@@ -135,6 +148,12 @@ Item_exists_subselect::Item_exists_subselect(THD *thd,
select_lex->select_limit= 1; // we need only 1 row to determinate existence
}
+void Item_exists_subselect::fix_length_and_dec()
+{
+ max_length= 1;
+
+}
+
double Item_exists_subselect::val ()
{
if (engine->exec())
@@ -221,6 +240,32 @@ int subselect_union_engine::prepare()
return unit->prepare(thd, result);
}
+void subselect_single_select_engine::fix_length_and_dec()
+{
+ List_iterator_fast<Item> li(select_lex->item_list);
+ Item *sel_item= li++;
+ item->max_length= sel_item->max_length;
+ res_type= sel_item->result_type();
+ item->decimals= sel_item->decimals;
+}
+
+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())
+ {
+ List_iterator_fast<Item> li(sl->item_list);
+ Item *s_item= li++;
+ if ((len= s_item->max_length))
+ mlen= len;
+ if (!sel_item)
+ sel_item= s_item;
+ }
+ item->max_length= mlen;
+ res_type= sel_item->result_type();
+ item->decimals= sel_item->decimals;
+}
int subselect_single_select_engine::exec()
{