Skip to content

Commit 84a83c6

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

File tree

3 files changed

+106
-5
lines changed

3 files changed

+106
-5
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: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,68 @@ AS $$
3838
END;
3939
$$ LANGUAGE plpgsql;
4040

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

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

43104
CREATE FUNCTION eql_v2.selector(val jsonb)
44105
RETURNS text
@@ -119,7 +180,7 @@ AS $$
119180
$$ LANGUAGE plpgsql;
120181

121182

122-
-- Returns truy if a contains b
183+
-- Returns true if a contains b
123184
-- All values of b must be in a
124185
CREATE FUNCTION eql_v2.ste_vec_contains(a eql_v2_encrypted, b eql_v2_encrypted)
125186
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)