|
Because of using double as a temporary storage for decimal in Func_mod::getDecimalVal, the MOD operator looses precision on huge narrow decimal values:
DROP TABLE IF EXISTS t1;
|
CREATE TABLE t1 (a DECIMAL(18,0)) ENGINE=ColumnStore;
|
INSERT INTO t1 VALUES (999999999999999999);
|
SELECT a MOD 10000 FROM t1;
|
+-------------+
|
| a MOD 10000 |
|
+-------------+
|
| 0 |
|
+-------------+
|
Looks wrong. The expected result is:
DROP TABLE IF EXISTS t1;
|
CREATE TABLE t1 (a DECIMAL(18,0)) ENGINE=InnoDB;
|
INSERT INTO t1 VALUES (999999999999999999);
|
SELECT a MOD 10000 FROM t1;
|
+-------------+
|
| a MOD 10000 |
|
+-------------+
|
| 9999 |
|
+-------------+
|
The same problem presents in the template Func_mod::doDecimal:
DROP TABLE IF EXISTS t1;
|
CREATE TABLE t1 (a DECIMAL(18,0)) ENGINE=ColumnStore;
|
INSERT INTO t1 VALUES (999999999999999999);
|
SELECT RAND(9999), RAND(a MOD 10000) FROM t1;
|
+--------------------+---------------------+
|
| RAND(9999) | RAND(a MOD 10000) |
|
+--------------------+---------------------+
|
| 0.7361292641015065 | 0.15522042769493574 |
|
+--------------------+---------------------+
|
The result for the second column looks wrong.
The expected result is:
DROP TABLE IF EXISTS t1;
|
CREATE TABLE t1 (a DECIMAL(18,0)) ENGINE=InnoDB;
|
INSERT INTO t1 VALUES (999999999999999999);
|
SELECT RAND(9999), RAND(a MOD 10000) FROM t1;
|
+--------------------+--------------------+
|
| RAND(9999) | RAND(a MOD 10000) |
|
+--------------------+--------------------+
|
| 0.7361292641015065 | 0.7361292641015065 |
|
+--------------------+--------------------+
|
|