10282
10282
if (cond->type() == Item::COND_ITEM)
10284
bool and_level= ((Item_cond*) cond)->functype()
10285
== Item_func::COND_AND_FUNC;
10284
bool and_level= (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC);
10286
10286
List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
10287
10287
Item::cond_result tmp_cond_value;
10288
bool should_fix_fields=0;
10288
bool should_fix_fields= false;
10290
*cond_value=Item::COND_UNDEF;
10290
*cond_value= Item::COND_UNDEF;
10292
while ((item=li++))
10292
while ((item= li++))
10294
Item *new_item=remove_eq_conds(session, item, &tmp_cond_value);
10294
Item *new_item= remove_eq_conds(session, item, &tmp_cond_value);
10297
10297
else if (item != new_item)
10299
li.replace(new_item);
10300
should_fix_fields=1;
10299
li.replace(new_item);
10300
should_fix_fields= true;
10302
10302
if (*cond_value == Item::COND_UNDEF)
10303
*cond_value=tmp_cond_value;
10304
switch (tmp_cond_value) {
10305
case Item::COND_OK: // Not true or false
10306
if (and_level || *cond_value == Item::COND_FALSE)
10307
*cond_value=tmp_cond_value;
10309
case Item::COND_FALSE:
10312
*cond_value=tmp_cond_value;
10313
return (COND*) 0; // Always false
10316
case Item::COND_TRUE:
10319
*cond_value= tmp_cond_value;
10320
return (COND*) 0; // Always true
10323
case Item::COND_UNDEF: // Impossible
10324
break; /* purecov: deadcode */
10303
*cond_value= tmp_cond_value;
10305
switch (tmp_cond_value)
10307
case Item::COND_OK: /* Not true or false */
10308
if (and_level || (*cond_value == Item::COND_FALSE))
10309
*cond_value= tmp_cond_value;
10311
case Item::COND_FALSE:
10314
*cond_value= tmp_cond_value;
10315
return (COND *) NULL; /* Always false */
10318
case Item::COND_TRUE:
10321
*cond_value= tmp_cond_value;
10322
return (COND *) NULL; /* Always true */
10325
case Item::COND_UNDEF: /* Impossible */
10326
break; /* purecov: deadcode */
10327
10330
if (should_fix_fields)
10328
10331
cond->update_used_tables();
10330
if (!((Item_cond*) cond)->argument_list()->elements ||
10331
*cond_value != Item::COND_OK)
10333
if (! ((Item_cond*) cond)->argument_list()->elements || *cond_value != Item::COND_OK)
10334
return (COND*) NULL;
10333
10336
if (((Item_cond*) cond)->argument_list()->elements == 1)
10338
/* Argument list contains only one element, so reduce it so a single item, then remove list */
10335
10339
item= ((Item_cond*) cond)->argument_list()->head();
10336
10340
((Item_cond*) cond)->argument_list()->empty();
10340
else if (cond->type() == Item::FUNC_ITEM &&
10341
((Item_func*) cond)->functype() == Item_func::ISNULL_FUNC)
10344
else if (cond->type() == Item::FUNC_ITEM && ((Item_func*) cond)->functype() == Item_func::ISNULL_FUNC)
10344
10347
Handles this special case for some ODBC applications:
10350
10353
SELECT * from table_name where auto_increment_column = LAST_INSERT_ID
10353
Item_func_isnull *func=(Item_func_isnull*) cond;
10356
Item_func_isnull *func= (Item_func_isnull*) cond;
10354
10357
Item **args= func->arguments();
10355
10358
if (args[0]->type() == Item::FIELD_ITEM)
10357
Field *field=((Item_field*) args[0])->field;
10358
if (field->flags & AUTO_INCREMENT_FLAG && !field->table->maybe_null &&
10359
(session->options & OPTION_AUTO_IS_NULL) &&
10360
(session->first_successful_insert_id_in_prev_stmt > 0 &&
10361
session->substitute_null_with_insert_id))
10360
Field *field= ((Item_field*) args[0])->field;
10361
if (field->flags & AUTO_INCREMENT_FLAG
10362
&& ! field->table->maybe_null
10363
&& session->options & OPTION_AUTO_IS_NULL
10365
session->first_successful_insert_id_in_prev_stmt > 0
10366
&& session->substitute_null_with_insert_id
10364
if ((new_cond= new Item_func_eq(args[0],
10365
new Item_int("last_insert_id()",
10366
session->read_first_successful_insert_id_in_prev_stmt(),
10367
MY_INT64_NUM_DECIMAL_DIGITS))))
10371
if ((new_cond= new Item_func_eq(args[0], new Item_int("last_insert_id()",
10372
session->read_first_successful_insert_id_in_prev_stmt(),
10373
MY_INT64_NUM_DECIMAL_DIGITS))))
10371
10377
Item_func_eq can't be fixed after creation so we do not check
10372
10378
cond->fixed, also it do not need tables so we use 0 as second
10375
cond->fix_fields(session, &cond);
10381
cond->fix_fields(session, &cond);
10378
10384
IS NULL should be mapped to LAST_INSERT_ID only for first row, so
10379
10385
clear for next row
10381
10387
session->substitute_null_with_insert_id= false;
10383
10390
/* fix to replace 'NULL' dates with '0' (shreeve@uci.edu) */
10384
else if (((field->type() == DRIZZLE_TYPE_DATE) ||
10385
(field->type() == DRIZZLE_TYPE_DATETIME)) &&
10386
(field->flags & NOT_NULL_FLAG) &&
10387
!field->table->maybe_null)
10392
((field->type() == DRIZZLE_TYPE_DATE) || (field->type() == DRIZZLE_TYPE_DATETIME))
10393
&& (field->flags & NOT_NULL_FLAG)
10394
&& ! field->table->maybe_null)
10390
if ((new_cond= new Item_func_eq(args[0],new Item_int("0", 0, 2))))
10397
if ((new_cond= new Item_func_eq(args[0],new Item_int("0", 0, 2))))
10394
10401
Item_func_eq can't be fixed after creation so we do not check
10395
10402
cond->fixed, also it do not need tables so we use 0 as second
10398
cond->fix_fields(session, &cond);
10405
cond->fix_fields(session, &cond);
10408
#endif /* NOTDEFINED */
10402
10410
if (cond->const_item())
10404
10412
*cond_value= eval_const_cond(cond) ? Item::COND_TRUE : Item::COND_FALSE;
10413
return (COND *) NULL;
10408
10416
else if (cond->const_item() && !cond->is_expensive())
10420
10428
*cond_value= eval_const_cond(cond) ? Item::COND_TRUE : Item::COND_FALSE;
10429
return (COND *) NULL;
10423
10431
else if ((*cond_value= cond->eq_cmp_result()) != Item::COND_OK)
10424
{ // boolan compare function
10433
/* boolan compare function */
10425
10434
Item *left_item= ((Item_func*) cond)->arguments()[0];
10426
10435
Item *right_item= ((Item_func*) cond)->arguments()[1];
10427
10436
if (left_item->eq(right_item,1))
10429
if (!left_item->maybe_null ||
10430
((Item_func*) cond)->functype() == Item_func::EQUAL_FUNC)
10431
return (COND*) 0; // Compare of identical items
10438
if (!left_item->maybe_null || ((Item_func*) cond)->functype() == Item_func::EQUAL_FUNC)
10439
return (COND*) NULL; /* Comparison of identical items */
10434
*cond_value=Item::COND_OK;
10435
return cond; // Point at next and level
10442
*cond_value= Item::COND_OK;
10443
return cond; /* Point at next and return into recursion */