diff options
author | unknown <bell@sanja.is.com.ua> | 2002-09-28 18:34:56 +0300 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2002-09-28 18:34:56 +0300 |
commit | c9a2b58986635015b3f3867999ef3fafa2bd2728 (patch) | |
tree | 6fcd2ba5039822ee13c52903e85f243887bac5ba /sql/item_subselect.cc | |
parent | da891a571e49804e3743bf2776bcf2648a4832da (diff) | |
download | mariadb-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.cc | 47 |
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() { |