diff options
author | unknown <bell@sanja.is.com.ua> | 2002-10-30 16:09:06 +0200 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2002-10-30 16:09:06 +0200 |
commit | 5bb0ca0a1fefcd1e22491500c1b57704739fdfea (patch) | |
tree | 58dd694a66b7047e8fc0092aed0866ace5e14c4b /sql/item_subselect.cc | |
parent | 1de7b502743db94e26f0815b4f113a043477ef62 (diff) | |
parent | ffb367ac5066b2fbb5b932ca5c1b70e02bac23c4 (diff) | |
download | mariadb-git-5bb0ca0a1fefcd1e22491500c1b57704739fdfea.tar.gz |
Merge sanja.is.com.ua:/home/bell/mysql/mysql-4.1
into sanja.is.com.ua:/home/bell/mysql/work-in-4.1
sql/item.cc:
Auto merged
sql/item_subselect.cc:
Auto merged
sql/sql_yacc.yy:
Auto merged
Diffstat (limited to 'sql/item_subselect.cc')
-rw-r--r-- | sql/item_subselect.cc | 74 |
1 files changed, 68 insertions, 6 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 82310710a9d..f68af3079d2 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -44,12 +44,13 @@ Item_subselect::Item_subselect(): } void Item_subselect::init(THD *thd, st_select_lex *select_lex, - select_subselect *result) + select_subselect *result, Item *left_expr) { DBUG_ENTER("Item_subselect::init"); - DBUG_PRINT("subs", ("select_lex 0x%xl", (long) select_lex)); + DBUG_PRINT("subs", ("select_lex 0x%xl", (ulong) select_lex)); + select_transformer(select_lex, left_expr); if (select_lex->next_select()) engine= new subselect_union_engine(thd, select_lex->master_unit(), result, this); @@ -65,6 +66,14 @@ Item_subselect::~Item_subselect() delete engine; } +void Item_subselect::select_transformer(st_select_lex *select_lex, + Item *left_expr) +{ + DBUG_ENTER("Item_subselect::select_transformer"); + DBUG_VOID_RETURN; +} + + void Item_subselect::make_field (Send_field *tmp_field) { if (null_value) @@ -109,9 +118,11 @@ Item_singleval_subselect::Item_singleval_subselect(THD *thd, st_select_lex *select_lex): Item_subselect() { - init(thd, select_lex, new select_singleval_subselect(this)); + DBUG_ENTER("Item_singleval_subselect::Item_singleval_subselect"); + init(thd, select_lex, new select_singleval_subselect(this), 0); max_columns= 1; maybe_null= 1; + DBUG_VOID_RETURN; } void Item_singleval_subselect::fix_length_and_dec() @@ -156,17 +167,37 @@ String *Item_singleval_subselect::val_str (String *str) } Item_exists_subselect::Item_exists_subselect(THD *thd, - st_select_lex *select_lex): + st_select_lex *select_lex, + Item *left_expr): Item_subselect() { - init(thd, select_lex, new select_exists_subselect(this)); + DBUG_ENTER("Item_exists_subselect::Item_exists_subselect"); + init(thd, select_lex, new select_exists_subselect(this), left_expr); max_columns= UINT_MAX; null_value= 0; //can't be NULL maybe_null= 0; //can't be NULL value= 0; - select_lex->select_limit= 1; // we need only 1 row to determinate existence + // We need only 1 row to determinate existence + select_lex->master_unit()->global_parameters->select_limit= 1; + DBUG_VOID_RETURN; } +Item_in_subselect::Item_in_subselect(THD *thd, Item * left_expr, + st_select_lex *select_lex): + Item_exists_subselect() +{ + DBUG_ENTER("Item_in_subselect::Item_in_subselect"); + init(thd, select_lex, new select_exists_subselect(this), left_expr); + max_columns= UINT_MAX; + null_value= 0; //can't be NULL + maybe_null= 0; //can't be NULL + value= 0; + // We need only 1 row to determinate existence + select_lex->master_unit()->global_parameters->select_limit= 1; + DBUG_VOID_RETURN; +} + + void Item_exists_subselect::fix_length_and_dec() { max_length= 1; @@ -204,6 +235,37 @@ String *Item_exists_subselect::val_str(String *str) return str; } +Item_in_subselect::Item_in_subselect(Item_in_subselect *item): + Item_exists_subselect(item) +{ +} + +void Item_in_subselect::select_transformer(st_select_lex *select_lex, + Item *left_expr) +{ + DBUG_ENTER("Item_in_subselect::select_transformer"); + for(SELECT_LEX * sl= select_lex; sl; sl= sl->next_select()) + { + Item *item; + if (sl->item_list.elements > 1) + { + my_message(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0)); + item= 0; // Item_asterisk_remover mast fail + } + else + item= (Item*) sl->item_list.pop(); + sl->item_list.empty(); + sl->item_list.push_back(new Item_int(1)); + left_expr= new Item_outer_select_context_saver(left_expr); + item= new Item_asterisk_remover(item); + if (sl->where) + sl->where= new Item_cond_and(sl->where, + new Item_func_eq(item, left_expr)); + else + sl->where= new Item_func_eq(item, left_expr); + } + DBUG_VOID_RETURN; +} subselect_single_select_engine::subselect_single_select_engine(THD *thd, st_select_lex *select, |