Skip to content

Commit aabc7ba

Browse files
committed
fix
0 parents  commit aabc7ba

File tree

6 files changed

+150
-0
lines changed

6 files changed

+150
-0
lines changed

Makefile

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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+

expected/zson.out

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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+

sql/zson.sql

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
CREATE EXTENSION zson;
2+
3+
SELECT '{"a": true}'::zson;
4+
5+
SELECT '{"a": true}'::zson -> 'a';

zson--1.0.sql

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+

zson.c

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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+

zson.control

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
comment = 'ZSON'
2+
default_version = '1.0'
3+
module_pathname = '$libdir/zson'
4+
relocatable = true

0 commit comments

Comments
 (0)