item_subselect.cc 20.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/* Copyright (C) 2000 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

/* 
   subselect Item

SUBSELECT TODO:
   - add function from mysql_select that use JOIN* as parameter to JOIN methods
     (sql_select.h/sql_select.cc)
   - remove double 'having' & 'having_list' from JOIN
     (sql_select.h/sql_select.cc)

*/

#ifdef __GNUC__
#pragma implementation				// gcc: Class implementation
#endif

#include "mysql_priv.h"
#include "sql_select.h"

unknown's avatar
unknown committed
35 36 37 38 39
inline Item * and_items(Item* cond, Item *item)
{
  return (cond? (new Item_cond_and(cond, item)) : item);
}

40
Item_subselect::Item_subselect():
41 42
  Item_result_field(), engine_owner(1), value_assigned(0), substitution(0),
  have_to_be_excluded(0)
43
{
44
  reset();
45 46 47 48 49 50 51 52
  /*
    item value is NULL if select_subselect not changed this value 
    (i.e. some rows will be found returned)
  */
  null_value= 1;
}

void Item_subselect::init(THD *thd, st_select_lex *select_lex,
unknown's avatar
unknown committed
53
			  select_subselect *result)
54 55 56
{

  DBUG_ENTER("Item_subselect::init");
unknown's avatar
unknown committed
57
  DBUG_PRINT("subs", ("select_lex 0x%xl", (ulong) select_lex));
unknown's avatar
unknown committed
58

unknown's avatar
unknown committed
59
  select_transformer(thd, select_lex->master_unit());
unknown's avatar
unknown committed
60 61 62 63 64 65
  if (select_lex->next_select())
    engine= new subselect_union_engine(thd, select_lex->master_unit(), result,
				       this);
  else
    engine= new subselect_single_select_engine(thd, select_lex, result,
					       this);
66 67 68
  DBUG_VOID_RETURN;
}

unknown's avatar
unknown committed
69 70 71 72 73 74
Item_subselect::~Item_subselect()
{
  if (engine_owner)
    delete engine;
}

unknown's avatar
unknown committed
75
void Item_subselect::select_transformer(THD *thd, st_select_lex_unit *unit) 
unknown's avatar
unknown committed
76 77 78 79 80 81
{
  DBUG_ENTER("Item_subselect::select_transformer");
  DBUG_VOID_RETURN;
}


unknown's avatar
unknown committed
82
bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
83
{
unknown's avatar
unknown committed
84 85 86
  if (substitution)
  {
    (*ref)= substitution;
unknown's avatar
unknown committed
87
    substitution->name= name;
88 89 90 91
    if (have_to_be_excluded)
      engine->exclude();
    substitution= 0;
    return (*ref)->fix_fields(thd, tables, ref);
unknown's avatar
unknown committed
92 93
  }

94
  char const *save_where= thd->where;
95
  int res= engine->prepare();
96
  if (!res)
unknown's avatar
unknown committed
97 98 99 100
  {
    // Is it one field subselect?
    if (engine->cols() > max_columns)
    {  
unknown's avatar
unknown committed
101
      my_error(ER_CARDINALITY_COL, MYF(0), 1);
unknown's avatar
unknown committed
102 103
      return 1;
    }
104
    fix_length_and_dec();
unknown's avatar
unknown committed
105
  }
106
  fixed= 1;
107
  thd->where= save_where;
108 109 110
  return res;
}

111 112 113 114 115
Item::Type Item_subselect::type() const 
{
  return SUBSELECT_ITEM;
}

116 117
void Item_subselect::fix_length_and_dec()
{
118
  engine->fix_length_and_dec(0);
119
}
unknown's avatar
unknown committed
120 121 122

inline table_map Item_subselect::used_tables() const
{
123 124
  return (table_map) (engine->dependent() ? 1L :
		      (engine->uncacheable() ? RAND_TABLE_BIT : 0L));
unknown's avatar
unknown committed
125 126
}

unknown's avatar
unknown committed
127
Item_singlerow_subselect::Item_singlerow_subselect(THD *thd,
unknown's avatar
unknown committed
128
						   st_select_lex *select_lex):
129
  Item_subselect(), value(0)
unknown's avatar
unknown committed
130
{
unknown's avatar
unknown committed
131 132
  DBUG_ENTER("Item_singlerow_subselect::Item_singlerow_subselect");
  init(thd, select_lex, new select_singlerow_subselect(this));
unknown's avatar
unknown committed
133 134
  max_columns= 1;
  maybe_null= 1;
135
  max_columns= UINT_MAX;
unknown's avatar
unknown committed
136
  DBUG_VOID_RETURN;
unknown's avatar
unknown committed
137 138
}

unknown's avatar
unknown committed
139
void Item_singlerow_subselect::reset()
140
{
141 142 143
  null_value= 1;
  if (value)
    value->null_value= 1;
144 145
}

unknown's avatar
unknown committed
146 147
void Item_singlerow_subselect::select_transformer(THD *thd,
						  st_select_lex_unit *unit)
148 149 150 151
{
  SELECT_LEX *select_lex= unit->first_select();
  
  if (!select_lex->next_select() && !select_lex->table_list.elements &&
unknown's avatar
unknown committed
152
      select_lex->item_list.elements == 1 &&
unknown's avatar
unknown committed
153 154 155 156 157 158 159
      /*
	We cant change name of Item_field or Item_ref, because it will
	prevent it's correct resolving, but we should save name of
	removed item => we do not make optimization if top item of
	list is field or reference.
	TODO: solve above problem
      */
unknown's avatar
unknown committed
160
      !(select_lex->item_list.head()->type() == FIELD_ITEM ||
161
	select_lex->item_list.head()->type() == REF_ITEM) 
unknown's avatar
unknown committed
162
      )
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
  {
    
    have_to_be_excluded= 1;
    if (thd->lex.describe)
    {
      char warn_buff[MYSQL_ERRMSG_SIZE];
      sprintf(warn_buff, ER(ER_SELECT_REDUCED), select_lex->select_number);
      push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
		   ER_SELECT_REDUCED, warn_buff);
    }
    substitution= select_lex->item_list.head();
    substitution->set_outer_resolving();
     
    if (select_lex->where || select_lex->having)
    {
      Item *cond;
      if (!select_lex->having)
	cond= select_lex->where;
      else if (!select_lex->where)
	cond= select_lex->having;
      else
	if (!(cond= new Item_cond_and(select_lex->having, select_lex->where)))
	  return;
      if (!(substitution= new Item_func_if(cond, substitution,
					   new Item_null())))
	return;
    }
  }
}

unknown's avatar
unknown committed
193
void Item_singlerow_subselect::store(uint i, Item *item)
unknown's avatar
unknown committed
194
{
195
  row[i]->store(item);
unknown's avatar
unknown committed
196 197
}

unknown's avatar
unknown committed
198
enum Item_result Item_singlerow_subselect::result_type() const
unknown's avatar
unknown committed
199
{
200 201 202
  return engine->type();
}

unknown's avatar
unknown committed
203
void Item_singlerow_subselect::fix_length_and_dec()
204
{
205 206 207 208 209 210 211
  if ((max_columns= engine->cols()) == 1)
  {
    engine->fix_length_and_dec(row= &value);
    if (!(value= Item_cache::get_cache(engine->type())))
      return;
  }
  else
212
  {
213 214 215 216 217
    THD *thd= current_thd;
    if (!(row= (Item_cache**)thd->alloc(sizeof(Item_cache*)*max_columns)))
      return;
    engine->fix_length_and_dec(row);
    value= *row;
218
  }
unknown's avatar
unknown committed
219
  maybe_null= engine->may_be_null();
220 221
}

unknown's avatar
unknown committed
222
uint Item_singlerow_subselect::cols()
unknown's avatar
unknown committed
223
{
224 225 226
  return engine->cols();
}

unknown's avatar
unknown committed
227
bool Item_singlerow_subselect::check_cols(uint c)
228 229 230 231 232 233 234 235 236
{
  if (c != engine->cols())
  {
    my_error(ER_CARDINALITY_COL, MYF(0), c);
    return 1;
  }
  return 0;
}

unknown's avatar
unknown committed
237
bool Item_singlerow_subselect::null_inside()
238 239 240 241 242 243 244 245 246
{
  for (uint i= 0; i < max_columns ; i++)
  {
    if (row[i]->null_value)
      return 1;
  }
  return 0;
}

unknown's avatar
unknown committed
247
void Item_singlerow_subselect::bring_value()
248 249
{
  engine->exec();
unknown's avatar
unknown committed
250 251
}

unknown's avatar
unknown committed
252
double Item_singlerow_subselect::val () 
unknown's avatar
unknown committed
253
{
254 255 256 257 258 259
  if (!engine->exec() && !value->null_value)
  {
    null_value= 0;
    return value->val();
  }
  else
unknown's avatar
unknown committed
260
  {
261
    reset();
unknown's avatar
unknown committed
262
    return 0;
unknown's avatar
unknown committed
263
  }
unknown's avatar
unknown committed
264 265
}

unknown's avatar
unknown committed
266
longlong Item_singlerow_subselect::val_int () 
unknown's avatar
unknown committed
267
{
268 269 270 271 272 273
  if (!engine->exec() && !value->null_value)
  {
    null_value= 0;
    return value->val_int();
  }
  else
unknown's avatar
unknown committed
274
  {
275
    reset();
unknown's avatar
unknown committed
276
    return 0;
unknown's avatar
unknown committed
277
  }
unknown's avatar
unknown committed
278 279
}

unknown's avatar
unknown committed
280
String *Item_singlerow_subselect::val_str (String *str) 
unknown's avatar
unknown committed
281
{
282 283 284 285 286 287
  if (!engine->exec() && !value->null_value)
  {
    null_value= 0;
    return value->val_str(str);
  }
  else
unknown's avatar
unknown committed
288
  {
289
    reset();
unknown's avatar
unknown committed
290
    return 0;
unknown's avatar
unknown committed
291
  }
unknown's avatar
unknown committed
292 293 294
}

Item_exists_subselect::Item_exists_subselect(THD *thd,
unknown's avatar
unknown committed
295
					     st_select_lex *select_lex):
296
  Item_subselect()
unknown's avatar
unknown committed
297
{
unknown's avatar
unknown committed
298
  DBUG_ENTER("Item_exists_subselect::Item_exists_subselect");
unknown's avatar
unknown committed
299
  init(thd, select_lex, new select_exists_subselect(this));
unknown's avatar
unknown committed
300 301 302 303
  max_columns= UINT_MAX;
  null_value= 0; //can't be NULL
  maybe_null= 0; //can't be NULL
  value= 0;
unknown's avatar
unknown committed
304 305 306 307 308
  // We need only 1 row to determinate existence
  select_lex->master_unit()->global_parameters->select_limit= 1;
  DBUG_VOID_RETURN;
}

unknown's avatar
unknown committed
309
Item_in_subselect::Item_in_subselect(THD *thd, Item * left_exp,
unknown's avatar
unknown committed
310 311 312 313
				     st_select_lex *select_lex):
  Item_exists_subselect()
{
  DBUG_ENTER("Item_in_subselect::Item_in_subselect");
unknown's avatar
unknown committed
314 315 316
  left_expr= left_exp;
  init(thd, select_lex, new select_exists_subselect(this));
  max_columns= UINT_MAX;
317 318
  maybe_null= 1;
  reset();
unknown's avatar
unknown committed
319 320 321 322 323 324 325 326 327 328 329 330 331 332
  // We need only 1 row to determinate existence
  select_lex->master_unit()->global_parameters->select_limit= 1;
  DBUG_VOID_RETURN;
}

Item_allany_subselect::Item_allany_subselect(THD *thd, Item * left_exp,
					     compare_func_creator f,
					     st_select_lex *select_lex):
  Item_in_subselect()
{
  DBUG_ENTER("Item_in_subselect::Item_in_subselect");
  left_expr= left_exp;
  func= f;
  init(thd, select_lex, new select_exists_subselect(this));
unknown's avatar
unknown committed
333
  max_columns= 1;
334
  reset();
unknown's avatar
unknown committed
335 336 337
  // We need only 1 row to determinate existence
  select_lex->master_unit()->global_parameters->select_limit= 1;
  DBUG_VOID_RETURN;
unknown's avatar
unknown committed
338 339
}

unknown's avatar
unknown committed
340

341 342
void Item_exists_subselect::fix_length_and_dec()
{
343
   decimals= 0;
344
   max_length= 1;
unknown's avatar
unknown committed
345
   max_columns= engine->cols();
346 347
}

unknown's avatar
unknown committed
348 349
double Item_exists_subselect::val () 
{
unknown's avatar
unknown committed
350
  if (engine->exec())
unknown's avatar
unknown committed
351
  {
352
    reset();
unknown's avatar
unknown committed
353
    return 0;
unknown's avatar
unknown committed
354
  }
unknown's avatar
unknown committed
355 356 357 358 359
  return (double) value;
}

longlong Item_exists_subselect::val_int () 
{
unknown's avatar
unknown committed
360
  if (engine->exec())
unknown's avatar
unknown committed
361
  {
362
    reset();
unknown's avatar
unknown committed
363
    return 0;
unknown's avatar
unknown committed
364
  }
unknown's avatar
unknown committed
365 366 367 368 369
  return value;
}

String *Item_exists_subselect::val_str(String *str)
{
unknown's avatar
unknown committed
370
  if (engine->exec())
unknown's avatar
unknown committed
371
  {
372 373 374
    reset();
    return 0;
  }
375
  str->set(value,default_charset());
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
  return str;
}

double Item_in_subselect::val () 
{
  if (engine->exec())
  {
    reset();
    null_value= 1;
    return 0;
  }
  if (was_null && !value)
    null_value= 1;
  return (double) value;
}

longlong Item_in_subselect::val_int () 
{
  if (engine->exec())
  {
    reset();
    null_value= 1;
    return 0;
  }
  if (was_null && !value)
    null_value= 1;
  return value;
}

String *Item_in_subselect::val_str(String *str)
{
  if (engine->exec())
  {
    reset();
    null_value= 1;
    return 0;
  }
  if (was_null && !value)
  {
    null_value= 1;
unknown's avatar
unknown committed
416
    return 0;
unknown's avatar
unknown committed
417
  }
418
  str->set(value,default_charset());
unknown's avatar
unknown committed
419 420 421
  return str;
}

unknown's avatar
unknown committed
422 423 424
Item_in_subselect::Item_in_subselect(Item_in_subselect *item):
  Item_exists_subselect(item)
{
unknown's avatar
unknown committed
425
  left_expr= item->left_expr;
unknown's avatar
unknown committed
426 427
}

unknown's avatar
unknown committed
428 429
Item_allany_subselect::Item_allany_subselect(Item_allany_subselect *item):
  Item_in_subselect(item)
unknown's avatar
unknown committed
430
{
unknown's avatar
unknown committed
431 432 433
  func= item->func;
}

unknown's avatar
unknown committed
434 435
void Item_in_subselect::single_value_transformer(THD *thd,
						 st_select_lex_unit *unit,
unknown's avatar
unknown committed
436 437 438 439
						 Item *left_expr,
						 compare_func_creator func)
{
  DBUG_ENTER("Item_in_subselect::single_value_transformer");
440

441
  if (unit->global_parameters->select_limit != HA_POS_ERROR)
442 443 444 445 446
  {
    my_error(ER_NOT_SUPPORTED_YET, MYF(0),
	     "LIMIT & IN/ALL/ANY/SOME subquery");
    DBUG_VOID_RETURN;
  }
unknown's avatar
unknown committed
447 448 449
  // no sense in ORDER BY without LIMIT
  unit->global_parameters->order_list.empty();

450 451 452 453
  Item_in_optimizer *optimizer;
  substitution= optimizer= new Item_in_optimizer(left_expr, this);
  if (!optimizer)
    DBUG_VOID_RETURN;
unknown's avatar
unknown committed
454

455 456 457 458
  /*
    As far as  Item_ref_in_optimizer do not substitude itself on fix_fields
    we can use same item for all selects.
  */
unknown's avatar
unknown committed
459
  Item *expr= new Item_ref((Item**)optimizer->get_cache(), 
460 461
			   (char *)"<no matter>",
			   (char*)"<left expr>");
462 463
  unit->dependent= 1;
  for (SELECT_LEX * sl= unit->first_select(); sl; sl= sl->next_select())
unknown's avatar
unknown committed
464
  {
465
    if (sl->select_limit != HA_POS_ERROR)
466 467 468 469 470 471
    {
      my_error(ER_NOT_SUPPORTED_YET, MYF(0),
	       "LIMIT & IN/ALL/ANY/SOME subquery");
      DBUG_VOID_RETURN;
    }

472
    sl->dependent= 1;
unknown's avatar
unknown committed
473 474 475
    Item *item;
    if (sl->item_list.elements > 1)
    {
unknown's avatar
unknown committed
476
      my_error(ER_CARDINALITY_COL, MYF(0), 1);
unknown's avatar
unknown committed
477
      DBUG_VOID_RETURN;
unknown's avatar
unknown committed
478 479 480
    }
    else
      item= (Item*) sl->item_list.pop();
481

unknown's avatar
unknown committed
482 483
    sl->order_list.empty(); // no sense in ORDER BY without LIMIT

unknown's avatar
unknown committed
484
    if (sl->having || sl->with_sum_func || sl->group_list.elements)
485 486
    {
      sl->item_list.push_back(item);
487
      setup_ref_array(thd, &sl->ref_pointer_array,
488 489
		      1 + sl->with_sum_func +
		      sl->order_list.elements + sl->group_list.elements);
490
      item= (*func)(expr, new Item_ref_null_helper(this,
unknown's avatar
unknown committed
491
						   sl->ref_pointer_array,
unknown's avatar
unknown committed
492 493
						   (char *)"<ref>",
						   this->full_name()));
unknown's avatar
unknown committed
494
      sl->having= and_items(sl->having, item);
495
    }
unknown's avatar
unknown committed
496
    else
497 498
    {
      sl->item_list.empty();
unknown's avatar
unknown committed
499
      sl->item_list.push_back(new Item_int("Not_used", (longlong) 1, 21));
unknown's avatar
unknown committed
500 501
      if (sl->table_list.elements)
      {
502 503 504
	item= (*func)(expr, new Item_asterisk_remover(this, item,
						      (char *)"<no matter>",
						      (char*)"<result>"));
unknown's avatar
unknown committed
505
	sl->where= and_items(sl->where, item);
unknown's avatar
unknown committed
506
      }
507
      else
unknown's avatar
unknown committed
508 509 510 511 512 513 514
      {
	if (item->type() == Item::FIELD_ITEM &&
	    ((Item_field*) item)->field_name[0] == '*')
	{
	  my_error(ER_NO_TABLES_USED, MYF(0));
	  DBUG_VOID_RETURN;
	}
515
	if (unit->first_select()->next_select())
unknown's avatar
unknown committed
516
	{
517 518 519 520 521 522 523 524
	  /* 
	     It is in union => we should perform it.
	     Item_asterisk_remover used only as wrapper to receine NULL value
	  */
	  sl->having= (*func)(expr, 
			      new Item_asterisk_remover(this, item,
							(char *)"<no matter>",
							(char*)"<result>"));
unknown's avatar
unknown committed
525 526 527 528 529 530
	}
	else
	{
	  // it is single select without tables => possible optimization
	  item= (*func)(left_expr, item);
	  substitution= item;
531
	  have_to_be_excluded= 1;
unknown's avatar
unknown committed
532 533 534 535 536 537 538 539 540
	  if (thd->lex.describe)
	  {
	    char warn_buff[MYSQL_ERRMSG_SIZE];
	    sprintf(warn_buff, ER(ER_SELECT_REDUCED), sl->select_number);
	    push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
			 ER_SELECT_REDUCED, warn_buff);
	  }
	}
      }
541
    }
unknown's avatar
unknown committed
542 543 544
  }
  DBUG_VOID_RETURN;
}
unknown's avatar
unknown committed
545

unknown's avatar
unknown committed
546 547
void Item_in_subselect::row_value_transformer(THD *thd,
					      st_select_lex_unit *unit,
unknown's avatar
unknown committed
548 549 550
					      Item *left_expr)
{
  DBUG_ENTER("Item_in_subselect::row_value_transformer");
551
  if (unit->global_parameters->select_limit != 
552 553
      HA_POS_ERROR)
  {
unknown's avatar
unknown committed
554 555 556 557 558 559 560 561 562
    /*
      Because we do the following (not exactly, following is just explenation) 
      transformation
      SELECT * from t1 WHERE t1.a IN (SELECT t2.a FROM t2)
        ->
      SELECT * from t1 WHERE EXISTS(SELECT 1 FROM t2 t1.a = t2.a LIMIT 1)

      it's impossible to support limit in the sub select.
    */
563 564 565 566
    my_error(ER_NOT_SUPPORTED_YET, MYF(0),
	     "LIMIT & IN/ALL/ANY/SOME subquery");
    DBUG_VOID_RETURN;
  }
unknown's avatar
unknown committed
567 568 569
  // no sense in ORDER BY without LIMIT
  unit->global_parameters->order_list.empty();

unknown's avatar
unknown committed
570 571 572 573
  Item_in_optimizer *optimizer;
  substitution= optimizer= new Item_in_optimizer(left_expr, this);
  if (!optimizer)
    DBUG_VOID_RETURN;
unknown's avatar
unknown committed
574

575
  unit->dependent= 1;
unknown's avatar
unknown committed
576 577 578
  uint n= left_expr->cols();
  if (optimizer->preallocate_row() || (*optimizer->get_cache())->allocate(n))
    DBUG_VOID_RETURN;
579
  for (SELECT_LEX * sl= unit->first_select(); sl; sl= sl->next_select())
unknown's avatar
unknown committed
580
  {
581
    if (sl->select_limit != HA_POS_ERROR)
582 583 584 585 586
    {
      my_error(ER_NOT_SUPPORTED_YET, MYF(0),
	       "LIMIT & IN/ALL/ANY/SOME subquery");
      DBUG_VOID_RETURN;
    }
unknown's avatar
unknown committed
587
    sl->order_list.empty(); // no sense in ORDER BY without LIMIT
588

589
    sl->dependent= 1;
unknown's avatar
unknown committed
590 591 592 593 594 595

    Item *item= 0;
    List_iterator_fast<Item> li(sl->item_list);
    for (uint i= 0; i < n; i++)
    {
      Item *func=
596 597 598
	new Item_ref_on_list_position(this, sl, i,
				      (char *) "<no matter>",
				      (char *) "<list ref>");
unknown's avatar
unknown committed
599 600 601 602 603 604
      func=
	Item_bool_func2::eq_creator(new Item_ref((*optimizer->get_cache())->
						 addr(i), 
						 (char *)"<no matter>",
						 (char *)"<left expr>"),
				    func);
unknown's avatar
unknown committed
605
      item= and_items(item, func);
unknown's avatar
unknown committed
606 607 608
    }

    if (sl->having || sl->with_sum_func || sl->group_list.first ||
unknown's avatar
unknown committed
609
	!sl->table_list.elements)
unknown's avatar
unknown committed
610
      sl->having= and_items(sl->having, item);
unknown's avatar
unknown committed
611
    else
unknown's avatar
unknown committed
612
      sl->where= and_items(sl->where, item);
unknown's avatar
unknown committed
613 614 615 616 617
  }
  DBUG_VOID_RETURN;
}


unknown's avatar
unknown committed
618
void Item_in_subselect::select_transformer(THD *thd, st_select_lex_unit *unit)
unknown's avatar
unknown committed
619
{
unknown's avatar
unknown committed
620
  if (left_expr->cols() == 1)
unknown's avatar
unknown committed
621
    single_value_transformer(thd, unit, left_expr,
unknown's avatar
unknown committed
622 623
			     &Item_bool_func2::eq_creator);
  else
unknown's avatar
unknown committed
624
    row_value_transformer(thd, unit, left_expr);
unknown's avatar
unknown committed
625 626
}

unknown's avatar
unknown committed
627 628
void Item_allany_subselect::select_transformer(THD *thd,
					       st_select_lex_unit *unit)
unknown's avatar
unknown committed
629
{
unknown's avatar
unknown committed
630
  single_value_transformer(thd, unit, left_expr, func);
unknown's avatar
unknown committed
631 632
}

unknown's avatar
unknown committed
633 634 635 636 637
subselect_single_select_engine::subselect_single_select_engine(THD *thd, 
							       st_select_lex *select,
							       select_subselect *result,
							       Item_subselect *item):
  subselect_engine(thd, item, result),
unknown's avatar
unknown committed
638
    prepared(0), optimized(0), executed(0)
unknown's avatar
unknown committed
639 640 641 642 643 644 645 646 647 648 649 650 651
{
  select_lex= select;
  SELECT_LEX_UNIT *unit= select_lex->master_unit();
  unit->offset_limit_cnt= unit->global_parameters->offset_limit;
  unit->select_limit_cnt= unit->global_parameters->select_limit+
    unit->global_parameters ->offset_limit;
  if (unit->select_limit_cnt < unit->global_parameters->select_limit)
    unit->select_limit_cnt= HA_POS_ERROR;		// no limit
  if (unit->select_limit_cnt == HA_POS_ERROR)
    select_lex->options&= ~OPTION_FOUND_ROWS;
  join= new JOIN(thd, select_lex->item_list, select_lex->options, result);
  if (!join || !result)
    //out of memory
652
    thd->fatal_error();
unknown's avatar
unknown committed
653
  unit->item= item;
unknown's avatar
unknown committed
654 655 656 657 658 659 660 661 662 663
  this->select_lex= select_lex;
}

subselect_union_engine::subselect_union_engine(THD *thd,
					       st_select_lex_unit *u,
					       select_subselect *result,
					       Item_subselect *item):
  subselect_engine(thd, item, result)
{
  unit= u;
unknown's avatar
unknown committed
664
  if (!result)
unknown's avatar
unknown committed
665
    //out of memory
666
    thd->fatal_error();
unknown's avatar
unknown committed
667 668 669 670 671
  unit->item= item;
}

int subselect_single_select_engine::prepare()
{
unknown's avatar
unknown committed
672 673 674
  if (prepared)
    return 0;
  prepared= 1;
675 676
  SELECT_LEX_NODE *save_select= thd->lex.current_select;
  thd->lex.current_select= select_lex;
unknown's avatar
unknown committed
677 678 679
  if (join->prepare(&select_lex->ref_pointer_array,
		    (TABLE_LIST*) select_lex->table_list.first,
		    select_lex->with_wild,
unknown's avatar
unknown committed
680
		    select_lex->where,
unknown's avatar
unknown committed
681 682
		    select_lex->order_list.elements +
		    select_lex->group_list.elements,
unknown's avatar
unknown committed
683 684 685 686
		    (ORDER*) select_lex->order_list.first,
		    (ORDER*) select_lex->group_list.first,
		    select_lex->having,
		    (ORDER*) 0, select_lex, 
687
		    select_lex->master_unit(), 0))
unknown's avatar
unknown committed
688
    return 1;
689
  thd->lex.current_select= save_select;
unknown's avatar
unknown committed
690 691 692 693 694
  return 0;
}

int subselect_union_engine::prepare()
{
695
  return unit->prepare(thd, result, 0);
unknown's avatar
unknown committed
696 697
}

698
static Item_result set_row(SELECT_LEX *select_lex, Item * item,
unknown's avatar
unknown committed
699
			   Item_cache **row, bool *maybe_null)
700
{
701 702
  Item_result res_type= STRING_RESULT;
  Item *sel_item;
703
  List_iterator_fast<Item> li(select_lex->item_list);
704 705 706 707 708
  for (uint i= 0; (sel_item= li++); i++)
  {
    item->max_length= sel_item->max_length;
    res_type= sel_item->result_type();
    item->decimals= sel_item->decimals;
unknown's avatar
unknown committed
709
    *maybe_null= sel_item->maybe_null;
710 711 712 713 714 715 716 717 718 719
    if (row)
    {
      if (!(row[i]= Item_cache::get_cache(res_type)))
	return STRING_RESULT; // we should return something
      row[i]->set_len_n_dec(sel_item->max_length, sel_item->decimals);
    }
  }
  if (select_lex->item_list.elements > 1)
    res_type= ROW_RESULT;
  return res_type;
720 721
}

722
void subselect_single_select_engine::fix_length_and_dec(Item_cache **row)
723
{
724
  DBUG_ASSERT(row || select_lex->item_list.elements==1);
unknown's avatar
unknown committed
725 726 727
  res_type= set_row(select_lex, item, row, &maybe_null);
  if (cols() != 1)
    maybe_null= 0;
728 729 730 731 732 733 734
}

void subselect_union_engine::fix_length_and_dec(Item_cache **row)
{
  DBUG_ASSERT(row || unit->first_select()->item_list.elements==1);

  if (unit->first_select()->item_list.elements == 1)
735
  {
736 737 738 739 740 741 742 743 744 745
    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)
	mlen= len;
      if (!sel_item)
	sel_item= s_item;
unknown's avatar
unknown committed
746
      maybe_null= s_item->maybe_null;
747 748 749 750 751 752 753 754 755 756 757 758 759 760
    }
    item->max_length= mlen;
    res_type= sel_item->result_type();
    item->decimals= sel_item->decimals;
    if (row)
    {
      if (!(row[0]= Item_cache::get_cache(res_type)))
	return;
      row[0]->set_len_n_dec(mlen, sel_item->decimals);
    }
  }
  else
  {
    SELECT_LEX *sl= unit->first_select();
unknown's avatar
unknown committed
761 762
    bool fake= 0;
    res_type= set_row(sl, item, row, &fake);
unknown's avatar
unknown committed
763
    for (sl= sl->next_select(); sl; sl->next_select())
764 765 766 767 768 769 770 771 772
    {
      List_iterator_fast<Item> li(sl->item_list);
      Item *sel_item;
      for (uint i= 0; (sel_item= li++); i++)
      {
	if (sel_item->max_length > row[i]->max_length)
	  row[i]->max_length= sel_item->max_length;
      }
    }
773 774
  }
}
unknown's avatar
unknown committed
775 776 777 778

int subselect_single_select_engine::exec()
{
  DBUG_ENTER("subselect_single_select_engine::exec");
779
  char const *save_where= join->thd->where;
unknown's avatar
unknown committed
780 781 782 783 784
  if (!optimized)
  {
    optimized=1;
    if (join->optimize())
    {
785
      join->thd->where= save_where;
unknown's avatar
unknown committed
786 787 788 789
      executed= 1;
      DBUG_RETURN(join->error?join->error:1);
    }
  }
790
  if ((select_lex->dependent || select_lex->uncacheable) && executed)
unknown's avatar
unknown committed
791 792
  {
    if (join->reinit())
793 794
    {
      join->thd->where= save_where;
unknown's avatar
unknown committed
795
      DBUG_RETURN(1);
796
    }
797
    item->reset();
unknown's avatar
unknown committed
798 799 800 801
    item->assigned((executed= 0));
  }
  if (!executed)
  {
802 803
    SELECT_LEX_NODE *save_select= join->thd->lex.current_select;
    join->thd->lex.current_select= select_lex;
unknown's avatar
unknown committed
804
    join->exec();
805
    join->thd->lex.current_select= save_select;
unknown's avatar
unknown committed
806
    executed= 1;
807
    join->thd->where= save_where;
808
    DBUG_RETURN(join->error||thd->is_fatal_error);
unknown's avatar
unknown committed
809
  }
810
  join->thd->where= save_where;
unknown's avatar
unknown committed
811 812 813 814 815
  DBUG_RETURN(0);
}

int subselect_union_engine::exec()
{
816 817 818 819
  char const *save_where= unit->thd->where;
  int res= unit->exec();
  unit->thd->where= save_where;
  return res;
unknown's avatar
unknown committed
820 821 822 823 824 825 826 827 828 829 830 831
}

uint subselect_single_select_engine::cols()
{
  return select_lex->item_list.elements;
}

uint subselect_union_engine::cols()
{
  return unit->first_select()->item_list.elements;
}

832
bool subselect_single_select_engine::dependent()
unknown's avatar
unknown committed
833
{
834
  return select_lex->dependent;
unknown's avatar
unknown committed
835 836
}

837
bool subselect_union_engine::dependent()
unknown's avatar
unknown committed
838
{
839
  return unit->dependent;
unknown's avatar
unknown committed
840
}
unknown's avatar
unknown committed
841

842 843 844 845 846 847 848 849 850 851
bool subselect_single_select_engine::uncacheable()
{
  return select_lex->uncacheable;
}

bool subselect_union_engine::uncacheable()
{
  return unit->uncacheable;
}

unknown's avatar
unknown committed
852 853 854 855 856 857 858 859 860
void subselect_single_select_engine::exclude()
{
  select_lex->master_unit()->exclude_level();
}

void subselect_union_engine::exclude()
{
  unit->exclude_level();
}