Skip to content

Commit 9c91f8c

Browse files
committed
WIP
1 parent 01dcc24 commit 9c91f8c

File tree

4 files changed

+155
-13
lines changed

4 files changed

+155
-13
lines changed

sql/000-ore.sql

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,18 @@ RETURNS integer AS $$
272272
END
273273
$$ LANGUAGE plpgsql;
274274

275+
DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a bytea[], b bytea[]);
276+
277+
CREATE FUNCTION compare_ore_64_8_v1(a bytea[], b bytea[])
278+
RETURNS integer AS $$
279+
DECLARE
280+
cmp_result integer;
281+
BEGIN
282+
-- Recursively compare blocks bailing as soon as we can make a decision
283+
RETURN compare_ore_array(a, b);
284+
END
285+
$$ LANGUAGE plpgsql;
286+
275287

276288
DROP FUNCTION IF EXISTS ore_64_8_v1_eq(a ore_64_8_v1, b ore_64_8_v1);
277289

sql/017-operators-ore.sql

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -401,24 +401,31 @@ CREATE OPERATOR <=(
401401

402402
-----------------------------------------------------------------------------------------
403403

404-
405404
DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b cs_encrypted_v1);
406405

407406
CREATE FUNCTION cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b cs_encrypted_v1)
408407
RETURNS integer AS $$
408+
DECLARE
409+
a_ore bytea[];
410+
b_ore bytea[];
409411
BEGIN
410-
RETURN compare_ore_64_8_v1(cs_ore_64_8_v1(a), cs_ore_64_8_v1(b));
412+
a_ore = ARRAY[(a->>'o')::bytea];
413+
b_ore = ARRAY[(b->>'o')::bytea];
414+
415+
RETURN compare_ore_64_8_v1(a_ore, b_ore);
411416
END;
417+
412418
$$ LANGUAGE plpgsql;
413419

414-
DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b cs_encrypted_v1);
415420

416-
CREATE FUNCTION cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b jsonb)
417-
RETURNS integer AS $$
418-
BEGIN
419-
RETURN compare_ore_64_8_v1(cs_ore_64_8_v1(a), cs_ore_64_8_v1(jsonb));
420-
END;
421-
$$ LANGUAGE plpgsql;
421+
-- DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b cs_encrypted_v1);
422+
423+
-- CREATE FUNCTION cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b jsonb)
424+
-- RETURNS integer AS $$
425+
-- BEGIN
426+
-- RETURN compare_ore_64_8_v1(cs_ore_64_8_v1(a), cs_ore_64_8_v1(jsonb));
427+
-- END;
428+
-- $$ LANGUAGE plpgsql;
422429

423430

424431
-----------------------------------------------------------------------------------------
@@ -428,8 +435,7 @@ DROP OPERATOR FAMILY IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1 USING btree
428435

429436
CREATE OPERATOR FAMILY cs_encrypted_ore_64_8_v1_btree_ops_v1 USING btree;
430437

431-
432-
DROP OPERATOR CLASS IF EXISTS ore_64_8_v1_btree_ops USING btree;
438+
DROP OPERATOR CLASS IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1 USING btree;
433439

434440
CREATE OPERATOR CLASS cs_encrypted_ore_64_8_v1_btree_ops_v1 DEFAULT
435441
FOR TYPE cs_encrypted_v1 USING btree

sql/666-drop-operators.sql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
DROP OPERATOR FAMILY IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1 USING btree;
2-
DROP OPERATOR CLASS IF EXISTS ore_64_8_v1_btree_ops USING btree;
1+
DROP OPERATOR FAMILY IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1;
2+
DROP OPERATOR CLASS IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1;
3+
34
DROP OPERATOR IF EXISTS @> (cs_encrypted_v1, cs_encrypted_v1);
45
DROP OPERATOR IF EXISTS @> (cs_encrypted_v1, cs_match_index_v1);
56
DROP OPERATOR IF EXISTS @> (cs_match_index_v1, cs_encrypted_v1);

tests/operators-ore-order.sql

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
\set ON_ERROR_STOP on
2+
3+
4+
-- Create a table with a plaintext column
5+
DROP TABLE IF EXISTS users;
6+
CREATE TABLE users
7+
(
8+
id bigint GENERATED ALWAYS AS IDENTITY,
9+
name_encrypted cs_encrypted_v1,
10+
PRIMARY KEY(id)
11+
);
12+
13+
TRUNCATE TABLE users;
14+
15+
CREATE index ON users (name_encrypted cs_encrypted_ore_64_8_v1_btree_ops_v1);
16+
17+
18+
-- User with "HIGH" value
19+
INSERT INTO users (name_encrypted) VALUES (
20+
'{
21+
"v": 1,
22+
"k": "ct",
23+
"c": "high",
24+
"i": {
25+
"t": "users",
26+
"c": "name"
27+
},
28+
"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\\\\"\")\"\"}\")"
29+
}'::jsonb
30+
);
31+
32+
33+
-- User with "LOW" value
34+
INSERT INTO users (name_encrypted) VALUES (
35+
'{
36+
"v": 1,
37+
"k": "ct",
38+
"c": "low",
39+
"i": {
40+
"t": "users",
41+
"c": "name"
42+
},
43+
"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"
44+
}'::jsonb
45+
);
46+
47+
48+
SELECT (name_encrypted->>'o') FROM users;
49+
50+
-- SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) > cs_ore_64_8_v1('{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"}');
51+
52+
53+
54+
55+
56+
57+
-- SELECT id, name_encrypted FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC
58+
-- SELECT id, name_encrypted FROM users ORDER BY name_encrypted ASC;
59+
60+
-- SELECT id FROM users WHERE name_encrypted::cs_encrypted_v1 > '{
61+
-- "v": 1,
62+
-- "k": "ct",
63+
-- "c": "ciphertext",
64+
-- "i": {
65+
-- "t": "users",
66+
-- "c": "name"
67+
-- },
68+
-- "m": [1, 2, 3],
69+
-- "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"
70+
-- }'::cs_encrypted_v1;
71+
72+
-- SELECT * FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC;
73+
-- SELECT * FROM users ORDER BY name_encrypted USING <;
74+
-- EXPLAIN ANALYZE SELECT * FROM users ORDER BY name_encrypted ASC;
75+
76+
-- SELECT data_type FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'name_encrypted';
77+
-- EXPLAIN ANALYZE SELECT * FROM users ORDER BY name_encrypted::jsonb ASC;
78+
79+
80+
81+
82+
DO $$
83+
DECLARE
84+
ore_cs_encrypted cs_encrypted_v1;
85+
ore_json jsonb;
86+
BEGIN
87+
88+
ore_cs_encrypted := '{
89+
"v": 1,
90+
"k": "ct",
91+
"c": "ciphertext",
92+
"i": {
93+
"t": "users",
94+
"c": "name"
95+
},
96+
"m": [1, 2, 3],
97+
"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"
98+
}';
99+
100+
ore_json := '{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"}';
101+
102+
103+
-- SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) > cs_ore_64_8_v1(ore_json);
104+
105+
-- SANITY CHECK
106+
-- ASSERT (SELECT EXISTS (SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) > cs_ore_64_8_v1(ore_json)));
107+
108+
-- ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted > ore_cs_encrypted));
109+
110+
-- PERFORM (SELECT id FROM users WHERE name_encrypted > ore_cs_encrypted::cs_encrypted_v1);
111+
112+
-- PERFORM (SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) > cs_ore_64_8_v1(ore_json));
113+
114+
-- PERFORM (SELECT id FROM users WHERE name_encrypted > ore_cs_encrypted);
115+
116+
-- SANITY CHECK
117+
-- ASSERT (SELECT EXISTS (SELECT id FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC);
118+
119+
120+
END;
121+
$$ LANGUAGE plpgsql;
122+
123+

0 commit comments

Comments
 (0)