diff options
author | unknown <mskold@mysql.com> | 2005-02-16 13:13:13 +0100 |
---|---|---|
committer | unknown <mskold@mysql.com> | 2005-02-16 13:13:13 +0100 |
commit | 88a2b72ce098c1de65b9f036b192bae348fa4ac8 (patch) | |
tree | 7bb7240f5622c5d6dd91c03371fbf9ce51d66591 /sql/item_cmpfunc.cc | |
parent | c4590730a692f14d9e26baf7cffd9d5c8a81b2e8 (diff) | |
parent | a95183916ef6cfac73adf068030b6f7b110ea9b9 (diff) | |
download | mariadb-git-88a2b72ce098c1de65b9f036b192bae348fa4ac8.tar.gz |
Merge mskold@bk-internal.mysql.com:/home/bk/mysql-5.0-ndb
into mysql.com:/usr/local/home/marty/MySQL/test/mysql-5.0-ndb
sql/filesort.cc:
Auto merged
sql/item.h:
Auto merged
sql/item_cmpfunc.cc:
Auto merged
sql/sql_select.cc:
Auto merged
Diffstat (limited to 'sql/item_cmpfunc.cc')
-rw-r--r-- | sql/item_cmpfunc.cc | 62 |
1 files changed, 41 insertions, 21 deletions
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 653d23e809c..5d764a734bc 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -273,8 +273,7 @@ int Arg_comparator::set_compare_func(Item_bool_func2 *item, Item_result type) owner= item; func= comparator_matrix[type] [test(owner->functype() == Item_func::EQUAL_FUNC)]; - switch(type) - { + switch(type) { case ROW_RESULT: { uint n= (*a)->cols(); @@ -877,25 +876,43 @@ void Item_func_interval::fix_length_and_dec() /* - return -1 if null value, - 0 if lower than lowest - 1 - arg_count-1 if between args[n] and args[n+1] - arg_count if higher than biggest argument + Execute Item_func_interval() + + SYNOPSIS + Item_func_interval::val_int() + + NOTES + If we are doing a decimal comparison, we are + evaluating the first item twice. + + RETURN + -1 if null value, + 0 if lower than lowest + 1 - arg_count-1 if between args[n] and args[n+1] + arg_count if higher than biggest argument */ longlong Item_func_interval::val_int() { DBUG_ASSERT(fixed == 1); - double value= row->el(0)->val_real(); + double value; my_decimal dec_buf, *dec= NULL; + uint i; + if (use_decimal_comparison) { dec= row->el(0)->val_decimal(&dec_buf); + if (row->el(0)->null_value) + return -1; + my_decimal2double(E_DEC_FATAL_ERROR, dec, &value); + } + else + { + value= row->el(0)->val_real(); + if (row->el(0)->null_value) + return -1; } - uint i; - if (row->el(0)->null_value) - return -1; // -1 if null if (intervals) { // Use binary search to find interval uint start,end; @@ -906,6 +923,11 @@ longlong Item_func_interval::val_int() uint mid= (start + end + 1) / 2; interval_range *range= intervals + mid; my_bool cmp_result; + /* + The values in the range intervall may have different types, + Only do a decimal comparision of the first argument is a decimal + and we are comparing against a decimal + */ if (dec && range->type == DECIMAL_RESULT) cmp_result= my_decimal_cmp(&range->dec, dec) <= 0; else @@ -917,7 +939,7 @@ longlong Item_func_interval::val_int() } interval_range *range= intervals+start; return ((dec && range->type == DECIMAL_RESULT) ? - my_decimal_cmp(dec, &range->dec) < 0 : + my_decimal_cmp(dec, &range->dec) < 0 : value < range->dbl) ? 0 : start + 1; } @@ -932,13 +954,13 @@ longlong Item_func_interval::val_int() if (my_decimal_cmp(e_dec, dec) > 0) return i-1; } - else - if (row->el(i)->val_real() > value) - return i-1; + else if (row->el(i)->val_real() > value) + return i-1; } return i-1; } + void Item_func_between::fix_length_and_dec() { max_length= 1; @@ -1087,8 +1109,7 @@ Item_func_ifnull::fix_length_and_dec() args[1]->max_length - args[1]->decimals) + decimals); agg_result_type(&cached_result_type, args, 2); - switch (cached_result_type) - { + switch (cached_result_type) { case STRING_RESULT: agg_arg_charsets(collation, args, arg_count, MY_COLL_CMP_CONV); break; @@ -1166,7 +1187,6 @@ my_decimal *Item_func_ifnull::val_decimal(my_decimal *decimal_value) } - String * Item_func_ifnull::val_str(String *str) { @@ -1456,7 +1476,6 @@ Item *Item_func_case::find_item(String *str) } - String *Item_func_case::val_str(String *str) { DBUG_ASSERT(fixed == 1); @@ -2037,7 +2056,8 @@ int cmp_item_row::compare(cmp_item *c) void cmp_item_decimal::store_value(Item *item) { my_decimal *val= item->val_decimal(&value); - if (val != &value) + /* val may be zero if item is nnull */ + if (val && val != &value) my_decimal2decimal(val, &value); } @@ -2051,9 +2071,9 @@ int cmp_item_decimal::cmp(Item *arg) } -int cmp_item_decimal::compare(cmp_item *c) +int cmp_item_decimal::compare(cmp_item *arg) { - cmp_item_decimal *cmp= (cmp_item_decimal *)c; + cmp_item_decimal *cmp= (cmp_item_decimal*) arg; return my_decimal_cmp(&value, &cmp->value); } |