Skip to content

Commit 0e3fd8e

Browse files
committed
Binary input/output for hll type.
1 parent 5f9b0e8 commit 0e3fd8e

File tree

5 files changed

+85
-1
lines changed

5 files changed

+85
-1
lines changed

hll--1.0.sql

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,16 @@ RETURNS cstring
3232
AS 'MODULE_PATHNAME'
3333
LANGUAGE C STRICT IMMUTABLE;
3434

35+
CREATE FUNCTION hll_recv(internal)
36+
RETURNS hll
37+
AS 'MODULE_PATHNAME'
38+
LANGUAGE C IMMUTABLE STRICT;
39+
40+
CREATE FUNCTION hll_send(hll)
41+
RETURNS bytea
42+
AS 'MODULE_PATHNAME'
43+
LANGUAGE C IMMUTABLE STRICT;
44+
3545
CREATE FUNCTION hll_typmod_in(cstring[])
3646
RETURNS integer
3747
AS 'MODULE_PATHNAME'
@@ -53,6 +63,8 @@ CREATE TYPE hll (
5363
OUTPUT = hll_out,
5464
TYPMOD_IN = hll_typmod_in,
5565
TYPMOD_OUT = hll_typmod_out,
66+
RECEIVE = hll_recv,
67+
SEND = hll_send,
5668
STORAGE = external
5769
);
5870

hll.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
#include "utils/lsyscache.h"
3434
#include "utils/memutils.h"
3535
#include "catalog/pg_type.h"
36+
#include "lib/stringinfo.h"
37+
#include "libpq/pqformat.h"
3638

3739
#include "MurmurHash3.h"
3840

@@ -3332,3 +3334,25 @@ hll_ceil_card_unpacked(PG_FUNCTION_ARGS)
33323334
PG_RETURN_INT64(ceilval);
33333335
}
33343336
}
3337+
3338+
PG_FUNCTION_INFO_V1(hll_recv);
3339+
Datum hll_recv(PG_FUNCTION_ARGS);
3340+
Datum
3341+
hll_recv(PG_FUNCTION_ARGS)
3342+
{
3343+
Datum dd = DirectFunctionCall1(bytearecv, PG_GETARG_DATUM(0));
3344+
return dd;
3345+
}
3346+
3347+
PG_FUNCTION_INFO_V1(hll_send);
3348+
Datum hll_send(PG_FUNCTION_ARGS);
3349+
Datum
3350+
hll_send(PG_FUNCTION_ARGS)
3351+
{
3352+
Datum dd = PG_GETARG_DATUM(0);
3353+
bytea* bp = DatumGetByteaP(dd);
3354+
StringInfoData buf;
3355+
pq_begintypsend(&buf);
3356+
pq_sendbytes(&buf, VARDATA(bp), VARSIZE(bp) - VARHDRSZ);
3357+
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
3358+
}

regress/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ SQL = \
5252
cumulative_union_sparse_full_representation.sql \
5353
cumulative_union_sparse_promotion.sql \
5454
cumulative_union_sparse_sparse.sql \
55+
copy_binary.sql \
5556
$(NULL)
5657

5758
TEST_DB = hll_regress
@@ -62,7 +63,7 @@ NOT = \
6263
OUT := $(SQL:%.sql=%.out)
6364

6465
# Print NULL values explicitly.
65-
PSQLOPTS = --echo-all -P null=NULL
66+
PSQLOPTS = -x --echo-all -P null=NULL
6667

6768
# Disable NOTICE log messages
6869
export PGOPTIONS := --client-min-messages=warning

regress/copy_binary.ref

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
SELECT hll_set_output_version(1);
2+
-[ RECORD 1 ]----------+--
3+
hll_set_output_version | 1
4+
5+
DROP TABLE IF EXISTS test_binary;
6+
DROP TABLE
7+
CREATE TABLE test_binary (id SERIAL, v1 hll);
8+
CREATE TABLE
9+
INSERT INTO test_binary(id,v1) VALUES (1, hll_empty() || hll_hash_text('A'));
10+
INSERT 0 1
11+
SELECT hll_cardinality(v1) FROM test_binary;
12+
-[ RECORD 1 ]---+--
13+
hll_cardinality | 1
14+
15+
\COPY test_binary TO 'binary.dat' WITH (FORMAT binary)
16+
DELETE FROM test_binary;
17+
DELETE 1
18+
SELECT hll_cardinality(v1) FROM test_binary;
19+
(No rows)
20+
\COPY test_binary FROM 'binary.dat' WITH (FORMAT binary)
21+
SELECT hll_cardinality(v1) FROM test_binary;
22+
-[ RECORD 1 ]---+--
23+
hll_cardinality | 1
24+
25+
DROP TABLE test_binary;
26+
DROP TABLE

regress/copy_binary.sql

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
SELECT hll_set_output_version(1);
2+
3+
DROP TABLE IF EXISTS test_binary;
4+
5+
CREATE TABLE test_binary (id SERIAL, v1 hll);
6+
7+
INSERT INTO test_binary(id,v1) VALUES (1, hll_empty() || hll_hash_text('A'));
8+
9+
SELECT hll_cardinality(v1) FROM test_binary;
10+
11+
\COPY test_binary TO 'binary.dat' WITH (FORMAT binary)
12+
13+
DELETE FROM test_binary;
14+
15+
SELECT hll_cardinality(v1) FROM test_binary;
16+
17+
\COPY test_binary FROM 'binary.dat' WITH (FORMAT binary)
18+
19+
SELECT hll_cardinality(v1) FROM test_binary;
20+
21+
DROP TABLE test_binary;

0 commit comments

Comments
 (0)