mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug#33143: Incorrect ORDER BY for ROUND()/TRUNCATE() result
The ROUND(X, D) function would change the Item::decimals field during execution to achieve the effect of a dynamic number of decimal digits. This caused a series of bugs: Bug #30617:Round() function not working under some circumstances in InnoDB Bug #33402:ROUND with decimal and non-constant cannot round to 0 decimal places Bug #30889:filesort and order by with float/numeric crashes server Fixed by never changing the number of shown digits for DECIMAL when used with a nonconstant number of decimal digits. mysql-test/r/type_decimal.result: Bug#33143: Test result mysql-test/t/type_decimal.test: Bug#33143: Test case sql/item_func.cc: Bug#33143: - Moved the DECIMAL_MAX_SCALE limitation to fix_length_and_dec. - Removed resetting of Item::decimals field. - set the frac field of the output value to current scale. strings/decimal.c: Bug#33143: It is necessary to set all digits in the buffer following the rounded one to zero, as they may now be displayed.
This commit is contained in:
@ -416,3 +416,46 @@ DROP TABLE t1;
|
||||
|
||||
SELECT 1 % .123456789123456789123456789123456789123456789123456789123456789123456789123456789 AS '%';
|
||||
SELECT MOD(1, .123456789123456789123456789123456789123456789123456789123456789123456789123456789) AS 'MOD()';
|
||||
|
||||
#
|
||||
# Bug #33143: Incorrect ORDER BY for ROUND()/TRUNCATE() result
|
||||
#
|
||||
|
||||
CREATE TABLE t1( a DECIMAL(4, 3), b INT );
|
||||
INSERT INTO t1 VALUES ( 1, 5 ), ( 2, 4 ), ( 3, 3 ), ( 4, 2 ), ( 5, 1 );
|
||||
SELECT a, b, ROUND( a, b ) AS c FROM t1 ORDER BY c;
|
||||
SELECT a, b, ROUND( a, b ) AS c FROM t1 ORDER BY c DESC;
|
||||
|
||||
CREATE TABLE t2 ( a INT, b INT, c DECIMAL(5, 4) );
|
||||
|
||||
INSERT INTO t2 VALUES ( 0, 1, 1.2345 ), ( 1, 2, 1.2345 ),
|
||||
( 3, 3, 1.2345 ), ( 2, 4, 1.2345 );
|
||||
|
||||
SELECT a, b, MAX(ROUND(c, a))
|
||||
FROM t2
|
||||
GROUP BY a, b
|
||||
ORDER BY b;
|
||||
|
||||
SELECT a, b, ROUND(c, a)
|
||||
FROM t2;
|
||||
|
||||
CREATE TABLE t3( a INT, b DECIMAL(6, 3) );
|
||||
INSERT INTO t3 VALUES( 0, 1.5 );
|
||||
SELECT ROUND( b, a ) FROM t3;
|
||||
|
||||
CREATE TABLE t4( a INT, b DECIMAL( 12, 0) );
|
||||
INSERT INTO t4 VALUES( -9, 1.5e9 );
|
||||
SELECT ROUND( b, a ) FROM t4;
|
||||
|
||||
CREATE TABLE t5( a INT, b DECIMAL( 13, 12 ) );
|
||||
INSERT INTO t5 VALUES( 0, 1.5 );
|
||||
INSERT INTO t5 VALUES( 9, 1.5e-9 );
|
||||
SELECT ROUND( b, a ) FROM t5;
|
||||
|
||||
CREATE TABLE t6( a INT );
|
||||
INSERT INTO t6 VALUES( 6 / 8 );
|
||||
SELECT * FROM t6;
|
||||
|
||||
SELECT ROUND(20061108085411.000002);
|
||||
|
||||
DROP TABLE t1, t2, t3, t4, t5, t6;
|
||||
|
Reference in New Issue
Block a user