Skip to content

Commit 18b4714

Browse files
author
Nikita Glukhov
committed
Add contrib/lz
1 parent b005843 commit 18b4714

File tree

7 files changed

+1127
-0
lines changed

7 files changed

+1127
-0
lines changed

contrib/lz/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Generated subdirectories
2+
/log/
3+
/results/
4+
/tmp_check/

contrib/lz/Makefile

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# contrib/lz/Makefile
2+
3+
MODULE_big = lz
4+
OBJS = lz.o $(WIN32RES)
5+
6+
EXTENSION = lz
7+
DATA = lz--1.0.sql
8+
PGFILEDESC = "LZ compression methods"
9+
10+
REGRESS = lz
11+
SHLIB_LINK += -lzstd -llz4 -lsnappy
12+
13+
ifdef USE_PGXS
14+
PG_CONFIG = pg_config
15+
PGXS := $(shell $(PG_CONFIG) --pgxs)
16+
include $(PGXS)
17+
else
18+
subdir = contrib/lz
19+
top_builddir = ../..
20+
include $(top_builddir)/src/Makefile.global
21+
include $(top_srcdir)/contrib/contrib-global.mk
22+
endif

contrib/lz/expected/lz.out

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
CREATE EXTENSION lz;
2+
-- Create tables
3+
CREATE TEMP TABLE invalid_datatype_for_lz_compression(i int compressed zstd);
4+
ERROR: lz compression method is only applicable to variable-length types
5+
---- zstd
6+
CREATE TEMP TABLE zstd_invalid_clevel(js json compressed zstd with (clevel 'abc'));
7+
ERROR: invalid input syntax for integer: "abc"
8+
CREATE TEMP TABLE zstd_invalid_option(js json compressed zstd with (invalid_option 'value'));
9+
ERROR: unrecognized compression level option 'invalid_option'
10+
CREATE TEMP TABLE t_zstd(t text compressed zstd);
11+
CREATE TEMP TABLE js_zstd(js json compressed zstd);
12+
CREATE TEMP TABLE jb_zstd(jb json compressed zstd);
13+
CREATE TEMP TABLE jb_zstd_10(js json compressed zstd with (clevel '10'));
14+
---- lz4
15+
CREATE TEMP TABLE lz4_invalid_clevel (js json compressed lz4 with (clevel 'aaa'));
16+
ERROR: invalid input syntax for integer: "aaa"
17+
CREATE TEMP TABLE lz4_invalid_option (js json compressed lz4 with (invalid_option 'value'));
18+
ERROR: unrecognized compression level option 'invalid_option'
19+
CREATE TEMP TABLE lz4hc_invalid_clevel(js json compressed lz4hc with (clevel 'aaa'));
20+
ERROR: invalid input syntax for integer: "aaa"
21+
CREATE TEMP TABLE lz4hc_invalid_option(js json compressed lz4hc with (invalid_option 'value'));
22+
ERROR: unrecognized compression level option 'invalid_option'
23+
CREATE TEMP TABLE lz4d_invalid_clevel (js json compressed lz4 with (clevel 'aaa'));
24+
ERROR: invalid input syntax for integer: "aaa"
25+
CREATE TEMP TABLE lz4d_invalid_dict (js json compressed lz4 with (dict 'aaa'));
26+
ERROR: unrecognized compression level option 'dict'
27+
CREATE TEMP TABLE lz4d_invalid_option (js json compressed lz4 with (invalid_option 'value'));
28+
ERROR: unrecognized compression level option 'invalid_option'
29+
CREATE TEMP TABLE jb_lz4 (jb json compressed lz4);
30+
CREATE TEMP TABLE jb_lz4_5 (jb json compressed lz4 with (clevel '5'));
31+
CREATE TEMP TABLE jb_lz4hc (jb json compressed lz4hc);
32+
CREATE TEMP TABLE jb_lz4hc_16(jb json compressed lz4hc with (clevel '16'));
33+
CREATE TEMP TABLE jb_lz4d_no_dict(jb json compressed lz4d);
34+
ERROR: lz4d compression method: option 'dict' is required
35+
SELECT NULL FROM lz4_dictionary_create('test_json_dict');
36+
?column?
37+
----------
38+
39+
(1 row)
40+
41+
SELECT NULL FROM lz4_dictionary_create('test_jsonb_dict');
42+
?column?
43+
----------
44+
45+
(1 row)
46+
47+
CREATE TEMP TABLE jb_lz4d(jb json compressed lz4d with (dict 'test_jsonb_dict'));
48+
CREATE TEMP TABLE jb_lz4d_5(jb json compressed lz4d with (dict 'test_jsonb_dict', clevel '5'));
49+
---- snappy
50+
CREATE TEMP TABLE snappy_invalid_clevel(js json compressed snappy with (clevel '1'));
51+
ERROR: snappy compression method has no options
52+
CREATE TEMP TABLE snappy_invalid_option(js json compressed snappy with (invalid_option 'value'));
53+
ERROR: snappy compression method has no options
54+
CREATE TEMP TABLE js_snappy(js json compressed snappy);
55+
CREATE TEMP TABLE jb_snappy(jb jsonb compressed snappy);
56+
-- Insert data
57+
CREATE TEMP TABLE lz_data(js text);
58+
INSERT INTO lz_data
59+
SELECT
60+
'{
61+
"id": ' || i || ',
62+
"string": "value' || i || '",
63+
"array": [' || i ||
64+
repeat(', 12345, ' || i || ', "str 12345 abcdef aaaaaaaaaa '|| i || '"', 20) ||
65+
'],
66+
"object": { "key": "value' || i || '" }
67+
}'
68+
FROM generate_series(1, 10000) i;
69+
SELECT lz4_dictionary_add_sample('test_jsonb_dict', js) FROM lz_data LIMIT 1;
70+
lz4_dictionary_add_sample
71+
---------------------------
72+
73+
(1 row)
74+
75+
DO
76+
$$
77+
DECLARE
78+
tab text[];
79+
tabs text[][] := array[
80+
array['t_zstd', 'text'],
81+
array['js_zstd', 'json'],
82+
array['jb_zstd', 'jsonb'],
83+
array['jb_zstd_10', 'jsonb'],
84+
array['jb_lz4', 'jsonb'],
85+
array['jb_lz4_5', 'jsonb'],
86+
array['jb_lz4hc', 'jsonb'],
87+
array['jb_lz4hc_16', 'jsonb'],
88+
array['jb_lz4d', 'jsonb'],
89+
array['jb_lz4d_5', 'jsonb'],
90+
array['js_snappy', 'json'],
91+
array['jb_snappy', 'jsonb']
92+
];
93+
tab_size bigint;
94+
BEGIN
95+
FOREACH tab SLICE 1 IN ARRAY tabs
96+
LOOP
97+
EXECUTE 'INSERT INTO ' || tab[1] ||
98+
' SELECT js::' || tab[2] ||
99+
' FROM lz_data';
100+
SELECT INTO tab_size pg_relation_size(tab[1]);
101+
RAISE NOTICE '%: %', tab[1], pg_size_pretty(tab_size);
102+
END LOOP;
103+
END
104+
$$;
105+
NOTICE: t_zstd: 1704 kB
106+
NOTICE: js_zstd: 1704 kB
107+
NOTICE: jb_zstd: 1536 kB
108+
NOTICE: jb_zstd_10: 1536 kB
109+
NOTICE: jb_lz4: 1456 kB
110+
NOTICE: jb_lz4_5: 2120 kB
111+
NOTICE: jb_lz4hc: 1456 kB
112+
NOTICE: jb_lz4hc_16: 1456 kB
113+
NOTICE: jb_lz4d: 1128 kB
114+
NOTICE: jb_lz4d_5: 1288 kB
115+
NOTICE: js_snappy: 2008 kB
116+
NOTICE: jb_snappy: 2672 kB

contrib/lz/lz--1.0.sql

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/* contrib/lz/lz-1.0.sql */
2+
3+
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
4+
\echo Use "CREATE EXTENSION lz" to load this file. \quit
5+
6+
-- Compression handlers
7+
8+
CREATE FUNCTION zstd_handler(internal)
9+
RETURNS compression_handler
10+
AS 'MODULE_PATHNAME'
11+
LANGUAGE C;
12+
13+
CREATE FUNCTION lz4_handler(internal)
14+
RETURNS compression_handler
15+
AS 'MODULE_PATHNAME'
16+
LANGUAGE C;
17+
18+
CREATE FUNCTION lz4hc_handler(internal)
19+
RETURNS compression_handler
20+
AS 'MODULE_PATHNAME'
21+
LANGUAGE C;
22+
23+
CREATE FUNCTION lz4d_handler(internal)
24+
RETURNS compression_handler
25+
AS 'MODULE_PATHNAME'
26+
LANGUAGE C;
27+
28+
CREATE FUNCTION snappy_handler(internal)
29+
RETURNS compression_handler
30+
AS 'MODULE_PATHNAME'
31+
LANGUAGE C;
32+
33+
-- Compression methods
34+
35+
CREATE COMPRESSION METHOD zstd FOR "any" HANDLER zstd_handler;
36+
COMMENT ON COMPRESSION METHOD zstd IS 'zstandard compression method';
37+
38+
CREATE COMPRESSION METHOD lz4 FOR "any" HANDLER lz4_handler;
39+
COMMENT ON COMPRESSION METHOD lz4 IS 'LZ4 Fast compression method';
40+
41+
CREATE COMPRESSION METHOD lz4hc FOR "any" HANDLER lz4hc_handler;
42+
COMMENT ON COMPRESSION METHOD lz4hc IS 'LZ4 High Compression method';
43+
44+
CREATE COMPRESSION METHOD lz4d FOR "any" HANDLER lz4d_handler;
45+
COMMENT ON COMPRESSION METHOD lz4d IS 'LZ4 Dictionary Compression method';
46+
47+
CREATE COMPRESSION METHOD snappy FOR "any" HANDLER snappy_handler;
48+
COMMENT ON COMPRESSION METHOD snappy IS 'snappy compression method';
49+
50+
-- LZ4 Dictionary
51+
52+
CREATE TABLE lz4_dictionary
53+
(
54+
dict_name name PRIMARY KEY,
55+
dict_data bytea
56+
) WITH oids;
57+
58+
CREATE INDEX lz4_dictionary_oid_idx ON lz4_dictionary(oid);
59+
CREATE INDEX lz4_dictionary_name_idx ON lz4_dictionary(dict_name);
60+
61+
CREATE FUNCTION lz4_dictionary_create(dict_name name)
62+
RETURNS oid
63+
AS
64+
$$
65+
INSERT INTO lz4_dictionary (dict_name, dict_data)
66+
VALUES (dict_name, '')
67+
RETURNING oid
68+
$$
69+
LANGUAGE SQL STRICT;
70+
71+
CREATE FUNCTION lz4_dictionary_add_sample(dict_id oid, sample "any")
72+
RETURNS void
73+
AS 'MODULE_PATHNAME'
74+
LANGUAGE C STRICT;
75+
76+
CREATE FUNCTION lz4_dictionary_add_sample(dict_name name, sample "any")
77+
RETURNS void
78+
AS 'MODULE_PATHNAME'
79+
LANGUAGE C STRICT;
80+

0 commit comments

Comments
 (0)