Details
-
Bug
-
Status: Resolved
-
Low
-
Resolution: Fixed
-
None
-
Tested with Cassandra 3.11.1 but this issue is present since the implementation of cast functions.
-
Low
Description
Cast functions from numeric types to decimal type are implemented as conversion to double first and then from double to decimal: https://github.com/apache/cassandra/compare/trunk...blerer:10310-3.0#diff-6aa4a8f76df6c30c5bb4026b8c9251eeR80.
This can cause loss of digits for big values stored in varint or bigint. It is probably unexpected because decimal can store such values precisely.
Examples:
cqlsh> CREATE TABLE cast_bigint_test(k int PRIMARY KEY, bigint_clmn bigint);
cqlsh> INSERT INTO cast_bigint_test(k, decimal_clmn) VALUES(2, 9223372036854775807);
cqlsh> SELECT CAST(bigint_clmn AS decimal) FROM cast_bigint_test;
cast(bigint_clmn as decimal)
------------------------------
9.223372036854776E+18
(1 rows)
cqlsh> CREATE TABLE cast_varint_test (k int PRIMARY KEY, varint_clmn varint);
cqlsh> INSERT INTO cast_varint_test(k, varint_clmn) values(2, 1234567890123456789);
cqlsh> SELECT CAST(varint_clmn AS decimal) FROM cast_varint_test;
cast(varint_clmn as decimal)
------------------------------
1.23456789012345677E+18
(1 rows)