diff options
author | unknown <kaa@polly.local> | 2006-09-13 16:06:59 +0400 |
---|---|---|
committer | unknown <kaa@polly.local> | 2006-09-13 16:06:59 +0400 |
commit | a5a9b980545c64c998295e649346de3afd544f73 (patch) | |
tree | 81fa1790787c1929f8f84c662007e725a71524c5 | |
parent | 9f80b604a339db6f66e28b2c6a6f847231739624 (diff) | |
parent | b419501e0df3201cb9d188ffd56fe84c468b3d17 (diff) | |
download | mariadb-git-a5a9b980545c64c998295e649346de3afd544f73.tar.gz |
Merge polly.local:/tmp/20924/bug20294/my50-bug20294
into polly.local:/home/kaa/src/maint/m50-maint--07OGt
sql/item_cmpfunc.cc:
Auto merged
sql/item_cmpfunc.h:
Auto merged
sql/sql_class.h:
Auto merged
mysql-test/r/user_var.result:
Manual merge
mysql-test/t/user_var.test:
Manual merge
sql/item_func.cc:
Manual merge
sql/item_func.h:
Manual merge
-rw-r--r-- | mysql-test/r/case.result | 7 | ||||
-rw-r--r-- | mysql-test/r/func_if.result | 7 | ||||
-rw-r--r-- | mysql-test/r/func_test.result | 7 | ||||
-rw-r--r-- | mysql-test/r/user_var.result | 1 | ||||
-rw-r--r-- | mysql-test/t/case.test | 10 | ||||
-rw-r--r-- | mysql-test/t/func_if.test | 15 | ||||
-rw-r--r-- | mysql-test/t/func_test.test | 11 | ||||
-rw-r--r-- | mysql-test/t/user_var.test | 3 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 21 | ||||
-rw-r--r-- | sql/item_cmpfunc.h | 14 | ||||
-rw-r--r-- | sql/item_func.cc | 37 | ||||
-rw-r--r-- | sql/log_event.cc | 2 | ||||
-rw-r--r-- | sql/sql_class.h | 1 |
13 files changed, 26 insertions, 110 deletions
diff --git a/mysql-test/r/case.result b/mysql-test/r/case.result index 7154c689783..cf358e6a404 100644 --- a/mysql-test/r/case.result +++ b/mysql-test/r/case.result @@ -200,10 +200,3 @@ CEMPNUM EMPMUM1 EMPNUM2 0.00 0 0.00 2.00 2 NULL DROP TABLE t1,t2; -SELECT CASE 1 WHEN 1 THEN 18446744073709551615 ELSE 1 END; -CASE 1 WHEN 1 THEN 18446744073709551615 ELSE 1 END -18446744073709551615 -SELECT COALESCE(18446744073709551615); -COALESCE(18446744073709551615) -18446744073709551615 -End of 4.1 tests diff --git a/mysql-test/r/func_if.result b/mysql-test/r/func_if.result index 59f8db93084..eef380c8f52 100644 --- a/mysql-test/r/func_if.result +++ b/mysql-test/r/func_if.result @@ -128,10 +128,3 @@ f1 f2 if(f1, 40.0, 5.00) 0 0 5.00 1 1 40.00 drop table t1; -SELECT IF(1 != 0, 18446744073709551615, 1); -IF(1 != 0, 18446744073709551615, 1) -18446744073709551615 -SELECT IFNULL(NULL, 18446744073709551615); -IFNULL(NULL, 18446744073709551615) -18446744073709551615 -End of 4.1 tests diff --git a/mysql-test/r/func_test.result b/mysql-test/r/func_test.result index 4543988a845..d9437f6c515 100644 --- a/mysql-test/r/func_test.result +++ b/mysql-test/r/func_test.result @@ -204,10 +204,3 @@ NULL SELECT GREATEST(1.5E+2,1.3E+2,NULL) FROM DUAL; GREATEST(1.5E+2,1.3E+2,NULL) NULL -SELECT GREATEST(1, 18446744073709551615); -GREATEST(1, 18446744073709551615) -18446744073709551615 -SELECT LEAST(1, 18446744073709551615); -LEAST(1, 18446744073709551615) -1 -End of 4.1 tests diff --git a/mysql-test/r/user_var.result b/mysql-test/r/user_var.result index 2b9ec8e2164..1664a907c99 100644 --- a/mysql-test/r/user_var.result +++ b/mysql-test/r/user_var.result @@ -301,4 +301,3 @@ select @var; @var 3 drop table t1; -End of 4.1 tests diff --git a/mysql-test/t/case.test b/mysql-test/t/case.test index a22b9cc39f1..0e9e141f6d8 100644 --- a/mysql-test/t/case.test +++ b/mysql-test/t/case.test @@ -152,12 +152,4 @@ SELECT IFNULL(t2.EMPNUM,t1.EMPNUM) AS CEMPNUM, FROM t1 LEFT JOIN t2 ON t1.EMPNUM=t2.EMPNUM; DROP TABLE t1,t2; -# -# Bug #20924: CAST(expr as UNSIGNED) returns SIGNED value when used in various -# functions -# - UNSIGNED values in CASE and COALESCE are treated as SIGNED -# -SELECT CASE 1 WHEN 1 THEN 18446744073709551615 ELSE 1 END; -SELECT COALESCE(18446744073709551615); - ---echo End of 4.1 tests +# End of 4.1 tests diff --git a/mysql-test/t/func_if.test b/mysql-test/t/func_if.test index 553387b9d42..beaa371f847 100644 --- a/mysql-test/t/func_if.test +++ b/mysql-test/t/func_if.test @@ -97,18 +97,3 @@ create table t1 (f1 int, f2 int); insert into t1 values(1,1),(0,0); select f1, f2, if(f1, 40.0, 5.00) from t1 group by f1 order by f2; drop table t1; -# -# Bug #20924: CAST(expr as UNSIGNED) returns SIGNED value when used in various -# functions -# - UNSIGNED values in IF() are treated as SIGNED -# -SELECT IF(1 != 0, 18446744073709551615, 1); - -# -# Bug #20924: CAST(expr as UNSIGNED) returns SIGNED value when used in various -# functions -# - UNSIGNED values in IFNULL() are treated as SIGNED -# -SELECT IFNULL(NULL, 18446744073709551615); - ---echo End of 4.1 tests diff --git a/mysql-test/t/func_test.test b/mysql-test/t/func_test.test index 83432dcc7fc..0ea89cd0913 100644 --- a/mysql-test/t/func_test.test +++ b/mysql-test/t/func_test.test @@ -108,7 +108,6 @@ select 5.1 mod 3, 5.1 mod -3, -5.1 mod 3, -5.1 mod -3; select 5 mod 3, 5 mod -3, -5 mod 3, -5 mod -3; -# # Bug#6726: NOT BETWEEN parse failure # create table t1 (a int, b int); @@ -126,12 +125,4 @@ SELECT LEAST('xxx','aaa',NULL,'yyy') FROM DUAL; SELECT LEAST(1.1,1.2,NULL,1.0) FROM DUAL; SELECT GREATEST(1.5E+2,1.3E+2,NULL) FROM DUAL; -# -# Bug #20924: CAST(expr as UNSIGNED) returns SIGNED value when used in various -# functions -# - UNSIGNED values in GREATEST() and LEAST() are treated as SIGNED -# -SELECT GREATEST(1, 18446744073709551615); -SELECT LEAST(1, 18446744073709551615); - ---echo End of 4.1 tests +# End of 4.1 tests diff --git a/mysql-test/t/user_var.test b/mysql-test/t/user_var.test index 192a92fc660..644ca506eba 100644 --- a/mysql-test/t/user_var.test +++ b/mysql-test/t/user_var.test @@ -144,7 +144,6 @@ select @@version; --replace_column 1 # select @@global.version; -# # Bug #6598: problem with cast(NULL as signed integer); # @@ -211,4 +210,4 @@ select @var:=f2 from t1 group by f1 order by f2 desc limit 1; select @var; drop table t1; ---echo End of 4.1 tests +# End of 4.1 tests diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 756754dde3c..919a23ed65d 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -730,7 +730,11 @@ int Arg_comparator::compare_int_signed_unsigned() if (!(*b)->null_value) { owner->null_value= 0; - return ::compare_int_signed_unsigned(sval1, uval2); + if (sval1 < 0 || (ulonglong)sval1 < uval2) + return -1; + if ((ulonglong)sval1 == uval2) + return 0; + return 1; } } owner->null_value= 1; @@ -751,7 +755,13 @@ int Arg_comparator::compare_int_unsigned_signed() if (!(*b)->null_value) { owner->null_value= 0; - return ::compare_int_unsigned_signed(uval1, sval2); + if (sval2 < 0) + return 1; + if (uval1 < (ulonglong)sval2) + return -1; + if (uval1 == (ulonglong)sval2) + return 0; + return 1; } } owner->null_value= 1; @@ -1392,13 +1402,11 @@ Item_func_ifnull::int_op() if (!args[0]->null_value) { null_value=0; - unsigned_flag= args[0]->unsigned_flag; return value; } value=args[1]->val_int(); if ((null_value=args[1]->null_value)) return 0; - unsigned_flag= args[1]->unsigned_flag; return value; } @@ -1549,7 +1557,6 @@ Item_func_if::val_int() Item *arg= args[0]->val_bool() ? args[1] : args[2]; longlong value=arg->val_int(); null_value=arg->null_value; - unsigned_flag= arg->unsigned_flag; return value; } @@ -1798,7 +1805,6 @@ longlong Item_func_case::val_int() } res=item->val_int(); null_value=item->null_value; - unsigned_flag= item->unsigned_flag; return res; } @@ -1985,10 +1991,7 @@ longlong Item_func_coalesce::int_op() { longlong res=args[i]->val_int(); if (!args[i]->null_value) - { - unsigned_flag= args[i]->unsigned_flag; return res; - } } null_value=1; return 0; diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 544f1470d9a..47f9f2aa98f 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -1396,17 +1396,3 @@ inline Item *and_conds(Item *a, Item *b) } Item *and_expressions(Item *a, Item *b, Item **org_item); - -inline int compare_int_signed_unsigned(longlong sval, ulonglong uval) -{ - if (sval < 0 || (ulonglong)sval < uval) - return -1; - if ((ulonglong)sval == uval) - return 0; - return 1; -} - -inline int compare_int_unsigned_signed(ulonglong uval, longlong sval) -{ - return -compare_int_signed_unsigned(sval, uval); -} diff --git a/sql/item_func.cc b/sql/item_func.cc index 4d9893e1bbd..18322bcf757 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2152,33 +2152,18 @@ longlong Item_func_min_max::val_int() { DBUG_ASSERT(fixed == 1); longlong value=0; - my_bool arg_unsigned_flag; - my_bool cmp; for (uint i=0; i < arg_count ; i++) { - longlong tmp= args[i]->val_int(); - if ((null_value= args[i]->null_value)) - break; - arg_unsigned_flag= args[i]->unsigned_flag; if (i == 0) - { - value= tmp; - unsigned_flag= arg_unsigned_flag; - } + value=args[i]->val_int(); else { - if (unsigned_flag == arg_unsigned_flag) - cmp= tmp < value; - else if (unsigned_flag) - cmp= compare_int_signed_unsigned(tmp, value) < 0; - else - cmp= compare_int_unsigned_signed(tmp, value) < 0; - if ((cmp ? cmp_sign : -cmp_sign) > 0) - { - value= tmp; - unsigned_flag= arg_unsigned_flag; - } + longlong tmp=args[i]->val_int(); + if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0) + value=tmp; } + if ((null_value= args[i]->null_value)) + break; } return value; } @@ -3437,7 +3422,6 @@ static user_var_entry *get_variable(HASH *hash, LEX_STRING &name, entry->length=0; entry->update_query_id=0; entry->collation.set(NULL, DERIVATION_IMPLICIT); - entry->unsigned_flag= 0; /* If we are here, we were called from a SET or a query which sets a variable. Imagine it is this: @@ -3581,7 +3565,6 @@ update_hash(user_var_entry *entry, bool set_null, void *ptr, uint length, ((my_decimal*)entry->value)->fix_buffer_pointer(); entry->length= length; entry->collation.set(cs, dv); - entry->unsigned_flag= unsigned_arg; } entry->type=type; return 0; @@ -3814,13 +3797,13 @@ Item_func_set_user_var::update() case REAL_RESULT: { res= update_hash((void*) &save_result.vreal,sizeof(save_result.vreal), - REAL_RESULT, &my_charset_bin, DERIVATION_IMPLICIT, 0); + REAL_RESULT, &my_charset_bin, DERIVATION_IMPLICIT); break; } case INT_RESULT: { res= update_hash((void*) &save_result.vint, sizeof(save_result.vint), - INT_RESULT, &my_charset_bin, DERIVATION_IMPLICIT, + INT_RESULT, &my_charset_bin, DERIVATION_IMPLICIT, unsigned_flag); break; } @@ -3828,12 +3811,12 @@ Item_func_set_user_var::update() { if (!save_result.vstr) // Null value res= update_hash((void*) 0, 0, STRING_RESULT, &my_charset_bin, - DERIVATION_IMPLICIT, 0); + DERIVATION_IMPLICIT); else res= update_hash((void*) save_result.vstr->ptr(), save_result.vstr->length(), STRING_RESULT, save_result.vstr->charset(), - DERIVATION_IMPLICIT, 0); + DERIVATION_IMPLICIT); break; } case DECIMAL_RESULT: diff --git a/sql/log_event.cc b/sql/log_event.cc index 219434ab218..cf5dbb1e77c 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -3846,7 +3846,7 @@ int User_var_log_event::exec_event(struct st_relay_log_info* rli) a single record and with a single column. Thus, like a column value, it could always have IMPLICIT derivation. */ - e.update_hash(val, val_len, type, charset, DERIVATION_IMPLICIT, 0); + e.update_hash(val, val_len, type, charset, DERIVATION_IMPLICIT); free_root(thd->mem_root,0); rli->inc_event_relay_log_pos(); diff --git a/sql/sql_class.h b/sql/sql_class.h index ed9f4b57f56..8baf5fb7360 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -2016,7 +2016,6 @@ class user_var_entry ulong length; query_id_t update_query_id, used_query_id; Item_result type; - bool unsigned_flag; double val_real(my_bool *null_value); longlong val_int(my_bool *null_value); |