Returns null instead of NaN or Infinity in JSON strings

patch by Benjamin Lerer; reviewed by Francisco Fernandez for CASSANDRA-14377


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/2bd73326
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/2bd73326
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/2bd73326

Branch: refs/heads/cassandra-3.11
Commit: 2bd733264ea0a30f2d62f62195a9bb7860904f83
Parents: 3482370
Author: Benjamin Lerer <b.le...@gmail.com>
Authored: Thu Aug 2 11:01:39 2018 +0200
Committer: Benjamin Lerer <b.le...@gmail.com>
Committed: Thu Aug 2 11:01:39 2018 +0200

----------------------------------------------------------------------
 CHANGES.txt                                              |  1 +
 src/java/org/apache/cassandra/db/marshal/DoubleType.java |  6 +++++-
 src/java/org/apache/cassandra/db/marshal/FloatType.java  |  6 +++++-
 .../cassandra/cql3/validation/entities/JsonTest.java     | 11 +++++++++++
 4 files changed, 22 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/2bd73326/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 9d6a9ea..9e810c0 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.2.13
+ * Returns null instead of NaN or Infinity in JSON strings (CASSANDRA-14377)
  * Fix bug that prevented compaction of SSTables after full repairs 
(CASSANDRA-14423)
  * Incorrect counting of pending messages in OutboundTcpConnection 
(CASSANDRA-11551)
  * Fix compaction failure caused by reading un-flushed data (CASSANDRA-12743)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/2bd73326/src/java/org/apache/cassandra/db/marshal/DoubleType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/DoubleType.java 
b/src/java/org/apache/cassandra/db/marshal/DoubleType.java
index 661b3c9..d0f8485 100644
--- a/src/java/org/apache/cassandra/db/marshal/DoubleType.java
+++ b/src/java/org/apache/cassandra/db/marshal/DoubleType.java
@@ -85,7 +85,11 @@ public class DoubleType extends AbstractType<Double>
     @Override
     public String toJSONString(ByteBuffer buffer, int protocolVersion)
     {
-        return getSerializer().deserialize(buffer).toString();
+        Double value = getSerializer().deserialize(buffer);
+        // JSON does not support NaN, Infinity and -Infinity values. Most of 
the parser convert them into null.
+        if (value.isNaN() || value.isInfinite())
+            return "null";
+        return value.toString();
     }
 
     public CQL3Type asCQL3Type()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/2bd73326/src/java/org/apache/cassandra/db/marshal/FloatType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/FloatType.java 
b/src/java/org/apache/cassandra/db/marshal/FloatType.java
index af02cad..fc12b87 100644
--- a/src/java/org/apache/cassandra/db/marshal/FloatType.java
+++ b/src/java/org/apache/cassandra/db/marshal/FloatType.java
@@ -84,7 +84,11 @@ public class FloatType extends AbstractType<Float>
     @Override
     public String toJSONString(ByteBuffer buffer, int protocolVersion)
     {
-        return getSerializer().deserialize(buffer).toString();
+        Float value = getSerializer().deserialize(buffer);
+        // JSON does not support NaN, Infinity and -Infinity values. Most of 
the parser convert them into null.
+        if (value.isNaN() || value.isInfinite())
+            return "null";
+        return value.toString();
     }
 
     public CQL3Type asCQL3Type()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/2bd73326/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java 
b/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
index 9d40038..b804c0e 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
@@ -1285,4 +1285,15 @@ public class JsonTest extends CQLTester
                    row("{\"a\": 100}"),
                    row("{\"a\": 20}"));
     }
+
+    @Test
+    public void testJsonWithNaNAndInfinity() throws Throwable
+    {
+        createTable("CREATE TABLE %s (pk int PRIMARY KEY, f1 float, f2 float, 
f3 float, d1 double, d2 double, d3 double)");
+        execute("INSERT INTO %s (pk, f1, f2, f3, d1, d2, d3) VALUES (?, ?, ?, 
?, ?, ?, ?)",
+                1, Float.NaN, Float.POSITIVE_INFINITY, 
Float.NEGATIVE_INFINITY, Double.NaN, Double.POSITIVE_INFINITY, 
Double.NEGATIVE_INFINITY);
+
+        // JSON does not support NaN, Infinity and -Infinity values. Most of 
the parser convert them into null.
+        assertRows(execute("SELECT JSON * FROM %s"), row("{\"pk\": 1, \"d1\": 
null, \"d2\": null, \"d3\": null, \"f1\": null, \"f2\": null, \"f3\": null}"));
+    }
 }


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

Reply via email to