summaryrefslogtreecommitdiff
path: root/sql/item_func.h
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2020-08-03 10:53:06 +0400
committerAlexander Barkov <bar@mariadb.com>2020-08-03 10:53:06 +0400
commit9840bb21ef683afd59a30a79ebc5bd5ad33a7c1a (patch)
treed3a79d95550a05c8381855adaa45bc5f2941619d /sql/item_func.h
parent97f7bfcebcc17df337bd97c0a9535a906547016d (diff)
downloadmariadb-git-9840bb21ef683afd59a30a79ebc5bd5ad33a7c1a.tar.gz
MDEV-23366 ROUND(18446744073709551615,rand()*0) returns a wrong result
Changing that in case of *INT and hex hybrid input: - ROUND(x,NULL) creates a column with the same type as x. The old code created a DOUBLE column, which was not relevant at all. This change simplifies the code a lot. - ROUND(x,non_constant) creates a column of the INT, BIGINT or DECIMAL data type (depending on the exact type of x). The old code created a column of the DOUBLE data type, which lead to precision loss. Hence MDEV-23366. - ROUND(bigint_30,negative_constant) creates a column of the DECIMAL(30,0) data type. The old code created DECIMAL(29,0), which looked strange: the data type promoted to a higher one, but max length reduced. Now the length attribute is preserved.
Diffstat (limited to 'sql/item_func.h')
-rw-r--r--sql/item_func.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/sql/item_func.h b/sql/item_func.h
index ea00a0cb033..24601983f86 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -1754,6 +1754,7 @@ class Item_func_round :public Item_func_hybrid_field_type
bool truncate;
void fix_length_and_dec_decimal(uint decimals_to_set);
void fix_length_and_dec_double(uint decimals_to_set);
+ bool test_if_length_can_increase();
public:
Item_func_round(THD *thd, Item *a, Item *b, bool trunc_arg)
:Item_func_hybrid_field_type(thd, a, b), truncate(trunc_arg) {}
@@ -1777,6 +1778,7 @@ public:
void fix_arg_int(const Type_handler *preferred,
const Type_std_attributes *preferred_attributes,
bool use_decimal_on_length_increase);
+ void fix_arg_hex_hybrid();
void fix_arg_double();
void fix_arg_time();
void fix_arg_datetime();