diff options
author | Alexander Barkov <bar@mariadb.org> | 2017-05-23 12:45:47 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2017-05-23 12:45:47 +0400 |
commit | d9304914bed2d6d45dbc9f43aa1e2f7ea3bbeb13 (patch) | |
tree | 75dd4ffb8bd8095ca7c2b666f2e0939e866ab623 /mysql-test/t/cast.test | |
parent | 9b79888df82259743284501af5b156a18edc427f (diff) | |
download | mariadb-git-d9304914bed2d6d45dbc9f43aa1e2f7ea3bbeb13.tar.gz |
Fixing a few problems with data type and metadata for INT result functions (MDEV-12852, MDEV-12853, MDEV-12869)
This is a joint patch for:
MDEV-12852 Out-of-range errors when CAST(1-2 AS UNSIGNED
MDEV-12853 Out-of-range errors when CAST('-1' AS UNSIGNED
MDEV-12869 Wrong metadata for integer additive and multiplicative operators
1. Fixing all Item_func_numhybrid descendants to set the precise
data type handler (type_handler_long or type_handler_longlong)
at fix_fields() time. This fixes MDEV-12869.
2. Fixing Item_func_unsigned_typecast to set the precise data type handler
at fix_fields() time. This fixes MDEV-12852 and MDEV-12853.
This is done by:
- fixing Type_handler::Item_func_unsigned_fix_length_and_dec()
and Type_handler_string_result::Item_func_unsigned_fix_length_and_dec()
to properly detect situations when a negative epxression is converted
to UNSIGNED. In this case, length of the result is now always set to
MAX_BIGINT_WIDTH without trying to use args[0]->max_length, as very
short arguments can produce very long result in such conversion:
CAST(-1 AS UNSIGNED) -> 18446744073709551614
- adding a new virtual method "longlong Item::val_int_max() const",
to preserve the old behavior for expressions like this:
CAST(1 AS UNSIGNED)
to stay under the INT data type (instead of BIGINT) for small
positive integer literals. Using Item::unsigned_flag would not help,
because Item_int does not set unsigned_flag to "true" for positive
numbers.
3. Adding helper methods:
* Item::type_handler_long_or_longlong()
* Type_handler::type_handler_long_or_longlong()
and reusing them in a few places, to reduce code duplication.
4. Making reorganation in create_tmp_field() and
create_field_for_create_select() for Item_hybrid_func and descendants,
to reduce duplicate code. They all now have a similar behavior in
respect of creating fields. Only Item_func_user_var descendants have
a different behavior. So moving the default behvior to Item_hybrid_func,
and overriding behavior on Item_func_user_var level.
Diffstat (limited to 'mysql-test/t/cast.test')
-rw-r--r-- | mysql-test/t/cast.test | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/mysql-test/t/cast.test b/mysql-test/t/cast.test index e56433b3d54..17e8be839a8 100644 --- a/mysql-test/t/cast.test +++ b/mysql-test/t/cast.test @@ -561,3 +561,29 @@ CALL p1('8FFFFFFFFFFFFFFF'); DROP PROCEDURE p1; SET sql_mode=DEFAULT; + + +--echo # +--echo # MDEV-12852 Out-of-range errors when CAST(1-2 AS UNSIGNED +--echo # + +SET sql_mode=STRICT_ALL_TABLES; +CREATE TABLE t1 AS SELECT + CAST(-1 AS UNSIGNED), + CAST(1-2 AS UNSIGNED); +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; +SET sql_mode=DEFAULT; + + +--echo # +--echo # MDEV-12853 Out-of-range errors when CAST('-1' AS UNSIGNED +--echo # + +SET sql_mode=STRICT_ALL_TABLES; +CREATE TABLE t1 AS SELECT CAST('-1' AS UNSIGNED); +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; +SET sql_mode=DEFAULT; |