Skip to content

Commit 43c9f2c

Browse files
authored
Merge pull request #92 from cipherstash/fix-ore-null-comparison
fix(ore): NULL comparisons should return NULL
2 parents 9caa151 + 7c3407e commit 43c9f2c

File tree

2 files changed

+18
-15
lines changed

2 files changed

+18
-15
lines changed

sql/000-ore.sql

+11-13
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,8 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term)
2323

2424
indicator smallint := 0;
2525
BEGIN
26-
IF a IS NULL AND b IS NULL THEN
27-
RETURN 0;
28-
END IF;
29-
30-
IF a IS NULL THEN
31-
RETURN -1;
32-
END IF;
33-
34-
IF b IS NULL THEN
35-
RETURN 1;
26+
IF a IS NULL OR b IS NULL THEN
27+
RETURN NULL;
3628
END IF;
3729

3830
IF bit_length(a.bytes) != bit_length(b.bytes) THEN
@@ -239,13 +231,19 @@ RETURNS integer AS $$
239231
DECLARE
240232
cmp_result integer;
241233
BEGIN
242-
IF (array_length(a, 1) = 0 OR a IS NULL) AND (array_length(b, 1) = 0 OR b IS NULL) THEN
234+
IF a IS NULL OR b IS NULL THEN
235+
RETURN NULL;
236+
END IF;
237+
238+
IF (array_length(a, 1) = 0) AND (array_length(b, 1) = 0) THEN
243239
RETURN 0;
244240
END IF;
245-
IF array_length(a, 1) = 0 OR a IS NULL THEN
241+
242+
IF array_length(a, 1) = 0 THEN
246243
RETURN -1;
247244
END IF;
248-
IF array_length(b, 1) = 0 OR a IS NULL THEN
245+
246+
IF array_length(b, 1) = 0 THEN
249247
RETURN 1;
250248
END IF;
251249

tests/operators-ore.sql

+7-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ CREATE TABLE users
1313
TRUNCATE TABLE users;
1414

1515

16-
TRUNCATE TABLE users;
17-
1816
-- User with "LOW" value
1917
INSERT INTO users (name_encrypted) VALUES (
2018
'{
@@ -30,6 +28,9 @@ INSERT INTO users (name_encrypted) VALUES (
3028
}'::jsonb
3129
);
3230

31+
INSERT INTO users (name_encrypted) VALUES (NULL);
32+
33+
3334
-- ORE eq < OPERATORS
3435
DO $$
3536
DECLARE
@@ -57,6 +58,10 @@ DO $$
5758
-- SANITY CHECK
5859
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) < cs_ore_64_8_v1(ore_json)));
5960

61+
-- ignore null
62+
ASSERT (SELECT (SELECT COUNT(*) FROM (SELECT id FROM users WHERE cs_ore_64_8_v1(name_encrypted) < cs_ore_64_8_v1(ore_json)) as count) = 1);
63+
64+
6065
ASSERT (SELECT EXISTS (
6166
SELECT id FROM users WHERE name_encrypted < ore_cs_encrypted::jsonb
6267
));

0 commit comments

Comments
 (0)