Skip to content

Commit 0654418

Browse files
committed
Raise exceptions if index fields are missing
1 parent 705ecc6 commit 0654418

File tree

2 files changed

+130
-73
lines changed

2 files changed

+130
-73
lines changed

sql/010-core.sql

Lines changed: 87 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -159,125 +159,147 @@ ALTER DOMAIN cs_encrypted_v1
159159
);
160160

161161

162-
DROP FUNCTION IF EXISTS cs_ciphertext_v1_v0_0(col jsonb);
162+
DROP FUNCTION IF EXISTS cs_ciphertext_v1_v0_0(val jsonb);
163+
164+
CREATE FUNCTION cs_ciphertext_v1_v0_0(val jsonb)
165+
RETURNS text
166+
IMMUTABLE STRICT PARALLEL SAFE
167+
AS $$
168+
BEGIN
169+
IF val ? 'c' THEN
170+
RETURN val->>'c';
171+
END IF;
172+
RAISE 'Expected a ciphertext (c) value in json: %', val;
173+
END;
174+
$$ LANGUAGE plpgsql;
163175

164-
CREATE FUNCTION cs_ciphertext_v1_v0_0(col jsonb)
165-
RETURNS text
166-
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
167-
BEGIN ATOMIC
168-
RETURN col->>'c';
169-
END;
170176

171177

172-
DROP FUNCTION IF EXISTS cs_ciphertext_v1_v0(col jsonb);
178+
DROP FUNCTION IF EXISTS cs_ciphertext_v1_v0(val jsonb);
173179

174-
CREATE FUNCTION cs_ciphertext_v1_v0(col jsonb)
180+
CREATE FUNCTION cs_ciphertext_v1_v0(val jsonb)
175181
RETURNS text
176182
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
177183
BEGIN ATOMIC
178-
RETURN cs_ciphertext_v1_v0_0(col);
184+
RETURN cs_ciphertext_v1_v0_0(val);
179185
END;
180186

181187

182-
DROP FUNCTION IF EXISTS cs_ciphertext_v1(col jsonb);
188+
DROP FUNCTION IF EXISTS cs_ciphertext_v1(val jsonb);
183189

184-
CREATE FUNCTION cs_ciphertext_v1(col jsonb)
190+
CREATE FUNCTION cs_ciphertext_v1(val jsonb)
185191
RETURNS text
186192
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
187193
BEGIN ATOMIC
188-
RETURN cs_ciphertext_v1_v0_0(col);
194+
RETURN cs_ciphertext_v1_v0_0(val);
189195
END;
190196

191197

192198
-- extracts match index from an emcrypted column
193-
DROP FUNCTION IF EXISTS cs_match_v1_v0_0(col jsonb);
199+
DROP FUNCTION IF EXISTS cs_match_v1_v0_0(val jsonb);
194200

195-
CREATE FUNCTION cs_match_v1_v0_0(col jsonb)
201+
CREATE FUNCTION cs_match_v1_v0_0(val jsonb)
196202
RETURNS cs_match_index_v1
197-
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
198-
BEGIN ATOMIC
199-
SELECT ARRAY(SELECT jsonb_array_elements(col->'m'))::cs_match_index_v1;
200-
END;
203+
IMMUTABLE STRICT PARALLEL SAFE
204+
AS $$
205+
BEGIN
206+
207+
IF val ? 'm' THEN
208+
RETURN ARRAY(SELECT jsonb_array_elements(val->'m'))::cs_match_index_v1;
209+
END IF;
210+
RAISE 'Expected a match index (m) value in json: %', val;
211+
END;
212+
$$ LANGUAGE plpgsql;
201213

202214

203-
DROP FUNCTION IF EXISTS cs_match_v1_v0(col jsonb);
215+
DROP FUNCTION IF EXISTS cs_match_v1_v0(val jsonb);
204216

205-
CREATE FUNCTION cs_match_v1_v0(col jsonb)
217+
CREATE FUNCTION cs_match_v1_v0(val jsonb)
206218
RETURNS cs_match_index_v1
207219
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
208220
BEGIN ATOMIC
209-
RETURN cs_match_v1_v0_0(col);
221+
RETURN cs_match_v1_v0_0(val);
210222
END;
211223

212224

213-
DROP FUNCTION IF EXISTS cs_match_v1(col jsonb);
225+
DROP FUNCTION IF EXISTS cs_match_v1(val jsonb);
214226

215-
CREATE FUNCTION cs_match_v1(col jsonb)
227+
CREATE FUNCTION cs_match_v1(val jsonb)
216228
RETURNS cs_match_index_v1
217229
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
218230
BEGIN ATOMIC
219-
RETURN cs_match_v1_v0_0(col);
231+
RETURN cs_match_v1_v0_0(val);
220232
END;
221233

222234

223235
-- extracts unique index from an encrypted column
224-
DROP FUNCTION IF EXISTS cs_unique_v1_v0_0(col jsonb);
236+
DROP FUNCTION IF EXISTS cs_unique_v1_v0_0(val jsonb);
225237

226-
CREATE FUNCTION cs_unique_v1_v0_0(col jsonb)
238+
CREATE FUNCTION cs_unique_v1_v0_0(val jsonb)
227239
RETURNS cs_unique_index_v1
228-
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
229-
BEGIN ATOMIC
230-
RETURN col->>'u';
231-
END;
240+
IMMUTABLE STRICT PARALLEL SAFE
241+
AS $$
242+
BEGIN
243+
IF val ? 'u' THEN
244+
RETURN val->>'u';
245+
END IF;
246+
RAISE 'Expected a unique index (u) value in json: %', val;
247+
END;
248+
$$ LANGUAGE plpgsql;
232249

233250

234-
DROP FUNCTION IF EXISTS cs_unique_v1_v0(col jsonb);
251+
DROP FUNCTION IF EXISTS cs_unique_v1_v0(val jsonb);
235252

236-
CREATE FUNCTION cs_unique_v1_v0(col jsonb)
253+
CREATE FUNCTION cs_unique_v1_v0(val jsonb)
237254
RETURNS cs_unique_index_v1
238255
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
239256
BEGIN ATOMIC
240-
RETURN cs_unique_v1_v0_0(col);
257+
RETURN cs_unique_v1_v0_0(val);
241258
END;
242259

243260

244-
DROP FUNCTION IF EXISTS cs_unique_v1(col jsonb);
261+
DROP FUNCTION IF EXISTS cs_unique_v1(val jsonb);
245262

246-
CREATE FUNCTION cs_unique_v1(col jsonb)
263+
CREATE FUNCTION cs_unique_v1(val jsonb)
247264
RETURNS cs_unique_index_v1
248265
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
249266
BEGIN ATOMIC
250-
RETURN cs_unique_v1_v0_0(col);
267+
RETURN cs_unique_v1_v0_0(val);
251268
END;
252269

253270
-- extracts json ste_vec index from an encrypted column
254-
DROP FUNCTION IF EXISTS cs_ste_vec_v1_v0_0(col jsonb);
271+
DROP FUNCTION IF EXISTS cs_ste_vec_v1_v0_0(val jsonb);
255272

256-
CREATE FUNCTION cs_ste_vec_v1_v0_0(col jsonb)
273+
CREATE FUNCTION cs_ste_vec_v1_v0_0(val jsonb)
257274
RETURNS cs_ste_vec_index_v1
258-
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
259-
BEGIN ATOMIC
260-
SELECT (col->'sv')::cs_ste_vec_index_v1;
261-
END;
275+
IMMUTABLE STRICT PARALLEL SAFE
276+
AS $$
277+
BEGIN
278+
IF val ? 'sv' THEN
279+
RETURN (val->'sv')::cs_ste_vec_index_v1;
280+
END IF;
281+
RAISE 'Expected a structured vector index (sv) value in json: %', val;
282+
END;
283+
$$ LANGUAGE plpgsql;
262284

263285

264-
DROP FUNCTION IF EXISTS cs_ste_vec_v1_v0(col jsonb);
286+
DROP FUNCTION IF EXISTS cs_ste_vec_v1_v0(val jsonb);
265287

266-
CREATE FUNCTION cs_ste_vec_v1_v0(col jsonb)
288+
CREATE FUNCTION cs_ste_vec_v1_v0(val jsonb)
267289
RETURNS cs_ste_vec_index_v1
268290
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
269291
BEGIN ATOMIC
270-
RETURN cs_ste_vec_v1_v0_0(col);
292+
RETURN cs_ste_vec_v1_v0_0(val);
271293
END;
272294

273295

274-
DROP FUNCTION IF EXISTS cs_ste_vec_v1(col jsonb);
296+
DROP FUNCTION IF EXISTS cs_ste_vec_v1(val jsonb);
275297

276-
CREATE FUNCTION cs_ste_vec_v1(col jsonb)
298+
CREATE FUNCTION cs_ste_vec_v1(val jsonb)
277299
RETURNS cs_ste_vec_index_v1
278300
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
279301
BEGIN ATOMIC
280-
RETURN cs_ste_vec_v1_v0_0(col);
302+
RETURN cs_ste_vec_v1_v0_0(val);
281303
END;
282304

283305

@@ -303,39 +325,31 @@ DROP FUNCTION IF EXISTS cs_ore_64_8_v1_v0_0(val jsonb);
303325

304326
CREATE FUNCTION cs_ore_64_8_v1_v0_0(val jsonb)
305327
RETURNS ore_64_8_v1
306-
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
307-
BEGIN ATOMIC
308-
SELECT (val->>'o')::ore_64_8_v1;
309-
END;
328+
IMMUTABLE STRICT PARALLEL SAFE
329+
AS $$
330+
BEGIN
331+
IF val ? 'o' THEN
332+
RETURN (val->>'o')::ore_64_8_v1;
333+
END IF;
334+
RAISE 'Expected an ore index (o) value in json: %', val;
335+
END;
336+
$$ LANGUAGE plpgsql;
310337

311-
DROP FUNCTION IF EXISTS cs_ore_64_8_v1_v0(col jsonb);
312338

313-
CREATE FUNCTION cs_ore_64_8_v1_v0(col jsonb)
339+
DROP FUNCTION IF EXISTS cs_ore_64_8_v1_v0(val jsonb);
340+
341+
CREATE FUNCTION cs_ore_64_8_v1_v0(val jsonb)
314342
RETURNS ore_64_8_v1
315343
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
316344
BEGIN ATOMIC
317-
RETURN cs_ore_64_8_v1_v0_0(col);
345+
RETURN cs_ore_64_8_v1_v0_0(val);
318346
END;
319347

320-
DROP FUNCTION IF EXISTS cs_ore_64_8_v1(col jsonb);
348+
DROP FUNCTION IF EXISTS cs_ore_64_8_v1(val jsonb);
321349

322-
CREATE FUNCTION cs_ore_64_8_v1(col jsonb)
350+
CREATE FUNCTION cs_ore_64_8_v1(val jsonb)
323351
RETURNS ore_64_8_v1
324352
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
325353
BEGIN ATOMIC
326-
RETURN cs_ore_64_8_v1_v0_0(col);
354+
RETURN cs_ore_64_8_v1_v0_0(val);
327355
END;
328-
329-
DROP FUNCTION IF EXISTS _cs_first_grouped_value(jsonb, jsonb);
330-
331-
CREATE FUNCTION _cs_first_grouped_value(jsonb, jsonb)
332-
RETURNS jsonb AS $$
333-
SELECT COALESCE($1, $2);
334-
$$ LANGUAGE sql IMMUTABLE;
335-
336-
DROP AGGREGATE IF EXISTS cs_grouped_value_v1(jsonb);
337-
338-
CREATE AGGREGATE cs_grouped_value_v1(jsonb) (
339-
SFUNC = _cs_first_grouped_value,
340-
STYPE = jsonb
341-
);

tests/core-functions.sql

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
\set ON_ERROR_STOP on
2+
3+
4+
DO $$
5+
BEGIN
6+
ASSERT (SELECT EXISTS (SELECT cs_unique_v1('{"u": "u"}'::jsonb)));
7+
ASSERT (SELECT EXISTS (SELECT cs_match_v1('{"m": []}'::jsonb)));
8+
END;
9+
$$ LANGUAGE plpgsql;
10+
11+
DO $$
12+
BEGIN
13+
-- sanity check
14+
PERFORM cs_unique_v1('{"u": "u"}'::jsonb);
15+
16+
BEGIN
17+
PERFORM cs_unique_v1_v0('{}'::jsonb);
18+
RAISE NOTICE 'Missing index. Function call should have failed.';
19+
ASSERT false;
20+
EXCEPTION
21+
WHEN OTHERS THEN
22+
ASSERT true;
23+
END;
24+
END;
25+
$$ LANGUAGE plpgsql;
26+
27+
28+
DO $$
29+
BEGIN
30+
-- sanity check
31+
PERFORM cs_match_v1('{"m": []}'::jsonb);
32+
33+
BEGIN
34+
PERFORM cs_match_v1('{}'::jsonb);
35+
RAISE NOTICE 'Missing index. Function call should have failed.';
36+
ASSERT false;
37+
EXCEPTION
38+
WHEN OTHERS THEN
39+
ASSERT true;
40+
END;
41+
END;
42+
$$ LANGUAGE plpgsql;
43+

0 commit comments

Comments
 (0)