Skip to content

Commit d595344

Browse files
committed
fix: treat single element ste vec as eql_v2_encrypted
1 parent 54840cb commit d595344

File tree

3 files changed

+109
-6
lines changed

3 files changed

+109
-6
lines changed

src/operators/compare.sql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ AS $$
5959
RETURN 1;
6060
END IF;
6161

62-
-- Use ORE if both parameters have ore index
62+
a := eql_v2.to_ste_vec_value(a);
63+
b := eql_v2.to_ste_vec_value(b);
64+
6365
IF eql_v2.has_ore_block_u64_8_256(a) AND eql_v2.has_ore_block_u64_8_256(b) THEN
6466
RETURN eql_v2.compare_ore_block_u64_8_256(a, b);
6567
END IF;
@@ -72,7 +74,6 @@ AS $$
7274
RETURN eql_v2.compare_ore_cllw_var_8(a, b);
7375
END IF;
7476

75-
-- Fallback to hmac if both parameters have hmac index
7677
IF eql_v2.has_hmac_256(a) AND eql_v2.has_hmac_256(b) THEN
7778
RETURN eql_v2.compare_hmac_256(a, b);
7879
END IF;

src/ste_vec/functions.sql

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
-- REQUIRE: src/schema.sql
22
-- REQUIRE: src/encrypted/types.sql
3+
-- REQUIRE: src/encrypted/casts.sql
4+
-- REQUIRE: src/encrypted/functions.sql
35

46

57
--
@@ -18,7 +20,7 @@ AS $$
1820
sv := jsonb_build_array(val);
1921
END IF;
2022

21-
SELECT array_agg(elem::eql_v2_encrypted)
23+
SELECT array_agg(eql_v2.to_encrypted(elem))
2224
INTO ary
2325
FROM jsonb_array_elements(sv) AS elem;
2426

@@ -38,7 +40,68 @@ AS $$
3840
END;
3941
$$ LANGUAGE plpgsql;
4042

43+
--
44+
-- Returns true if val is an SteVec with a single array item.
45+
-- SteVec value items can be treated as regular eql_encrypted
46+
--
47+
CREATE FUNCTION eql_v2.is_ste_vec_value(val jsonb)
48+
RETURNS boolean
49+
IMMUTABLE STRICT PARALLEL SAFE
50+
AS $$
51+
BEGIN
52+
IF val ? 'sv' THEN
53+
RETURN jsonb_array_length(val->'sv') = 1;
54+
END IF;
55+
56+
RETURN false;
57+
END;
58+
$$ LANGUAGE plpgsql;
4159

60+
CREATE FUNCTION eql_v2.is_ste_vec_value(val eql_v2_encrypted)
61+
RETURNS boolean
62+
IMMUTABLE STRICT PARALLEL SAFE
63+
AS $$
64+
BEGIN
65+
RETURN eql_v2.is_ste_vec_value(val.data);
66+
END;
67+
$$ LANGUAGE plpgsql;
68+
69+
--
70+
-- Returns an SteVec with a single array item as an eql_encrypted
71+
--
72+
CREATE FUNCTION eql_v2.to_ste_vec_value(val jsonb)
73+
RETURNS eql_v2_encrypted
74+
IMMUTABLE STRICT PARALLEL SAFE
75+
AS $$
76+
DECLARE
77+
meta jsonb;
78+
sv jsonb;
79+
BEGIN
80+
81+
IF val IS NULL THEN
82+
RETURN NULL;
83+
END IF;
84+
85+
IF eql_v2.is_ste_vec_value(val) THEN
86+
meta := eql_v2.meta_data(val);
87+
sv := val->'sv';
88+
sv := sv[0];
89+
90+
RETURN eql_v2.to_encrypted(meta || sv);
91+
END IF;
92+
93+
RETURN eql_v2.to_encrypted(val);
94+
END;
95+
$$ LANGUAGE plpgsql;
96+
97+
CREATE FUNCTION eql_v2.to_ste_vec_value(val eql_v2_encrypted)
98+
RETURNS eql_v2_encrypted
99+
IMMUTABLE STRICT PARALLEL SAFE
100+
AS $$
101+
BEGIN
102+
RETURN eql_v2.to_ste_vec_value(val.data);
103+
END;
104+
$$ LANGUAGE plpgsql;
42105

43106
CREATE FUNCTION eql_v2.selector(val jsonb)
44107
RETURNS text
@@ -119,7 +182,7 @@ AS $$
119182
$$ LANGUAGE plpgsql;
120183

121184

122-
-- Returns truy if a contains b
185+
-- Returns true if a contains b
123186
-- All values of b must be in a
124187
CREATE FUNCTION eql_v2.ste_vec_contains(a eql_v2_encrypted, b eql_v2_encrypted)
125188
RETURNS boolean

src/ste_vec/functions_test.sql

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,10 @@ $$ LANGUAGE plpgsql;
2828
DO $$
2929
DECLARE
3030
e eql_v2_encrypted;
31-
sv eql_v2_encrypted[];
3231
BEGIN
3332
e := '{ "a": 1 }'::jsonb::eql_v2_encrypted;
3433
ASSERT eql_v2.is_ste_vec_array(e);
3534

36-
3735
e := '{ "a": 0 }'::jsonb::eql_v2_encrypted;
3836
ASSERT NOT eql_v2.is_ste_vec_array(e);
3937

@@ -43,6 +41,47 @@ DO $$
4341
$$ LANGUAGE plpgsql;
4442

4543

44+
DO $$
45+
DECLARE
46+
e jsonb;
47+
BEGIN
48+
-- extract the ste_vec array item as an eeql_v2_encrypted
49+
e := eql_v2.to_ste_vec_value('{ "i": "i", "v": 2, "sv": [ { "ocf": "ocf" }] }'::jsonb);
50+
51+
ASSERT e ? 'i';
52+
ASSERT e ? 'v';
53+
ASSERT e ? 'ocf';
54+
55+
-- Returns the original if not an stevec value
56+
e := eql_v2.to_ste_vec_value('{ "i": "i", "v": 2, "b3": "b3" }'::jsonb);
57+
58+
ASSERT e ? 'i';
59+
ASSERT e ? 'v';
60+
ASSERT e ? 'b3';
61+
62+
END;
63+
$$ LANGUAGE plpgsql;
64+
65+
66+
67+
DO $$
68+
DECLARE
69+
e eql_v2_encrypted;
70+
sv eql_v2_encrypted[];
71+
BEGIN
72+
e := '{ "sv": [1] }'::jsonb::eql_v2_encrypted;
73+
ASSERT eql_v2.is_ste_vec_value(e);
74+
75+
e := '{ "sv": [] }'::jsonb::eql_v2_encrypted;
76+
ASSERT NOT eql_v2.is_ste_vec_value(e);
77+
78+
e := '{ }'::jsonb::eql_v2_encrypted;
79+
ASSERT NOT eql_v2.is_ste_vec_value(e);
80+
81+
END;
82+
$$ LANGUAGE plpgsql;
83+
84+
4685
-- ------------------------------------------------------------------------
4786
-- ------------------------------------------------------------------------
4887
--

0 commit comments

Comments
 (0)