maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #09384
Re: Please review MDEV-9653 Assertion `length || !scale' failed in uint my_decimal_length_to_precision(uint, uint, bool)
Hi Sergei,
On 03/17/2016 01:14 PM, Sergei Golubchik wrote:
> Hi, Alexander!
>
> On Mar 17, Alexander Barkov wrote:
>>>
>>> why is it NOT_FIXED_DEC? it seems to me that it has to be 0 here.
>>
>> Perhaps my example in the comments made you think that
>> it happens in a very special case with CAST AS UNSIGNED.
>> It also happens in simpler cases:
>>
>> SELECT CASE WHEN TRUE
>> THEN COALESCE(NULL)
>> ELSE 40
>> END;
>>
>> I guess I should fix the example to this ^^^.
>
> Yes, please.
>
> More questions:
>
> 1. Perhaps my_decimal_length_to_precision() then? It's used not only in
> Item_func_case::agg_num_lengths. Quick grepping finds more
> potentially dangerous places. For example
> Item_decimal_typecast::print.
I could not find places where my_decimal_length_to_precision() can be
called with (0,NOT_FIXED_DEC).
Item_decimal_typecast::print() is safe.
Item_decimal_typecast::max_length and Item_decimal_typecast::decimals
are set to valid values in constructor. The latter cannot be NOT_FIXED_DEC.
>
> 2. Why my_decimal_length_to_precision is only used in Item_func_case?
> How do other functions aggregate types? Perhaps CASE needs
> to be changed to work like other similar functions do?
There is some code duplication in hybrid type functions:
- Item_func_case::agg_num_lengths()
- Item_func::count_decimal_length(), which is called from
Item_func_coalesce::fix_length_and_dec()
- Item_func_case_abbreviation2::fix_length_and_dec()
I earlier created a task for this for 10.2:
https://jira.mariadb.org/browse/MDEV-9406
I found new bugs when replying to this letter:
SELECT COALESCE(COALESCE(NULL), 1.1);
SELECT IF(0, COALESCE(NULL), 1.1);
return 1.1000000000000000000000000000000, which is wrong.
I'll come up with a new patch soon.
Thanks.
>
> Regards,
> Sergei
> Chief Architect MariaDB
> and security@xxxxxxxxxxx
>
Follow ups
References
-
Please review MDEV-9653 Assertion `length || !scale' failed in uint my_decimal_length_to_precision(uint, uint, bool)
From: Alexander Barkov, 2016-03-16
-
Re: Please review MDEV-9653 Assertion `length || !scale' failed in uint my_decimal_length_to_precision(uint, uint, bool)
From: Sergei Golubchik, 2016-03-16
-
Re: Please review MDEV-9653 Assertion `length || !scale' failed in uint my_decimal_length_to_precision(uint, uint, bool)
From: Alexander Barkov, 2016-03-17
-
Re: Please review MDEV-9653 Assertion `length || !scale' failed in uint my_decimal_length_to_precision(uint, uint, bool)
From: Sergei Golubchik, 2016-03-17