]> granicus.if.org Git - postgresql/commitdiff
Fix handling of "undef" in contrib/jsonb_plperl.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 4 Aug 2019 18:05:34 +0000 (14:05 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 4 Aug 2019 18:05:34 +0000 (14:05 -0400)
Perl has multiple internal representations of "undef", and just
testing for SvTYPE(x) == SVt_NULL doesn't recognize all of them,
leading to "cannot transform this Perl type to jsonb" errors.
Use the approved test SvOK() instead.

Report and patch by Ivan Panchenko.  Back-patch to v11 where
this module was added.

Discussion: https://postgr.es/m/1564783533.324795401@f193.i.mail.ru

contrib/jsonb_plperl/expected/jsonb_plperl.out
contrib/jsonb_plperl/expected/jsonb_plperlu.out
contrib/jsonb_plperl/jsonb_plperl.c
contrib/jsonb_plperl/sql/jsonb_plperl.sql
contrib/jsonb_plperl/sql/jsonb_plperlu.sql

index 6dc090a87f72299afdf95f54c1360ace1382ba64..5a73485ac06a809421ec57e6915efc38436f251f 100644 (file)
@@ -66,6 +66,26 @@ SELECT testRegexpResultToJsonb();
  0
 (1 row)
 
+-- this revealed a different bug
+CREATE FUNCTION testTextToJsonbObject(text) RETURNS jsonb
+LANGUAGE plperl
+TRANSFORM FOR TYPE jsonb
+AS $$
+my $x = shift;
+return {a => $x};
+$$;
+SELECT testTextToJsonbObject('abc');
+ testtexttojsonbobject 
+-----------------------
+ {"a": "abc"}
+(1 row)
+
+SELECT testTextToJsonbObject(NULL);
+ testtexttojsonbobject 
+-----------------------
+ {"a": null}
+(1 row)
+
 CREATE FUNCTION roundtrip(val jsonb, ref text = '') RETURNS jsonb
 LANGUAGE plperl
 TRANSFORM FOR TYPE jsonb
@@ -230,4 +250,4 @@ SELECT roundtrip('{"1": {"2": [3, 4, 5]}, "2": 3}', 'HASH');
 
 \set VERBOSITY terse \\ -- suppress cascade details
 DROP EXTENSION plperl CASCADE;
-NOTICE:  drop cascades to 7 other objects
+NOTICE:  drop cascades to 8 other objects
index 434327bea02907b818d08dddfec8aeafb3dc9803..dff316cf984e641b5706fa8ede23fb8b958c4f92 100644 (file)
@@ -66,6 +66,26 @@ SELECT testRegexpResultToJsonb();
  0
 (1 row)
 
+-- this revealed a different bug
+CREATE FUNCTION testTextToJsonbObject(text) RETURNS jsonb
+LANGUAGE plperlu
+TRANSFORM FOR TYPE jsonb
+AS $$
+my $x = shift;
+return {a => $x};
+$$;
+SELECT testTextToJsonbObject('abc');
+ testtexttojsonbobject 
+-----------------------
+ {"a": "abc"}
+(1 row)
+
+SELECT testTextToJsonbObject(NULL);
+ testtexttojsonbobject 
+-----------------------
+ {"a": null}
+(1 row)
+
 CREATE FUNCTION roundtrip(val jsonb, ref text = '') RETURNS jsonb
 LANGUAGE plperlu
 TRANSFORM FOR TYPE jsonb
@@ -257,4 +277,4 @@ INFO:  $VAR1 = {'1' => {'2' => ['3','4','5']},'2' => '3'};
 
 \set VERBOSITY terse \\ -- suppress cascade details
 DROP EXTENSION plperlu CASCADE;
-NOTICE:  drop cascades to 7 other objects
+NOTICE:  drop cascades to 8 other objects
index b26723a958916c2cb6da600ae19240ae9c715ff1..04b04df953fc6fe9c712aa583b157baafff0e50c 100644 (file)
@@ -189,12 +189,12 @@ SV_to_JsonbValue(SV *in, JsonbParseState **jsonb_state, bool is_elem)
                case SVt_PVHV:
                        return HV_to_JsonbValue((HV *) in, jsonb_state);
 
-               case SVt_NULL:
-                       out.type = jbvNull;
-                       break;
-
                default:
-                       if (SvUOK(in))
+                       if (!SvOK(in))
+                       {
+                               out.type = jbvNull;
+                       }
+                       else if (SvUOK(in))
                        {
                                /*
                                 * If UV is >=64 bits, we have no better way to make this
index 8b062dfc6bb4a32db3b813ae90dd357f9b2c8590..a5b2cffe6b7c0a438e9d0d8fca08137a7c4ed4b6 100644 (file)
@@ -57,6 +57,19 @@ $$;
 SELECT testRegexpResultToJsonb();
 
 
+-- this revealed a different bug
+CREATE FUNCTION testTextToJsonbObject(text) RETURNS jsonb
+LANGUAGE plperl
+TRANSFORM FOR TYPE jsonb
+AS $$
+my $x = shift;
+return {a => $x};
+$$;
+
+SELECT testTextToJsonbObject('abc');
+SELECT testTextToJsonbObject(NULL);
+
+
 CREATE FUNCTION roundtrip(val jsonb, ref text = '') RETURNS jsonb
 LANGUAGE plperl
 TRANSFORM FOR TYPE jsonb
index 8d8e841540570089d9d3aac4efe0282bd1efe9f2..c68ef7308a9749fd4220f025cb6a388b78c1b51f 100644 (file)
@@ -57,6 +57,19 @@ $$;
 SELECT testRegexpResultToJsonb();
 
 
+-- this revealed a different bug
+CREATE FUNCTION testTextToJsonbObject(text) RETURNS jsonb
+LANGUAGE plperlu
+TRANSFORM FOR TYPE jsonb
+AS $$
+my $x = shift;
+return {a => $x};
+$$;
+
+SELECT testTextToJsonbObject('abc');
+SELECT testTextToJsonbObject(NULL);
+
+
 CREATE FUNCTION roundtrip(val jsonb, ref text = '') RETURNS jsonb
 LANGUAGE plperlu
 TRANSFORM FOR TYPE jsonb