~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/item/cmpfunc.cc

  • Committer: Brian Aker
  • Date: 2011-07-14 22:12:02 UTC
  • mto: (2392.1.1 drizzle-autoconf)
  • mto: This revision was merged to the branch mainline in revision 2368.
  • Revision ID: brian@tangent.org-20110714221202-9ov19jp0tmhiovqk
Fixes bug where true/false would not be interpreted correctly/displayed correctly.

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
#include <drizzled/cached_item.h>
27
27
#include <drizzled/check_stack_overrun.h>
28
28
#include <drizzled/current_session.h>
 
29
#include <drizzled/display.h>
29
30
#include <drizzled/error.h>
30
31
#include <drizzled/internal/my_sys.h>
31
32
#include <drizzled/item/cache_int.h>
33
34
#include <drizzled/item/int_with_ref.h>
34
35
#include <drizzled/item/subselect.h>
35
36
#include <drizzled/session.h>
 
37
#include <drizzled/sql_lex.h>
36
38
#include <drizzled/sql_select.h>
 
39
#include <drizzled/system_variables.h>
37
40
#include <drizzled/temporal.h>
38
41
#include <drizzled/time_functions.h>
39
 
#include <drizzled/sql_lex.h>
40
 
#include <drizzled/system_variables.h>
41
42
 
42
43
#include <math.h>
43
44
#include <algorithm>
94
95
  for (; item < item_end; item++)
95
96
  {
96
97
    if ((*item)->type() != Item::NULL_ITEM)
 
98
    {
97
99
      *type= item_store_type(*type, *item, unsigned_flag);
 
100
    }
98
101
  }
99
102
}
100
103
 
2371
2374
}
2372
2375
 
2373
2376
 
2374
 
void
2375
 
Item_func_if::fix_length_and_dec()
 
2377
void Item_func_if::fix_length_and_dec()
2376
2378
{
2377
2379
  maybe_null= args[1]->maybe_null || args[2]->maybe_null;
2378
2380
  decimals= max(args[1]->decimals, args[2]->decimals);
2397
2399
  }
2398
2400
  else
2399
2401
  {
2400
 
    agg_result_type(&cached_result_type, args+1, 2);
 
2402
    agg_result_type(&cached_result_type, args +1, 2);
2401
2403
    if (cached_result_type == STRING_RESULT)
2402
2404
    {
2403
 
      if (agg_arg_charsets(collation, args+1, 2, MY_COLL_ALLOW_CONV, 1))
 
2405
      if (agg_arg_charsets(collation, args +1, 2, MY_COLL_ALLOW_CONV, 1))
2404
2406
        return;
2405
2407
    }
2406
2408
    else
2407
2409
    {
2408
2410
      collation.set(&my_charset_bin);   // Number
2409
2411
    }
2410
 
    cached_field_type= agg_field_type(args + 1, 2);
 
2412
    cached_field_type= agg_field_type(args +1, 2);
2411
2413
  }
2412
2414
 
2413
 
  if ((cached_result_type == DECIMAL_RESULT )
2414
 
      || (cached_result_type == INT_RESULT))
 
2415
  switch (cached_result_type)
2415
2416
  {
2416
 
    int len1= args[1]->max_length - args[1]->decimals
2417
 
      - (args[1]->unsigned_flag ? 0 : 1);
2418
 
 
2419
 
    int len2= args[2]->max_length - args[2]->decimals
2420
 
      - (args[2]->unsigned_flag ? 0 : 1);
2421
 
 
2422
 
    max_length= max(len1, len2) + decimals + (unsigned_flag ? 0 : 1);
2423
 
  }
2424
 
  else
 
2417
  case DECIMAL_RESULT: 
 
2418
  case INT_RESULT:
 
2419
    {
 
2420
      int len1= args[1]->max_length -args[1]->decimals -(args[1]->unsigned_flag ? 0 : 1);
 
2421
      int len2= args[2]->max_length -args[2]->decimals -(args[2]->unsigned_flag ? 0 : 1);
 
2422
      max_length= max(len1, len2) + decimals + (unsigned_flag ? 0 : 1);
 
2423
    }
 
2424
    break;
 
2425
  case REAL_RESULT:
 
2426
  case STRING_RESULT:
2425
2427
    max_length= max(args[1]->max_length, args[2]->max_length);
 
2428
    break;
 
2429
 
 
2430
  case ROW_RESULT:
 
2431
    assert(0);
 
2432
    break;
 
2433
  }
2426
2434
}
2427
2435
 
2428
2436
 
2449
2457
{
2450
2458
  assert(fixed == 1);
2451
2459
  Item *arg= args[0]->val_bool() ? args[1] : args[2];
2452
 
  int64_t value=arg->val_int();
2453
 
  null_value=arg->null_value;
 
2460
  int64_t value= arg->val_int();
 
2461
  null_value= arg->null_value;
2454
2462
  return value;
2455
2463
}
2456
2464
 
2459
2467
{
2460
2468
  assert(fixed == 1);
2461
2469
  Item *arg= args[0]->val_bool() ? args[1] : args[2];
2462
 
  String *res=arg->val_str(str);
 
2470
  String *res= arg->val_str(str);
2463
2471
  if (res)
 
2472
  {
2464
2473
    res->set_charset(collation.collation);
2465
 
  null_value=arg->null_value;
 
2474
  }
 
2475
  null_value= arg->null_value;
2466
2476
  return res;
2467
2477
}
2468
2478