]> granicus.if.org Git - postgresql/commitdiff
Prevent NaN in jsonb/plpython transform
authorPeter Eisentraut <peter_e@gmx.net>
Wed, 2 May 2018 19:58:34 +0000 (15:58 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Wed, 2 May 2018 20:01:22 +0000 (16:01 -0400)
As in e348e7ae5727a6da8678036d748e5c5af7deb6c9 for jsonb/plperl, prevent
putting a NaN into a jsonb numeric field.

Tests for this had been removed in
6278a2a262b63faaf47eb2371f6bcb5b6e3ff118, but in case they are ever
resurrected: This would change the output of the test1nan() function to
an error.

contrib/jsonb_plpython/jsonb_plpython.c

index 645238f15b363af897e38b44e7219014f5b182bd..f752d6c3cd8e6c088418b71e0e5a9e96dbf99e57 100644 (file)
@@ -5,6 +5,7 @@
 #include "plpy_typeio.h"
 #include "utils/jsonb.h"
 #include "utils/fmgrprotos.h"
+#include "utils/numeric.h"
 
 PG_MODULE_MAGIC;
 
@@ -343,6 +344,16 @@ PLyNumber_ToJsonbValue(PyObject *obj, JsonbValue *jbvNum)
 
        pfree(str);
 
+       /*
+        * jsonb doesn't allow NaN (per JSON specification), so we have to prevent
+        * it here explicitly.  (Infinity is also not allowed in jsonb, but
+        * numeric_in above already catches that.)
+        */
+       if (numeric_is_nan(num))
+               ereport(ERROR,
+                               (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+                                (errmsg("cannot convert NaN to jsonb"))));
+
        jbvNum->type = jbvNumeric;
        jbvNum->val.numeric = num;