You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Daniel Fiala (JIRA)" <ji...@apache.org> on 2018/01/17 10:24:00 UTC

[jira] [Updated] (CASSANDRA-14170) Loss of digits when doing CAST from varint/bigint to decimal

     [ https://issues.apache.org/jira/browse/CASSANDRA-14170?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Daniel Fiala updated CASSANDRA-14170:
-------------------------------------
    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)}}

 

  was:
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)}}

 


> Loss of digits when doing CAST from varint/bigint to decimal
> ------------------------------------------------------------
>
>                 Key: CASSANDRA-14170
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-14170
>             Project: Cassandra
>          Issue Type: Bug
>         Environment: Tested with Cassandra 3.11.1 but this issue is present since the implementation of cast functions.
>            Reporter: Daniel Fiala
>            Priority: Minor
>
> 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)}}
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org