Skip to content

Commit a5b6c7f

Browse files
authored
Merge pull request #97 from cipherstash/create-cs_min_v1-cs_max_v1-eql-functions
Create cs min v1 cs max v1 eql functions
2 parents 4b0d27c + 5ef88ac commit a5b6c7f

File tree

4 files changed

+140
-1
lines changed

4 files changed

+140
-1
lines changed

sql/040-aggregate-ore.sql

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
-- Aggregate functions for ORE
2+
DROP FUNCTION IF EXISTS cs_min_encrypted_v1;
3+
CREATE FUNCTION cs_min_encrypted_v1(a cs_encrypted_v1, b cs_encrypted_v1)
4+
RETURNS cs_encrypted_v1
5+
LANGUAGE plpgsql
6+
STRICT
7+
AS $$
8+
BEGIN
9+
IF cs_ore_64_8_v1(a) < cs_ore_64_8_v1(b) THEN
10+
RETURN a;
11+
ELSE
12+
RETURN b;
13+
END IF;
14+
END;
15+
$$;
16+
17+
CREATE AGGREGATE cs_min_v1(cs_encrypted_v1)
18+
(
19+
sfunc = cs_min_encrypted_v1,
20+
stype = cs_encrypted_v1
21+
);
22+
23+
DROP FUNCTION IF EXISTS cs_max_encrypted_v1;
24+
CREATE FUNCTION cs_max_encrypted_v1(a cs_encrypted_v1, b cs_encrypted_v1)
25+
RETURNS cs_encrypted_v1
26+
LANGUAGE plpgsql
27+
STRICT
28+
AS $$
29+
BEGIN
30+
IF cs_ore_64_8_v1(a) > cs_ore_64_8_v1(b) THEN
31+
RETURN a;
32+
ELSE
33+
RETURN b;
34+
END IF;
35+
END;
36+
$$;
37+
38+
CREATE AGGREGATE cs_max_v1(cs_encrypted_v1)
39+
(
40+
sfunc = cs_max_encrypted_v1,
41+
stype = cs_encrypted_v1
42+
);

tasks/test.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ run_test tests/encryptindex.sql
4545
run_test tests/operators-eq.sql
4646
run_test tests/operators-match.sql
4747
run_test tests/operators-ore.sql
48+
run_test tests/aggregate-ore.sql
4849

4950
echo
5051
echo '###############################################'

tests/aggregate-ore.sql

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
\set ON_ERROR_STOP on
2+
3+
-- create table
4+
DROP TABLE IF EXISTS agg_test;
5+
CREATE TABLE agg_test
6+
(
7+
plain_int integer,
8+
enc_int cs_encrypted_v1
9+
);
10+
11+
-- Add data. These are saved from the psql query output connected to Proxy.
12+
-- Decrypted `enc_int` value is the same as the `plain_int` value in the same row.
13+
INSERT INTO agg_test (plain_int, enc_int) VALUES
14+
(
15+
NULL,
16+
NULL
17+
),
18+
(
19+
3,
20+
'{"c": "mBbJyWl%QyVQT_N?b~OpQj!$J7B7H2CK@gB#`36H312|)kY;SeM7R*dAl5{R*U)AI+$~k7(JPvj;hmQK^F_}g^7Zs^WuYa^B(7y{V{&<LbY)~;X>N2hzy", "i": {"c": "encrypted_int4", "t": "encrypted"}, "k": "ct", "m": null, "o": ["ccccccccb06565ebd23d6a4c3eee512713175e673c6d995ff5d9b1d3492fe8eb289c3eb95029025f5b71fc6e06632b4a1302980e433361c7999724dbdd052739258d9444b0fbd43cc61368e60f4b0d5aeca2aa85c1c89933b53afffcc4eb0632dca75f632bb9bc792d1dbd6bced6253291f0db134552d384e9e378f4f5890c31ca9d115965a0e8fbf13ad8d1d33f88d360d5e2f9680fb158f98158443ffc769cd9aac94380f05e3226b785f58006e5b9da6b8d86a7441a88fd848099a2400ef59b494b0c30013568dc1be9bba560565fccb49309ba2ec3edcff6f9d7a67b519b3754b37b0025dff7592a6117949a04043c100353289628884fe06cb2099e7b4b49abea9797a73ee0b85283a5b6f69bcf45f87e6cd6d45ecfd1633903270781173ed9d31a682bba0e54ff355f456bf0c468e378e41cb54fcc074ad40fb4448f6fec892c1ecda15a5efffb8dde3a3b282865ac436d7e43d48d4327c439956733697d3f5b02ead4805a7f905bdae24c1b35252e34939676a07ddb5454c3580c7d76d792a97988e35142f43667112432623eda5126e9af2592dd"], "v": 1}'::cs_encrypted_v1
21+
),
22+
(
23+
5,
24+
'{"c": "mBbKSqWLK6yl>o%G%&x+2$jdg7F`-R(^>R1Q^wGod8-FZ5C$xFI4dN?Ap114=77xPZ9!cKxE}qmyXrhx#K`4ztbUrysQrOFqON6bV{&<LbY)~;X>N2hzy", "i": {"c": "encrypted_int4", "t": "encrypted"}, "k": "ct", "m": null, "o": ["ccccccccb065659dd23d6a4c3eee512713175e673c6d995ff5d9b1d3492fe8eb289c3eb95029025f5b71fc6e06632b4a1302980e433361c7999724dbdd052739258d9444b0fbd43cc61368e60f4b0d5aeca2aa85c1c89933b53afffcc4eb0632dca75f632bb9bc792d1dbd6bced6253291f0db134552d384bec7bfb23290d7559fd8637b85ca7510cca465570029734ef0319c77177913ad84f54852bed2e2a67b6dafcab3eb70d3a2592414a43acc03703083cf1fa1984dfc0719337d5de4eefd0d137588641a0d38c771b77ab07ebab3fc9bfd7469c4222e1a8edee71188eeb24bfffcd82f711156381d8068223e3d75f5ba8a958182bc46a0ab58c29872cd17e559ed0b935a445249dbac5b51438cebaf9d28d5c8b67cd99f990d5295c1e37470ce5b33fe01eaf31d84c9a08b267c0e9e1aadfcce7f9e2253ababa71eaf1fec309dc988e454717a3c2e3bffb1c546a7195ecf274eb7d691abcf46a61e34d4c63c45d48831dc23aa11f981de692926cd1d1d77a340c9e54baf62da61d5f88960a93e120d3828f4053577b93b536cc9b05c889dcf171865"], "v": 1}'::cs_encrypted_v1
25+
),
26+
(
27+
1,
28+
'{"c": "mBbJSy$p0fHEK%aOAOYi4PTJN7B@a-j{+xl7tffjGTN<-Znt3Zge#lGAX^WHzU`7ml<4vRHLKxoB%}N<H3?J~gR*ISwBlJ)X0By!V{&<LbY)~;X>N2hzy", "i": {"c": "encrypted_int4", "t": "encrypted"}, "k": "ct", "m": null, "o": ["ccccccccb0656502d23d6a4c3eee512713175e673c6d995ff5d9b1d3492fe8eb289c3eb95029025f5b71fc6e06632b4a1302980e433361c7999724dbdd052739258d9444b0fbd43cc61368e60f4b0d5aeca2aa85c1c89933b53afffcc4eb0632dca75f632bb9bc792d1dbd6bced6253291f0db134552d384250ca116ef329616ddb341917699b9ea48901124a15a4547be1ff7c672c0c1bc6bb17e2a141f46138fc314f4bf8a55068bf031bc48f038c379e54cfbb1c64eb223c18c87cd68a91fb031905e11d9478f158b561399b527038efc594bfd9fb19c963a2778b75215e1d8933b08df04d1c62742fd48a4de310792031a70ca4b157bc218ab3fbadc6dc14b939422023331c03bcf4b673c5d261a19c3d13155cbaa1b84e9e90e389fa6973dde07fba08c13847006707488e288ce780d59700197452ebc68d22032ab03f7b445e45ed7abb1af34955199440f7db2c969c60b1eb49cdcd75d5e8f7de37848ddebb40df8e14d4b92910e15fedac3f61f22ef430805ba1bbf5fccc9fe792e4c0353beee48ca03ef23c7d3fab19e9aa218aefb44e6c26d70"], "v": 1}'::cs_encrypted_v1
29+
),
30+
(
31+
3,
32+
'{"c": "mBbLa7Cm?&jvpfcv1d3hep>s)76qzUbwUky&M&C<M-e2q^@e798gqWcAb{9a>3mjDG_os-_y0MRaMGl@&p#AOuusN|3Lu=mBCcg_V{&<LbY)~;X>N2hzy", "i": {"c": "encrypted_int4", "t": "encrypted"}, "k": "ct", "m": null, "o": ["ccccccccb06565ebd23d6a4c3eee512713175e673c6d995ff5d9b1d3492fe8eb289c3eb95029025f5b71fc6e06632b4a1302980e433361c7999724dbdd052739258d9444b0fbd43cc61368e60f4b0d5aeca2aa85c1c89933b53afffcc4eb0632dca75f632bb9bc792d1dbd6bced6253291f0db134552d384e9e378f4f5890c31ca9d115965a0e8fb2c3c60ccce84ffc03bddb22b27a1ce278eec118496fd23f083ebb21bb4b83b89eda8c0bdea50debc5ec4f2b2d91b63a80d39386194ad9d129bee2f5168341cb41ed26dc03466cac5e2dbe7336fdb74c0d37d63b396033ce60002c9950f5ac2970dacf4caace2eef5b81544df88a7ef2a8d69550d25d39c678c8e43a3dcc2857018a2c979b45c6b19dabd28ae7388d62916e6742763d6484d1b45154e6c8e6a66e02b03f64b67ddef24747dded32e226e3a93d5d1a92d11e760403cad04a0dd07c14da336a409739e8bbeb3b3d6b92117fa2d2c941da4996ea61b29ca3fffb4594ddbeab7105a1b4c5e422ec5ab8154db545103d8c2889be2e4591198912446d8b33b8708a4cc959a1e0957dcae6a50c3"], "v": 1}'::cs_encrypted_v1
33+
)
34+
;
35+
36+
-- run normal cases
37+
DO $$
38+
BEGIN
39+
-- min null finds null
40+
ASSERT ((SELECT cs_min_v1(enc_int) FROM agg_test where enc_int IS NULL) IS NULL);
41+
42+
-- min enc_int finds the minimum (1)
43+
ASSERT ((SELECT enc_int FROM agg_test WHERE plain_int = 1) = (SELECT cs_min_v1(enc_int) FROM agg_test));
44+
45+
-- max null finds null
46+
ASSERT ((SELECT cs_max_v1(enc_int) FROM agg_test where enc_int IS NULL) IS NULL);
47+
48+
-- max enc_int finds the maximum (5)
49+
ASSERT ((SELECT enc_int FROM agg_test WHERE plain_int = 5) = (SELECT cs_max_v1(enc_int) FROM agg_test));
50+
END;
51+
$$ LANGUAGE plpgsql;
52+
53+
-- insert data without "o" (ore index value)
54+
INSERT INTO agg_test (plain_int, enc_int) VALUES
55+
(
56+
3,
57+
'{"c": "mBbLa7Cm?&jvpfcv1d3hep>s)76qzUbwUky&M&C<M-e2q^@e798gqWcAb{9a>3mjDG_os-_y0MRaMGl@&p#AOuusN|3Lu=mBCcg_V{&<LbY)~;X>N2hzy", "i": {"c": "encrypted_int4", "t": "encrypted"}, "k": "ct", "m": null, "v": 1}'::cs_encrypted_v1
58+
);
59+
60+
-- run exceptional case
61+
DO $$
62+
DECLARE
63+
error_message text;
64+
BEGIN
65+
-- min enc_int raises exception
66+
SELECT cs_min_v1(enc_int) FROM agg_test;
67+
EXCEPTION
68+
WHEN others THEN
69+
error_message := SQLERRM;
70+
71+
IF error_message LIKE '%' || 'Expected an ore index (o) value in json' || '%' THEN
72+
ASSERT true;
73+
ELSE
74+
RAISE EXCEPTION 'Unexpected exception: %', error_message;
75+
END IF;
76+
END;
77+
$$ LANGUAGE plpgsql;
78+
79+
-- run exceptional case
80+
DO $$
81+
DECLARE
82+
error_message text;
83+
BEGIN
84+
-- max enc_int raises exception
85+
SELECT cs_max_v1(enc_int) FROM agg_test;
86+
EXCEPTION
87+
WHEN others THEN
88+
error_message := SQLERRM;
89+
90+
IF error_message LIKE '%' || 'Expected an ore index (o) value in json' || '%' THEN
91+
ASSERT true;
92+
ELSE
93+
RAISE EXCEPTION 'Unexpected exception: %', error_message;
94+
END IF;
95+
END;
96+
$$ LANGUAGE plpgsql;

tests/core.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ $$ LANGUAGE plpgsql;
5959

6060
-- -----------------------------------------------
6161
---
62-
-- cs_encrypted_v1 tyoe
62+
-- cs_encrypted_v1 type
6363
-- Validate configuration schema
6464
-- Try and insert many invalid configurations
6565
-- None should exist

0 commit comments

Comments
 (0)