Hi Tor,
Patch looks correct and solves the problem. OK to push.
Best regards,
Olav
On 14/01/2011 15:03, Tor Didriksen wrote:
> #At file:///export/home/didrik/repo/5.5/ based on
> revid:guilhem.bichot@stripped
>
> 3248 Tor Didriksen 2011-01-14
> Bug #59498 div function broken in mysql-trunk
> @ mysql-test/r/func_math.result
> New test case.
> @ mysql-test/t/func_math.test
> New test case.
> @ sql/item_func.cc
> Check for null before converting value to my_decimal.
>
> modified:
> mysql-test/r/func_math.result
> mysql-test/t/func_math.test
> sql/item_func.cc
> === modified file 'mysql-test/r/func_math.result'
> --- a/mysql-test/r/func_math.result 2011-01-14 09:05:14 +0000
> +++ b/mysql-test/r/func_math.result 2011-01-14 14:03:37 +0000
> @@ -650,3 +650,9 @@ SELECT ((@a:=@b:=1.0) div (@b:=@a:=get_f
> NULL
> Warnings:
> Warning 1366 Incorrect decimal value: '' for column '' at row -1
> +#
> +# Bug #59498 div function broken in mysql-trunk
> +#
> +SELECT 1 div null;
> +1 div null
> +NULL
>
> === modified file 'mysql-test/t/func_math.test'
> --- a/mysql-test/t/func_math.test 2011-01-14 09:05:14 +0000
> +++ b/mysql-test/t/func_math.test 2011-01-14 14:03:37 +0000
> @@ -495,3 +495,8 @@ DROP TABLE t1;
> --echo # in do_div_mod with doubly assigned variables
> --echo #
> SELECT ((@a:=@b:=1.0) div (@b:=@a:=get_format(datetime, 'usa')));
> +
> +--echo #
> +--echo # Bug #59498 div function broken in mysql-trunk
> +--echo #
> +SELECT 1 div null;
>
> === modified file 'sql/item_func.cc'
> --- a/sql/item_func.cc 2011-01-14 09:05:14 +0000
> +++ b/sql/item_func.cc 2011-01-14 14:03:37 +0000
> @@ -1582,10 +1582,15 @@ longlong Item_func_int_div::val_int()
> args[1]->result_type() != INT_RESULT)
> {
> my_decimal tmp;
> - my_decimal val0= *args[0]->val_decimal(&tmp);
> - my_decimal val1= *args[1]->val_decimal(&tmp);
> - if ((null_value= (args[0]->null_value || args[1]->null_value)))
> + my_decimal *val0p= args[0]->val_decimal(&tmp);
> + if ((null_value= args[0]->null_value))
> return 0;
> + my_decimal val0= *val0p;
> +
> + my_decimal *val1p= args[1]->val_decimal(&tmp);
> + if ((null_value= args[1]->null_value))
> + return 0;
> + my_decimal val1= *val1p;
>
> int err;
> if ((err= my_decimal_div(E_DEC_FATAL_ERROR& ~E_DEC_DIV_ZERO,&tmp,
>
>
>
>
>
>