Skip to content

Commit 2e09010

Browse files
committed
fix(ore): NULL comparisons should return NULL
1 parent 9caa151 commit 2e09010

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

sql/000-ore.sql

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term)
2424
indicator smallint := 0;
2525
BEGIN
2626
IF a IS NULL AND b IS NULL THEN
27-
RETURN 0;
27+
RETURN NULL;
2828
END IF;
2929

3030
IF a IS NULL THEN
31-
RETURN -1;
31+
RETURN NULL;
3232
END IF;
3333

3434
IF b IS NULL THEN
35-
RETURN 1;
35+
RETURN NULL;
3636
END IF;
3737

3838
IF bit_length(a.bytes) != bit_length(b.bytes) THEN
@@ -239,13 +239,27 @@ RETURNS integer AS $$
239239
DECLARE
240240
cmp_result integer;
241241
BEGIN
242-
IF (array_length(a, 1) = 0 OR a IS NULL) AND (array_length(b, 1) = 0 OR b IS NULL) THEN
242+
IF a IS NULL AND b IS NULL THEN
243+
RETURN NULL;
244+
END IF;
245+
246+
IF a IS NULL THEN
247+
RETURN NULL;
248+
END IF;
249+
250+
IF b IS NULL THEN
251+
RETURN NULL;
252+
END IF;
253+
254+
IF (array_length(a, 1) = 0) AND (array_length(b, 1) = 0) THEN
243255
RETURN 0;
244256
END IF;
245-
IF array_length(a, 1) = 0 OR a IS NULL THEN
257+
258+
IF array_length(a, 1) = 0 THEN
246259
RETURN -1;
247260
END IF;
248-
IF array_length(b, 1) = 0 OR a IS NULL THEN
261+
262+
IF array_length(b, 1) = 0 THEN
249263
RETURN 1;
250264
END IF;
251265

tests/operators-ore.sql

Lines changed: 7 additions & 2 deletions
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)