Details
- 
    Bug 
- 
    Status: Closed (View Workflow)
- 
    Major 
- 
    Resolution: Fixed
- 
    5.5.1, 5.6.1, 6.1.1
- 
    None
Description
The problem described below is also with narrow and wide DECIMAL.
The method TreeNode::getIntVal() performs truncation instead of rounding when converting from DECIMAL to signed integer:
| case CalpontSystemCatalog::DECIMAL: | 
| case CalpontSystemCatalog::UDECIMAL: | 
|         { | 
| if (fResultType.colWidth == datatypes::MAXDECIMALWIDTH) | 
|             { | 
| return static_cast<int64_t>(fResult.decimalVal.getIntegralPart()); | 
|             } | 
| else | 
|             { | 
| return (int64_t)(fResult.decimalVal.value / pow((double)10, fResult.decimalVal.scale)); | 
|             } | 
|         }
 | 
This makes ColumnStore return MariaDB incompatible values:
RAND()
| DROP TABLE IF EXISTS t1; | 
| CREATE TABLE t1 (a DECIMAL(10,1)) ENGINE=ColumnStore; | 
| INSERT INTO t1 VALUES (1.4),(1.5); | 
| SELECT a, RAND(a), RAND(CAST(a AS DECIMAL(10,1))) FROM t1; | 
| +------+---------------------+--------------------------------+ | 
| | a    | RAND(a)             | RAND(CAST(a AS DECIMAL(10,1))) | | 
| +------+---------------------+--------------------------------+ | 
| |  1.4 | 0.40540353712197724 |            0.40540353712197724 | | 
| |  1.5 | 0.40540353712197724 |            0.40540353712197724 | | 
| +------+---------------------+--------------------------------+
 | 
Looks wrong. RAND() did not round the seed value from 1.5 to 2.
The expected result is:
| DROP TABLE IF EXISTS t1; | 
| CREATE TABLE t1 (a DECIMAL(10,1)) ENGINE=InnoDB; | 
| INSERT INTO t1 VALUES (1.4),(1.5); | 
| SELECT a, RAND(a), RAND(CAST(a AS DECIMAL(10,1))) FROM t1; | 
| +------+---------------------+--------------------------------+ | 
| | a    | RAND(a)             | RAND(CAST(a AS DECIMAL(10,1))) | | 
| +------+---------------------+--------------------------------+ | 
| |  1.4 | 0.40540353712197724 |            0.40540353712197724 | | 
| |  1.5 |  0.6555866465490187 |             0.6555866465490187 | | 
| +------+---------------------+--------------------------------+
 | 
TRUNCATE()
| DROP TABLE IF EXISTS t1; | 
| CREATE TABLE t1 (a DECIMAL(10,1)) ENGINE=ColumnStore; | 
| INSERT INTO t1 VALUES (1.4),(1.5); | 
| SELECT TRUNCATE(1.2345, a) FROM t1; | 
| +---------------------+ | 
| | TRUNCATE(1.2345, a) | | 
| +---------------------+ | 
| |              1.2000 | | 
| |              1.2000 | | 
| +---------------------+
 | 
The expected result is:
| DROP TABLE IF EXISTS t1; | 
| CREATE TABLE t1 (a DECIMAL(10,1)) ENGINE=InnoDB; | 
| INSERT INTO t1 VALUES (1.4),(1.5); | 
| SELECT TRUNCATE(1.2345, a) FROM t1; | 
| +---------------------+ | 
| | TRUNCATE(1.2345, a) | | 
| +---------------------+ | 
| |              1.2000 | | 
| |              1.2300 | | 
| +---------------------+
 | 
CONV()
| DROP TABLE IF EXISTS t1; | 
| CREATE TABLE t1 (a DECIMAL(10,1)) ENGINE=ColumnStore; | 
| INSERT INTO t1 VALUES (15.4),(15.5),(16.0); | 
| SELECT a, CONV(16,a,10) FROM t1; | 
| +------+---------------+ | 
| | a    | CONV(16,a,10) | | 
| +------+---------------+ | 
| | 15.4 | 21            | | 
| | 15.5 | 21            | <--- this is wrong | 
| | 16.0 | 22            | | 
| +------+---------------+
 | 
| DROP TABLE IF EXISTS t1; | 
| CREATE TABLE t1 (a DECIMAL(10,1)) ENGINE=InnoDB; | 
| INSERT INTO t1 VALUES (15.4),(15.5),(16.0); | 
| SELECT a, CONV(16,a,10) FROM t1; | 
| +------+---------------+ | 
| | a    | CONV(16,a,10) | | 
| +------+---------------+ | 
| | 15.4 | 21            | | 
| | 15.5 | 22            | | 
| | 16.0 | 22            | | 
| +------+---------------+
 |