From 9c91f8c073f1fae6e4529e223e088c0f1fa85e18 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 30 Jan 2025 13:44:25 +1100 Subject: [PATCH 01/15] WIP --- sql/000-ore.sql | 12 ++++ sql/017-operators-ore.sql | 28 +++++--- sql/666-drop-operators.sql | 5 +- tests/operators-ore-order.sql | 123 ++++++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 13 deletions(-) create mode 100644 tests/operators-ore-order.sql diff --git a/sql/000-ore.sql b/sql/000-ore.sql index b5c81940..b2b8bc19 100644 --- a/sql/000-ore.sql +++ b/sql/000-ore.sql @@ -272,6 +272,18 @@ RETURNS integer AS $$ 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; + DROP FUNCTION IF EXISTS ore_64_8_v1_eq(a ore_64_8_v1, b ore_64_8_v1); diff --git a/sql/017-operators-ore.sql b/sql/017-operators-ore.sql index 400a683f..eca26825 100644 --- a/sql/017-operators-ore.sql +++ b/sql/017-operators-ore.sql @@ -401,24 +401,31 @@ 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[]; BEGIN - RETURN compare_ore_64_8_v1(cs_ore_64_8_v1(a), cs_ore_64_8_v1(b)); + a_ore = ARRAY[(a->>'o')::bytea]; + b_ore = ARRAY[(b->>'o')::bytea]; + + RETURN compare_ore_64_8_v1(a_ore, b_ore); END; + $$ LANGUAGE plpgsql; -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 jsonb) - RETURNS integer AS $$ - BEGIN - RETURN compare_ore_64_8_v1(cs_ore_64_8_v1(a), cs_ore_64_8_v1(jsonb)); - END; -$$ LANGUAGE plpgsql; +-- 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 jsonb) +-- RETURNS integer AS $$ +-- BEGIN +-- RETURN compare_ore_64_8_v1(cs_ore_64_8_v1(a), cs_ore_64_8_v1(jsonb)); +-- END; +-- $$ LANGUAGE plpgsql; ----------------------------------------------------------------------------------------- @@ -428,8 +435,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 diff --git a/sql/666-drop-operators.sql b/sql/666-drop-operators.sql index 8bd9fe3a..7d070f62 100644 --- a/sql/666-drop-operators.sql +++ b/sql/666-drop-operators.sql @@ -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 FAMILY IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1; +DROP OPERATOR CLASS IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1; + 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); diff --git a/tests/operators-ore-order.sql b/tests/operators-ore-order.sql new file mode 100644 index 00000000..37331900 --- /dev/null +++ b/tests/operators-ore-order.sql @@ -0,0 +1,123 @@ +\set ON_ERROR_STOP on + + +-- Create a table with a plaintext column +DROP TABLE IF EXISTS users; +CREATE TABLE users +( + id bigint GENERATED ALWAYS AS IDENTITY, + name_encrypted cs_encrypted_v1, + PRIMARY KEY(id) +); + +TRUNCATE TABLE users; + +CREATE index ON users (name_encrypted cs_encrypted_ore_64_8_v1_btree_ops_v1); + + +-- User with "HIGH" value +INSERT INTO users (name_encrypted) VALUES ( + '{ + "v": 1, + "k": "ct", + "c": "high", + "i": { + "t": "users", + "c": "name" + }, + "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\\\\"\")\"\"}\")" + }'::jsonb +); + + +-- User with "LOW" value +INSERT INTO users (name_encrypted) VALUES ( + '{ + "v": 1, + "k": "ct", + "c": "low", + "i": { + "t": "users", + "c": "name" + }, + "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")" + }'::jsonb +); + + +SELECT (name_encrypted->>'o') FROM users; + +-- SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) > cs_ore_64_8_v1('{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"}'); + + + + + + +-- SELECT id, name_encrypted FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC +-- SELECT id, name_encrypted FROM users ORDER BY name_encrypted ASC; + +-- SELECT id FROM users WHERE name_encrypted::cs_encrypted_v1 > '{ +-- "v": 1, +-- "k": "ct", +-- "c": "ciphertext", +-- "i": { +-- "t": "users", +-- "c": "name" +-- }, +-- "m": [1, 2, 3], +-- "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")" +-- }'::cs_encrypted_v1; + +-- SELECT * FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC; +-- SELECT * FROM users ORDER BY name_encrypted USING <; +-- EXPLAIN ANALYZE SELECT * FROM users ORDER BY name_encrypted ASC; + +-- SELECT data_type FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'name_encrypted'; +-- EXPLAIN ANALYZE SELECT * FROM users ORDER BY name_encrypted::jsonb ASC; + + + + +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; + + From 134e2a64eab079dca883e7551fcbf19d2c9b1121 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 30 Jan 2025 13:58:24 +1100 Subject: [PATCH 02/15] Closer --- sql/000-ore.sql | 28 +++++++++++++++++++++------- tests/operators-ore-order.sql | 6 +----- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/sql/000-ore.sql b/sql/000-ore.sql index b2b8bc19..7580d702 100644 --- a/sql/000-ore.sql +++ b/sql/000-ore.sql @@ -9,8 +9,15 @@ CREATE TYPE ore_64_8_v1 AS ( ); 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; @@ -35,7 +42,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; @@ -47,8 +54,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 @@ -63,20 +70,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; @@ -235,6 +242,13 @@ CREATE OPERATOR CLASS ore_64_8_v1_term_btree_ops DEFAULT FOR TYPE ore_64_8_v1_te 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); + END +$$ LANGUAGE plpgsql; + +CREATE FUNCTION compare_ore_array(a bytea[], b bytea[]) RETURNS integer AS $$ DECLARE cmp_result integer; diff --git a/tests/operators-ore-order.sql b/tests/operators-ore-order.sql index 37331900..f3616ced 100644 --- a/tests/operators-ore-order.sql +++ b/tests/operators-ore-order.sql @@ -45,16 +45,12 @@ INSERT INTO users (name_encrypted) VALUES ( ); -SELECT (name_encrypted->>'o') FROM users; -- SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) > cs_ore_64_8_v1('{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"}'); +SELECT id, name_encrypted FROM users ORDER BY name_encrypted DESC; - - - --- SELECT id, name_encrypted FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC -- SELECT id, name_encrypted FROM users ORDER BY name_encrypted ASC; -- SELECT id FROM users WHERE name_encrypted::cs_encrypted_v1 > '{ From 63c4637ddd538dbf78f27770a3cfd6d7f08f31fc Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 30 Jan 2025 15:25:27 +1100 Subject: [PATCH 03/15] Closer, but order is inverted (ASC is DESC etc) --- sql/000-ore.sql | 32 ++++++++++++++++++++++++-------- tests/operators-ore-order.sql | 6 ++---- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/sql/000-ore.sql b/sql/000-ore.sql index 7580d702..878ea377 100644 --- a/sql/000-ore.sql +++ b/sql/000-ore.sql @@ -8,6 +8,21 @@ CREATE TYPE ore_64_8_v1 AS ( terms ore_64_8_v1_term[] ); +DROP FUNCTION IF EXISTS cs_cast_ore_64_8_v1_term_to_bytea(t ore_64_8_v1_term); + +CREATE FUNCTION cs_cast_ore_64_8_v1_term_to_bytea(t ore_64_8_v1_term) + RETURNS bytea + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +BEGIN ATOMIC + RETURN t.bytes; +END; + +DROP CAST IF EXISTS (ore_64_8_v1_term AS bytea); + +CREATE CAST (ore_64_8_v1_term AS bytea) + WITH FUNCTION cs_cast_ore_64_8_v1_term_to_bytea(ore_64_8_v1_term) AS IMPLICIT; + + 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); @@ -239,14 +254,15 @@ 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); - END -$$ LANGUAGE plpgsql; +-- 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 bytea[], b bytea[]) RETURNS integer AS $$ @@ -282,7 +298,7 @@ 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; diff --git a/tests/operators-ore-order.sql b/tests/operators-ore-order.sql index f3616ced..323d4a4e 100644 --- a/tests/operators-ore-order.sql +++ b/tests/operators-ore-order.sql @@ -45,13 +45,11 @@ INSERT INTO users (name_encrypted) VALUES ( ); - -- SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) > cs_ore_64_8_v1('{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"}'); -SELECT id, name_encrypted FROM users ORDER BY name_encrypted DESC; - +SELECT id, name_encrypted FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC; --- SELECT id, name_encrypted FROM users ORDER BY name_encrypted ASC; +SELECT id, name_encrypted FROM users ORDER BY name_encrypted; -- SELECT id FROM users WHERE name_encrypted::cs_encrypted_v1 > '{ -- "v": 1, From df9f863c816e7386a52b2b480efd56fbbff3a1ae Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 10 Feb 2025 12:05:03 +1100 Subject: [PATCH 04/15] eql ore fn returns bytea[] --- sql/011-core-functions.sql | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/sql/011-core-functions.sql b/sql/011-core-functions.sql index 003e6991..af4312ff 100644 --- a/sql/011-core-functions.sql +++ b/sql/011-core-functions.sql @@ -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; @@ -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); @@ -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); From c518c70b895b4812f9e9939216533ad12c6c89d6 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 10 Feb 2025 12:07:17 +1100 Subject: [PATCH 05/15] testing ore payload as bytea[] --- sql/000-ore.sql | 16 +------- sql/017-operators-ore.sql | 22 +++++------ sql/666-drop-operators.sql | 4 +- tests/operators-ore-order.sql | 72 ++++++++++------------------------- 4 files changed, 32 insertions(+), 82 deletions(-) diff --git a/sql/000-ore.sql b/sql/000-ore.sql index 878ea377..c94a64af 100644 --- a/sql/000-ore.sql +++ b/sql/000-ore.sql @@ -8,27 +8,13 @@ CREATE TYPE ore_64_8_v1 AS ( terms ore_64_8_v1_term[] ); -DROP FUNCTION IF EXISTS cs_cast_ore_64_8_v1_term_to_bytea(t ore_64_8_v1_term); - -CREATE FUNCTION cs_cast_ore_64_8_v1_term_to_bytea(t ore_64_8_v1_term) - RETURNS bytea - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN t.bytes; -END; - -DROP CAST IF EXISTS (ore_64_8_v1_term AS bytea); - -CREATE CAST (ore_64_8_v1_term AS bytea) - WITH FUNCTION cs_cast_ore_64_8_v1_term_to_bytea(ore_64_8_v1_term) AS IMPLICIT; - 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) + SELECT compare_ore_64_8_v1_term(a.bytes, b.bytes); END; $$ LANGUAGE plpgsql; diff --git a/sql/017-operators-ore.sql b/sql/017-operators-ore.sql index eca26825..893f3855 100644 --- a/sql/017-operators-ore.sql +++ b/sql/017-operators-ore.sql @@ -408,24 +408,20 @@ CREATE FUNCTION cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b cs_encrypted_ DECLARE a_ore bytea[]; b_ore bytea[]; + result integer; BEGIN - a_ore = ARRAY[(a->>'o')::bytea]; - b_ore = ARRAY[(b->>'o')::bytea]; - RETURN compare_ore_64_8_v1(a_ore, b_ore); - END; - -$$ LANGUAGE plpgsql; + SELECT cs_ore_64_8_v1(a) INTO a_ore; + SELECT cs_ore_64_8_v1(b) INTO b_ore; + RAISE NOTICE 'a %', a_ore; + RAISE NOTICE 'b %', b_ore; --- DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b cs_encrypted_v1); + SELECT compare_ore_64_8_v1(a_ore, b_ore) INTO RESULT; --- 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)); --- END; --- $$ LANGUAGE plpgsql; + RETURN result; + END; +$$ LANGUAGE plpgsql; ----------------------------------------------------------------------------------------- diff --git a/sql/666-drop-operators.sql b/sql/666-drop-operators.sql index 7d070f62..d8cd6604 100644 --- a/sql/666-drop-operators.sql +++ b/sql/666-drop-operators.sql @@ -1,5 +1,5 @@ -DROP OPERATOR FAMILY IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1; -DROP OPERATOR CLASS IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1; +DROP OPERATOR FAMILY IF EXISTS cs_encrypted_ore_64_8_v1_btree_ops_v1 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); diff --git a/tests/operators-ore-order.sql b/tests/operators-ore-order.sql index 323d4a4e..6060acef 100644 --- a/tests/operators-ore-order.sql +++ b/tests/operators-ore-order.sql @@ -1,75 +1,43 @@ \set ON_ERROR_STOP on - -- Create a table with a plaintext column -DROP TABLE IF EXISTS users; -CREATE TABLE users +DROP TABLE IF EXISTS encrypted; +CREATE TABLE encrypted ( id bigint GENERATED ALWAYS AS IDENTITY, - name_encrypted cs_encrypted_v1, + encrypted_int2 cs_encrypted_v1, PRIMARY KEY(id) ); -TRUNCATE TABLE users; - -CREATE index ON users (name_encrypted cs_encrypted_ore_64_8_v1_btree_ops_v1); +CREATE index ON encrypted (encrypted_int2 cs_encrypted_ore_64_8_v1_btree_ops_v1); --- User with "HIGH" value -INSERT INTO users (name_encrypted) VALUES ( - '{ - "v": 1, - "k": "ct", - "c": "high", - "i": { - "t": "users", - "c": "name" - }, - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\\\\"\")\"\"}\")" - }'::jsonb -); +-- 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}'); --- User with "LOW" value -INSERT INTO users (name_encrypted) VALUES ( - '{ - "v": 1, - "k": "ct", - "c": "low", - "i": { - "t": "users", - "c": "name" - }, - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")" - }'::jsonb -); +-- 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 FROM users WHERE cs_ore_64_8_v1(name_encrypted) > cs_ore_64_8_v1('{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"}'); -SELECT id, name_encrypted FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC; -SELECT id, name_encrypted FROM users ORDER BY name_encrypted; +-- SELECT id, name_encrypted FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC; --- SELECT id FROM users WHERE name_encrypted::cs_encrypted_v1 > '{ --- "v": 1, --- "k": "ct", --- "c": "ciphertext", --- "i": { --- "t": "users", --- "c": "name" --- }, --- "m": [1, 2, 3], --- "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")" --- }'::cs_encrypted_v1; +-- SELECT id, cs_ore_64_8_v1(name_encrypted) FROM users; --- SELECT * FROM users ORDER BY cs_ore_64_8_v1(name_encrypted) ASC; --- SELECT * FROM users ORDER BY name_encrypted USING <; --- EXPLAIN ANALYZE SELECT * FROM users ORDER BY name_encrypted ASC; +-- SANITY CHECK DATA +-- SELECT (encrypted_int2->>'o')::bytea[] FROM encrypted; --- SELECT data_type FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'name_encrypted'; --- EXPLAIN ANALYZE SELECT * FROM users ORDER BY name_encrypted::jsonb ASC; +SELECT id, encrypted_int2->>'c' FROM encrypted ORDER BY encrypted_int2 ASC; +SELECT id, encrypted_int2->>'c' FROM encrypted ORDER BY encrypted_int2 DESC; From 542df822141625d8f4569439be81a3b98c102d11 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 11 Feb 2025 17:35:12 +1100 Subject: [PATCH 06/15] Ore index as JSONB array --- sql/000-ore.sql | 233 ++++------------------ sql/011-core-functions.sql | 123 +++--------- sql/015-operators-eq.sql | 150 +-------------- sql/017-operators-ore.sql | 261 ++++++------------------- sql/666-drop-operators.sql | 12 -- sql/666-drop_types.sql | 2 +- tests/operators-ore-order.sql | 71 ++----- tests/operators-ore.sql | 350 +++++++++++----------------------- 8 files changed, 253 insertions(+), 949 deletions(-) diff --git a/sql/000-ore.sql b/sql/000-ore.sql index c94a64af..bad69f9e 100644 --- a/sql/000-ore.sql +++ b/sql/000-ore.sql @@ -1,23 +1,9 @@ CREATE EXTENSION IF NOT EXISTS pgcrypto; -CREATE TYPE ore_64_8_v1_term AS ( - bytes bytea -); - -CREATE TYPE ore_64_8_v1 AS ( - terms ore_64_8_v1_term[] -); - +CREATE DOMAIN ore_64_8_index_v1 AS bytea[]; -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; @@ -95,144 +81,6 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a bytea, b bytea) returns integer AS $$ $$ LANGUAGE plpgsql; -DROP FUNCTION IF EXISTS ore_64_8_v1_term_eq(a ore_64_8_v1_term, b ore_64_8_v1_term); - -CREATE FUNCTION ore_64_8_v1_term_eq(a ore_64_8_v1_term, b ore_64_8_v1_term) -RETURNS boolean AS $$ - SELECT compare_ore_64_8_v1_term(a, b) = 0 -$$ LANGUAGE SQL; - - -DROP FUNCTION IF EXISTS ore_64_8_v1_term_neq(a ore_64_8_v1_term, b ore_64_8_v1_term); - -CREATE FUNCTION ore_64_8_v1_term_neq(a ore_64_8_v1_term, b ore_64_8_v1_term) -RETURNS boolean AS $$ - SELECT compare_ore_64_8_v1_term(a, b) <> 0 -$$ LANGUAGE SQL; - - -DROP FUNCTION IF EXISTS ore_64_8_v1_term_lt(a ore_64_8_v1_term, b ore_64_8_v1_term); - -CREATE FUNCTION ore_64_8_v1_term_lt(a ore_64_8_v1_term, b ore_64_8_v1_term) -RETURNS boolean AS $$ - SELECT compare_ore_64_8_v1_term(a, b) = -1 -$$ LANGUAGE SQL; - - -DROP FUNCTION IF EXISTS ore_64_8_v1_term_lte(a ore_64_8_v1_term, b ore_64_8_v1_term); - -CREATE FUNCTION ore_64_8_v1_term_lte(a ore_64_8_v1_term, b ore_64_8_v1_term) -RETURNS boolean AS $$ - SELECT compare_ore_64_8_v1_term(a, b) != 1 -$$ LANGUAGE SQL; - - -DROP FUNCTION IF EXISTS ore_64_8_v1_term_gt(a ore_64_8_v1_term, b ore_64_8_v1_term); - -CREATE FUNCTION ore_64_8_v1_term_gt(a ore_64_8_v1_term, b ore_64_8_v1_term) -RETURNS boolean AS $$ - SELECT compare_ore_64_8_v1_term(a, b) = 1 -$$ LANGUAGE SQL; - - -DROP FUNCTION IF EXISTS ore_64_8_v1_term_gte(a ore_64_8_v1_term, b ore_64_8_v1_term); - -CREATE FUNCTION ore_64_8_v1_term_gte(a ore_64_8_v1_term, b ore_64_8_v1_term) -RETURNS boolean AS $$ - SELECT compare_ore_64_8_v1_term(a, b) != -1 -$$ LANGUAGE SQL; - - -DROP OPERATOR IF EXISTS = (ore_64_8_v1_term, ore_64_8_v1_term); - -CREATE OPERATOR = ( - PROCEDURE="ore_64_8_v1_term_eq", - LEFTARG=ore_64_8_v1_term, - RIGHTARG=ore_64_8_v1_term, - NEGATOR = <>, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, - MERGES -); - - -DROP OPERATOR IF EXISTS <> (ore_64_8_v1_term, ore_64_8_v1_term); - -CREATE OPERATOR <> ( - PROCEDURE="ore_64_8_v1_term_neq", - LEFTARG=ore_64_8_v1_term, - RIGHTARG=ore_64_8_v1_term, - NEGATOR = =, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, - MERGES -); - -DROP OPERATOR IF EXISTS > (ore_64_8_v1_term, ore_64_8_v1_term); - -CREATE OPERATOR > ( - PROCEDURE="ore_64_8_v1_term_gt", - LEFTARG=ore_64_8_v1_term, - RIGHTARG=ore_64_8_v1_term, - COMMUTATOR = <, - NEGATOR = <=, - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); - -DROP OPERATOR IF EXISTS < (ore_64_8_v1_term, ore_64_8_v1_term); - -CREATE OPERATOR < ( - PROCEDURE="ore_64_8_v1_term_lt", - LEFTARG=ore_64_8_v1_term, - RIGHTARG=ore_64_8_v1_term, - COMMUTATOR = >, - NEGATOR = >=, - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); - -DROP OPERATOR IF EXISTS <= (ore_64_8_v1_term, ore_64_8_v1_term); - -CREATE OPERATOR <= ( - PROCEDURE="ore_64_8_v1_term_lte", - LEFTARG=ore_64_8_v1_term, - RIGHTARG=ore_64_8_v1_term, - COMMUTATOR = >=, - NEGATOR = >, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - -DROP OPERATOR IF EXISTS >= (ore_64_8_v1_term, ore_64_8_v1_term); - -CREATE OPERATOR >= ( - PROCEDURE="ore_64_8_v1_term_gte", - LEFTARG=ore_64_8_v1_term, - RIGHTARG=ore_64_8_v1_term, - COMMUTATOR = <=, - NEGATOR = <, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - -DROP OPERATOR FAMILY IF EXISTS ore_64_8_v1_term_btree_ops USING btree; - -CREATE OPERATOR FAMILY ore_64_8_v1_term_btree_ops USING btree; - - -DROP OPERATOR CLASS IF EXISTS ore_64_8_v1_term_btree_ops USING btree; - -CREATE OPERATOR CLASS ore_64_8_v1_term_btree_ops DEFAULT FOR TYPE ore_64_8_v1_term USING btree FAMILY ore_64_8_v1_term_btree_ops AS - OPERATOR 1 <, - OPERATOR 2 <=, - OPERATOR 3 =, - OPERATOR 4 >=, - OPERATOR 5 >, - FUNCTION 1 compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term); - -- Compare the "head" of each array and recurse if necessary -- This function assumes an empty string is "less than" everything else -- so if a is empty we return -1, if be is empty and a isn't, we return 1. @@ -240,32 +88,33 @@ 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[]); --- 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 bytea[], b bytea[]) RETURNS integer AS $$ DECLARE cmp_result integer; + len_a integer; + len_b integer; BEGIN + + SELECT array_length(a, 1) INTO len_a; + SELECT array_length(b, 1) INTO len_b; + IF (array_length(a, 1) = 0 OR a IS NULL) AND (array_length(b, 1) = 0 OR b IS NULL) THEN RETURN 0; END IF; + IF array_length(a, 1) = 0 OR a IS NULL THEN RETURN -1; END IF; + IF array_length(b, 1) = 0 OR a IS NULL THEN RETURN 1; END IF; cmp_result := compare_ore_64_8_v1_term(a[1], b[1]); + IF cmp_result = 0 THEN -- Removes the first element in the array, and calls this fn again to compare the next element/s in the array. RETURN compare_ore_array(a[2:array_length(a,1)], b[2:array_length(b,1)]); @@ -276,24 +125,10 @@ RETURNS integer AS $$ $$ LANGUAGE plpgsql; -- This function uses lexicographic comparison -DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a ore_64_8_v1, b ore_64_8_v1); +DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a ore_64_8_index_v1, b ore_64_8_index_v1); -CREATE FUNCTION compare_ore_64_8_v1(a ore_64_8_v1, b ore_64_8_v1) +CREATE FUNCTION compare_ore_64_8_v1(a ore_64_8_index_v1, b ore_64_8_index_v1) 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.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); @@ -301,55 +136,57 @@ RETURNS integer AS $$ $$ LANGUAGE plpgsql; -DROP FUNCTION IF EXISTS ore_64_8_v1_eq(a ore_64_8_v1, b ore_64_8_v1); +DROP FUNCTION IF EXISTS ore_64_8_v1_eq(a ore_64_8_index_v1, b ore_64_8_index_v1); -CREATE FUNCTION ore_64_8_v1_eq(a ore_64_8_v1, b ore_64_8_v1) +CREATE FUNCTION ore_64_8_v1_eq(a ore_64_8_index_v1, b ore_64_8_index_v1) RETURNS boolean AS $$ SELECT compare_ore_64_8_v1(a, b) = 0 $$ LANGUAGE SQL; -DROP FUNCTION IF EXISTS ore_64_8_v1_neq(a ore_64_8_v1, b ore_64_8_v1); +DROP FUNCTION IF EXISTS ore_64_8_v1_neq(a ore_64_8_index_v1, b ore_64_8_index_v1); -CREATE FUNCTION ore_64_8_v1_neq(a ore_64_8_v1, b ore_64_8_v1) +CREATE FUNCTION ore_64_8_v1_neq(a ore_64_8_index_v1, b ore_64_8_index_v1) RETURNS boolean AS $$ SELECT compare_ore_64_8_v1(a, b) <> 0 $$ LANGUAGE SQL; -DROP FUNCTION IF EXISTS ore_64_8_v1_lt(a ore_64_8_v1, b ore_64_8_v1); +DROP FUNCTION IF EXISTS ore_64_8_v1_lt(a ore_64_8_index_v1, b ore_64_8_index_v1); -CREATE FUNCTION ore_64_8_v1_lt(a ore_64_8_v1, b ore_64_8_v1) +CREATE FUNCTION ore_64_8_v1_lt(a ore_64_8_index_v1, b ore_64_8_index_v1) RETURNS boolean AS $$ SELECT compare_ore_64_8_v1(a, b) = -1 $$ LANGUAGE SQL; -DROP FUNCTION IF EXISTS ore_64_8_v1_lte(a ore_64_8_v1, b ore_64_8_v1); +DROP FUNCTION IF EXISTS ore_64_8_v1_lte(a ore_64_8_index_v1, b ore_64_8_index_v1); -CREATE FUNCTION ore_64_8_v1_lte(a ore_64_8_v1, b ore_64_8_v1) +CREATE FUNCTION ore_64_8_v1_lte(a ore_64_8_index_v1, b ore_64_8_index_v1) RETURNS boolean AS $$ SELECT compare_ore_64_8_v1(a, b) != 1 $$ LANGUAGE SQL; -DROP FUNCTION IF EXISTS ore_64_8_v1_gt(a ore_64_8_v1, b ore_64_8_v1); +DROP FUNCTION IF EXISTS ore_64_8_v1_gt(a ore_64_8_index_v1, b ore_64_8_index_v1); -CREATE FUNCTION ore_64_8_v1_gt(a ore_64_8_v1, b ore_64_8_v1) +CREATE FUNCTION ore_64_8_v1_gt(a ore_64_8_index_v1, b ore_64_8_index_v1) RETURNS boolean AS $$ - SELECT compare_ore_64_8_v1(a, b) = 1 -$$ LANGUAGE SQL; + BEGIN + SELECT compare_ore_64_8_v1(a, b) = 1; + END; +$$ LANGUAGE plpgsql; -DROP FUNCTION IF EXISTS ore_64_8_v1_gte(a ore_64_8_v1, b ore_64_8_v1); +DROP FUNCTION IF EXISTS ore_64_8_v1_gte(a ore_64_8_index_v1, b ore_64_8_index_v1); -CREATE FUNCTION ore_64_8_v1_gte(a ore_64_8_v1, b ore_64_8_v1) +CREATE FUNCTION ore_64_8_v1_gte(a ore_64_8_index_v1, b ore_64_8_index_v1) RETURNS boolean AS $$ SELECT compare_ore_64_8_v1(a, b) != -1 $$ LANGUAGE SQL; -DROP OPERATOR IF EXISTS = (ore_64_8_v1, ore_64_8_v1); +DROP OPERATOR IF EXISTS = (ore_64_8_index_v1, ore_64_8_index_v1); CREATE OPERATOR = ( PROCEDURE="ore_64_8_v1_eq", @@ -363,7 +200,7 @@ CREATE OPERATOR = ( ); -DROP OPERATOR IF EXISTS <> (ore_64_8_v1, ore_64_8_v1); +DROP OPERATOR IF EXISTS <> (ore_64_8_index_v1, ore_64_8_index_v1); CREATE OPERATOR <> ( PROCEDURE="ore_64_8_v1_neq", @@ -376,7 +213,7 @@ CREATE OPERATOR <> ( MERGES ); -DROP OPERATOR IF EXISTS > (ore_64_8_v1, ore_64_8_v1); +DROP OPERATOR IF EXISTS > (ore_64_8_index_v1, ore_64_8_index_v1); CREATE OPERATOR > ( PROCEDURE="ore_64_8_v1_gt", @@ -389,7 +226,7 @@ CREATE OPERATOR > ( ); -DROP OPERATOR IF EXISTS < (ore_64_8_v1, ore_64_8_v1); +DROP OPERATOR IF EXISTS < (ore_64_8_index_v1, ore_64_8_index_v1); CREATE OPERATOR < ( PROCEDURE="ore_64_8_v1_lt", @@ -402,7 +239,7 @@ CREATE OPERATOR < ( ); -DROP OPERATOR IF EXISTS <= (ore_64_8_v1, ore_64_8_v1); +DROP OPERATOR IF EXISTS <= (ore_64_8_index_v1, ore_64_8_index_v1); CREATE OPERATOR <= ( PROCEDURE="ore_64_8_v1_lte", @@ -415,7 +252,7 @@ CREATE OPERATOR <= ( ); -DROP OPERATOR IF EXISTS >= (ore_64_8_v1, ore_64_8_v1); +DROP OPERATOR IF EXISTS >= (ore_64_8_index_v1, ore_64_8_index_v1); CREATE OPERATOR >= ( PROCEDURE="ore_64_8_v1_gte", @@ -441,4 +278,4 @@ CREATE OPERATOR CLASS ore_64_8_v1_btree_ops DEFAULT FOR TYPE ore_64_8_v1 USING b OPERATOR 3 =, OPERATOR 4 >=, OPERATOR 5 >, - FUNCTION 1 compare_ore_64_8_v1(a ore_64_8_v1, b ore_64_8_v1); + FUNCTION 1 compare_ore_64_8_v1(a ore_64_8_index_v1, b ore_64_8_index_v1); diff --git a/sql/011-core-functions.sql b/sql/011-core-functions.sql index af4312ff..07e0aaa0 100644 --- a/sql/011-core-functions.sql +++ b/sql/011-core-functions.sql @@ -1,6 +1,6 @@ DROP FUNCTION IF EXISTS cs_ciphertext_v1_v0_0(val jsonb); -CREATE FUNCTION cs_ciphertext_v1_v0_0(val jsonb) +CREATE FUNCTION cs_ciphertext_v1(val jsonb) RETURNS text IMMUTABLE STRICT PARALLEL SAFE AS $$ @@ -13,30 +13,13 @@ AS $$ $$ LANGUAGE plpgsql; -DROP FUNCTION IF EXISTS cs_ciphertext_v1_v0(val jsonb); - -CREATE FUNCTION cs_ciphertext_v1_v0(val jsonb) - RETURNS text - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN cs_ciphertext_v1_v0_0(val); -END; - - -DROP FUNCTION IF EXISTS cs_ciphertext_v1(val jsonb); - -CREATE FUNCTION cs_ciphertext_v1(val jsonb) - RETURNS text - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN cs_ciphertext_v1_v0_0(val); -END; +----------------------------------------------------------------------------- -- extracts match index from an emcrypted column -DROP FUNCTION IF EXISTS cs_match_v1_v0_0(val jsonb); +DROP FUNCTION IF EXISTS cs_match_v1(val jsonb); -CREATE FUNCTION cs_match_v1_v0_0(val jsonb) +CREATE FUNCTION cs_match_v1(val jsonb) RETURNS cs_match_index_v1 IMMUTABLE STRICT PARALLEL SAFE AS $$ @@ -48,31 +31,13 @@ AS $$ END; $$ LANGUAGE plpgsql; - -DROP FUNCTION IF EXISTS cs_match_v1_v0(val jsonb); - -CREATE FUNCTION cs_match_v1_v0(val jsonb) - RETURNS cs_match_index_v1 - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN cs_match_v1_v0_0(val); -END; - - -DROP FUNCTION IF EXISTS cs_match_v1(val jsonb); - -CREATE FUNCTION cs_match_v1(val jsonb) - RETURNS cs_match_index_v1 - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN cs_match_v1_v0_0(val); -END; +----------------------------------------------------------------------------- -- extracts unique index from an encrypted column -DROP FUNCTION IF EXISTS cs_unique_v1_v0_0(val jsonb); +DROP FUNCTION IF EXISTS cs_unique_v1(val jsonb); -CREATE FUNCTION cs_unique_v1_v0_0(val jsonb) +CREATE FUNCTION cs_unique_v1(val jsonb) RETURNS cs_unique_index_v1 IMMUTABLE STRICT PARALLEL SAFE AS $$ @@ -85,29 +50,12 @@ AS $$ $$ LANGUAGE plpgsql; -DROP FUNCTION IF EXISTS cs_unique_v1_v0(val jsonb); - -CREATE FUNCTION cs_unique_v1_v0(val jsonb) - RETURNS cs_unique_index_v1 - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN cs_unique_v1_v0_0(val); -END; - - -DROP FUNCTION IF EXISTS cs_unique_v1(val jsonb); - -CREATE FUNCTION cs_unique_v1(val jsonb) - RETURNS cs_unique_index_v1 - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN cs_unique_v1_v0_0(val); -END; +----------------------------------------------------------------------------- -- extracts json ste_vec index from an encrypted column -DROP FUNCTION IF EXISTS cs_ste_vec_v1_v0_0(val jsonb); +DROP FUNCTION IF EXISTS cs_ste_vec_v1(val jsonb); -CREATE FUNCTION cs_ste_vec_v1_v0_0(val jsonb) +CREATE FUNCTION cs_ste_vec_v1(val jsonb) RETURNS cs_ste_vec_index_v1 IMMUTABLE STRICT PARALLEL SAFE AS $$ @@ -119,60 +67,33 @@ AS $$ END; $$ LANGUAGE plpgsql; +----------------------------------------------------------------------------- -DROP FUNCTION IF EXISTS cs_ste_vec_v1_v0(val jsonb); - -CREATE FUNCTION cs_ste_vec_v1_v0(val jsonb) - RETURNS cs_ste_vec_index_v1 - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN cs_ste_vec_v1_v0_0(val); -END; +DROP FUNCTION IF EXISTS jsonb_array_to_bytea_array(val jsonb); -DROP FUNCTION IF EXISTS cs_ste_vec_v1(val jsonb); - -CREATE FUNCTION cs_ste_vec_v1(val jsonb) - RETURNS cs_ste_vec_index_v1 - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN cs_ste_vec_v1_v0_0(val); -END; - +CREATE FUNCTION jsonb_array_to_bytea_array(jsonb) +RETURNS bytea[] AS $$ + -- SELECT array_agg(decode(term, 'hex'))::bytea[] || ARRAY[]::bytea[] FROM jsonb_array_elements_text($1) t(term); + SELECT array_agg(term)::bytea[] || ARRAY[]::bytea[] FROM jsonb_array_elements_text($1) t(term); +$$ LANGUAGE sql IMMUTABLE; --- extracts ore index from an encrypted column -DROP FUNCTION IF EXISTS cs_ore_64_8_v1_v0_0(val jsonb); +DROP FUNCTION IF EXISTS cs_ore_64_8_v1(val jsonb); -CREATE FUNCTION cs_ore_64_8_v1_v0_0(val jsonb) - RETURNS bytea[] +CREATE FUNCTION cs_ore_64_8_v1(val jsonb) + RETURNS ore_64_8_index_v1 IMMUTABLE STRICT PARALLEL SAFE AS $$ BEGIN IF val ? 'o' THEN - RETURN (val->>'o')::bytea[]; + RETURN jsonb_array_to_bytea_array(val->'o'); END IF; RAISE 'Expected an ore index (o) value in json: %', val; END; $$ 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 bytea[] - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN cs_ore_64_8_v1_v0_0(val); -END; - -DROP FUNCTION IF EXISTS cs_ore_64_8_v1(val jsonb); - -CREATE FUNCTION cs_ore_64_8_v1(val jsonb) - RETURNS bytea[] - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN cs_ore_64_8_v1_v0_0(val); -END; DROP FUNCTION IF EXISTS _cs_first_grouped_value(jsonb, jsonb); diff --git a/sql/015-operators-eq.sql b/sql/015-operators-eq.sql index 5b79543e..d898f31b 100644 --- a/sql/015-operators-eq.sql +++ b/sql/015-operators-eq.sql @@ -28,7 +28,7 @@ AS $$ END; BEGIN - o := (SELECT cs_ore_64_8_v1(a) = cs_ore_64_8_v1(b)); + o := (SELECT cs_encrypted_ore_64_8_compare_v1(a, b) = 0); EXCEPTION WHEN OTHERS THEN o := false; END; @@ -67,7 +67,7 @@ AS $$ END; BEGIN - o := (SELECT cs_ore_64_8_v1(a) = cs_ore_64_8_v1(b)); + o := (SELECT cs_encrypted_ore_64_8_compare_v1(a, b) = 0); EXCEPTION WHEN OTHERS THEN o := false; END; @@ -106,7 +106,7 @@ AS $$ END; BEGIN - o := (SELECT cs_ore_64_8_v1(a) = cs_ore_64_8_v1(b)); + o := (SELECT cs_encrypted_ore_64_8_compare_v1(a, b) = 0); EXCEPTION WHEN OTHERS THEN o := false; END; @@ -193,77 +193,9 @@ CREATE OPERATOR =( ); - -DROP OPERATOR IF EXISTS = (cs_encrypted_v1, ore_64_8_v1); -DROP FUNCTION IF EXISTS cs_encrypted_eq_v1(a cs_encrypted_v1, b ore_64_8_v1); - -CREATE FUNCTION cs_encrypted_eq_v1(a cs_encrypted_v1, b ore_64_8_v1) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - DECLARE - o boolean; - BEGIN - - BEGIN - o := (SELECT cs_ore_64_8_v1(a) = b); - EXCEPTION WHEN OTHERS THEN - o := false; - END; - - RETURN o; - END; -$$ LANGUAGE plpgsql; - - -CREATE OPERATOR = ( - PROCEDURE="cs_encrypted_eq_v1", - LEFTARG=cs_encrypted_v1, - RIGHTARG=ore_64_8_v1, - NEGATOR = <>, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, - MERGES -); - -DROP OPERATOR IF EXISTS = (ore_64_8_v1, cs_encrypted_v1); -DROP FUNCTION IF EXISTS cs_encrypted_eq_v1(a ore_64_8_v1, b cs_encrypted_v1); - -CREATE FUNCTION cs_encrypted_eq_v1(a ore_64_8_v1, b cs_encrypted_v1) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - DECLARE - o boolean; - BEGIN - - BEGIN - o := (SELECT a = cs_ore_64_8_v1(b)); - EXCEPTION WHEN OTHERS THEN - o := false; - END; - - RETURN o; - END; -$$ LANGUAGE plpgsql; - - -CREATE OPERATOR =( - PROCEDURE="cs_encrypted_eq_v1", - LEFTARG=ore_64_8_v1, - RIGHTARG=cs_encrypted_v1, - NEGATOR = <>, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, - MERGES -); - - - --- ------------------------------------------------------------ + DROP OPERATOR IF EXISTS <> (cs_encrypted_v1, cs_encrypted_v1); DROP FUNCTION IF EXISTS cs_encrypted_neq_v1(a cs_encrypted_v1, b cs_encrypted_v1); @@ -282,7 +214,7 @@ AS $$ END; BEGIN - o := (SELECT cs_ore_64_8_v1(a) <> cs_ore_64_8_v1(b)); + o := (SELECT cs_encrypted_ore_64_8_compare_v1(a, b) <> 0); EXCEPTION WHEN OTHERS THEN o := false; END; @@ -321,7 +253,7 @@ AS $$ END; BEGIN - o := (SELECT cs_ore_64_8_v1(a) <> cs_ore_64_8_v1(b)); + o := (SELECT cs_encrypted_ore_64_8_compare_v1(a, b) <> 0); EXCEPTION WHEN OTHERS THEN o := false; END; @@ -360,7 +292,7 @@ AS $$ END; BEGIN - o := (SELECT cs_ore_64_8_v1(a) <> cs_ore_64_8_v1(b)); + o := (SELECT cs_encrypted_ore_64_8_compare_v1(a, b) <> 0); EXCEPTION WHEN OTHERS THEN o := false; END; @@ -455,71 +387,3 @@ CREATE OPERATOR <> ( ); - - -DROP OPERATOR IF EXISTS <> (cs_encrypted_v1, ore_64_8_v1); -DROP FUNCTION IF EXISTS cs_encrypted_neq_v1(a cs_encrypted_v1, b ore_64_8_v1); - -CREATE FUNCTION cs_encrypted_neq_v1(a cs_encrypted_v1, b ore_64_8_v1) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - DECLARE - o boolean; - BEGIN - BEGIN - o := (SELECT cs_ore_64_8_v1(a) <> b); - EXCEPTION WHEN OTHERS THEN - o := false; - END; - - RETURN o; - END; -$$ LANGUAGE plpgsql; - -CREATE OPERATOR <> ( - PROCEDURE="cs_encrypted_neq_v1", - LEFTARG=cs_encrypted_v1, - RIGHTARG=ore_64_8_v1, - NEGATOR = =, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, - MERGES -); - - -DROP OPERATOR IF EXISTS <> (ore_64_8_v1, cs_encrypted_v1); -DROP FUNCTION IF EXISTS cs_encrypted_neq_v1(a ore_64_8_v1, b cs_encrypted_v1); - -CREATE FUNCTION cs_encrypted_neq_v1(a ore_64_8_v1, b cs_encrypted_v1) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - DECLARE - o boolean; - BEGIN - - BEGIN - o := (SELECT a <> cs_ore_64_8_v1(b)); - EXCEPTION WHEN OTHERS THEN - o := false; - END; - - RETURN o; - END; -$$ LANGUAGE plpgsql; - -CREATE OPERATOR <> ( - PROCEDURE="cs_encrypted_neq_v1", - LEFTARG=ore_64_8_v1, - RIGHTARG=cs_encrypted_v1, - NEGATOR = =, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, - MERGES -); - - - diff --git a/sql/017-operators-ore.sql b/sql/017-operators-ore.sql index 893f3855..ba59de5c 100644 --- a/sql/017-operators-ore.sql +++ b/sql/017-operators-ore.sql @@ -7,13 +7,43 @@ -- cs_encrypted_v1 > ore_64_8_v1 -- +DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_compare_v1(a cs_encrypted_v1, b cs_encrypted_v1); + +CREATE FUNCTION cs_encrypted_ore_64_8_compare_v1(a cs_encrypted_v1, b cs_encrypted_v1) + RETURNS integer AS $$ + SELECT cs_encrypted_ore_64_8_compare_v1(a::jsonb, b::jsonb) +$$ LANGUAGE sql; + + +DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_compare_v1(a jsonb, b jsonb); + +CREATE FUNCTION cs_encrypted_ore_64_8_compare_v1(a jsonb, b jsonb) + RETURNS integer AS $$ + DECLARE + a_ore ore_64_8_index_v1; + b_ore ore_64_8_index_v1; + result integer; + BEGIN + + SELECT cs_ore_64_8_v1(a) INTO a_ore; + SELECT cs_ore_64_8_v1(b) INTO b_ore; + + SELECT compare_ore_64_8_v1(a_ore, b_ore) INTO result; + + RETURN result; + END; +$$ LANGUAGE plpgsql; + +----------------------------------------------------------------------------------------- + + DROP OPERATOR IF EXISTS > (cs_encrypted_v1, cs_encrypted_v1); DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_gt_v1(a cs_encrypted_v1, b cs_encrypted_v1); CREATE FUNCTION cs_encrypted_ore_64_8_v1_gt_v1(a cs_encrypted_v1, b cs_encrypted_v1) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) > cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) = 1 +$$ LANGUAGE sql; CREATE OPERATOR >( PROCEDURE="cs_encrypted_ore_64_8_v1_gt_v1", @@ -31,8 +61,8 @@ DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_gt_v1(a cs_encrypted_v1, b json CREATE FUNCTION cs_encrypted_ore_64_8_v1_gt_v1(a cs_encrypted_v1, b jsonb) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) > cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) = 1 +$$ LANGUAGE sql; CREATE OPERATOR >( PROCEDURE="cs_encrypted_ore_64_8_v1_gt_v1", @@ -45,33 +75,14 @@ CREATE OPERATOR >( ); -DROP OPERATOR IF EXISTS > (cs_encrypted_v1, ore_64_8_v1); -DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_gt_v1(a cs_encrypted_v1, b ore_64_8_v1); - -CREATE FUNCTION cs_encrypted_ore_64_8_v1_gt_v1(a cs_encrypted_v1, b ore_64_8_v1) -RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) > b; -$$ LANGUAGE SQL; - -CREATE OPERATOR >( - PROCEDURE="cs_encrypted_ore_64_8_v1_gt_v1", - LEFTARG=cs_encrypted_v1, - RIGHTARG=ore_64_8_v1, - COMMUTATOR = <, - NEGATOR = <=, - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); - - DROP OPERATOR IF EXISTS > (jsonb, cs_encrypted_v1); DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_gt_v1(a jsonb, b cs_encrypted_v1); CREATE FUNCTION cs_encrypted_ore_64_8_v1_gt_v1(a jsonb, b cs_encrypted_v1) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) > cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) = 1 +$$ LANGUAGE sql; CREATE OPERATOR >( PROCEDURE="cs_encrypted_ore_64_8_v1_gt_v1", @@ -84,25 +95,6 @@ CREATE OPERATOR >( ); -DROP OPERATOR IF EXISTS > (ore_64_8_v1, cs_encrypted_v1); -DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_gt_v1(a ore_64_8_v1, b cs_encrypted_v1); - -CREATE FUNCTION cs_encrypted_ore_64_8_v1_gt_v1(a ore_64_8_v1, b cs_encrypted_v1) -RETURNS boolean AS $$ - SELECT a > cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; - -CREATE OPERATOR >( - PROCEDURE="cs_encrypted_ore_64_8_v1_gt_v1", - LEFTARG=ore_64_8_v1, - RIGHTARG=cs_encrypted_v1, - COMMUTATOR = <, - NEGATOR = <=, - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); - - ----------------------------------------------------------------------------------------- -- LT @@ -112,8 +104,13 @@ DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_lt_v1(a cs_encrypted_v1, b cs_e CREATE FUNCTION cs_encrypted_ore_64_8_v1_lt_v1(a cs_encrypted_v1, b cs_encrypted_v1) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) < cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + DECLARE + result integer; + BEGIN + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) INTO result; + RETURN result = -1; + END; +$$ LANGUAGE plpgsql; CREATE OPERATOR <( PROCEDURE="cs_encrypted_ore_64_8_v1_lt_v1", @@ -131,8 +128,8 @@ DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_lt_v1(a cs_encrypted_v1, b json CREATE FUNCTION cs_encrypted_ore_64_8_v1_lt_v1(a cs_encrypted_v1, b jsonb) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) < cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) = -1 +$$ LANGUAGE sql; CREATE OPERATOR <( PROCEDURE="cs_encrypted_ore_64_8_v1_lt_v1", @@ -150,8 +147,8 @@ DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_lt_v1(a jsonb, b cs_encrypted_v CREATE FUNCTION cs_encrypted_ore_64_8_v1_lt_v1(a jsonb, b cs_encrypted_v1) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) < cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) = -1 +$$ LANGUAGE sql; CREATE OPERATOR <( PROCEDURE="cs_encrypted_ore_64_8_v1_lt_v1", @@ -165,44 +162,6 @@ CREATE OPERATOR <( -DROP OPERATOR IF EXISTS <(cs_encrypted_v1, ore_64_8_v1); -DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_lt_v1(a cs_encrypted_v1, b ore_64_8_v1); - -CREATE FUNCTION cs_encrypted_ore_64_8_v1_lt_v1(a cs_encrypted_v1, b ore_64_8_v1) -RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) < b; -$$ LANGUAGE SQL; - -CREATE OPERATOR <( - PROCEDURE="cs_encrypted_ore_64_8_v1_lt_v1", - LEFTARG=cs_encrypted_v1, - RIGHTARG=ore_64_8_v1, - COMMUTATOR = >, - NEGATOR = >=, - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); - - -DROP OPERATOR IF EXISTS <(ore_64_8_v1, cs_encrypted_v1); -DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_lt_v1(a ore_64_8_v1, b cs_encrypted_v1); - -CREATE FUNCTION cs_encrypted_ore_64_8_v1_lt_v1(a ore_64_8_v1, b cs_encrypted_v1) -RETURNS boolean AS $$ - SELECT a < cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; - -CREATE OPERATOR <( - PROCEDURE="cs_encrypted_ore_64_8_v1_lt_v1", - LEFTARG=ore_64_8_v1, - RIGHTARG=cs_encrypted_v1, - COMMUTATOR = >, - NEGATOR = >=, - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); - - ----------------------------------------------------------------------------------------- @@ -211,8 +170,8 @@ DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_gte_v1(a cs_encrypted_v1, b cs_ CREATE FUNCTION cs_encrypted_ore_64_8_v1_gte_v1(a cs_encrypted_v1, b cs_encrypted_v1) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) >= cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) != -1 +$$ LANGUAGE sql; CREATE OPERATOR >=( PROCEDURE="cs_encrypted_ore_64_8_v1_gte_v1", @@ -230,8 +189,8 @@ DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_gte_v1(a cs_encrypted_v1, b jso CREATE FUNCTION cs_encrypted_ore_64_8_v1_gte_v1(a cs_encrypted_v1, b jsonb) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) >= cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) != -1; +$$ LANGUAGE sql; CREATE OPERATOR >=( PROCEDURE="cs_encrypted_ore_64_8_v1_gte_v1", @@ -244,32 +203,14 @@ CREATE OPERATOR >=( ); -DROP OPERATOR IF EXISTS >= (cs_encrypted_v1, ore_64_8_v1); -DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_gte_v1(a cs_encrypted_v1, b ore_64_8_v1); - -CREATE FUNCTION cs_encrypted_ore_64_8_v1_gte_v1(a cs_encrypted_v1, b ore_64_8_v1) -RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) >= b; -$$ LANGUAGE SQL; - -CREATE OPERATOR >=( - PROCEDURE="cs_encrypted_ore_64_8_v1_gte_v1", - LEFTARG=cs_encrypted_v1, - RIGHTARG=ore_64_8_v1, - COMMUTATOR = <=, - NEGATOR = <, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - DROP OPERATOR IF EXISTS >= (jsonb, cs_encrypted_v1); DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_gte_v1(a jsonb, b cs_encrypted_v1); CREATE FUNCTION cs_encrypted_ore_64_8_v1_gte_v1(a jsonb, b cs_encrypted_v1) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) >= cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) != -1 +$$ LANGUAGE sql; CREATE OPERATOR >=( PROCEDURE="cs_encrypted_ore_64_8_v1_gte_v1", @@ -282,25 +223,6 @@ CREATE OPERATOR >=( ); -DROP OPERATOR IF EXISTS >=(ore_64_8_v1, cs_encrypted_v1); -DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_gte_v1(a ore_64_8_v1, b cs_encrypted_v1); - -CREATE FUNCTION cs_encrypted_ore_64_8_v1_gte_v1(a ore_64_8_v1, b cs_encrypted_v1) -RETURNS boolean AS $$ - SELECT a >= cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; - -CREATE OPERATOR >=( - PROCEDURE="cs_encrypted_ore_64_8_v1_gte_v1", - LEFTARG=ore_64_8_v1, - RIGHTARG=cs_encrypted_v1, - COMMUTATOR = <=, - NEGATOR = <, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - - ----------------------------------------------------------------------------------------- @@ -309,8 +231,8 @@ DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_lte_v1(a cs_encrypted_v1, b cs_ CREATE FUNCTION cs_encrypted_ore_64_8_v1_lte_v1(a cs_encrypted_v1, b cs_encrypted_v1) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) <= cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) != 1 +$$ LANGUAGE sql; CREATE OPERATOR <=( PROCEDURE="cs_encrypted_ore_64_8_v1_lte_v1", @@ -328,8 +250,8 @@ DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_lte_v1(a cs_encrypted_v1, b jso CREATE FUNCTION cs_encrypted_ore_64_8_v1_lte_v1(a cs_encrypted_v1, b jsonb) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) <= cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) != 1 +$$ LANGUAGE sql; CREATE OPERATOR <=( PROCEDURE="cs_encrypted_ore_64_8_v1_lte_v1", @@ -347,8 +269,8 @@ DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_lte_v1(a jsonb, b cs_encrypted_ CREATE FUNCTION cs_encrypted_ore_64_8_v1_lte_v1(a jsonb, b cs_encrypted_v1) RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) <= cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; + SELECT cs_encrypted_ore_64_8_compare_v1(a, b) != 1 +$$ LANGUAGE sql; CREATE OPERATOR <=( PROCEDURE="cs_encrypted_ore_64_8_v1_lte_v1", @@ -361,69 +283,6 @@ CREATE OPERATOR <=( ); -DROP OPERATOR IF EXISTS <= (cs_encrypted_v1, ore_64_8_v1); -DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_lte_v1(a cs_encrypted_v1, b ore_64_8_v1); - -CREATE FUNCTION cs_encrypted_ore_64_8_v1_lte_v1(a cs_encrypted_v1, b ore_64_8_v1) -RETURNS boolean AS $$ - SELECT cs_ore_64_8_v1(a) <= b; -$$ LANGUAGE SQL; - -CREATE OPERATOR <=( - PROCEDURE="cs_encrypted_ore_64_8_v1_lte_v1", - LEFTARG=cs_encrypted_v1, - RIGHTARG=ore_64_8_v1, - COMMUTATOR = >=, - NEGATOR = >, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - - -DROP OPERATOR IF EXISTS <= (ore_64_8_v1, cs_encrypted_v1); -DROP FUNCTION IF EXISTS cs_encrypted_ore_64_8_v1_lte_v1(a ore_64_8_v1, b cs_encrypted_v1); - -CREATE FUNCTION cs_encrypted_ore_64_8_v1_lte_v1(a ore_64_8_v1, b cs_encrypted_v1) -RETURNS boolean AS $$ - SELECT a <= cs_ore_64_8_v1(b); -$$ LANGUAGE SQL; - -CREATE OPERATOR <=( - PROCEDURE="cs_encrypted_ore_64_8_v1_lte_v1", - LEFTARG=ore_64_8_v1, - RIGHTARG=cs_encrypted_v1, - COMMUTATOR = >=, - NEGATOR = >, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - - ------------------------------------------------------------------------------------------ - -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 - - SELECT cs_ore_64_8_v1(a) INTO a_ore; - SELECT cs_ore_64_8_v1(b) INTO b_ore; - - 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; - - ----------------------------------------------------------------------------------------- @@ -441,4 +300,4 @@ FOR TYPE cs_encrypted_v1 USING btree OPERATOR 3 =, OPERATOR 4 >=, OPERATOR 5 >, - FUNCTION 1 cs_encrypted_ore_64_8_compare(a cs_encrypted_v1, b cs_encrypted_v1); + FUNCTION 1 cs_encrypted_ore_64_8_compare_v1(a cs_encrypted_v1, b cs_encrypted_v1); diff --git a/sql/666-drop-operators.sql b/sql/666-drop-operators.sql index d8cd6604..b0024e8b 100644 --- a/sql/666-drop-operators.sql +++ b/sql/666-drop-operators.sql @@ -9,27 +9,19 @@ 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); -DROP OPERATOR IF EXISTS <= (ore_64_8_v1, cs_encrypted_v1); -DROP OPERATOR IF EXISTS <= (cs_encrypted_v1, ore_64_8_v1); DROP OPERATOR IF EXISTS <= (jsonb, cs_encrypted_v1); DROP OPERATOR IF EXISTS <= (cs_encrypted_v1, jsonb); DROP OPERATOR IF EXISTS <= (cs_encrypted_v1, cs_encrypted_v1); -DROP OPERATOR IF EXISTS >= (ore_64_8_v1, cs_encrypted_v1); DROP OPERATOR IF EXISTS >= (jsonb, cs_encrypted_v1); -DROP OPERATOR IF EXISTS >= (cs_encrypted_v1, ore_64_8_v1); DROP OPERATOR IF EXISTS >= (cs_encrypted_v1, jsonb); DROP OPERATOR IF EXISTS >= (cs_encrypted_v1, cs_encrypted_v1); -DROP OPERATOR IF EXISTS < (ore_64_8_v1, cs_encrypted_v1); -DROP OPERATOR IF EXISTS < (cs_encrypted_v1, ore_64_8_v1); DROP OPERATOR IF EXISTS < (jsonb, cs_encrypted_v1); DROP OPERATOR IF EXISTS < (cs_encrypted_v1, jsonb); DROP OPERATOR IF EXISTS < (cs_encrypted_v1, cs_encrypted_v1); -DROP OPERATOR IF EXISTS > (ore_64_8_v1, cs_encrypted_v1); DROP OPERATOR IF EXISTS > (jsonb, cs_encrypted_v1); -DROP OPERATOR IF EXISTS > (cs_encrypted_v1, ore_64_8_v1); DROP OPERATOR IF EXISTS > (cs_encrypted_v1, jsonb); DROP OPERATOR IF EXISTS > (cs_encrypted_v1, cs_encrypted_v1); @@ -38,13 +30,9 @@ DROP OPERATOR IF EXISTS = (cs_encrypted_v1, jsonb); DROP OPERATOR IF EXISTS = (jsonb, cs_encrypted_v1); DROP OPERATOR IF EXISTS = (cs_encrypted_v1, cs_unique_index_v1); DROP OPERATOR IF EXISTS = (cs_unique_index_v1, cs_encrypted_v1); -DROP OPERATOR IF EXISTS = (cs_encrypted_v1, ore_64_8_v1); -DROP OPERATOR IF EXISTS = (ore_64_8_v1, cs_encrypted_v1); DROP OPERATOR IF EXISTS <> (cs_encrypted_v1, cs_encrypted_v1); DROP OPERATOR IF EXISTS <> (cs_encrypted_v1, jsonb); DROP OPERATOR IF EXISTS <> (jsonb, cs_encrypted_v1); DROP OPERATOR IF EXISTS <> (cs_encrypted_v1, cs_unique_index_v1); DROP OPERATOR IF EXISTS <> (cs_unique_index_v1, cs_encrypted_v1); -DROP OPERATOR IF EXISTS <> (ore_64_8_v1, cs_encrypted_v1); -DROP OPERATOR IF EXISTS <> (cs_encrypted_v1, ore_64_8_v1); diff --git a/sql/666-drop_types.sql b/sql/666-drop_types.sql index 8de0cb64..c3cadd23 100644 --- a/sql/666-drop_types.sql +++ b/sql/666-drop_types.sql @@ -1,6 +1,6 @@ -- ANYTHING THAT NEEDS TO BE DROPPED LAST DROP TYPE IF EXISTS ore_64_8_v1; -DROP TYPE IF EXISTS ore_64_8_v1_term; +-- DROP TYPE IF EXISTS ore_64_8_v1_term; DROP TYPE IF EXISTS cs_ste_vec_index_v1; DROP TYPE IF EXISTS cs_ste_vec_v1_entry; DROP TYPE IF EXISTS ore_cllw_8_v1; diff --git a/tests/operators-ore-order.sql b/tests/operators-ore-order.sql index 6060acef..b9544ca0 100644 --- a/tests/operators-ore-order.sql +++ b/tests/operators-ore-order.sql @@ -1,10 +1,9 @@ \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, + id bigint, encrypted_int2 cs_encrypted_v1, PRIMARY KEY(id) ); @@ -12,71 +11,31 @@ CREATE TABLE encrypted 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}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (99, '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d771b05d53e9237f5a015095a24dd7447e1e3f27b152b463089f1ed90cdf3fa6f0597a3256edb06196fe0d09d0b188edf0e213f61339c93041f3c8f9e40621e131a1bb9d27f7d2af8a7706dead7858171a52c82b074694d269ad562ba0f793f2f3980b54f76873996e7cd5894c153c339d0137360871fc7ffead9621cbe954bdaf471610f5cb27b18982a6ef333d34bb7c5ffb766a4f77b1063aabbd58a8e76d0f2f7af7bc3c2e868eeeef00537e13d9bdb13d0c30b148f2276189043d48c525744c47644f26d375d18029da11f959734b5e54c15ae235d35db204a6c4e88162f59fc792a6d2f0ac41c3a0d72c59203485e5a5cdd9ec87f50546a3965706829fc63c774078b4a415b68747589c07fbd19a"], "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}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (5, '{"c": "5", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212591fe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801d7a2a8638edc950e921074126382a46dae8bf87cb681a5eeaa7d27c3a71679687677a9f0c4973d0a86100bd6f97be3865659689278109a70532cec5a3bd0564508255506f5043e0e42f8046f878ff3bdb65aabdbe9883d15b4fd6271819fcc46767b1019c95782b3bf03f94abdae0a1b821a9d0a6f44c40fb0249e0078074b5a4692f0735fe70041ad68cf194abe1a33b17fd43e14911513dabd1adca315820c017b85b003cf6807f21a18d8349619885d78004556c4c410916c9e6eb4a6f79d1bf0e77b1ce109445fc8a9d86e471e78894e59af894780fe5b047a280ea5b8a2d1b20400ad886437b551786e99b2cf788a69524d299991f136c7c850cdd5d39a1f7152feebea0ee720d23b0b8514cfc3d8c99e8f44052cfd0134f335ac9fa1fd"], "u": "cdd6248063d3431f3fe010c5728954fd62cbf42b0c515a9991bd4fc673604e26", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (6, '{"c": "6", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212599de28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a6afd969a465c445ab35c15e7ef11ebaaa97578179e9cf7e8f186317352ef4316c1fae5079582a0c1195756bc5cb789d2ef48bd1d531c259f3273477f92c642c1a54633ad74987532d2044be59916a3743d5156c7c5e0d1dd256c79fb955023ab1dae725cae77e712d2075cabf46aa33b96d2cefa8b3ea3b2e4fc7c4966c883fd2018f6e1f33b418dadbea80c10b5320090be7d60abf2e19111ee58e75b1ee8e3dee2c133265dfd5179f0b885306addbde51a402adf1d13e34f5d6b67c739ed40cb57e74517bb3e7bf02529790af64de4b19e0d6a0d6d4f0b79ae613266a48165d5a8ef18d605e239e0c57a96072527d0d9d5d2655585adbeac83f7f3fc2381b9e772cab2e65cc9537b8142f105a0f4a3d8c97889255c7b5b2b15061149412ad"], "u": "a97ec70e9e4cc5c6888f1f809ec4fa551aff8633d76cfb26bb20997d4d50ca91", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (7, '{"c": "7", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["1212121212125948e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a901168d92ea2d7df254becc59888cf4a411c9f619a77715716200fbc36fb78ed7cd088e647a1d9ea722ae8144f050573024c899a85d6db80fcc6459bece64646a3805bb46bd72c4d27c1917fcdfbfa049a9139f0bb021e5e31bf2b8f0df014d9d09cd9cdc5b6f21fc6f843f506ca773c9a1951e2c5b7aa09e17c8864180163b5f6ec26f5826aef99d0631de5965451e22f24726b6956e4d490f3a5e690c81b30db160b64f455cf07e64e2b57d69719cb6dd1df65a7cf688571c983f75b51846b475b01f56eda9d4bfad849ba3ffa17a1b0bc6ef247da5fb3fc7d49634806acc132caf2a225388c0e0d1dabdf74b9ec8aa44771c789cc919227d9dc4c6465de21614a1a1f33a7a9c8138d06a9eacba64444cc0f98aa7f13ba4d2def340d6250a"], "u": "28f3ec44eae678f9d0d8238c0b3a01a146d56ccc4c1125f0373d394c4e1e95f4", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (8, '{"c": "8", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212594ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801783caa0b75f5aa4c005b423d7518fd4b0d9f553a75636801a6a1cd246227261dcf8eed0caa3defebf4e45e15f6692e38192bbda5913827b59d9eb72cb85e638803f9642cad7225fd45379a283eb51b154d9794df12b0e62b9cab9e7189517a54fc1e5a473d1630092146f53d8700b7661824f175ba7d953a57b8dc7b9b27dd215f75e23a4c3f7318de298da94fcdd17cb4946f1229ef815b7014dc76ee67d2535cba61b05444beebbf35a403a23886d04023adcc5452de4d4c1639fabdba6bbc9a37d4daed7ecc091f0c17a4893b79aa3e250207966cb9fb75055ba615d44609cdaa0f88fda50595a96bed6f13e2d30577ec81a59f49f901ff36e10c251969e30b87144c9ad13073d63e6de7d6f2f78b4ec78118bbe2002bbb7698e22d8c6b96"], "u": "9e80a31275db9e5ebc9a254864971cdef2ca68b0047712d3d106d86516bcfc6a", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (9, '{"c": "9", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["12121212121259dae28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801357205e56d3cf91febac317b171083353fdb3ad88d5525f2ed24157c65616978e3b29d5641bb30e7972173d1225e51c4a648721565e6583ff0e29898885f34bed5803af54254ed48e524e2c53614fb8abd4079daf12c519abe2622aa340eff843798c64ed843dd3528849783573a5e90d05e78aaaf596b58239324f862b8d63028bd78f05410868063963845306c21ccce475a058fa66e03bc0519e434504a1db60a5c1f3dbeac1504e31ae4bc731f5c4860de2952ef10aba433580079303d9724275d355f26bf60b58054522422ff2cb11896092b8ad55e246bcc7c335b2581e156b370bd9c18b93b991440cf52203af64579a8729ea4acb3bbd5ff80d3910ed3431cc48dacd7f70f4504d4686ce023ce0a46fac48f4a7834c2a4a73a220acb"], "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; - +INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": 1, "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a651f4442c298030a6e752d2776d99cab01b445aca923a25dfa511bbb3ecad11034c9b33facf27b6f8fbe276f2638c2e4aa78aa46c245c45efd918b0c0d029b5979cdbd26bb7e172060917b1d66554045ccc190f797c55ac5c062320f49e1f78a2410482579e4fb74cc8ba9e60d0842bfa08680cde8b0f4bb3090578c67d1e26678f4254559632fa854377c1da9266e3651a9c033a05f7bbabe31fa92b7ca59c48af7f77e9dc63f6d6fd9cd8dbcb86a7f06847f6be4d07474d11c30b99f41b17ef1093918923c9fc17d0b60fdfffb0e9c00f5f2c29b94de6e56f940ff6181a3e2de16729b7d65157cd604f97fa50d3f9363143d3a1356c1e93f7b2a67587b81a1309c6b51f9cfb4338406316e69a2ce2c"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'); +SELECT id FROM encrypted ORDER BY encrypted_int2 DESC; +-- ORE LT < AND GT > OPERATORS DO $$ DECLARE - ore_cs_encrypted cs_encrypted_v1; - ore_json jsonb; + result_id integer; 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); + SELECT id + FROM encrypted ORDER BY encrypted_int2 + LIMIT 1 + INTO result_id; END; diff --git a/tests/operators-ore.sql b/tests/operators-ore.sql index 0494c559..b33879e3 100644 --- a/tests/operators-ore.sql +++ b/tests/operators-ore.sql @@ -1,288 +1,164 @@ \set ON_ERROR_STOP on - --- Create a table with a plaintext column -DROP TABLE IF EXISTS users; -CREATE TABLE users +DROP TABLE IF EXISTS encrypted; +CREATE TABLE encrypted ( - id bigint GENERATED ALWAYS AS IDENTITY, - name_encrypted cs_encrypted_v1, + id bigint, + encrypted_int2 cs_encrypted_v1, PRIMARY KEY(id) ); -TRUNCATE TABLE users; - - -TRUNCATE TABLE users; - --- User with "LOW" value -INSERT INTO users (name_encrypted) VALUES ( - '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")" - }'::jsonb -); - --- ORE eq < OPERATORS -DO $$ - DECLARE - ore_cs_encrypted cs_encrypted_v1; - ore_json jsonb; - ore_record text; - BEGIN - ore_cs_encrypted := '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\\\\"\")\"\"}\")" - }'; - - ore_json := '{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\\\\"\")\"\"}\")"}'; - - ore_record = '("{""(\\""\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\"")""}")'; - - -- SANITY CHECK - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) < cs_ore_64_8_v1(ore_json))); +-- CREATE index ON encrypted (encrypted_int2 cs_encrypted_ore_64_8_v1_btree_ops_v1); - ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted < ore_cs_encrypted::jsonb - )); - -- -- -- cs_encrypted_v1 < jsonb - ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted < ore_json::jsonb - )); +-- 99 +INSERT INTO encrypted (id, encrypted_int2) VALUES (99, '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d771b05d53e9237f5a015095a24dd7447e1e3f27b152b463089f1ed90cdf3fa6f0597a3256edb06196fe0d09d0b188edf0e213f61339c93041f3c8f9e40621e131a1bb9d27f7d2af8a7706dead7858171a52c82b074694d269ad562ba0f793f2f3980b54f76873996e7cd5894c153c339d0137360871fc7ffead9621cbe954bdaf471610f5cb27b18982a6ef333d34bb7c5ffb766a4f77b1063aabbd58a8e76d0f2f7af7bc3c2e868eeeef00537e13d9bdb13d0c30b148f2276189043d48c525744c47644f26d375d18029da11f959734b5e54c15ae235d35db204a6c4e88162f59fc792a6d2f0ac41c3a0d72c59203485e5a5cdd9ec87f50546a3965706829fc63c774078b4a415b68747589c07fbd19a"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'); - -- -- -- jsonb < cs_encrypted_v1 - -- genrating ORE data for tests is fiddly, hence the IS FALSE here - ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE (ore_json::jsonb < name_encrypted) IS FALSE - )); +-- 5 .. 9 +INSERT INTO encrypted (id, encrypted_int2) VALUES (5, '{"c": "5", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212591fe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801d7a2a8638edc950e921074126382a46dae8bf87cb681a5eeaa7d27c3a71679687677a9f0c4973d0a86100bd6f97be3865659689278109a70532cec5a3bd0564508255506f5043e0e42f8046f878ff3bdb65aabdbe9883d15b4fd6271819fcc46767b1019c95782b3bf03f94abdae0a1b821a9d0a6f44c40fb0249e0078074b5a4692f0735fe70041ad68cf194abe1a33b17fd43e14911513dabd1adca315820c017b85b003cf6807f21a18d8349619885d78004556c4c410916c9e6eb4a6f79d1bf0e77b1ce109445fc8a9d86e471e78894e59af894780fe5b047a280ea5b8a2d1b20400ad886437b551786e99b2cf788a69524d299991f136c7c850cdd5d39a1f7152feebea0ee720d23b0b8514cfc3d8c99e8f44052cfd0134f335ac9fa1fd"], "u": "cdd6248063d3431f3fe010c5728954fd62cbf42b0c515a9991bd4fc673604e26", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (6, '{"c": "6", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212599de28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a6afd969a465c445ab35c15e7ef11ebaaa97578179e9cf7e8f186317352ef4316c1fae5079582a0c1195756bc5cb789d2ef48bd1d531c259f3273477f92c642c1a54633ad74987532d2044be59916a3743d5156c7c5e0d1dd256c79fb955023ab1dae725cae77e712d2075cabf46aa33b96d2cefa8b3ea3b2e4fc7c4966c883fd2018f6e1f33b418dadbea80c10b5320090be7d60abf2e19111ee58e75b1ee8e3dee2c133265dfd5179f0b885306addbde51a402adf1d13e34f5d6b67c739ed40cb57e74517bb3e7bf02529790af64de4b19e0d6a0d6d4f0b79ae613266a48165d5a8ef18d605e239e0c57a96072527d0d9d5d2655585adbeac83f7f3fc2381b9e772cab2e65cc9537b8142f105a0f4a3d8c97889255c7b5b2b15061149412ad"], "u": "a97ec70e9e4cc5c6888f1f809ec4fa551aff8633d76cfb26bb20997d4d50ca91", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (7, '{"c": "7", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["1212121212125948e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a901168d92ea2d7df254becc59888cf4a411c9f619a77715716200fbc36fb78ed7cd088e647a1d9ea722ae8144f050573024c899a85d6db80fcc6459bece64646a3805bb46bd72c4d27c1917fcdfbfa049a9139f0bb021e5e31bf2b8f0df014d9d09cd9cdc5b6f21fc6f843f506ca773c9a1951e2c5b7aa09e17c8864180163b5f6ec26f5826aef99d0631de5965451e22f24726b6956e4d490f3a5e690c81b30db160b64f455cf07e64e2b57d69719cb6dd1df65a7cf688571c983f75b51846b475b01f56eda9d4bfad849ba3ffa17a1b0bc6ef247da5fb3fc7d49634806acc132caf2a225388c0e0d1dabdf74b9ec8aa44771c789cc919227d9dc4c6465de21614a1a1f33a7a9c8138d06a9eacba64444cc0f98aa7f13ba4d2def340d6250a"], "u": "28f3ec44eae678f9d0d8238c0b3a01a146d56ccc4c1125f0373d394c4e1e95f4", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (8, '{"c": "8", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212594ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801783caa0b75f5aa4c005b423d7518fd4b0d9f553a75636801a6a1cd246227261dcf8eed0caa3defebf4e45e15f6692e38192bbda5913827b59d9eb72cb85e638803f9642cad7225fd45379a283eb51b154d9794df12b0e62b9cab9e7189517a54fc1e5a473d1630092146f53d8700b7661824f175ba7d953a57b8dc7b9b27dd215f75e23a4c3f7318de298da94fcdd17cb4946f1229ef815b7014dc76ee67d2535cba61b05444beebbf35a403a23886d04023adcc5452de4d4c1639fabdba6bbc9a37d4daed7ecc091f0c17a4893b79aa3e250207966cb9fb75055ba615d44609cdaa0f88fda50595a96bed6f13e2d30577ec81a59f49f901ff36e10c251969e30b87144c9ad13073d63e6de7d6f2f78b4ec78118bbe2002bbb7698e22d8c6b96"], "u": "9e80a31275db9e5ebc9a254864971cdef2ca68b0047712d3d106d86516bcfc6a", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (9, '{"c": "9", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["12121212121259dae28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801357205e56d3cf91febac317b171083353fdb3ad88d5525f2ed24157c65616978e3b29d5641bb30e7972173d1225e51c4a648721565e6583ff0e29898885f34bed5803af54254ed48e524e2c53614fb8abd4079daf12c519abe2622aa340eff843798c64ed843dd3528849783573a5e90d05e78aaaf596b58239324f862b8d63028bd78f05410868063963845306c21ccce475a058fa66e03bc0519e434504a1db60a5c1f3dbeac1504e31ae4bc731f5c4860de2952ef10aba433580079303d9724275d355f26bf60b58054522422ff2cb11896092b8ad55e246bcc7c335b2581e156b370bd9c18b93b991440cf52203af64579a8729ea4acb3bbd5ff80d3910ed3431cc48dacd7f70f4504d4686ce023ce0a46fac48f4a7834c2a4a73a220acb"], "u": "94ec6ec3b6a8acb4d1b94f0c3a4a7c6359b11ce5d8fd01a7e4474e5e7a0cca8b", "v": 1}'); - -- -- -- -- cs_encrypted_v1 < ore_64_8_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted < ore_record::ore_64_8_v1)); +-- 1 +INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": 1, "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a651f4442c298030a6e752d2776d99cab01b445aca923a25dfa511bbb3ecad11034c9b33facf27b6f8fbe276f2638c2e4aa78aa46c245c45efd918b0c0d029b5979cdbd26bb7e172060917b1d66554045ccc190f797c55ac5c062320f49e1f78a2410482579e4fb74cc8ba9e60d0842bfa08680cde8b0f4bb3090578c67d1e26678f4254559632fa854377c1da9266e3651a9c033a05f7bbabe31fa92b7ca59c48af7f77e9dc63f6d6fd9cd8dbcb86a7f06847f6be4d07474d11c30b99f41b17ef1093918923c9fc17d0b60fdfffb0e9c00f5f2c29b94de6e56f940ff6181a3e2de16729b7d65157cd604f97fa50d3f9363143d3a1356c1e93f7b2a67587b81a1309c6b51f9cfb4338406316e69a2ce2c"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'); - -- -- -- -- -- ore_64_8_v1 < cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE (ore_record::ore_64_8_v1 < name_encrypted) IS FALSE)); - -- -- -- -- cs_encrypted_v1 <> cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted < ore_cs_encrypted::cs_encrypted_v1)); - - END; -$$ LANGUAGE plpgsql; - - - --- ORE eq <= OPERATORS +-- ORE LT < AND GT > OPERATORS DO $$ DECLARE - ore_cs_encrypted cs_encrypted_v1; - ore_json jsonb; - ore_record text; + ore_cs_encrypted_high cs_encrypted_v1; + ore_cs_encrypted_low cs_encrypted_v1; + ore_json_high jsonb; + ore_json_low jsonb; + row_count integer; BEGIN - ore_cs_encrypted := '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\\\\"\")\"\"}\")" - }'; + ore_cs_encrypted_high := '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d771b05d53e9237f5a015095a24dd7447e1e3f27b152b463089f1ed90cdf3fa6f0597a3256edb06196fe0d09d0b188edf0e213f61339c93041f3c8f9e40621e131a1bb9d27f7d2af8a7706dead7858171a52c82b074694d269ad562ba0f793f2f3980b54f76873996e7cd5894c153c339d0137360871fc7ffead9621cbe954bdaf471610f5cb27b18982a6ef333d34bb7c5ffb766a4f77b1063aabbd58a8e76d0f2f7af7bc3c2e868eeeef00537e13d9bdb13d0c30b148f2276189043d48c525744c47644f26d375d18029da11f959734b5e54c15ae235d35db204a6c4e88162f59fc792a6d2f0ac41c3a0d72c59203485e5a5cdd9ec87f50546a3965706829fc63c774078b4a415b68747589c07fbd19a"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; + ore_cs_encrypted_low := '{"c": 1, "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a651f4442c298030a6e752d2776d99cab01b445aca923a25dfa511bbb3ecad11034c9b33facf27b6f8fbe276f2638c2e4aa78aa46c245c45efd918b0c0d029b5979cdbd26bb7e172060917b1d66554045ccc190f797c55ac5c062320f49e1f78a2410482579e4fb74cc8ba9e60d0842bfa08680cde8b0f4bb3090578c67d1e26678f4254559632fa854377c1da9266e3651a9c033a05f7bbabe31fa92b7ca59c48af7f77e9dc63f6d6fd9cd8dbcb86a7f06847f6be4d07474d11c30b99f41b17ef1093918923c9fc17d0b60fdfffb0e9c00f5f2c29b94de6e56f940ff6181a3e2de16729b7d65157cd604f97fa50d3f9363143d3a1356c1e93f7b2a67587b81a1309c6b51f9cfb4338406316e69a2ce2c"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; - ore_json := '{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\\\\"\")\"\"}\")"}'; + ore_json_high := '{"o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d771b05d53e9237f5a015095a24dd7447e1e3f27b152b463089f1ed90cdf3fa6f0597a3256edb06196fe0d09d0b188edf0e213f61339c93041f3c8f9e40621e131a1bb9d27f7d2af8a7706dead7858171a52c82b074694d269ad562ba0f793f2f3980b54f76873996e7cd5894c153c339d0137360871fc7ffead9621cbe954bdaf471610f5cb27b18982a6ef333d34bb7c5ffb766a4f77b1063aabbd58a8e76d0f2f7af7bc3c2e868eeeef00537e13d9bdb13d0c30b148f2276189043d48c525744c47644f26d375d18029da11f959734b5e54c15ae235d35db204a6c4e88162f59fc792a6d2f0ac41c3a0d72c59203485e5a5cdd9ec87f50546a3965706829fc63c774078b4a415b68747589c07fbd19a"]}'; + ore_json_low := '{"o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a651f4442c298030a6e752d2776d99cab01b445aca923a25dfa511bbb3ecad11034c9b33facf27b6f8fbe276f2638c2e4aa78aa46c245c45efd918b0c0d029b5979cdbd26bb7e172060917b1d66554045ccc190f797c55ac5c062320f49e1f78a2410482579e4fb74cc8ba9e60d0842bfa08680cde8b0f4bb3090578c67d1e26678f4254559632fa854377c1da9266e3651a9c033a05f7bbabe31fa92b7ca59c48af7f77e9dc63f6d6fd9cd8dbcb86a7f06847f6be4d07474d11c30b99f41b17ef1093918923c9fc17d0b60fdfffb0e9c00f5f2c29b94de6e56f940ff6181a3e2de16729b7d65157cd604f97fa50d3f9363143d3a1356c1e93f7b2a67587b81a1309c6b51f9cfb4338406316e69a2ce2c"]}'; - ore_record = '("{""(\\""\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\"")""}")'; + -- ------------------------------------------------------------------------------------------------ + -- -- cs_encrypted_v1 < cs_encrypted_v1 + SELECT + COUNT(id) + FROM encrypted WHERE encrypted_int2 < ore_cs_encrypted_high + INTO row_count; + ASSERT row_count = 6; + -- -- cs_encrypted_v1 < jsonb + SELECT + COUNT(id) + FROM encrypted WHERE encrypted_int2 < ore_json_high + INTO row_count; - -- 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 row_count = 6; - ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted <= ore_cs_encrypted::jsonb - )); + -- -- jsonb < cs_encrypted_v1 + SELECT + COUNT(id) + FROM encrypted WHERE ore_json_low < encrypted_int2 + INTO row_count; - -- -- -- cs_encrypted_v1 <= jsonb - ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted <= ore_json::jsonb - )); + ASSERT row_count = 6; - -- -- -- jsonb <= cs_encrypted_v1 - -- genrating ORE data for tests is fiddly, hence the IS FALSE here - ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE (ore_json::jsonb <= name_encrypted) IS FALSE - )); - -- -- -- -- cs_encrypted_v1 <= ore_64_8_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <= ore_record::ore_64_8_v1)); + -- -- cs_encrypted_v1 > cs_encrypted_v1 + SELECT + COUNT(id) + FROM encrypted WHERE encrypted_int2 > ore_cs_encrypted_low + INTO row_count; + ASSERT row_count = 6; - -- -- -- -- -- ore_64_8_v1 <= cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE (ore_record::ore_64_8_v1 <= name_encrypted) IS FALSE)); + -- -- cs_encrypted_v1 > jsonb + SELECT + COUNT(id) + FROM encrypted WHERE encrypted_int2 > ore_json_low + INTO row_count; - -- -- -- -- cs_encrypted_v1 <= cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <= ore_cs_encrypted::cs_encrypted_v1)); - - END; -$$ LANGUAGE plpgsql; + ASSERT row_count = 6; + -- -- jsonb > cs_encrypted_v1 + SELECT + COUNT(id) + FROM encrypted WHERE ore_json_low > encrypted_int2 + INTO row_count; + ASSERT row_count = 0; --- User with "HIGH" value -INSERT INTO users (name_encrypted) VALUES ( - '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\\\\"\")\"\"}\")" - }'::jsonb -); + END; +$$ LANGUAGE plpgsql; --- ORE eq < OPERATORS +-- ORE LTE <= AND GTE >= OPERATORS DO $$ DECLARE - ore_cs_encrypted cs_encrypted_v1; - ore_json jsonb; - ore_record text; + ore_cs_encrypted_high cs_encrypted_v1; + ore_cs_encrypted_low cs_encrypted_v1; + ore_json_high jsonb; + ore_json_low jsonb; + row_count integer; BEGIN - ore_cs_encrypted := '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")" - }'; + ore_cs_encrypted_high := '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d771b05d53e9237f5a015095a24dd7447e1e3f27b152b463089f1ed90cdf3fa6f0597a3256edb06196fe0d09d0b188edf0e213f61339c93041f3c8f9e40621e131a1bb9d27f7d2af8a7706dead7858171a52c82b074694d269ad562ba0f793f2f3980b54f76873996e7cd5894c153c339d0137360871fc7ffead9621cbe954bdaf471610f5cb27b18982a6ef333d34bb7c5ffb766a4f77b1063aabbd58a8e76d0f2f7af7bc3c2e868eeeef00537e13d9bdb13d0c30b148f2276189043d48c525744c47644f26d375d18029da11f959734b5e54c15ae235d35db204a6c4e88162f59fc792a6d2f0ac41c3a0d72c59203485e5a5cdd9ec87f50546a3965706829fc63c774078b4a415b68747589c07fbd19a"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; + ore_cs_encrypted_low := '{"c": 1, "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a651f4442c298030a6e752d2776d99cab01b445aca923a25dfa511bbb3ecad11034c9b33facf27b6f8fbe276f2638c2e4aa78aa46c245c45efd918b0c0d029b5979cdbd26bb7e172060917b1d66554045ccc190f797c55ac5c062320f49e1f78a2410482579e4fb74cc8ba9e60d0842bfa08680cde8b0f4bb3090578c67d1e26678f4254559632fa854377c1da9266e3651a9c033a05f7bbabe31fa92b7ca59c48af7f77e9dc63f6d6fd9cd8dbcb86a7f06847f6be4d07474d11c30b99f41b17ef1093918923c9fc17d0b60fdfffb0e9c00f5f2c29b94de6e56f940ff6181a3e2de16729b7d65157cd604f97fa50d3f9363143d3a1356c1e93f7b2a67587b81a1309c6b51f9cfb4338406316e69a2ce2c"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; - ore_json := '{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"}'; + ore_json_high := '{"o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d771b05d53e9237f5a015095a24dd7447e1e3f27b152b463089f1ed90cdf3fa6f0597a3256edb06196fe0d09d0b188edf0e213f61339c93041f3c8f9e40621e131a1bb9d27f7d2af8a7706dead7858171a52c82b074694d269ad562ba0f793f2f3980b54f76873996e7cd5894c153c339d0137360871fc7ffead9621cbe954bdaf471610f5cb27b18982a6ef333d34bb7c5ffb766a4f77b1063aabbd58a8e76d0f2f7af7bc3c2e868eeeef00537e13d9bdb13d0c30b148f2276189043d48c525744c47644f26d375d18029da11f959734b5e54c15ae235d35db204a6c4e88162f59fc792a6d2f0ac41c3a0d72c59203485e5a5cdd9ec87f50546a3965706829fc63c774078b4a415b68747589c07fbd19a"]}'; + ore_json_low := '{"o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a651f4442c298030a6e752d2776d99cab01b445aca923a25dfa511bbb3ecad11034c9b33facf27b6f8fbe276f2638c2e4aa78aa46c245c45efd918b0c0d029b5979cdbd26bb7e172060917b1d66554045ccc190f797c55ac5c062320f49e1f78a2410482579e4fb74cc8ba9e60d0842bfa08680cde8b0f4bb3090578c67d1e26678f4254559632fa854377c1da9266e3651a9c033a05f7bbabe31fa92b7ca59c48af7f77e9dc63f6d6fd9cd8dbcb86a7f06847f6be4d07474d11c30b99f41b17ef1093918923c9fc17d0b60fdfffb0e9c00f5f2c29b94de6e56f940ff6181a3e2de16729b7d65157cd604f97fa50d3f9363143d3a1356c1e93f7b2a67587b81a1309c6b51f9cfb4338406316e69a2ce2c"]}'; + -- ------------------------------------------------------------------------------------------------ + -- -- cs_encrypted_v1 < cs_encrypted_v1 + SELECT + COUNT(id) + FROM encrypted WHERE encrypted_int2 <= ore_cs_encrypted_high + INTO row_count; + ASSERT row_count = 7; - ore_record = '("{""(\\""\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\"")""}")'; + -- -- cs_encrypted_v1 < jsonb + SELECT + COUNT(id) + FROM encrypted WHERE encrypted_int2 <= ore_json_high + INTO row_count; - -- 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 row_count = 7; - ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted > ore_cs_encrypted::jsonb - )); + -- -- jsonb < cs_encrypted_v1 + SELECT + COUNT(id) + FROM encrypted WHERE encrypted_int2 <= ore_json_low + INTO row_count; - -- -- -- cs_encrypted_v1 > jsonb - ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted > ore_json::jsonb - )); + ASSERT row_count = 1; - -- -- -- jsonb > cs_encrypted_v1 - -- genrating ORE data for tests is fiddly, hence the IS FALSE here - ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE (ore_json::jsonb > name_encrypted) IS FALSE - )); - -- -- -- -- cs_encrypted_v1 > ore_64_8_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted > ore_record::ore_64_8_v1)); + -- -- cs_encrypted_v1 >= cs_encrypted_v1 + SELECT + COUNT(id) + FROM encrypted WHERE encrypted_int2 >= ore_cs_encrypted_low + INTO row_count; + ASSERT row_count = 7; - -- -- -- -- -- ore_64_8_v1 > cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE (ore_record::ore_64_8_v1 > name_encrypted) IS FALSE)); - - -- -- -- -- cs_encrypted_v1 >> cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted > ore_cs_encrypted::cs_encrypted_v1)); - - END; -$$ LANGUAGE plpgsql; - - - - --- User with "HIGH" value -INSERT INTO users (name_encrypted) VALUES ( - '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\\\\"\")\"\"}\")" - }'::jsonb -); + -- -- cs_encrypted_v1 > jsonb + SELECT + COUNT(id) + FROM encrypted WHERE encrypted_int2 >= ore_json_high + INTO row_count; + ASSERT row_count = 1; + -- -- jsonb >= cs_encrypted_v1 + SELECT + COUNT(id) + FROM encrypted WHERE ore_json_low >= encrypted_int2 + INTO row_count; --- ORE eq >= OPERATORS -DO $$ - DECLARE - ore_cs_encrypted cs_encrypted_v1; - ore_json jsonb; - ore_record text; - BEGIN - ore_cs_encrypted := '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")" - }'; + ASSERT row_count = 1; - ore_json := '{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"}'; - - - ore_record = '("{""(\\""\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\"")""}")'; - - -- 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::jsonb - )); - - -- -- -- cs_encrypted_v1 >= jsonb - ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted >= ore_json::jsonb - )); - - -- -- -- jsonb >= cs_encrypted_v1 - -- genrating ORE data for tests is fiddly, hence the IS FALSE here - ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE (ore_json::jsonb >= name_encrypted) IS FALSE - )); - - -- -- -- -- cs_encrypted_v1 >= ore_64_8_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted >= ore_record::ore_64_8_v1)); - - -- -- -- -- -- ore_64_8_v1 >= cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE (ore_record::ore_64_8_v1 >= name_encrypted) IS FALSE)); - - -- -- -- -- cs_encrypted_v1 >= cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted >= ore_cs_encrypted::cs_encrypted_v1)); END; $$ LANGUAGE plpgsql; + + From 634aaba8b137dcc44195b80fd4387e0b51d066ec Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 14 Feb 2025 14:36:48 +1100 Subject: [PATCH 07/15] ORE operators --- tests/operators-ore.sql | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/tests/operators-ore.sql b/tests/operators-ore.sql index b33879e3..c82db8ae 100644 --- a/tests/operators-ore.sql +++ b/tests/operators-ore.sql @@ -8,22 +8,13 @@ CREATE TABLE encrypted PRIMARY KEY(id) ); - --- CREATE index ON encrypted (encrypted_int2 cs_encrypted_ore_64_8_v1_btree_ops_v1); - - --- 99 -INSERT INTO encrypted (id, encrypted_int2) VALUES (99, '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d771b05d53e9237f5a015095a24dd7447e1e3f27b152b463089f1ed90cdf3fa6f0597a3256edb06196fe0d09d0b188edf0e213f61339c93041f3c8f9e40621e131a1bb9d27f7d2af8a7706dead7858171a52c82b074694d269ad562ba0f793f2f3980b54f76873996e7cd5894c153c339d0137360871fc7ffead9621cbe954bdaf471610f5cb27b18982a6ef333d34bb7c5ffb766a4f77b1063aabbd58a8e76d0f2f7af7bc3c2e868eeeef00537e13d9bdb13d0c30b148f2276189043d48c525744c47644f26d375d18029da11f959734b5e54c15ae235d35db204a6c4e88162f59fc792a6d2f0ac41c3a0d72c59203485e5a5cdd9ec87f50546a3965706829fc63c774078b4a415b68747589c07fbd19a"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'); - --- 5 .. 9 -INSERT INTO encrypted (id, encrypted_int2) VALUES (5, '{"c": "5", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212591fe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801d7a2a8638edc950e921074126382a46dae8bf87cb681a5eeaa7d27c3a71679687677a9f0c4973d0a86100bd6f97be3865659689278109a70532cec5a3bd0564508255506f5043e0e42f8046f878ff3bdb65aabdbe9883d15b4fd6271819fcc46767b1019c95782b3bf03f94abdae0a1b821a9d0a6f44c40fb0249e0078074b5a4692f0735fe70041ad68cf194abe1a33b17fd43e14911513dabd1adca315820c017b85b003cf6807f21a18d8349619885d78004556c4c410916c9e6eb4a6f79d1bf0e77b1ce109445fc8a9d86e471e78894e59af894780fe5b047a280ea5b8a2d1b20400ad886437b551786e99b2cf788a69524d299991f136c7c850cdd5d39a1f7152feebea0ee720d23b0b8514cfc3d8c99e8f44052cfd0134f335ac9fa1fd"], "u": "cdd6248063d3431f3fe010c5728954fd62cbf42b0c515a9991bd4fc673604e26", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (6, '{"c": "6", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212599de28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a6afd969a465c445ab35c15e7ef11ebaaa97578179e9cf7e8f186317352ef4316c1fae5079582a0c1195756bc5cb789d2ef48bd1d531c259f3273477f92c642c1a54633ad74987532d2044be59916a3743d5156c7c5e0d1dd256c79fb955023ab1dae725cae77e712d2075cabf46aa33b96d2cefa8b3ea3b2e4fc7c4966c883fd2018f6e1f33b418dadbea80c10b5320090be7d60abf2e19111ee58e75b1ee8e3dee2c133265dfd5179f0b885306addbde51a402adf1d13e34f5d6b67c739ed40cb57e74517bb3e7bf02529790af64de4b19e0d6a0d6d4f0b79ae613266a48165d5a8ef18d605e239e0c57a96072527d0d9d5d2655585adbeac83f7f3fc2381b9e772cab2e65cc9537b8142f105a0f4a3d8c97889255c7b5b2b15061149412ad"], "u": "a97ec70e9e4cc5c6888f1f809ec4fa551aff8633d76cfb26bb20997d4d50ca91", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (7, '{"c": "7", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["1212121212125948e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a901168d92ea2d7df254becc59888cf4a411c9f619a77715716200fbc36fb78ed7cd088e647a1d9ea722ae8144f050573024c899a85d6db80fcc6459bece64646a3805bb46bd72c4d27c1917fcdfbfa049a9139f0bb021e5e31bf2b8f0df014d9d09cd9cdc5b6f21fc6f843f506ca773c9a1951e2c5b7aa09e17c8864180163b5f6ec26f5826aef99d0631de5965451e22f24726b6956e4d490f3a5e690c81b30db160b64f455cf07e64e2b57d69719cb6dd1df65a7cf688571c983f75b51846b475b01f56eda9d4bfad849ba3ffa17a1b0bc6ef247da5fb3fc7d49634806acc132caf2a225388c0e0d1dabdf74b9ec8aa44771c789cc919227d9dc4c6465de21614a1a1f33a7a9c8138d06a9eacba64444cc0f98aa7f13ba4d2def340d6250a"], "u": "28f3ec44eae678f9d0d8238c0b3a01a146d56ccc4c1125f0373d394c4e1e95f4", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (8, '{"c": "8", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212594ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801783caa0b75f5aa4c005b423d7518fd4b0d9f553a75636801a6a1cd246227261dcf8eed0caa3defebf4e45e15f6692e38192bbda5913827b59d9eb72cb85e638803f9642cad7225fd45379a283eb51b154d9794df12b0e62b9cab9e7189517a54fc1e5a473d1630092146f53d8700b7661824f175ba7d953a57b8dc7b9b27dd215f75e23a4c3f7318de298da94fcdd17cb4946f1229ef815b7014dc76ee67d2535cba61b05444beebbf35a403a23886d04023adcc5452de4d4c1639fabdba6bbc9a37d4daed7ecc091f0c17a4893b79aa3e250207966cb9fb75055ba615d44609cdaa0f88fda50595a96bed6f13e2d30577ec81a59f49f901ff36e10c251969e30b87144c9ad13073d63e6de7d6f2f78b4ec78118bbe2002bbb7698e22d8c6b96"], "u": "9e80a31275db9e5ebc9a254864971cdef2ca68b0047712d3d106d86516bcfc6a", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (9, '{"c": "9", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["12121212121259dae28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801357205e56d3cf91febac317b171083353fdb3ad88d5525f2ed24157c65616978e3b29d5641bb30e7972173d1225e51c4a648721565e6583ff0e29898885f34bed5803af54254ed48e524e2c53614fb8abd4079daf12c519abe2622aa340eff843798c64ed843dd3528849783573a5e90d05e78aaaf596b58239324f862b8d63028bd78f05410868063963845306c21ccce475a058fa66e03bc0519e434504a1db60a5c1f3dbeac1504e31ae4bc731f5c4860de2952ef10aba433580079303d9724275d355f26bf60b58054522422ff2cb11896092b8ad55e246bcc7c335b2581e156b370bd9c18b93b991440cf52203af64579a8729ea4acb3bbd5ff80d3910ed3431cc48dacd7f70f4504d4686ce023ce0a46fac48f4a7834c2a4a73a220acb"], "u": "94ec6ec3b6a8acb4d1b94f0c3a4a7c6359b11ce5d8fd01a7e4474e5e7a0cca8b", "v": 1}'); - --- 1 -INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": 1, "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a651f4442c298030a6e752d2776d99cab01b445aca923a25dfa511bbb3ecad11034c9b33facf27b6f8fbe276f2638c2e4aa78aa46c245c45efd918b0c0d029b5979cdbd26bb7e172060917b1d66554045ccc190f797c55ac5c062320f49e1f78a2410482579e4fb74cc8ba9e60d0842bfa08680cde8b0f4bb3090578c67d1e26678f4254559632fa854377c1da9266e3651a9c033a05f7bbabe31fa92b7ca59c48af7f77e9dc63f6d6fd9cd8dbcb86a7f06847f6be4d07474d11c30b99f41b17ef1093918923c9fc17d0b60fdfffb0e9c00f5f2c29b94de6e56f940ff6181a3e2de16729b7d65157cd604f97fa50d3f9363143d3a1356c1e93f7b2a67587b81a1309c6b51f9cfb4338406316e69a2ce2c"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (99, '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (5, '{"c": "mBbLon>=7ftt`=*S&jse$4dOf6yJvdxSqSRPpFtGPlBHkz6(wFqQoGnB5@)Ov#bUqy)1tr`#7noWJgfu~pkXjCBx%`R~Qw6gyWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x1212121212125948e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a901168d92ea2d7df254becc59888cf41530bacb77fa8c9aabe64574c246875cebd0c3ac7c8041d791d3091ba3b7083931be986a31d3c251479a2911c634aa1028f30852e6e213380a70a1c57bafe4467cbdd131e171c1136e2f8d144c8cd7a354edb93fe4f140b2e5a7c2d7ccfb2b77328d946ce2acbd6ddbfe50b81d2e1d4c5eacc3853876ae12ec4128332ff594c01309d32451d7a71913452476f1bb5af7b280bcb5bfa98e3c1a3d0e50ce58938b3c1fad0225ec051266ea8ac597a332313d023cc8b39732768e83feaca0ebe47c64684b192893e983c7be31489e86f3c99e76131e9e73c5733c4d79091f6182f9a4bc5b26ecf1dd8faa8124be2b87cfa7a589257aa63ac67f9d5046fc3be4feafc1f187dfa8fdb249110890aacdfdd53a"], "u": "28f3ec44eae678f9d0d8238c0b3a01a146d56ccc4c1125f0373d394c4e1e95f4", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (8, '{"c": "mBbJZ8KCF-%TLAttT!Kh)Bdx>6d*;f`!dvyxG>#+vD}RNtB2Us7sMbp(TSJniNkU`Hw$%;-2y!lE0z+OHrVk@cwi^L!sbglQ5m2>-BW9ogbyZjyIgeGg|W?{2@LgnyccSYi>kTA6xiNKsfTW>4X{HWg#UqTOMZ OPERATORS @@ -35,11 +26,11 @@ DO $$ ore_json_low jsonb; row_count integer; BEGIN - ore_cs_encrypted_high := '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d771b05d53e9237f5a015095a24dd7447e1e3f27b152b463089f1ed90cdf3fa6f0597a3256edb06196fe0d09d0b188edf0e213f61339c93041f3c8f9e40621e131a1bb9d27f7d2af8a7706dead7858171a52c82b074694d269ad562ba0f793f2f3980b54f76873996e7cd5894c153c339d0137360871fc7ffead9621cbe954bdaf471610f5cb27b18982a6ef333d34bb7c5ffb766a4f77b1063aabbd58a8e76d0f2f7af7bc3c2e868eeeef00537e13d9bdb13d0c30b148f2276189043d48c525744c47644f26d375d18029da11f959734b5e54c15ae235d35db204a6c4e88162f59fc792a6d2f0ac41c3a0d72c59203485e5a5cdd9ec87f50546a3965706829fc63c774078b4a415b68747589c07fbd19a"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; - ore_cs_encrypted_low := '{"c": 1, "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a651f4442c298030a6e752d2776d99cab01b445aca923a25dfa511bbb3ecad11034c9b33facf27b6f8fbe276f2638c2e4aa78aa46c245c45efd918b0c0d029b5979cdbd26bb7e172060917b1d66554045ccc190f797c55ac5c062320f49e1f78a2410482579e4fb74cc8ba9e60d0842bfa08680cde8b0f4bb3090578c67d1e26678f4254559632fa854377c1da9266e3651a9c033a05f7bbabe31fa92b7ca59c48af7f77e9dc63f6d6fd9cd8dbcb86a7f06847f6be4d07474d11c30b99f41b17ef1093918923c9fc17d0b60fdfffb0e9c00f5f2c29b94de6e56f940ff6181a3e2de16729b7d65157cd604f97fa50d3f9363143d3a1356c1e93f7b2a67587b81a1309c6b51f9cfb4338406316e69a2ce2c"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; + ore_cs_encrypted_high := '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; + ore_cs_encrypted_low := '{"c": "mBbK6IM@r}>@LgnyccSYi>kTA6xiNKsfTW>4X{HWg#UqTOMZ Date: Fri, 14 Feb 2025 14:50:57 +1100 Subject: [PATCH 08/15] Order by ORE --- tests/operators-ore-order.sql | 74 ++++++++++++++++++++++++++++------- tests/operators-ore.sql | 2 +- 2 files changed, 61 insertions(+), 15 deletions(-) diff --git a/tests/operators-ore-order.sql b/tests/operators-ore-order.sql index b9544ca0..5df49b3f 100644 --- a/tests/operators-ore-order.sql +++ b/tests/operators-ore-order.sql @@ -11,32 +11,78 @@ CREATE TABLE encrypted CREATE index ON encrypted (encrypted_int2 cs_encrypted_ore_64_8_v1_btree_ops_v1); --- 99 -INSERT INTO encrypted (id, encrypted_int2) VALUES (99, '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d771b05d53e9237f5a015095a24dd7447e1e3f27b152b463089f1ed90cdf3fa6f0597a3256edb06196fe0d09d0b188edf0e213f61339c93041f3c8f9e40621e131a1bb9d27f7d2af8a7706dead7858171a52c82b074694d269ad562ba0f793f2f3980b54f76873996e7cd5894c153c339d0137360871fc7ffead9621cbe954bdaf471610f5cb27b18982a6ef333d34bb7c5ffb766a4f77b1063aabbd58a8e76d0f2f7af7bc3c2e868eeeef00537e13d9bdb13d0c30b148f2276189043d48c525744c47644f26d375d18029da11f959734b5e54c15ae235d35db204a6c4e88162f59fc792a6d2f0ac41c3a0d72c59203485e5a5cdd9ec87f50546a3965706829fc63c774078b4a415b68747589c07fbd19a"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'); +-- The value of encrypted_int2 == id +INSERT INTO encrypted (id, encrypted_int2) VALUES (99,'{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (5, '{"c": "5", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212591fe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801d7a2a8638edc950e921074126382a46da05655a5205c0d5196dec740f50d1fcfa8221cd9aa78fc7b6f276f0131f9a02734b0c3dba6ac1ce512718d8f31ec80caa7a1c3c852c67a5d22890bfd6e7099572fa9cd9dcafeae9c3ce4fb60a4cbe22174ff7f2a5d345215fb748524dcaad2e615e8922ae59280463d7b35821dfefe8821fbec700de11832019654aa521b043e15b242ac711f2552ee879b03f15e55bbf0e6a79e9c86f0c6067baf78ed84a7ffae447cb01157ffa9556e81fad25aaf1686f6e9a989f2c5f24d0011c3e86d7abf14ea16005bda2d59d803f5a609fa035ef072475a8cc5645490f3de2253fe4d4ebcd4825d48108f0f485c6b0f7c5ca963c9d3d4bd6e2d86163a26aff609fe2bb59b0da6ff623958179591d1ee62226a50"], "u": "cdd6248063d3431f3fe010c5728954fd62cbf42b0c515a9991bd4fc673604e26", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (6, '{"c": "6", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212599de28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a6afd969a465c445ab35c15e7ef11eba3b65e765e52eb048019b0c2aec77012d71fff7b3d18b5b28e8cfce2901a2858b7aab627e07e69bb46c1503226ade5b0f8b77f21458d2cc1bcf99dd05da127be1c8cfc5323a18b6d53ba0715b5898a43cf1b05520d8957340d34ad49f778ff78afe974ba973c2460cdfd79ce9599915f4c95ec22f93231110bb3131aa7601a26589abd32f41845a977747163113a9395a82b3cee1f316bbe586b42e14130c870d6c731d0e499ecea7a1ef3f38fc7ef8ad43b52cf8dd7cf5723ddbfa1404717d0a0e63ef7be577b5a551aafcd9c28ecdef1cb2011cf468a1fff72b72264be1a6cc26d16a08e0bd0007ff0d09527f503e97c56f16e1efbf94c7318390c9e27eb92683a63ade0864376257a81d1cf9a97c73"], "u": "a97ec70e9e4cc5c6888f1f809ec4fa551aff8633d76cfb26bb20997d4d50ca91", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (7, '{"c": "7", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x1212121212125948e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a901168d92ea2d7df254becc59888cf41530bacb77fa8c9aabe64574c246875cebd0c3ac7c8041d791d3091ba3b7083931be986a31d3c251479a2911c634aa1028f30852e6e213380a70a1c57bafe4467cbdd131e171c1136e2f8d144c8cd7a354edb93fe4f140b2e5a7c2d7ccfb2b77328d946ce2acbd6ddbfe50b81d2e1d4c5eacc3853876ae12ec4128332ff594c01309d32451d7a71913452476f1bb5af7b280bcb5bfa98e3c1a3d0e50ce58938b3c1fad0225ec051266ea8ac597a332313d023cc8b39732768e83feaca0ebe47c64684b192893e983c7be31489e86f3c99e76131e9e73c5733c4d79091f6182f9a4bc5b26ecf1dd8faa8124be2b87cfa7a589257aa63ac67f9d5046fc3be4feafc1f187dfa8fdb249110890aacdfdd53a"], "u": "28f3ec44eae678f9d0d8238c0b3a01a146d56ccc4c1125f0373d394c4e1e95f4", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (8, '{"c": "8", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801783caa0b75f5aa4c005b423d7518fd4ba385e489dabd945f2894e79a6109660602d6044ebff087093acc682aeadc5e303917d328f350b20396d48a115d0db162ea4dbf0b7f83acdaf576c06edf52168a8deb8e5458c5521a45d148ad5dfc8cb8f50e0943b2041918834d84daedac15d1d88e5cb3b0cbcd731c2fcad75719a5a81a6f7a423dd27c5d00fd7ad215d06e0b34969358486e8ecd089d5d4c614b56cd47e21ee0d07adf8c6a3770f21e239ca367cd97d4168054d3b8e09fdc7da862fa021aeb21929837959cc89c091fe4c7d42c4873edef63f0adad04abdcc1ac5e4c9c8622293c6c8399085f92a6f5cf037043ccac1f69b8626d0453dda0098b45aae708b99ef44edf3c41f6509e407f76756266260c40e5080fcc8719f1e2ffea46"], "u": "9e80a31275db9e5ebc9a254864971cdef2ca68b0047712d3d106d86516bcfc6a", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (9, '{"c": "9", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x12121212121259dae28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801357205e56d3cf91febac317b17108335156373777c7a0474b8bf8f3ca4a05681debfa5ca3c19c4d272209cf423f0414911cf80c4f5da0480e6865f0929c55deda9ed42f859be162e6f307552fa56ae91bb6a197222910d78847204e53df19046c99a5cd8282748a10fc73e04dd162296c3a2bf90d293c56277c2949cca4535f75ab268725c6614cdeb6f828eea6ed428acb3ec935e6793908217044ff3062d6194f79040a43d3951ed5786682672754e0cdd044a2d6f3ac0c02c9ac45917dca0ded737028f84a058799181a750d1f60e7f77ef31cf476ffa1c9ab25c5f02924814b5cb9bf3e59c2469de963e6253f4c80db37304b32c719615669fcc2b394782addf37041e1e31eafb6000ec5ec3d1ff87167eefef767ae5cee9cc593664f48c"], "u": "94ec6ec3b6a8acb4d1b94f0c3a4a7c6359b11ce5d8fd01a7e4474e5e7a0cca8b", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'); --- 5 .. 9 -INSERT INTO encrypted (id, encrypted_int2) VALUES (5, '{"c": "5", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212591fe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801d7a2a8638edc950e921074126382a46dae8bf87cb681a5eeaa7d27c3a71679687677a9f0c4973d0a86100bd6f97be3865659689278109a70532cec5a3bd0564508255506f5043e0e42f8046f878ff3bdb65aabdbe9883d15b4fd6271819fcc46767b1019c95782b3bf03f94abdae0a1b821a9d0a6f44c40fb0249e0078074b5a4692f0735fe70041ad68cf194abe1a33b17fd43e14911513dabd1adca315820c017b85b003cf6807f21a18d8349619885d78004556c4c410916c9e6eb4a6f79d1bf0e77b1ce109445fc8a9d86e471e78894e59af894780fe5b047a280ea5b8a2d1b20400ad886437b551786e99b2cf788a69524d299991f136c7c850cdd5d39a1f7152feebea0ee720d23b0b8514cfc3d8c99e8f44052cfd0134f335ac9fa1fd"], "u": "cdd6248063d3431f3fe010c5728954fd62cbf42b0c515a9991bd4fc673604e26", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (6, '{"c": "6", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212599de28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a6afd969a465c445ab35c15e7ef11ebaaa97578179e9cf7e8f186317352ef4316c1fae5079582a0c1195756bc5cb789d2ef48bd1d531c259f3273477f92c642c1a54633ad74987532d2044be59916a3743d5156c7c5e0d1dd256c79fb955023ab1dae725cae77e712d2075cabf46aa33b96d2cefa8b3ea3b2e4fc7c4966c883fd2018f6e1f33b418dadbea80c10b5320090be7d60abf2e19111ee58e75b1ee8e3dee2c133265dfd5179f0b885306addbde51a402adf1d13e34f5d6b67c739ed40cb57e74517bb3e7bf02529790af64de4b19e0d6a0d6d4f0b79ae613266a48165d5a8ef18d605e239e0c57a96072527d0d9d5d2655585adbeac83f7f3fc2381b9e772cab2e65cc9537b8142f105a0f4a3d8c97889255c7b5b2b15061149412ad"], "u": "a97ec70e9e4cc5c6888f1f809ec4fa551aff8633d76cfb26bb20997d4d50ca91", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (7, '{"c": "7", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["1212121212125948e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a901168d92ea2d7df254becc59888cf4a411c9f619a77715716200fbc36fb78ed7cd088e647a1d9ea722ae8144f050573024c899a85d6db80fcc6459bece64646a3805bb46bd72c4d27c1917fcdfbfa049a9139f0bb021e5e31bf2b8f0df014d9d09cd9cdc5b6f21fc6f843f506ca773c9a1951e2c5b7aa09e17c8864180163b5f6ec26f5826aef99d0631de5965451e22f24726b6956e4d490f3a5e690c81b30db160b64f455cf07e64e2b57d69719cb6dd1df65a7cf688571c983f75b51846b475b01f56eda9d4bfad849ba3ffa17a1b0bc6ef247da5fb3fc7d49634806acc132caf2a225388c0e0d1dabdf74b9ec8aa44771c789cc919227d9dc4c6465de21614a1a1f33a7a9c8138d06a9eacba64444cc0f98aa7f13ba4d2def340d6250a"], "u": "28f3ec44eae678f9d0d8238c0b3a01a146d56ccc4c1125f0373d394c4e1e95f4", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (8, '{"c": "8", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212594ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801783caa0b75f5aa4c005b423d7518fd4b0d9f553a75636801a6a1cd246227261dcf8eed0caa3defebf4e45e15f6692e38192bbda5913827b59d9eb72cb85e638803f9642cad7225fd45379a283eb51b154d9794df12b0e62b9cab9e7189517a54fc1e5a473d1630092146f53d8700b7661824f175ba7d953a57b8dc7b9b27dd215f75e23a4c3f7318de298da94fcdd17cb4946f1229ef815b7014dc76ee67d2535cba61b05444beebbf35a403a23886d04023adcc5452de4d4c1639fabdba6bbc9a37d4daed7ecc091f0c17a4893b79aa3e250207966cb9fb75055ba615d44609cdaa0f88fda50595a96bed6f13e2d30577ec81a59f49f901ff36e10c251969e30b87144c9ad13073d63e6de7d6f2f78b4ec78118bbe2002bbb7698e22d8c6b96"], "u": "9e80a31275db9e5ebc9a254864971cdef2ca68b0047712d3d106d86516bcfc6a", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (9, '{"c": "9", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["12121212121259dae28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801357205e56d3cf91febac317b171083353fdb3ad88d5525f2ed24157c65616978e3b29d5641bb30e7972173d1225e51c4a648721565e6583ff0e29898885f34bed5803af54254ed48e524e2c53614fb8abd4079daf12c519abe2622aa340eff843798c64ed843dd3528849783573a5e90d05e78aaaf596b58239324f862b8d63028bd78f05410868063963845306c21ccce475a058fa66e03bc0519e434504a1db60a5c1f3dbeac1504e31ae4bc731f5c4860de2952ef10aba433580079303d9724275d355f26bf60b58054522422ff2cb11896092b8ad55e246bcc7c335b2581e156b370bd9c18b93b991440cf52203af64579a8729ea4acb3bbd5ff80d3910ed3431cc48dacd7f70f4504d4686ce023ce0a46fac48f4a7834c2a4a73a220acb"], "u": "94ec6ec3b6a8acb4d1b94f0c3a4a7c6359b11ce5d8fd01a7e4474e5e7a0cca8b", "v": 1}'); --- 1 -INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": 1, "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a651f4442c298030a6e752d2776d99cab01b445aca923a25dfa511bbb3ecad11034c9b33facf27b6f8fbe276f2638c2e4aa78aa46c245c45efd918b0c0d029b5979cdbd26bb7e172060917b1d66554045ccc190f797c55ac5c062320f49e1f78a2410482579e4fb74cc8ba9e60d0842bfa08680cde8b0f4bb3090578c67d1e26678f4254559632fa854377c1da9266e3651a9c033a05f7bbabe31fa92b7ca59c48af7f77e9dc63f6d6fd9cd8dbcb86a7f06847f6be4d07474d11c30b99f41b17ef1093918923c9fc17d0b60fdfffb0e9c00f5f2c29b94de6e56f940ff6181a3e2de16729b7d65157cd604f97fa50d3f9363143d3a1356c1e93f7b2a67587b81a1309c6b51f9cfb4338406316e69a2ce2c"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'); +SELECT * FROM encrypted ORDER BY encrypted_int2; -SELECT id FROM encrypted ORDER BY encrypted_int2 DESC; -- ORE LT < AND GT > OPERATORS DO $$ DECLARE + ore_cs_encrypted_high cs_encrypted_v1; + ore_cs_encrypted_low cs_encrypted_v1; + ore_json_high jsonb; + ore_json_low jsonb; result_id integer; BEGIN + ore_cs_encrypted_high := '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; + ore_cs_encrypted_low := '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; - SELECT id - FROM encrypted ORDER BY encrypted_int2 - LIMIT 1 + ore_json_high := '{"o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"]}'; + ore_json_low := '{"o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"]}'; + + + -- ------------------------------------------------------------------------------------------------ + + SELECT id FROM encrypted ORDER BY encrypted_int2 DESC LIMIT 1 + INTO result_id; + + ASSERT result_id = 99; + + + SELECT id FROM encrypted ORDER BY encrypted_int2 ASC LIMIT 1 + INTO result_id; + + ASSERT result_id = 1; + + SELECT id FROM encrypted + WHERE encrypted_int2 < ore_cs_encrypted_high + ORDER BY encrypted_int2 DESC LIMIT 1 + INTO result_id; + + ASSERT result_id = 9; + + SELECT id FROM encrypted + WHERE encrypted_int2 < ore_cs_encrypted_high + ORDER BY encrypted_int2 ASC LIMIT 1 + INTO result_id; + + ASSERT result_id = 1; + + + SELECT id FROM encrypted + WHERE encrypted_int2 > ore_cs_encrypted_low + ORDER BY encrypted_int2 ASC LIMIT 1 INTO result_id; + ASSERT result_id = 5; + + + SELECT id FROM encrypted + WHERE encrypted_int2 > ore_cs_encrypted_low + ORDER BY encrypted_int2 DESC LIMIT 1 + INTO result_id; + + ASSERT result_id = 99; + END; $$ LANGUAGE plpgsql; diff --git a/tests/operators-ore.sql b/tests/operators-ore.sql index c82db8ae..65bac14d 100644 --- a/tests/operators-ore.sql +++ b/tests/operators-ore.sql @@ -8,6 +8,7 @@ CREATE TABLE encrypted PRIMARY KEY(id) ); +-- The value of encrypted_int2 == id INSERT INTO encrypted (id, encrypted_int2) VALUES (99, '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'); INSERT INTO encrypted (id, encrypted_int2) VALUES (5, '{"c": "mBbLon>=7ftt`=*S&jse$4dOf6yJvdxSqSRPpFtGPlBHkz6(wFqQoGnB5@)Ov#bUqy)1tr`#7noW cs_encrypted_v1 SELECT COUNT(id) From fc45184a6c72e8734a1dc646d1c7c7d89345678f Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 14 Feb 2025 15:22:10 +1100 Subject: [PATCH 09/15] EQ tests with ORE --- tests/operators-eq.sql | 189 ++++++++++++----------------------------- 1 file changed, 55 insertions(+), 134 deletions(-) diff --git a/tests/operators-eq.sql b/tests/operators-eq.sql index ad51ee54..aad83a0d 100644 --- a/tests/operators-eq.sql +++ b/tests/operators-eq.sql @@ -1,37 +1,28 @@ --- Create a table with a plaintext column -DROP TABLE IF EXISTS users; -CREATE TABLE users +\set ON_ERROR_STOP on + +DROP TABLE IF EXISTS encrypted; +CREATE TABLE encrypted ( - id bigint GENERATED ALWAYS AS IDENTITY, - name_encrypted cs_encrypted_v1, + id bigint, + encrypted_int2 cs_encrypted_v1, PRIMARY KEY(id) ); - -INSERT INTO users (name_encrypted) VALUES ( - '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "u": "unique-text" - }'::jsonb -); +INSERT INTO encrypted (id, encrypted_int2) VALUES (99, '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-99", "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-1", "o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "v": 1}'); -- UNIQUE eq = OPERATORS DO $$ BEGIN + + -- SANITY CHECK - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE cs_unique_v1(name_encrypted) = cs_unique_v1('{"u":"unique-text"}'))); + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE cs_unique_v1(encrypted_int2) = cs_unique_v1('{"u":"unique-99"}'))); ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted = '{ + SELECT id FROM encrypted WHERE encrypted_int2 = '{ "v": 1, "k": "ct", "c": "ciphertext", @@ -39,29 +30,29 @@ DO $$ "t": "users", "c": "name" }, - "u": "unique-text" + "u": "unique-1" }'::jsonb )); -- cs_encrypted_v1 = jsonb ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted = '{"u": "unique-text"}'::jsonb + SELECT id FROM encrypted WHERE encrypted_int2 = '{"u": "unique-1"}'::jsonb )); -- jsonb = cs_encrypted_v1 ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE '{"u": "unique-text"}'::jsonb = name_encrypted + SELECT id FROM encrypted WHERE '{"u": "unique-99"}'::jsonb = encrypted_int2 )); -- cs_encrypted_v1 = text - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted = 'unique-text'::text)); - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted = 'unique-text'::cs_unique_index_v1)); + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE encrypted_int2 = 'unique-1'::text)); + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE encrypted_int2 = 'unique-99'::cs_unique_index_v1)); -- text = cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE 'unique-text'::text = name_encrypted)); + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE 'unique-1'::text = encrypted_int2)); -- cs_encrypted_v1 = cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted = '{ + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE encrypted_int2 = '{ "v": 1, "k": "ct", "c": "ciphertext", @@ -69,7 +60,7 @@ DO $$ "t": "users", "c": "name" }, - "u": "unique-text" + "u": "unique-99" }'::cs_encrypted_v1)); END; @@ -80,19 +71,19 @@ $$ LANGUAGE plpgsql; DO $$ BEGIN -- SANITY CHECK - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE cs_unique_v1(name_encrypted) != cs_unique_v1('{"u":"random-text"}'))); - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE cs_unique_v1(name_encrypted) <> cs_unique_v1('{"u":"random-text"}'))); + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE cs_unique_v1(encrypted_int2) != cs_unique_v1('{"u":"random-text"}'))); + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE cs_unique_v1(encrypted_int2) <> cs_unique_v1('{"u":"random-text"}'))); -- cs_encrypted_v1 = jsonb - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted != '{"u":"random-text"}'::jsonb)); - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <> '{"u":"random-text"}'::jsonb)); + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE encrypted_int2 != '{"u":"random-text"}'::jsonb)); + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE encrypted_int2 <> '{"u":"random-text"}'::jsonb)); -- cs_encrypted_v1 = text - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted != 'random-text'::text)); - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <> 'random-text'::text)); + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE encrypted_int2 != 'random-text'::text)); + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE encrypted_int2 <> 'random-text'::text)); -- cs_encrypted_v1 = cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted != '{ + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE encrypted_int2 != '{ "v": 1, "k": "ct", "c": "ciphertext", @@ -103,7 +94,7 @@ DO $$ "u": "random-text" }'::cs_encrypted_v1)); - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <> '{ + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE encrypted_int2 <> '{ "v": 1, "k": "ct", "c": "ciphertext", @@ -119,149 +110,79 @@ DO $$ $$ LANGUAGE plpgsql; -TRUNCATE TABLE users; - --- --- Example ORE values are generated from an array in the form `vec![0, 1, 2, 3, 4, 5]`; --- --- JSON values are JSON escaped on top of a PostgreSQL escaped Record --- --- PostgreSQL value is ("{""(\\""\\\\\\\\x000102030405\\"")""}") --- --- -INSERT INTO users (name_encrypted) VALUES ( - '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")" - }'::jsonb -); -- ORE eq = OPERATORS DO $$ DECLARE - ore_cs_encrypted cs_encrypted_v1; - ore_json jsonb; - ore_record text; + ore_cs_encrypted_99 cs_encrypted_v1; + ore_cs_encrypted_1 cs_encrypted_v1; + ore_json_1 jsonb; BEGIN - ore_cs_encrypted := '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")" - }'; + ore_cs_encrypted_99 := '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-99", "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; - ore_json := '{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")"}'; + ore_cs_encrypted_1 := '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-1", "o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; + ore_json_1 := '{"o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"]}'; - ore_record = '("{""(\\""\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\"")""}")'; -- 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 encrypted WHERE cs_ore_64_8_v1(encrypted_int2) = cs_ore_64_8_v1(ore_json_1))); ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted = ore_cs_encrypted::jsonb + SELECT id FROM encrypted WHERE encrypted_int2 = ore_cs_encrypted_99::jsonb )); -- -- cs_encrypted_v1 = jsonb ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted = ore_json::jsonb + SELECT id FROM encrypted WHERE encrypted_int2 = ore_json_1::jsonb )); -- -- jsonb = cs_encrypted_v1 ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE ore_json::jsonb = name_encrypted + SELECT id FROM encrypted WHERE ore_json_1::jsonb = encrypted_int2 )); - -- -- cs_encrypted_v1 = ore_64_8_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted = ore_record::ore_64_8_v1)); - - -- -- -- ore_64_8_v1 = cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE ore_record::ore_64_8_v1 = name_encrypted)); - -- -- -- cs_encrypted_v1 = cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted = ore_cs_encrypted::cs_encrypted_v1)); + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE encrypted_int2 = ore_cs_encrypted_1::cs_encrypted_v1)); END; $$ LANGUAGE plpgsql; -TRUNCATE TABLE users; - -INSERT INTO users (name_encrypted) VALUES ( - '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x12121212121259bfe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801ff4a28b714e4cde8df10625dce72602fdbdcc53d515857f1119f5912804ce09c6cf6c2d37393a27a465134523b512664582f834e15003b7216cb668480bc3e7d1c069f2572ece7c848b9eb9a28b4e62bfc2b97c93e61b2054154e621c5bbb7bed37de3d7c343bd3dbcf7b4af20128c961351bf55910a855f08a8587c2059a5f05ca8d7a082e695b3dd4ff3ce86694d4fe98972220eea1ab90f5de493ef3a502b74a569f103ee2897ebc9ae9b16a17e7be67415ee830519beb3058ffc1c1eb0e574d66c8b365919f27eb00aa7bce475d7bdaad4ed800f8fc3d626e0eb842e312b0cc22a1ccf89847ebb2cd0a6e18aec21bd2deeec1c47301fc687f7f764bb882b50f553c246a6da5816b78b3530119ea68b08a8403a90e063e58502670563bd4d\\\\\"\")\"\"}\")" - }'::jsonb -); --- ORE eq = OPERATORS + +-- ORE eq <> OPERATORS DO $$ DECLARE - ore_cs_encrypted cs_encrypted_v1; - ore_json jsonb; - ore_record text; + ore_cs_encrypted_99 cs_encrypted_v1; + ore_cs_encrypted_1 cs_encrypted_v1; + ore_json_1 jsonb; BEGIN - ore_cs_encrypted := '{ - "v": 1, - "k": "ct", - "c": "ciphertext", - "i": { - "t": "users", - "c": "name" - }, - "m": [1, 2, 3], - "o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\\\\"\")\"\"}\")" - }'; + ore_cs_encrypted_99 := '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-99", "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; - ore_json := '{"o":"(\"{\"\"(\\\\\"\"\\\\\\\\\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\\\\"\")\"\"}\")"}'; + ore_cs_encrypted_1 := '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-1", "o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; + ore_json_1 := '{"o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"]}'; - ore_record = '("{""(\\""\\\\\\\\x1212121212125932e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd8011f94b49eaa5fa5a60e1e2adccde4185a7d6c7f83088500b677f897d4ffc276016d614708488f407c01bd3ccf2be653269062cb97f8945a621d049277d19b1c248611f25d047038928d2efeb4323c402af4c19288c7b36911dc06639af5bb34367519b66c1f525bbd3828c12067c9c579aeeb4fb3ae0918125dc1dad5fd518019a5ae67894ce1a7f7bed1a591ba8edda2fdf4cd403761fd981fb1ea5eb0bf806f919350ee60cac16d0a39a491a4d79301781f95ea3870aea82e9946053537360b2fb415b18b61aed0af81d461ad6b923f10c0df79daddc4e279ff543a282bb3a37f9fa03238348b3dac51a453b04bced1f5bd318ddd829bdfe5f37abdbeda730e21441b818302f3c5c2c4d5657accfca4c53d7a80eb3db43946d38965be5f796b\\"")""}")'; -- 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 encrypted WHERE cs_ore_64_8_v1(encrypted_int2) <> cs_ore_64_8_v1(ore_json_1))); ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted <> ore_cs_encrypted::jsonb + SELECT id FROM encrypted WHERE encrypted_int2 <> ore_cs_encrypted_99::jsonb )); - -- -- -- cs_encrypted_v1 <> jsonb + -- -- cs_encrypted_v1 = jsonb ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE name_encrypted <> ore_json::jsonb + SELECT id FROM encrypted WHERE encrypted_int2 <> ore_json_1::jsonb )); - -- -- -- jsonb <> cs_encrypted_v1 + -- -- jsonb = cs_encrypted_v1 ASSERT (SELECT EXISTS ( - SELECT id FROM users WHERE ore_json::jsonb <> name_encrypted + SELECT id FROM encrypted WHERE ore_json_1::jsonb <> encrypted_int2 )); - -- -- -- cs_encrypted_v1 <> ore_64_8_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <> ore_record::ore_64_8_v1)); - - -- -- -- -- ore_64_8_v1 <> cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE ore_record::ore_64_8_v1 <> name_encrypted)); - - -- -- -- -- cs_encrypted_v1 <> cs_encrypted_v1 - ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <> ore_cs_encrypted::cs_encrypted_v1)); + -- -- -- cs_encrypted_v1 = cs_encrypted_v1 + ASSERT (SELECT EXISTS (SELECT id FROM encrypted WHERE encrypted_int2 <> ore_cs_encrypted_1::cs_encrypted_v1)); END; $$ LANGUAGE plpgsql; - From 8c22347197d6d9d368a3b6506ea23320a5c6cc44 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 14 Feb 2025 15:28:21 +1100 Subject: [PATCH 10/15] Ore is now array --- tests/core-functions.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/core-functions.sql b/tests/core-functions.sql index 792a7e3a..7e0c4ac2 100644 --- a/tests/core-functions.sql +++ b/tests/core-functions.sql @@ -6,7 +6,7 @@ DO $$ ASSERT (SELECT EXISTS (SELECT cs_unique_v1('{"u": "u"}'::jsonb))); ASSERT (SELECT EXISTS (SELECT cs_match_v1('{"m": []}'::jsonb))); ASSERT (SELECT EXISTS (SELECT cs_ste_vec_v1('{"sv": [[]]}'::jsonb))); - ASSERT (SELECT EXISTS (SELECT cs_ore_64_8_v1('{"o": "()"}'::jsonb))); + ASSERT (SELECT EXISTS (SELECT cs_ore_64_8_v1('{"o": []}'::jsonb))); END; $$ LANGUAGE plpgsql; @@ -14,7 +14,7 @@ $$ LANGUAGE plpgsql; DO $$ BEGIN -- sanity check - PERFORM cs_ore_64_8_v1('{"o": "()"}'::jsonb); + PERFORM cs_ore_64_8_v1('{"o": []}'::jsonb); BEGIN PERFORM cs_ore_64_8_v1('{}'::jsonb); From db9e67af1e2d332242d459d538f2445d88b1f784 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 14 Feb 2025 15:57:50 +1100 Subject: [PATCH 11/15] Cleanup --- sql/011-core-functions.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/sql/011-core-functions.sql b/sql/011-core-functions.sql index 07e0aaa0..c52b7f45 100644 --- a/sql/011-core-functions.sql +++ b/sql/011-core-functions.sql @@ -74,7 +74,6 @@ DROP FUNCTION IF EXISTS jsonb_array_to_bytea_array(val jsonb); CREATE FUNCTION jsonb_array_to_bytea_array(jsonb) RETURNS bytea[] AS $$ - -- SELECT array_agg(decode(term, 'hex'))::bytea[] || ARRAY[]::bytea[] FROM jsonb_array_elements_text($1) t(term); SELECT array_agg(term)::bytea[] || ARRAY[]::bytea[] FROM jsonb_array_elements_text($1) t(term); $$ LANGUAGE sql IMMUTABLE; From 7ae0c79821f6e0aa38de98cf5fb4c48088b33965 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 17 Feb 2025 10:58:05 +1100 Subject: [PATCH 12/15] Expand ordering tests --- tests/operators-ore-order.sql | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/tests/operators-ore-order.sql b/tests/operators-ore-order.sql index 5df49b3f..ed8cd1b4 100644 --- a/tests/operators-ore-order.sql +++ b/tests/operators-ore-order.sql @@ -21,10 +21,7 @@ INSERT INTO encrypted (id, encrypted_int2) VALUES (9, '{"c": "9", "i": {"table": INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'); -SELECT * FROM encrypted ORDER BY encrypted_int2; - --- ORE LT < AND GT > OPERATORS DO $$ DECLARE ore_cs_encrypted_high cs_encrypted_v1; @@ -44,15 +41,29 @@ DO $$ SELECT id FROM encrypted ORDER BY encrypted_int2 DESC LIMIT 1 INTO result_id; - ASSERT result_id = 99; + SELECT id FROM encrypted ORDER BY encrypted_int2 DESC LIMIT 1 OFFSET 1 + INTO result_id; + ASSERT result_id = 9; - SELECT id FROM encrypted ORDER BY encrypted_int2 ASC LIMIT 1 + SELECT id FROM encrypted ORDER BY encrypted_int2 DESC LIMIT 1 OFFSET 5 INTO result_id; + ASSERT result_id = 5; + SELECT id FROM encrypted ORDER BY encrypted_int2 ASC LIMIT 1 + INTO result_id; ASSERT result_id = 1; + SELECT id FROM encrypted ORDER BY encrypted_int2 ASC LIMIT 1 OFFSET 1 + INTO result_id; + ASSERT result_id = 5; + + SELECT id FROM encrypted ORDER BY encrypted_int2 ASC LIMIT 1 OFFSET 5 + INTO result_id; + ASSERT result_id = 9; + + SELECT id FROM encrypted WHERE encrypted_int2 < ore_cs_encrypted_high ORDER BY encrypted_int2 DESC LIMIT 1 @@ -64,7 +75,6 @@ DO $$ WHERE encrypted_int2 < ore_cs_encrypted_high ORDER BY encrypted_int2 ASC LIMIT 1 INTO result_id; - ASSERT result_id = 1; @@ -72,7 +82,6 @@ DO $$ WHERE encrypted_int2 > ore_cs_encrypted_low ORDER BY encrypted_int2 ASC LIMIT 1 INTO result_id; - ASSERT result_id = 5; @@ -80,10 +89,8 @@ DO $$ WHERE encrypted_int2 > ore_cs_encrypted_low ORDER BY encrypted_int2 DESC LIMIT 1 INTO result_id; - ASSERT result_id = 99; - END; $$ LANGUAGE plpgsql; From dd69d983e73575ed99995452592a7f5f85abede3 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 18 Feb 2025 20:26:39 +1100 Subject: [PATCH 13/15] decode instead of cast bytea --- sql/000-ore.sql | 6 -- sql/011-core-functions.sql | 8 +- sql/666-drop_types.sql | 1 - tests/operators-eq.sql | 16 ++-- tests/operators-ore-order.sql | 22 ++--- tests/operators-ore.sql | 157 +++++++++++++++++----------------- 6 files changed, 104 insertions(+), 106 deletions(-) diff --git a/sql/000-ore.sql b/sql/000-ore.sql index bad69f9e..5283e793 100644 --- a/sql/000-ore.sql +++ b/sql/000-ore.sql @@ -94,13 +94,7 @@ CREATE FUNCTION compare_ore_array(a bytea[], b bytea[]) RETURNS integer AS $$ DECLARE cmp_result integer; - len_a integer; - len_b integer; BEGIN - - SELECT array_length(a, 1) INTO len_a; - SELECT array_length(b, 1) INTO len_b; - IF (array_length(a, 1) = 0 OR a IS NULL) AND (array_length(b, 1) = 0 OR b IS NULL) THEN RETURN 0; END IF; diff --git a/sql/011-core-functions.sql b/sql/011-core-functions.sql index c52b7f45..88215a9d 100644 --- a/sql/011-core-functions.sql +++ b/sql/011-core-functions.sql @@ -72,10 +72,12 @@ $$ LANGUAGE plpgsql; DROP FUNCTION IF EXISTS jsonb_array_to_bytea_array(val jsonb); -CREATE FUNCTION jsonb_array_to_bytea_array(jsonb) +CREATE FUNCTION jsonb_array_to_bytea_array(val jsonb) RETURNS bytea[] AS $$ - SELECT array_agg(term)::bytea[] || ARRAY[]::bytea[] FROM jsonb_array_elements_text($1) t(term); -$$ LANGUAGE sql IMMUTABLE; + SELECT array_agg(decode(value::text, 'hex')) + FROM jsonb_array_elements_text(val) AS value; +$$ LANGUAGE sql; + DROP FUNCTION IF EXISTS cs_ore_64_8_v1(val jsonb); diff --git a/sql/666-drop_types.sql b/sql/666-drop_types.sql index c3cadd23..e03241fd 100644 --- a/sql/666-drop_types.sql +++ b/sql/666-drop_types.sql @@ -1,6 +1,5 @@ -- ANYTHING THAT NEEDS TO BE DROPPED LAST DROP TYPE IF EXISTS ore_64_8_v1; --- DROP TYPE IF EXISTS ore_64_8_v1_term; DROP TYPE IF EXISTS cs_ste_vec_index_v1; DROP TYPE IF EXISTS cs_ste_vec_v1_entry; DROP TYPE IF EXISTS ore_cllw_8_v1; diff --git a/tests/operators-eq.sql b/tests/operators-eq.sql index aad83a0d..8a1ae803 100644 --- a/tests/operators-eq.sql +++ b/tests/operators-eq.sql @@ -8,8 +8,8 @@ CREATE TABLE encrypted PRIMARY KEY(id) ); -INSERT INTO encrypted (id, encrypted_int2) VALUES (99, '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-99", "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-1", "o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (99, '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-99", "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-1", "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "v": 1}'); @@ -118,11 +118,11 @@ DO $$ ore_cs_encrypted_1 cs_encrypted_v1; ore_json_1 jsonb; BEGIN - ore_cs_encrypted_99 := '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-99", "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; + ore_cs_encrypted_99 := '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-99", "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; - ore_cs_encrypted_1 := '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-1", "o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; + ore_cs_encrypted_1 := '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-1", "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; - ore_json_1 := '{"o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"]}'; + ore_json_1 := '{"o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"]}'; -- SANITY CHECK @@ -157,11 +157,11 @@ DO $$ ore_cs_encrypted_1 cs_encrypted_v1; ore_json_1 jsonb; BEGIN - ore_cs_encrypted_99 := '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-99", "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; + ore_cs_encrypted_99 := '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-99", "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; - ore_cs_encrypted_1 := '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-1", "o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; + ore_cs_encrypted_1 := '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "u": "unique-1", "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; - ore_json_1 := '{"o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"]}'; + ore_json_1 := '{"o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"]}'; -- SANITY CHECK diff --git a/tests/operators-ore-order.sql b/tests/operators-ore-order.sql index ed8cd1b4..31e552d9 100644 --- a/tests/operators-ore-order.sql +++ b/tests/operators-ore-order.sql @@ -12,13 +12,13 @@ CREATE TABLE encrypted CREATE index ON encrypted (encrypted_int2 cs_encrypted_ore_64_8_v1_btree_ops_v1); -- The value of encrypted_int2 == id -INSERT INTO encrypted (id, encrypted_int2) VALUES (99,'{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (5, '{"c": "5", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212591fe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801d7a2a8638edc950e921074126382a46da05655a5205c0d5196dec740f50d1fcfa8221cd9aa78fc7b6f276f0131f9a02734b0c3dba6ac1ce512718d8f31ec80caa7a1c3c852c67a5d22890bfd6e7099572fa9cd9dcafeae9c3ce4fb60a4cbe22174ff7f2a5d345215fb748524dcaad2e615e8922ae59280463d7b35821dfefe8821fbec700de11832019654aa521b043e15b242ac711f2552ee879b03f15e55bbf0e6a79e9c86f0c6067baf78ed84a7ffae447cb01157ffa9556e81fad25aaf1686f6e9a989f2c5f24d0011c3e86d7abf14ea16005bda2d59d803f5a609fa035ef072475a8cc5645490f3de2253fe4d4ebcd4825d48108f0f485c6b0f7c5ca963c9d3d4bd6e2d86163a26aff609fe2bb59b0da6ff623958179591d1ee62226a50"], "u": "cdd6248063d3431f3fe010c5728954fd62cbf42b0c515a9991bd4fc673604e26", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (6, '{"c": "6", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212599de28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a6afd969a465c445ab35c15e7ef11eba3b65e765e52eb048019b0c2aec77012d71fff7b3d18b5b28e8cfce2901a2858b7aab627e07e69bb46c1503226ade5b0f8b77f21458d2cc1bcf99dd05da127be1c8cfc5323a18b6d53ba0715b5898a43cf1b05520d8957340d34ad49f778ff78afe974ba973c2460cdfd79ce9599915f4c95ec22f93231110bb3131aa7601a26589abd32f41845a977747163113a9395a82b3cee1f316bbe586b42e14130c870d6c731d0e499ecea7a1ef3f38fc7ef8ad43b52cf8dd7cf5723ddbfa1404717d0a0e63ef7be577b5a551aafcd9c28ecdef1cb2011cf468a1fff72b72264be1a6cc26d16a08e0bd0007ff0d09527f503e97c56f16e1efbf94c7318390c9e27eb92683a63ade0864376257a81d1cf9a97c73"], "u": "a97ec70e9e4cc5c6888f1f809ec4fa551aff8633d76cfb26bb20997d4d50ca91", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (7, '{"c": "7", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x1212121212125948e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a901168d92ea2d7df254becc59888cf41530bacb77fa8c9aabe64574c246875cebd0c3ac7c8041d791d3091ba3b7083931be986a31d3c251479a2911c634aa1028f30852e6e213380a70a1c57bafe4467cbdd131e171c1136e2f8d144c8cd7a354edb93fe4f140b2e5a7c2d7ccfb2b77328d946ce2acbd6ddbfe50b81d2e1d4c5eacc3853876ae12ec4128332ff594c01309d32451d7a71913452476f1bb5af7b280bcb5bfa98e3c1a3d0e50ce58938b3c1fad0225ec051266ea8ac597a332313d023cc8b39732768e83feaca0ebe47c64684b192893e983c7be31489e86f3c99e76131e9e73c5733c4d79091f6182f9a4bc5b26ecf1dd8faa8124be2b87cfa7a589257aa63ac67f9d5046fc3be4feafc1f187dfa8fdb249110890aacdfdd53a"], "u": "28f3ec44eae678f9d0d8238c0b3a01a146d56ccc4c1125f0373d394c4e1e95f4", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (8, '{"c": "8", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801783caa0b75f5aa4c005b423d7518fd4ba385e489dabd945f2894e79a6109660602d6044ebff087093acc682aeadc5e303917d328f350b20396d48a115d0db162ea4dbf0b7f83acdaf576c06edf52168a8deb8e5458c5521a45d148ad5dfc8cb8f50e0943b2041918834d84daedac15d1d88e5cb3b0cbcd731c2fcad75719a5a81a6f7a423dd27c5d00fd7ad215d06e0b34969358486e8ecd089d5d4c614b56cd47e21ee0d07adf8c6a3770f21e239ca367cd97d4168054d3b8e09fdc7da862fa021aeb21929837959cc89c091fe4c7d42c4873edef63f0adad04abdcc1ac5e4c9c8622293c6c8399085f92a6f5cf037043ccac1f69b8626d0453dda0098b45aae708b99ef44edf3c41f6509e407f76756266260c40e5080fcc8719f1e2ffea46"], "u": "9e80a31275db9e5ebc9a254864971cdef2ca68b0047712d3d106d86516bcfc6a", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (9, '{"c": "9", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x12121212121259dae28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801357205e56d3cf91febac317b17108335156373777c7a0474b8bf8f3ca4a05681debfa5ca3c19c4d272209cf423f0414911cf80c4f5da0480e6865f0929c55deda9ed42f859be162e6f307552fa56ae91bb6a197222910d78847204e53df19046c99a5cd8282748a10fc73e04dd162296c3a2bf90d293c56277c2949cca4535f75ab268725c6614cdeb6f828eea6ed428acb3ec935e6793908217044ff3062d6194f79040a43d3951ed5786682672754e0cdd044a2d6f3ac0c02c9ac45917dca0ded737028f84a058799181a750d1f60e7f77ef31cf476ffa1c9ab25c5f02924814b5cb9bf3e59c2469de963e6253f4c80db37304b32c719615669fcc2b394782addf37041e1e31eafb6000ec5ec3d1ff87167eefef767ae5cee9cc593664f48c"], "u": "94ec6ec3b6a8acb4d1b94f0c3a4a7c6359b11ce5d8fd01a7e4474e5e7a0cca8b", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (99,'{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (5, '{"c": "5", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["121212121212591fe28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801d7a2a8638edc950e921074126382a46da05655a5205c0d5196dec740f50d1fcfa8221cd9aa78fc7b6f276f0131f9a02734b0c3dba6ac1ce512718d8f31ec80caa7a1c3c852c67a5d22890bfd6e7099572fa9cd9dcafeae9c3ce4fb60a4cbe22174ff7f2a5d345215fb748524dcaad2e615e8922ae59280463d7b35821dfefe8821fbec700de11832019654aa521b043e15b242ac711f2552ee879b03f15e55bbf0e6a79e9c86f0c6067baf78ed84a7ffae447cb01157ffa9556e81fad25aaf1686f6e9a989f2c5f24d0011c3e86d7abf14ea16005bda2d59d803f5a609fa035ef072475a8cc5645490f3de2253fe4d4ebcd4825d48108f0f485c6b0f7c5ca963c9d3d4bd6e2d86163a26aff609fe2bb59b0da6ff623958179591d1ee62226a50"], "u": "cdd6248063d3431f3fe010c5728954fd62cbf42b0c515a9991bd4fc673604e26", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (6, '{"c": "6", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["121212121212599de28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a6afd969a465c445ab35c15e7ef11eba3b65e765e52eb048019b0c2aec77012d71fff7b3d18b5b28e8cfce2901a2858b7aab627e07e69bb46c1503226ade5b0f8b77f21458d2cc1bcf99dd05da127be1c8cfc5323a18b6d53ba0715b5898a43cf1b05520d8957340d34ad49f778ff78afe974ba973c2460cdfd79ce9599915f4c95ec22f93231110bb3131aa7601a26589abd32f41845a977747163113a9395a82b3cee1f316bbe586b42e14130c870d6c731d0e499ecea7a1ef3f38fc7ef8ad43b52cf8dd7cf5723ddbfa1404717d0a0e63ef7be577b5a551aafcd9c28ecdef1cb2011cf468a1fff72b72264be1a6cc26d16a08e0bd0007ff0d09527f503e97c56f16e1efbf94c7318390c9e27eb92683a63ade0864376257a81d1cf9a97c73"], "u": "a97ec70e9e4cc5c6888f1f809ec4fa551aff8633d76cfb26bb20997d4d50ca91", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (7, '{"c": "7", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["1212121212125948e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a901168d92ea2d7df254becc59888cf41530bacb77fa8c9aabe64574c246875cebd0c3ac7c8041d791d3091ba3b7083931be986a31d3c251479a2911c634aa1028f30852e6e213380a70a1c57bafe4467cbdd131e171c1136e2f8d144c8cd7a354edb93fe4f140b2e5a7c2d7ccfb2b77328d946ce2acbd6ddbfe50b81d2e1d4c5eacc3853876ae12ec4128332ff594c01309d32451d7a71913452476f1bb5af7b280bcb5bfa98e3c1a3d0e50ce58938b3c1fad0225ec051266ea8ac597a332313d023cc8b39732768e83feaca0ebe47c64684b192893e983c7be31489e86f3c99e76131e9e73c5733c4d79091f6182f9a4bc5b26ecf1dd8faa8124be2b87cfa7a589257aa63ac67f9d5046fc3be4feafc1f187dfa8fdb249110890aacdfdd53a"], "u": "28f3ec44eae678f9d0d8238c0b3a01a146d56ccc4c1125f0373d394c4e1e95f4", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (8, '{"c": "8", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["121212121212594ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801783caa0b75f5aa4c005b423d7518fd4ba385e489dabd945f2894e79a6109660602d6044ebff087093acc682aeadc5e303917d328f350b20396d48a115d0db162ea4dbf0b7f83acdaf576c06edf52168a8deb8e5458c5521a45d148ad5dfc8cb8f50e0943b2041918834d84daedac15d1d88e5cb3b0cbcd731c2fcad75719a5a81a6f7a423dd27c5d00fd7ad215d06e0b34969358486e8ecd089d5d4c614b56cd47e21ee0d07adf8c6a3770f21e239ca367cd97d4168054d3b8e09fdc7da862fa021aeb21929837959cc89c091fe4c7d42c4873edef63f0adad04abdcc1ac5e4c9c8622293c6c8399085f92a6f5cf037043ccac1f69b8626d0453dda0098b45aae708b99ef44edf3c41f6509e407f76756266260c40e5080fcc8719f1e2ffea46"], "u": "9e80a31275db9e5ebc9a254864971cdef2ca68b0047712d3d106d86516bcfc6a", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (9, '{"c": "9", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["12121212121259dae28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801357205e56d3cf91febac317b17108335156373777c7a0474b8bf8f3ca4a05681debfa5ca3c19c4d272209cf423f0414911cf80c4f5da0480e6865f0929c55deda9ed42f859be162e6f307552fa56ae91bb6a197222910d78847204e53df19046c99a5cd8282748a10fc73e04dd162296c3a2bf90d293c56277c2949cca4535f75ab268725c6614cdeb6f828eea6ed428acb3ec935e6793908217044ff3062d6194f79040a43d3951ed5786682672754e0cdd044a2d6f3ac0c02c9ac45917dca0ded737028f84a058799181a750d1f60e7f77ef31cf476ffa1c9ab25c5f02924814b5cb9bf3e59c2469de963e6253f4c80db37304b32c719615669fcc2b394782addf37041e1e31eafb6000ec5ec3d1ff87167eefef767ae5cee9cc593664f48c"], "u": "94ec6ec3b6a8acb4d1b94f0c3a4a7c6359b11ce5d8fd01a7e4474e5e7a0cca8b", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'); @@ -30,11 +30,11 @@ DO $$ ore_json_low jsonb; result_id integer; BEGIN - ore_cs_encrypted_high := '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; - ore_cs_encrypted_low := '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; + ore_cs_encrypted_high := '{"c": "99", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; + ore_cs_encrypted_low := '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'; - ore_json_high := '{"o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"]}'; - ore_json_low := '{"o": ["\\x121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"]}'; + ore_json_high := '{"o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"]}'; + ore_json_low := '{"o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"]}'; -- ------------------------------------------------------------------------------------------------ diff --git a/tests/operators-ore.sql b/tests/operators-ore.sql index 65bac14d..34deeb67 100644 --- a/tests/operators-ore.sql +++ b/tests/operators-ore.sql @@ -9,15 +9,18 @@ CREATE TABLE encrypted ); -- The value of encrypted_int2 == id -INSERT INTO encrypted (id, encrypted_int2) VALUES (99, '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (5, '{"c": "mBbLon>=7ftt`=*S&jse$4dOf6yJvdxSqSRPpFtGPlBHkz6(wFqQoGnB5@)Ov#bUqy)1tr`#7noWJgfu~pkXjCBx%`R~Qw6gyWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x1212121212125948e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a901168d92ea2d7df254becc59888cf41530bacb77fa8c9aabe64574c246875cebd0c3ac7c8041d791d3091ba3b7083931be986a31d3c251479a2911c634aa1028f30852e6e213380a70a1c57bafe4467cbdd131e171c1136e2f8d144c8cd7a354edb93fe4f140b2e5a7c2d7ccfb2b77328d946ce2acbd6ddbfe50b81d2e1d4c5eacc3853876ae12ec4128332ff594c01309d32451d7a71913452476f1bb5af7b280bcb5bfa98e3c1a3d0e50ce58938b3c1fad0225ec051266ea8ac597a332313d023cc8b39732768e83feaca0ebe47c64684b192893e983c7be31489e86f3c99e76131e9e73c5733c4d79091f6182f9a4bc5b26ecf1dd8faa8124be2b87cfa7a589257aa63ac67f9d5046fc3be4feafc1f187dfa8fdb249110890aacdfdd53a"], "u": "28f3ec44eae678f9d0d8238c0b3a01a146d56ccc4c1125f0373d394c4e1e95f4", "v": 1}'); -INSERT INTO encrypted (id, encrypted_int2) VALUES (8, '{"c": "mBbJZ8KCF-%TLAttT!Kh)Bdx>6d*;f`!dvyxG>#+vD}RNtB2Us7sMbp(TSJniNkU`Hw$%;-2y!lE0z+OHrVk@cwi^L!sbglQ5m2>-BW9ogbyZjyIgeGg|W?{2@LgnyccSYi>kTA6xiNKsfTW>4X{HWg#UqTOMZa*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (5, '{"c": "mBbLon>=7ftt`=*S&jse$4dOf6yJvdxSqSRPpFtGPlBHkz6(wFqQoGnB5@)Ov#bUqy)1tr`#7noWJgfu~pkXjCBx%`R~Qw6gyWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["1212121212125948e28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801a901168d92ea2d7df254becc59888cf41530bacb77fa8c9aabe64574c246875cebd0c3ac7c8041d791d3091ba3b7083931be986a31d3c251479a2911c634aa1028f30852e6e213380a70a1c57bafe4467cbdd131e171c1136e2f8d144c8cd7a354edb93fe4f140b2e5a7c2d7ccfb2b77328d946ce2acbd6ddbfe50b81d2e1d4c5eacc3853876ae12ec4128332ff594c01309d32451d7a71913452476f1bb5af7b280bcb5bfa98e3c1a3d0e50ce58938b3c1fad0225ec051266ea8ac597a332313d023cc8b39732768e83feaca0ebe47c64684b192893e983c7be31489e86f3c99e76131e9e73c5733c4d79091f6182f9a4bc5b26ecf1dd8faa8124be2b87cfa7a589257aa63ac67f9d5046fc3be4feafc1f187dfa8fdb249110890aacdfdd53a"], "u": "28f3ec44eae678f9d0d8238c0b3a01a146d56ccc4c1125f0373d394c4e1e95f4", "v": 1}'); +INSERT INTO encrypted (id, encrypted_int2) VALUES (8, '{"c": "mBbJZ8KCF-%TLAttT!Kh)Bdx>6d*;f`!dvyxG>#+vD}RNtB2Us7sMbp(TSJniNkU`Hw$%;-2y!lE0z+OHrVk@cwi^L!sbglQ5m2>-BW9ogbyZjyIgeGg|W?{2@LgnyccSYi>kTA6xiNKsfTW>4X{HWg#UqTOMZ'o') AS elem(value); + -- ORE LT < AND GT > OPERATORS DO $$ DECLARE @@ -27,11 +30,11 @@ DO $$ ore_json_low jsonb; row_count integer; BEGIN - ore_cs_encrypted_high := '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; - ore_cs_encrypted_low := '{"c": "mBbK6IM@r}>@LgnyccSYi>kTA6xiNKsfTW>4X{HWg#UqTOMZ= OPERATORS -DO $$ - DECLARE - ore_cs_encrypted_high cs_encrypted_v1; - ore_cs_encrypted_low cs_encrypted_v1; - ore_json_high jsonb; - ore_json_low jsonb; - row_count integer; - BEGIN - ore_cs_encrypted_high := '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["\\x121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; - ore_cs_encrypted_low := '{"c": "mBbK6IM@r}>@LgnyccSYi>kTA6xiNKsfTW>4X{HWg#UqTOMZ= cs_encrypted_v1 - SELECT - COUNT(id) - FROM encrypted WHERE encrypted_int2 >= ore_cs_encrypted_low - INTO row_count; - ASSERT row_count = 7; - - -- -- cs_encrypted_v1 > jsonb - SELECT - COUNT(id) - FROM encrypted WHERE encrypted_int2 >= ore_json_high - INTO row_count; - - ASSERT row_count = 1; - - -- -- jsonb >= cs_encrypted_v1 - SELECT - COUNT(id) - FROM encrypted WHERE ore_json_low >= encrypted_int2 - INTO row_count; - - ASSERT row_count = 1; - - - END; -$$ LANGUAGE plpgsql; +-- -- ORE LTE <= AND GTE >= OPERATORS +-- DO $$ +-- DECLARE +-- ore_cs_encrypted_high cs_encrypted_v1; +-- ore_cs_encrypted_low cs_encrypted_v1; +-- ore_json_high jsonb; +-- ore_json_low jsonb; +-- row_count integer; +-- BEGIN +-- ore_cs_encrypted_high := '{"c": "mBbLe860@9!clJM`8VX}ip6ro6vMw{Dq=G8?vJ-CE`5o0g0Pv0hQuJcV39Iw$K9)4TCQzV|J#$hgIUyEYJyfuHY>a*_OoEFWo~0~d2n=PWM64+bTYs", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["121212121212594be28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd80132248f0640e89761a123fad8155748d764f347a29e059758575a770618ab6f82d06bad973c3fb62505d9749f4f8483c8d607c61bae7c75ef09add6d91b728449726534e65379f7b3442d2a4aa2b8c3cdb90311b53dc333bbf6b213949a8990b4300473985f60c09c6a91ac963c802e319c28bafc2be66eceb3f1924081724e44d173de2091251d1ea69ec827b94ea5ab63436f0701dd2bf299e1a66a22c4b44b32b88620949736e088bc3ec6e7974426e4b392ecece0e88a7acaf510322d1726da6bc9580dad3c8717619051c220d8654a35eb7fa0a6de4be0456522054f124bbb0bdda4bc177b35a6ca20bd996f3a3499ffd00c93d4705cc4bc05f428541c3adcc36f0b9b9aebc61a88cd4bad8f034dd4a483de9bd3291e4bee06449083c83e"], "u": "c787c0331d81d7609e828bab7b973ba88c95de0539d1a1d378b4d5cc73c3b875", "v": 1}'; +-- ore_cs_encrypted_low := '{"c": "mBbK6IM@r}>@LgnyccSYi>kTA6xiNKsfTW>4X{HWg#UqTOMZ= cs_encrypted_v1 +-- SELECT +-- COUNT(id) +-- FROM encrypted WHERE encrypted_int2 >= ore_cs_encrypted_low +-- INTO row_count; +-- ASSERT row_count = 7; + +-- -- -- cs_encrypted_v1 > jsonb +-- SELECT +-- COUNT(id) +-- FROM encrypted WHERE encrypted_int2 >= ore_json_high +-- INTO row_count; + +-- ASSERT row_count = 1; + +-- -- -- jsonb >= cs_encrypted_v1 +-- SELECT +-- COUNT(id) +-- FROM encrypted WHERE ore_json_low >= encrypted_int2 +-- INTO row_count; + +-- ASSERT row_count = 1; + + +-- END; +-- $$ LANGUAGE plpgsql; From 2d22a91742f38b4798ed7e5c85757f1c96f40b76 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 19 Feb 2025 14:39:27 +1100 Subject: [PATCH 14/15] Explictly test sort order for all rows --- tests/operators-ore-order.sql | 37 ++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/tests/operators-ore-order.sql b/tests/operators-ore-order.sql index 31e552d9..e5ccec45 100644 --- a/tests/operators-ore-order.sql +++ b/tests/operators-ore-order.sql @@ -21,7 +21,6 @@ INSERT INTO encrypted (id, encrypted_int2) VALUES (9, '{"c": "9", "i": {"table": INSERT INTO encrypted (id, encrypted_int2) VALUES (1, '{"c": "1", "i": {"table": "encrypted", "column": "encrypted_int2"}, "k": "ct", "m": null, "o": ["121212121212597ee28282d03415e7714fccd69eb7eb476c70743e485e20331f59cbc1c848dcdeda716f351eb20588c406a7df5fb8917ebf816739aa1414ac3b8498e493bf0badea5c9fdb3cc34da8b152b995957591880c523beb1d3f12487c38d18f62dd26209a727674e5a5fe3a3e3037860839afd801f6e268e7ba5a049613d57b000f03353a911cce15580808b5a5437e7fe5f4a303847b14979a77af448fac6f39255ec13a949c2378520af48d8e5562957fb84d5f0be62ff2cc4cb4c6de243df329c676af2a0581eb40cd20b63910213afab3fdd6dfe5dc727e051e917428f5d4bca5ccda5bda99f911abffd9e3fec8019c15dad79c485192eabfb16a91af1fa88cf196123c2a6ca46069bb468281b00294bb55e2a6adae2e6549d781d6beb4b5ae35b00eef0701678c1769551eff36ed1060571707244172d212d3e5f457333003f9f4c34e42e2fe7d1cd3367a701500fe0050cbda5d59363dd5a633fb2e067ccbc1db5c33ad25c1e96a62e774ee5672247b5856f48d88ad186e58492e891f32967139ec6fab5290f0f7d0fd6b9538b0669d1597"], "u": "fd80b0e733ed4ff9fe71434b9474ae434863eb01ceff77d73736ac6600334de3", "v": 1}'); - DO $$ DECLARE ore_cs_encrypted_high cs_encrypted_v1; @@ -39,6 +38,7 @@ DO $$ -- ------------------------------------------------------------------------------------------------ + -- DESC SELECT id FROM encrypted ORDER BY encrypted_int2 DESC LIMIT 1 INTO result_id; ASSERT result_id = 99; @@ -47,10 +47,28 @@ DO $$ INTO result_id; ASSERT result_id = 9; + SELECT id FROM encrypted ORDER BY encrypted_int2 DESC LIMIT 1 OFFSET 2 + INTO result_id; + ASSERT result_id = 8; + + SELECT id FROM encrypted ORDER BY encrypted_int2 DESC LIMIT 1 OFFSET 3 + INTO result_id; + ASSERT result_id = 7; + + SELECT id FROM encrypted ORDER BY encrypted_int2 DESC LIMIT 1 OFFSET 4 + INTO result_id; + ASSERT result_id = 6; + SELECT id FROM encrypted ORDER BY encrypted_int2 DESC LIMIT 1 OFFSET 5 INTO result_id; ASSERT result_id = 5; + SELECT id FROM encrypted ORDER BY encrypted_int2 DESC LIMIT 1 OFFSET 6 + INTO result_id; + ASSERT result_id = 1; + + -- ASC + SELECT id FROM encrypted ORDER BY encrypted_int2 ASC LIMIT 1 INTO result_id; ASSERT result_id = 1; @@ -59,10 +77,27 @@ DO $$ INTO result_id; ASSERT result_id = 5; + SELECT id FROM encrypted ORDER BY encrypted_int2 ASC LIMIT 1 OFFSET 2 + INTO result_id; + ASSERT result_id = 6; + + SELECT id FROM encrypted ORDER BY encrypted_int2 ASC LIMIT 1 OFFSET 3 + INTO result_id; + ASSERT result_id = 7; + + SELECT id FROM encrypted ORDER BY encrypted_int2 ASC LIMIT 1 OFFSET 4 + INTO result_id; + ASSERT result_id = 8; + SELECT id FROM encrypted ORDER BY encrypted_int2 ASC LIMIT 1 OFFSET 5 INTO result_id; ASSERT result_id = 9; + SELECT id FROM encrypted ORDER BY encrypted_int2 ASC LIMIT 1 OFFSET 6 + INTO result_id; + ASSERT result_id = 99; + + SELECT id FROM encrypted WHERE encrypted_int2 < ore_cs_encrypted_high From eea9365261456dc364db0f85c5b976a3172cbdde Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 19 Feb 2025 14:41:20 +1100 Subject: [PATCH 15/15] Use ore_64_8_index_v1 instead of bytea[] --- sql/000-ore.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/000-ore.sql b/sql/000-ore.sql index 5283e793..cae9a055 100644 --- a/sql/000-ore.sql +++ b/sql/000-ore.sql @@ -90,7 +90,7 @@ $$ LANGUAGE plpgsql; -- we need to consider the next block so we recurse, otherwise we return the comparison result. -CREATE FUNCTION compare_ore_array(a bytea[], b bytea[]) +CREATE FUNCTION compare_ore_array(a ore_64_8_index_v1, b ore_64_8_index_v1) RETURNS integer AS $$ DECLARE cmp_result integer;