Skip to content
48 changes: 38 additions & 10 deletions sql/000-ore.sql
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,17 @@ CREATE TYPE ore_64_8_v1 AS (
terms ore_64_8_v1_term[]
);


DROP FUNCTION IF EXISTS compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term);
DROP FUNCTION IF EXISTS compare_ore_64_8_v1_term(a bytea, b bytea);

CREATE FUNCTION compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term) returns integer AS $$
BEGIN
SELECT compare_ore_64_8_v1_term(a.bytes, b.bytes);
END;
$$ LANGUAGE plpgsql;

CREATE FUNCTION compare_ore_64_8_v1_term(a bytea, b bytea) returns integer AS $$
DECLARE
eq boolean := true;
unequal_block smallint := 0;
Expand All @@ -35,7 +43,7 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term)
RETURN 1;
END IF;

IF bit_length(a.bytes) != bit_length(b.bytes) THEN
IF bit_length(a) != bit_length(b) THEN
RAISE EXCEPTION 'Ciphertexts are different lengths';
END IF;

Expand All @@ -47,8 +55,8 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term)
-- * We are not worrying about timing attacks here; don't fret about
-- the OR or !=.
IF
substr(a.bytes, 1 + block, 1) != substr(b.bytes, 1 + block, 1)
OR substr(a.bytes, 9 + left_block_size * block, left_block_size) != substr(b.bytes, 9 + left_block_size * BLOCK, left_block_size)
substr(a, 1 + block, 1) != substr(b, 1 + block, 1)
OR substr(a, 9 + left_block_size * block, left_block_size) != substr(b, 9 + left_block_size * BLOCK, left_block_size)
THEN
-- set the first unequal block we find
IF eq THEN
Expand All @@ -63,20 +71,20 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term)
END IF;

-- Hash key is the IV from the right CT of b
hash_key := substr(b.bytes, right_offset + 1, 16);
hash_key := substr(b, right_offset + 1, 16);

-- first right block is at right offset + nonce_size (ordinally indexed)
target_block := substr(b.bytes, right_offset + 17 + (unequal_block * right_block_size), right_block_size);
target_block := substr(b, right_offset + 17 + (unequal_block * right_block_size), right_block_size);

indicator := (
get_bit(
encrypt(
substr(a.bytes, 9 + (left_block_size * unequal_block), left_block_size),
substr(a, 9 + (left_block_size * unequal_block), left_block_size),
hash_key,
'aes-ecb'
),
0
) + get_bit(target_block, get_byte(a.bytes, unequal_block))) % 2;
) + get_bit(target_block, get_byte(a, unequal_block))) % 2;

IF indicator = 1 THEN
RETURN 1::integer;
Expand Down Expand Up @@ -232,9 +240,17 @@ CREATE OPERATOR CLASS ore_64_8_v1_term_btree_ops DEFAULT FOR TYPE ore_64_8_v1_te
-- doesn't always make sense but it's here for completeness.
-- If both are non-empty, we compare the first element. If they are equal
-- we need to consider the next block so we recurse, otherwise we return the comparison result.
DROP FUNCTION IF EXISTS compare_ore_array(a ore_64_8_v1_term[], b ore_64_8_v1_term[]);
-- DROP FUNCTION IF EXISTS compare_ore_array(a ore_64_8_v1_term[], b ore_64_8_v1_term[]);

-- CREATE FUNCTION compare_ore_array(a ore_64_8_v1_term[], b ore_64_8_v1_term[])
-- RETURNS integer AS $$
-- BEGIN
-- -- SELECT compare_ore_array(a, b);
-- SELECT compare_ore_array(CAST(a AS bytea[]), CAST(b AS bytea[]));
-- END
-- $$ LANGUAGE plpgsql;

CREATE FUNCTION compare_ore_array(a ore_64_8_v1_term[], b ore_64_8_v1_term[])
CREATE FUNCTION compare_ore_array(a bytea[], b bytea[])
RETURNS integer AS $$
DECLARE
cmp_result integer;
Expand Down Expand Up @@ -268,7 +284,19 @@ RETURNS integer AS $$
cmp_result integer;
BEGIN
-- Recursively compare blocks bailing as soon as we can make a decision
RETURN compare_ore_array(a.terms, b.terms);
RETURN compare_ore_array(a.terms::bytea[], b.terms::bytea[]);
END
$$ LANGUAGE plpgsql;

DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a bytea[], b bytea[]);

CREATE FUNCTION compare_ore_64_8_v1(a bytea[], b bytea[])
RETURNS integer AS $$
DECLARE
cmp_result integer;
BEGIN
-- Recursively compare blocks bailing as soon as we can make a decision
RETURN compare_ore_array(a, b);
END
$$ LANGUAGE plpgsql;

Expand Down
25 changes: 4 additions & 21 deletions sql/011-core-functions.sql
Original file line number Diff line number Diff line change
Expand Up @@ -140,33 +140,16 @@ BEGIN ATOMIC
END;


-- casts text to ore_64_8_v1_term (bytea)
DROP FUNCTION IF EXISTS _cs_text_to_ore_64_8_v1_term_v1_0(t text);

CREATE FUNCTION _cs_text_to_ore_64_8_v1_term_v1_0(t text)
RETURNS ore_64_8_v1_term
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
BEGIN ATOMIC
RETURN t::bytea;
END;

-- cast to cleanup ore_64_8_v1 extraction
DROP CAST IF EXISTS (text AS ore_64_8_v1_term);

CREATE CAST (text AS ore_64_8_v1_term)
WITH FUNCTION _cs_text_to_ore_64_8_v1_term_v1_0(text) AS IMPLICIT;


-- extracts ore index from an encrypted column
DROP FUNCTION IF EXISTS cs_ore_64_8_v1_v0_0(val jsonb);

CREATE FUNCTION cs_ore_64_8_v1_v0_0(val jsonb)
RETURNS ore_64_8_v1
RETURNS bytea[]
IMMUTABLE STRICT PARALLEL SAFE
AS $$
BEGIN
IF val ? 'o' THEN
RETURN (val->>'o')::ore_64_8_v1;
RETURN (val->>'o')::bytea[];
END IF;
RAISE 'Expected an ore index (o) value in json: %', val;
END;
Expand All @@ -176,7 +159,7 @@ $$ LANGUAGE plpgsql;
DROP FUNCTION IF EXISTS cs_ore_64_8_v1_v0(val jsonb);

CREATE FUNCTION cs_ore_64_8_v1_v0(val jsonb)
RETURNS ore_64_8_v1
RETURNS bytea[]
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
BEGIN ATOMIC
RETURN cs_ore_64_8_v1_v0_0(val);
Expand All @@ -185,7 +168,7 @@ END;
DROP FUNCTION IF EXISTS cs_ore_64_8_v1(val jsonb);

CREATE FUNCTION cs_ore_64_8_v1(val jsonb)
RETURNS ore_64_8_v1
RETURNS bytea[]
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
BEGIN ATOMIC
RETURN cs_ore_64_8_v1_v0_0(val);
Expand Down
24 changes: 13 additions & 11 deletions sql/017-operators-ore.sql
Original file line number Diff line number Diff line change
Expand Up @@ -401,22 +401,25 @@ CREATE OPERATOR <=(

-----------------------------------------------------------------------------------------


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

CREATE FUNCTION cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b cs_encrypted_v1)
RETURNS integer AS $$
DECLARE
a_ore bytea[];
b_ore bytea[];
result integer;
BEGIN
RETURN compare_ore_64_8_v1(cs_ore_64_8_v1(a), cs_ore_64_8_v1(b));
END;
$$ LANGUAGE plpgsql;

DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b cs_encrypted_v1);
SELECT cs_ore_64_8_v1(a) INTO a_ore;
SELECT cs_ore_64_8_v1(b) INTO b_ore;

CREATE FUNCTION cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b jsonb)
RETURNS integer AS $$
BEGIN
RETURN compare_ore_64_8_v1(cs_ore_64_8_v1(a), cs_ore_64_8_v1(jsonb));
RAISE NOTICE 'a %', a_ore;
RAISE NOTICE 'b %', b_ore;

SELECT compare_ore_64_8_v1(a_ore, b_ore) INTO RESULT;

RETURN result;
END;
$$ LANGUAGE plpgsql;

Expand All @@ -428,8 +431,7 @@ DROP OPERATOR FAMILY IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1 USING btree

CREATE OPERATOR FAMILY cs_encrypted_ore_64_8_v1_btree_ops_v1 USING btree;


DROP OPERATOR CLASS IF EXISTS ore_64_8_v1_btree_ops USING btree;
DROP OPERATOR CLASS IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1 USING btree;

CREATE OPERATOR CLASS cs_encrypted_ore_64_8_v1_btree_ops_v1 DEFAULT
FOR TYPE cs_encrypted_v1 USING btree
Expand Down
3 changes: 2 additions & 1 deletion sql/666-drop-operators.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
DROP OPERATOR FAMILY IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1 USING btree;
DROP OPERATOR CLASS IF EXISTS ore_64_8_v1_btree_ops USING btree;
DROP OPERATOR CLASS IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1 USING btree;

DROP OPERATOR IF EXISTS @> (cs_encrypted_v1, cs_encrypted_v1);
DROP OPERATOR IF EXISTS @> (cs_encrypted_v1, cs_match_index_v1);
DROP OPERATOR IF EXISTS @> (cs_match_index_v1, cs_encrypted_v1);
Expand Down
85 changes: 85 additions & 0 deletions tests/operators-ore-order.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
\set ON_ERROR_STOP on

-- Create a table with a plaintext column
DROP TABLE IF EXISTS encrypted;
CREATE TABLE encrypted
(
id bigint GENERATED ALWAYS AS IDENTITY,
encrypted_int2 cs_encrypted_v1,
PRIMARY KEY(id)
);


CREATE index ON encrypted (encrypted_int2 cs_encrypted_ore_64_8_v1_btree_ops_v1);


-- 99
INSERT INTO encrypted (encrypted_int2) VALUES ('{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": "{\"\\\\\\\\\\\\\\\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d7df6b2c706438ae9990eaae2c53152f6a054114e7c0c43191931fa630315ecf5b2043fec606e98129b60164c904e72c7b89b8112bec8d2434f0b8a2b39d8789aa3d1807aa97eb0f1218975bdafabf63e366718bde853f4e138ec155e3881130596a7ce7f1bf8b4fc8d9cdcaaea967c4971775330759f64b6a6e8f981cbbd6d18cd441e424dd58b7327f0dbd405c1779b74ad537ca1563b5c5eb6419a2c8ddf8c445b8c477a3bbeca05f40c0798040abff80fd48072dfb7a4467dc7a0808ac2c189a1391170ebdf594954c1ab8fd5d966a2ac7bb9136ed566f0d01ff365f51d59af9b92fc760fc70f424be40906e9fdf8b70e228aedb30607d0aad1b48254bdcdfcc096d6eecd09659bccbbf17b28e89eb\"}", "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}');

-- 5 .. 9
INSERT INTO encrypted (encrypted_int2) VALUES ('{"c": "5", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": "{\"\\\\\\\\\\\\\\\\x121212121212591fe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801d7a2a8638edc950e921074126382a46dc1cddd68d653ff67447fb929a057027664983df10ec4fa48ff72805aadcfbf20250bc6734a4c4097f1c7b2e919f787f0069045ca27b9fb6557eda9da508b9c1921c836b4311540f6b565d5743c07c55dd1352efb8c61a6e13f0eef1763a4cd64a34fca99638fd96653e6a83ae728a4520fcd0c08074f55d046dd2c47d7905ef3b1650828a8c7a89a0d35273aa48cda337ec4124f168aeadd425b32bea4b410828e7a67caa9e8c21954a3255ea73b9ef801167db8440daaf33cc0c1069597b0b82157a5adb9cbe87932d4133d83d25c1aab21165a134540bfe8268cdaf7878a6f6473e62ba2f3371c737b5f513d6166194d106df8abfd551767c9d011091614d96301fc8f9e330678c2fd915678cababd\"}", "u": "cdd6248063d3431f3fe010c5728954fd62cbf42b0c515a9991bd4fc673604e26", "v": 1}');
INSERT INTO encrypted (encrypted_int2) VALUES ('{"c": "6", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": "{\"\\\\\\\\\\\\\\\\x121212121212599de28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a6afd969a465c445ab35c15e7ef11eba0411270c2fdd4578aef1155f13e1cba0341a89333540fc98dbdd394db2fdaaa89aa955c6f597c0c71d79cd27934a2db7844a325067a8bfc61949806419742a55b78f90788e881346b91ae242c54ef5ab71e022d4e299beb02faecdd38ea11604a6776f602bf79e9173eeee2ca1ad822fa2a943621cb84e33587a420d3b56f53b2fe9ceea24ccb418db9c98e10362e1f8acc188cdddc7fd9e27f0460f60ceeb30b0b9a3af4c6d9f4ddbf398e8af529c0d18de229ea67b86b1f4a15a6e73d58ade30ebae2bcbadad7383df69e4f7a6c8826d1ba7e2279417259b50a26271278d1078145b7b7bfbf0a94bfe34c39c6247bf982dfb68e0b4f969a10d9ae500d57a901ea717244da6207ed0599d7f2cbdd4f2\"}", "u": "a97ec70e9e4cc5c6888f1f809ec4fa551aff8633d76cfb26bb20997d4d50ca91", "v": 1}');
INSERT INTO encrypted (encrypted_int2) VALUES ('{"c": "7", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": "{\"\\\\\\\\\\\\\\\\x1212121212125948e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a901168d92ea2d7df254becc59888cf46c1d5faf172e7f95cff290254c3873edef20871a19f2d66c8a139678c5c6829a7b1f9d56fe44ad492b8c45a19d83aeadd84d01e1b095abdab069159ab18db8f457b0bdac457c084d0c67a2e6fcd9423231c9bfd89788ef127032472ae51215536d6b550de87b221037a2a48757805d1a9c1f9df240bf041f95beee31b5d19b626682d4c06f93846572fc87c0f25cf30c4e1b196f25e3f9ae44aebb62eaad2c53fcbfbf07f4f96f408fc329bd6e591e6c2a28907cc26727ba63c0fe355576c2a18ff4d4e98f4f2f991dd2094b5e4477f8cdcf4e43b6d49a571aa580f3910762bb8c7a45032a1f1f40bfd93b032722140f268afd4dae03ef06bcf9fea2b65e31edd9a19a6d100dfc0066ca2e92f72fd182\"}", "u": "28f3ec44eae678f9d0d8238c0b3a01a146d56ccc4c1125f0373d394c4e1e95f4", "v": 1}');
INSERT INTO encrypted (encrypted_int2) VALUES ('{"c": "8", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": "{\"\\\\\\\\\\\\\\\\x121212121212594ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801783caa0b75f5aa4c005b423d7518fd4ba6eb6aa561404f1a0220899d95fbd4b55f066864ff6954e127ddf460434025440ffa235e4349445f8ae71f35e45a7958d5f98c7f85724dd03c8c973247f0e43e65810b0672bb6d32a1c546fd4c2c724da38fc88e8d0d8f75bc3242b588da322b828832335847f195f7f387132c390d9bc5d056123dbba1fd978f33a60c0afa6a160ac387add829b16ca24b25c1cc84d7606331313b611894b0bcf02adae0d7a5d2a71990efd2b75021f57de01593e5247aa266279a8f585c67e69d1ceb8720e4f5960b58cc0ee79cb4b4ce89ade73e58df1d526c2a4e9ec7b54fdc47b4c0f9ccc46f058e5504f6561003935ebddcc2a8c9e1db37d34f2439ea83d05e35ee01bc89fb30d915ca9ef1853da28bb49bea7c\"}", "u": "9e80a31275db9e5ebc9a254864971cdef2ca68b0047712d3d106d86516bcfc6a", "v": 1}');
INSERT INTO encrypted (encrypted_int2) VALUES ('{"c": "9", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": "{\"\\\\\\\\\\\\\\\\x12121212121259dae28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801357205e56d3cf91febac317b171083359db17a7bb1b36322c0ba2d98761226235a94cde3ce299e791b0add7a9cb2e0930c6fc85e950ba8118098bbda70a1b64f6f315b9688ade446afbfe0e19fef48c755fb2a0a1cbe03f208c6a700ce4f2194dbad2d5a984af349c34ef03dd326643260f180efeb7bf2f50227646970924ea3e04126edf444e2c6c553a243844c3ab5c208294574a08d3590d8ef4d59da502e30ba176b42e37c113fec63b5dfb7bba36245f087bac09817ef32310b0ad9b940f10bb81da9c7c434c122c03accdfb569ad3bbe8b6b19d02adff465cf666c7b7097ef18079b554da8bd93a589691bce0ca56de08b24797c12dd6a124b2a0ee15ea54c9e52eb63db09f0d346297847be4eb98b9a96ca2ed672794e7e27022ec55a\"}", "u": "94ec6ec3b6a8acb4d1b94f0c3a4a7c6359b11ce5d8fd01a7e4474e5e7a0cca8b", "v": 1}');

-- 1
INSERT INTO encrypted (encrypted_int2) VALUES ('{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": "{\"\\\\\\\\\\\\\\\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353acd2894710cbee75950e4c034ec695bc3c1c4662a272c20df45e7423b38bff2b864d1649483bd65fa40a0a2113d53fb3c756db4cc660266e550e5db1764d0a253b9bfb55a45fafa6add18e36f128d9843c66a2eae20aff8362f9d4cbd78fd7e39ed1b58550b12e7d863e7e2b2737dff77434d1850bf7c3bc2be212b3259c856f45efe6633355d4ecf68f0d97874cf6a7f22d78556c33e15c3903324526e2a36619d82184e7fe815f4bba53d85520c917beaa92dc2d9ae1268049c24ec1e4ab43fdb306a4f32c0b74fb5e943af91226277b11256bcada313abf55b1cde773b6858f199d1267467e664a940675394fab4d4ef729f02d0020275a94d7fb021cf7cd1e213df2136aea73353788be114c52eab\"}", "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}');



-- SELECT id, name_encrypted FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC;

-- SELECT id, cs_ore_64_8_v1(name_encrypted) FROM users;

-- SANITY CHECK DATA
-- SELECT (encrypted_int2->>'o')::bytea[] FROM encrypted;

SELECT id, encrypted_int2->>'c' FROM encrypted ORDER BY encrypted_int2 ASC;

SELECT id, encrypted_int2->>'c' FROM encrypted ORDER BY encrypted_int2 DESC;



DO $$
DECLARE
ore_cs_encrypted cs_encrypted_v1;
ore_json jsonb;
BEGIN

ore_cs_encrypted := '{
"v": 1,
"k": "ct",
"c": "ciphertext",
"i": {
"t": "users",
"c": "name"
},
"m": [1, 2, 3],
"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"
}';

ore_json := '{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"}';


-- SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) > cs_ore_64_8_v1(ore_json);

-- SANITY CHECK
-- ASSERT (SELECT EXISTS (SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) > cs_ore_64_8_v1(ore_json)));

-- ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted > ore_cs_encrypted));

-- PERFORM (SELECT id FROM users WHERE name_encrypted > ore_cs_encrypted::cs_encrypted_v1);

-- PERFORM (SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) > cs_ore_64_8_v1(ore_json));

-- PERFORM (SELECT id FROM users WHERE name_encrypted > ore_cs_encrypted);

-- SANITY CHECK
-- ASSERT (SELECT EXISTS (SELECT id FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC);


END;
$$ LANGUAGE plpgsql;


Loading