jsonb_plperl_null_bug.patch
application/x-patch
Patch
Format: unified
| File | + | − |
|---|---|---|
| contrib/jsonb_plperl/expected/jsonb_plperl.out | 26 | 1 |
| contrib/jsonb_plperl/expected/jsonb_plperlu.out | 26 | 1 |
| contrib/jsonb_plperl/jsonb_plperl.c | 6 | 0 |
| contrib/jsonb_plperl/sql/jsonb_plperl.sql | 11 | 0 |
| contrib/jsonb_plperl/sql/jsonb_plperlu.sql | 11 | 0 |
diff --git a/contrib/jsonb_plperl/expected/jsonb_plperl.out b/contrib/jsonb_plperl/expected/jsonb_plperl.out
index 6dc090a..b784ca1 100644
--- a/contrib/jsonb_plperl/expected/jsonb_plperl.out
+++ b/contrib/jsonb_plperl/expected/jsonb_plperl.out
@@ -228,6 +228,31 @@ SELECT roundtrip('{"1": {"2": [3, 4, 5]}, "2": 3}', 'HASH');
{"1": {"2": [3, 4, 5]}, "2": 3}
(1 row)
+CREATE FUNCTION text2jsonb (text) RETURNS jsonb
+LANGUAGE plperl
+TRANSFORM FOR TYPE jsonb
+AS $$
+ my $x = shift;
+ return {a=>$x};
+$$;
+SELECT text2jsonb(NULL);
+ text2jsonb
+-------------
+ {"a": null}
+(1 row)
+
+SELECT text2jsonb('11');
+ text2jsonb
+-------------
+ {"a": "11"}
+(1 row)
+
+SELECT text2jsonb(NULL);
+ text2jsonb
+-------------
+ {"a": null}
+(1 row)
+
\set VERBOSITY terse \\ -- suppress cascade details
DROP EXTENSION plperl CASCADE;
-NOTICE: drop cascades to 7 other objects
+NOTICE: drop cascades to 8 other objects
diff --git a/contrib/jsonb_plperl/expected/jsonb_plperlu.out b/contrib/jsonb_plperl/expected/jsonb_plperlu.out
index 434327b..7fe0721 100644
--- a/contrib/jsonb_plperl/expected/jsonb_plperlu.out
+++ b/contrib/jsonb_plperl/expected/jsonb_plperlu.out
@@ -255,6 +255,31 @@ INFO: $VAR1 = {'1' => {'2' => ['3','4','5']},'2' => '3'};
{"1": {"2": [3, 4, 5]}, "2": 3}
(1 row)
+CREATE FUNCTION text2jsonb (text) RETURNS jsonb
+LANGUAGE plperlu
+TRANSFORM FOR TYPE jsonb
+AS $$
+ my $x = shift;
+ return {a=>$x};
+$$;
+SELECT text2jsonb(NULL);
+ text2jsonb
+-------------
+ {"a": null}
+(1 row)
+
+SELECT text2jsonb('11');
+ text2jsonb
+-------------
+ {"a": "11"}
+(1 row)
+
+SELECT text2jsonb(NULL);
+ text2jsonb
+-------------
+ {"a": null}
+(1 row)
+
\set VERBOSITY terse \\ -- suppress cascade details
DROP EXTENSION plperlu CASCADE;
-NOTICE: drop cascades to 7 other objects
+NOTICE: drop cascades to 8 other objects
diff --git a/contrib/jsonb_plperl/jsonb_plperl.c b/contrib/jsonb_plperl/jsonb_plperl.c
index 79c5f57..5244ab7 100644
--- a/contrib/jsonb_plperl/jsonb_plperl.c
+++ b/contrib/jsonb_plperl/jsonb_plperl.c
@@ -257,6 +257,12 @@ SV_to_JsonbValue(SV *in, JsonbParseState **jsonb_state, bool is_elem)
}
else
{
+ /* SVt_PV without POK flag is also NULL */
+ if(SvTYPE(in) == SVt_PV)
+ {
+ out.type = jbvNull;
+ break;
+ }
/*
* XXX It might be nice if we could include the Perl type in
* the error message.
diff --git a/contrib/jsonb_plperl/sql/jsonb_plperl.sql b/contrib/jsonb_plperl/sql/jsonb_plperl.sql
index 8b062df..622141b 100644
--- a/contrib/jsonb_plperl/sql/jsonb_plperl.sql
+++ b/contrib/jsonb_plperl/sql/jsonb_plperl.sql
@@ -99,6 +99,17 @@ SELECT roundtrip('{"1": "string1"}', 'HASH');
SELECT roundtrip('{"1": {"2": [3, 4, 5]}, "2": 3}', 'HASH');
+CREATE FUNCTION text2jsonb (text) RETURNS jsonb
+LANGUAGE plperl
+TRANSFORM FOR TYPE jsonb
+AS $$
+ my $x = shift;
+ return {a=>$x};
+$$;
+
+SELECT text2jsonb(NULL);
+SELECT text2jsonb('11');
+SELECT text2jsonb(NULL);
\set VERBOSITY terse \\ -- suppress cascade details
DROP EXTENSION plperl CASCADE;
diff --git a/contrib/jsonb_plperl/sql/jsonb_plperlu.sql b/contrib/jsonb_plperl/sql/jsonb_plperlu.sql
index 8d8e841..9981c37 100644
--- a/contrib/jsonb_plperl/sql/jsonb_plperlu.sql
+++ b/contrib/jsonb_plperl/sql/jsonb_plperlu.sql
@@ -103,6 +103,17 @@ SELECT roundtrip('{"1": "string1"}', 'HASH');
SELECT roundtrip('{"1": {"2": [3, 4, 5]}, "2": 3}', 'HASH');
+CREATE FUNCTION text2jsonb (text) RETURNS jsonb
+LANGUAGE plperlu
+TRANSFORM FOR TYPE jsonb
+AS $$
+ my $x = shift;
+ return {a=>$x};
+$$;
+
+SELECT text2jsonb(NULL);
+SELECT text2jsonb('11');
+SELECT text2jsonb(NULL);
\set VERBOSITY terse \\ -- suppress cascade details
DROP EXTENSION plperlu CASCADE;