maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #12411
Re: d19f380d62c: MDEV-21445 Strange/inconsistent behavior of IN condition when mixing numbers and strings
Hi, Alexander!
On Oct 12, Alexander Barkov wrote:
> revision-id: d19f380d62c (mariadb-10.3.21-213-gd19f380d62c)
> parent(s): 90c8d773ed0
> author: Alexander Barkov <bar@xxxxxxxxxxx>
> committer: Alexander Barkov <bar@xxxxxxxxxxx>
> timestamp: 2020-08-18 13:19:21 +0400
> message:
>
> MDEV-21445 Strange/inconsistent behavior of IN condition when mixing numbers and strings
>
> Comparison is now performed as DECIMAL for pairs (int,string) and (string,int).
Are there tests with strings like '1e100', outside of bigint range ?
> Before the patch the comparison was performed in DOUBLE format,
> so precision loss happened on huge values, e.g.:
>
> '97716021308405775' was converted to
> 97716021308405770 (notice, the last digit was lost)
>
> diff --git a/sql/field.h b/sql/field.h
> index be3a648617b..c9f5a34a3ae 100644
> --- a/sql/field.h
> +++ b/sql/field.h
> @@ -311,7 +311,7 @@ class Value_source
> const char *end)
> {
> Converter_str2my_decimal_with_warn(NULL, Warn_filter_all(),
> - E_DEC_FATAL_ERROR & ~E_DEC_BAD_NUM,
> + 0,
why did you remove warnings (here and elsewhere)?
would be good to have it in the commit comment too, not just in email.
> cs, cptr, end - cptr, decimal_value);
> return decimal_value;
> }
> diff --git a/sql/sql_type.cc b/sql/sql_type.cc
> index 9d3a47adfa5..7a847c90b8f 100644
> --- a/sql/sql_type.cc
> +++ b/sql/sql_type.cc
> @@ -764,6 +764,11 @@ Type_handler_hybrid_field_type::aggregate_for_comparison(const Type_handler *h)
> m_type_handler= &type_handler_datetime;
> }
> }
> + else if ((a == INT_RESULT && b == STRING_RESULT) ||
> + (b == INT_RESULT && a == INT_RESULT))
looks like a typo, the second line should be
b == INT_RESULT && a == STRING_RESULT
please add some tests to cover it.
> + {
> + m_type_handler= &type_handler_newdecimal;
> + }
> else if ((a == INT_RESULT || a == DECIMAL_RESULT) &&
> (b == INT_RESULT || b == DECIMAL_RESULT))
> {
Regards,
Sergei
VP of MariaDB Server Engineering
and security@xxxxxxxxxxx