-
Notifications
You must be signed in to change notification settings - Fork 158
/
Copy pathstring_to_jsonb.sql
46 lines (43 loc) · 1.61 KB
/
string_to_jsonb.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
create or replace function public.string_to_jsonb(str text)
returns jsonb
returns null on null input
parallel unsafe --(ERROR: cannot start subtransactions during a parallel operation)
stable
language plpgsql
set search_path = ''
cost 5
as
$$
BEGIN
BEGIN
RETURN str::jsonb;
EXCEPTION WHEN others THEN
RETURN NULL;
END;
END;
$$;
comment on function public.string_to_jsonb(str text) is $$
Converts JSON syntax from string to jsonb type.
For invalid JSON syntax returns NULL rather error.
$$;
--TEST
do $$
begin
--positive (valid JSON)
assert jsonb_typeof(public.string_to_jsonb('null')) = 'null';
assert jsonb_typeof(public.string_to_jsonb('true')) = 'boolean';
assert jsonb_typeof(public.string_to_jsonb('false')) = 'boolean';
assert jsonb_typeof(public.string_to_jsonb('0')) = 'number';
assert jsonb_typeof(public.string_to_jsonb('-0.1')) = 'number';
assert jsonb_typeof(public.string_to_jsonb('""')) = 'string';
assert jsonb_typeof(public.string_to_jsonb('[]')) = 'array';
assert jsonb_typeof(public.string_to_jsonb('[1,2]')) = 'array';
assert jsonb_typeof(public.string_to_jsonb('{}')) = 'object';
assert jsonb_typeof(public.string_to_jsonb('{"":0}')) = 'object';
--negative (invalid JSON)
assert jsonb_typeof(public.string_to_jsonb(null)) is null;
assert jsonb_typeof(public.string_to_jsonb('')) is null;
assert jsonb_typeof(public.string_to_jsonb('{"oops"}')) is null;
assert jsonb_typeof(public.string_to_jsonb('[,]')) is null;
end
$$;