File tree 6 files changed +150
-0
lines changed
6 files changed +150
-0
lines changed Original file line number Diff line number Diff line change
1
+ EXTENSION = zson
2
+ MODULES = zson
3
+ DATA = zson--1.0.sql
4
+ OBJS = zson.o
5
+ REGRESS = zson
6
+
7
+ ifdef USE_PGXS
8
+ PGXS := $(shell pg_config --pgxs)
9
+ include $(PGXS )
10
+ else
11
+ subdir = contrib/zson
12
+ top_builddir = ../..
13
+ include $(top_builddir ) /src/Makefile.global
14
+ include $(top_srcdir ) /contrib/contrib-global.mk
15
+ endif
16
+
17
+
Original file line number Diff line number Diff line change
1
+ CREATE EXTENSION zson;
2
+ SELECT '{"a": true}'::zson;
3
+ zson
4
+ -------------
5
+ {"a": true}
6
+ (1 row)
7
+
8
+ SELECT '{"a": true}'::zson -> 'a';
9
+ ?column?
10
+ ----------
11
+ true
12
+ (1 row)
13
+
Original file line number Diff line number Diff line change
1
+ CREATE EXTENSION zson;
2
+
3
+ SELECT ' {"a": true}' ::zson;
4
+
5
+ SELECT ' {"a": true}' ::zson - > ' a' ;
Original file line number Diff line number Diff line change
1
+ -- complain if script is sourced in psql, rather than via CREATE EXTENSION
2
+ \echo Use " CREATE EXTENSION zson" to load this file. \quit
3
+
4
+ CREATE TYPE zson ;
5
+
6
+ CREATE FUNCTION zson_in (cstring)
7
+ RETURNS zson
8
+ AS ' MODULE_PATHNAME'
9
+ LANGUAGE C STRICT IMMUTABLE;
10
+
11
+ CREATE FUNCTION zson_out (zson)
12
+ RETURNS cstring
13
+ AS ' MODULE_PATHNAME'
14
+ LANGUAGE C STRICT IMMUTABLE;
15
+
16
+ CREATE TYPE zson (
17
+ INTERNALLENGTH = - 1 ,
18
+ INPUT = zson_in,
19
+ OUTPUT = zson_out,
20
+ STORAGE = extended
21
+ );
22
+
23
+ CREATE FUNCTION z2j (zson)
24
+ RETURNS jsonb
25
+ AS ' MODULE_PATHNAME'
26
+ LANGUAGE C STRICT IMMUTABLE;
27
+
28
+ CREATE FUNCTION j2z (jsonb)
29
+ RETURNS zson
30
+ AS ' MODULE_PATHNAME'
31
+ LANGUAGE C STRICT IMMUTABLE;
32
+
33
+ CREATE CAST (zson AS jsonb) WITH FUNCTION z2j(zson) AS IMPLICIT;
34
+ CREATE CAST (jsonb AS zson) WITH FUNCTION j2z(jsonb) AS ASSIGNMENT;
35
+
Original file line number Diff line number Diff line change
1
+ #include <postgres.h>
2
+ #include <utils/builtins.h>
3
+ #include <utils/jsonb.h>
4
+
5
+ PG_MODULE_MAGIC ;
6
+
7
+ PG_FUNCTION_INFO_V1 (zson_in );
8
+ PG_FUNCTION_INFO_V1 (zson_out );
9
+ PG_FUNCTION_INFO_V1 (z2j );
10
+ PG_FUNCTION_INFO_V1 (j2z );
11
+
12
+ Datum
13
+ zson_in (PG_FUNCTION_ARGS )
14
+ {
15
+ Jsonb * j = DatumGetJsonb (
16
+ DirectFunctionCall1 (
17
+ jsonb_in ,
18
+ PG_GETARG_DATUM (0 )
19
+ )
20
+ );
21
+
22
+ PG_RETURN_BYTEA_P (
23
+ DatumGetByteaP (
24
+ DirectFunctionCall1 (
25
+ j2z ,
26
+ JsonbGetDatum (j )
27
+ )
28
+ )
29
+ );
30
+ }
31
+
32
+
33
+ Datum
34
+ zson_out (PG_FUNCTION_ARGS )
35
+ {
36
+ bytea * z = PG_GETARG_BYTEA_P (0 );
37
+
38
+ PG_RETURN_CSTRING (
39
+ DatumGetCString (
40
+ DirectFunctionCall1 (
41
+ jsonb_out ,
42
+ PointerGetDatum (VARDATA_ANY (z ))
43
+ )
44
+ )
45
+ );
46
+ }
47
+
48
+
49
+ Datum
50
+ z2j (PG_FUNCTION_ARGS )
51
+ {
52
+ bytea * z = PG_GETARG_BYTEA_P (0 );
53
+ Jsonb * j ;
54
+
55
+ j = palloc (VARSIZE_ANY (z ));
56
+
57
+ memcpy (j , VARDATA_ANY (z ), VARSIZE_ANY_EXHDR (z ));
58
+
59
+ PG_RETURN_JSONB (j );
60
+ }
61
+
62
+ Datum
63
+ j2z (PG_FUNCTION_ARGS )
64
+ {
65
+ Jsonb * j = PG_GETARG_JSONB (0 );
66
+ bytea * z ;
67
+
68
+ z = palloc (VARSIZE_ANY (j ) + VARHDRSZ );
69
+ SET_VARSIZE (z , VARSIZE_ANY (j ) + VARHDRSZ );
70
+
71
+ memcpy (VARDATA_ANY (z ), j , VARSIZE_ANY (j ));
72
+
73
+ PG_RETURN_BYTEA_P (z );
74
+ }
75
+
76
+
Original file line number Diff line number Diff line change
1
+ comment = 'ZSON'
2
+ default_version = '1.0'
3
+ module_pathname = '$libdir/zson'
4
+ relocatable = true
You can’t perform that action at this time.
0 commit comments