Commit 63d53857 authored by igor@olga.mysql.com's avatar igor@olga.mysql.com

Fixed bug #29417.

An assertion abort could occur for some grouping queries that employed 
decimal user variables with assignments to them.

The problem appeared the constructors of the class Field_new_decimal
because the function my_decimal_length_to_precision did not guarantee
returning decimal precision not greater than DECIMAL_MAX_PRECISION.
parent 5b1e1eea
...@@ -1471,4 +1471,12 @@ drop table t1; ...@@ -1471,4 +1471,12 @@ drop table t1;
SELECT 1.000000000000 * 99.999999999998 / 100 a,1.000000000000 * (99.999999999998 / 100) b; SELECT 1.000000000000 * 99.999999999998 / 100 a,1.000000000000 * (99.999999999998 / 100) b;
a b a b
0.9999999999999800000000000000 0.9999999999999800000000000000 0.9999999999999800000000000000 0.9999999999999800000000000000
CREATE TABLE t1 (a int DEFAULT NULL, b int DEFAULT NULL);
INSERT INTO t1 VALUES (3,30), (1,10), (2,10);
SET @a= CAST(1 AS decimal);
SELECT 1 FROM t1 GROUP BY @b := @a, @b;
1
1
1
DROP TABLE t1;
End of 5.0 tests End of 5.0 tests
...@@ -1162,4 +1162,17 @@ drop table t1; ...@@ -1162,4 +1162,17 @@ drop table t1;
# #
SELECT 1.000000000000 * 99.999999999998 / 100 a,1.000000000000 * (99.999999999998 / 100) b; SELECT 1.000000000000 * 99.999999999998 / 100 a,1.000000000000 * (99.999999999998 / 100) b;
#
# Bug #29417: assertion abort for a grouping query with decimal user variable
#
CREATE TABLE t1 (a int DEFAULT NULL, b int DEFAULT NULL);
INSERT INTO t1 VALUES (3,30), (1,10), (2,10);
SET @a= CAST(1 AS decimal);
SELECT 1 FROM t1 GROUP BY @b := @a, @b;
DROP TABLE t1;
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -2267,6 +2267,7 @@ Field_new_decimal::Field_new_decimal(char *ptr_arg, ...@@ -2267,6 +2267,7 @@ Field_new_decimal::Field_new_decimal(char *ptr_arg,
dec_arg, zero_arg, unsigned_arg) dec_arg, zero_arg, unsigned_arg)
{ {
precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg); precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
set_if_smaller(precision, DECIMAL_MAX_PRECISION);
DBUG_ASSERT((precision <= DECIMAL_MAX_PRECISION) && DBUG_ASSERT((precision <= DECIMAL_MAX_PRECISION) &&
(dec <= DECIMAL_MAX_SCALE)); (dec <= DECIMAL_MAX_SCALE));
bin_size= my_decimal_get_binary_size(precision, dec); bin_size= my_decimal_get_binary_size(precision, dec);
...@@ -2286,6 +2287,7 @@ Field_new_decimal::Field_new_decimal(uint32 len_arg, ...@@ -2286,6 +2287,7 @@ Field_new_decimal::Field_new_decimal(uint32 len_arg,
0, unsigned_arg) 0, unsigned_arg)
{ {
precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg); precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
set_if_smaller(precision, DECIMAL_MAX_PRECISION);
DBUG_ASSERT((precision <= DECIMAL_MAX_PRECISION) && DBUG_ASSERT((precision <= DECIMAL_MAX_PRECISION) &&
(dec <= DECIMAL_MAX_SCALE)); (dec <= DECIMAL_MAX_SCALE));
bin_size= my_decimal_get_binary_size(precision, dec); bin_size= my_decimal_get_binary_size(precision, dec);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment