Skip to content

Commit b149fee

Browse files
committed
Raise exceptions if index fields are missing
1 parent 45aa246 commit b149fee

File tree

2 files changed

+123
-73
lines changed

2 files changed

+123
-73
lines changed

sql/010-core.sql

Lines changed: 86 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -159,125 +159,146 @@ 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);
163163

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;
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;
170175

171176

172-
DROP FUNCTION IF EXISTS cs_ciphertext_v1_v0(col jsonb);
173177

174-
CREATE FUNCTION cs_ciphertext_v1_v0(col jsonb)
178+
DROP FUNCTION IF EXISTS cs_ciphertext_v1_v0(val jsonb);
179+
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+
IF val ? 'm' THEN
207+
SELECT ARRAY(SELECT jsonb_array_elements(val->'m'))::cs_match_index_v1;
208+
END IF;
209+
RAISE 'Expected a match index (m) value in json: %', val;
210+
END;
211+
$$ LANGUAGE plpgsql;
201212

202213

203-
DROP FUNCTION IF EXISTS cs_match_v1_v0(col jsonb);
214+
DROP FUNCTION IF EXISTS cs_match_v1_v0(val jsonb);
204215

205-
CREATE FUNCTION cs_match_v1_v0(col jsonb)
216+
CREATE FUNCTION cs_match_v1_v0(val jsonb)
206217
RETURNS cs_match_index_v1
207218
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
208219
BEGIN ATOMIC
209-
RETURN cs_match_v1_v0_0(col);
220+
RETURN cs_match_v1_v0_0(val);
210221
END;
211222

212223

213-
DROP FUNCTION IF EXISTS cs_match_v1(col jsonb);
224+
DROP FUNCTION IF EXISTS cs_match_v1(val jsonb);
214225

215-
CREATE FUNCTION cs_match_v1(col jsonb)
226+
CREATE FUNCTION cs_match_v1(val jsonb)
216227
RETURNS cs_match_index_v1
217228
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
218229
BEGIN ATOMIC
219-
RETURN cs_match_v1_v0_0(col);
230+
RETURN cs_match_v1_v0_0(val);
220231
END;
221232

222233

223234
-- extracts unique index from an encrypted column
224-
DROP FUNCTION IF EXISTS cs_unique_v1_v0_0(col jsonb);
235+
DROP FUNCTION IF EXISTS cs_unique_v1_v0_0(val jsonb);
225236

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

233249

234-
DROP FUNCTION IF EXISTS cs_unique_v1_v0(col jsonb);
250+
DROP FUNCTION IF EXISTS cs_unique_v1_v0(val jsonb);
235251

236-
CREATE FUNCTION cs_unique_v1_v0(col jsonb)
252+
CREATE FUNCTION cs_unique_v1_v0(val jsonb)
237253
RETURNS cs_unique_index_v1
238254
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
239255
BEGIN ATOMIC
240-
RETURN cs_unique_v1_v0_0(col);
256+
RETURN cs_unique_v1_v0_0(val);
241257
END;
242258

243259

244-
DROP FUNCTION IF EXISTS cs_unique_v1(col jsonb);
260+
DROP FUNCTION IF EXISTS cs_unique_v1(val jsonb);
245261

246-
CREATE FUNCTION cs_unique_v1(col jsonb)
262+
CREATE FUNCTION cs_unique_v1(val jsonb)
247263
RETURNS cs_unique_index_v1
248264
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
249265
BEGIN ATOMIC
250-
RETURN cs_unique_v1_v0_0(col);
266+
RETURN cs_unique_v1_v0_0(val);
251267
END;
252268

253269
-- extracts json ste_vec index from an encrypted column
254-
DROP FUNCTION IF EXISTS cs_ste_vec_v1_v0_0(col jsonb);
270+
DROP FUNCTION IF EXISTS cs_ste_vec_v1_v0_0(val jsonb);
255271

256-
CREATE FUNCTION cs_ste_vec_v1_v0_0(col jsonb)
272+
CREATE FUNCTION cs_ste_vec_v1_v0_0(val jsonb)
257273
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;
274+
IMMUTABLE STRICT PARALLEL SAFE
275+
AS $$
276+
BEGIN
277+
IF val ? 'sv' THEN
278+
SELECT (val->'sv')::cs_ste_vec_index_v1;
279+
END IF;
280+
RAISE 'Expected a structured vector index (sv) value in json: %', val;
281+
END;
282+
$$ LANGUAGE plpgsql;
262283

263284

264-
DROP FUNCTION IF EXISTS cs_ste_vec_v1_v0(col jsonb);
285+
DROP FUNCTION IF EXISTS cs_ste_vec_v1_v0(val jsonb);
265286

266-
CREATE FUNCTION cs_ste_vec_v1_v0(col jsonb)
287+
CREATE FUNCTION cs_ste_vec_v1_v0(val jsonb)
267288
RETURNS cs_ste_vec_index_v1
268289
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
269290
BEGIN ATOMIC
270-
RETURN cs_ste_vec_v1_v0_0(col);
291+
RETURN cs_ste_vec_v1_v0_0(val);
271292
END;
272293

273294

274-
DROP FUNCTION IF EXISTS cs_ste_vec_v1(col jsonb);
295+
DROP FUNCTION IF EXISTS cs_ste_vec_v1(val jsonb);
275296

276-
CREATE FUNCTION cs_ste_vec_v1(col jsonb)
297+
CREATE FUNCTION cs_ste_vec_v1(val jsonb)
277298
RETURNS cs_ste_vec_index_v1
278299
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
279300
BEGIN ATOMIC
280-
RETURN cs_ste_vec_v1_v0_0(col);
301+
RETURN cs_ste_vec_v1_v0_0(val);
281302
END;
282303

283304

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

304325
CREATE FUNCTION cs_ore_64_8_v1_v0_0(val jsonb)
305326
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;
327+
IMMUTABLE STRICT PARALLEL SAFE
328+
AS $$
329+
BEGIN
330+
IF val ? 'o' THEN
331+
SELECT (val->>'o')::ore_64_8_v1;
332+
END IF;
333+
RAISE 'Expected an ore index (o) value in json: %', val;
334+
END;
335+
$$ LANGUAGE plpgsql;
310336

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

313-
CREATE FUNCTION cs_ore_64_8_v1_v0(col jsonb)
338+
DROP FUNCTION IF EXISTS cs_ore_64_8_v1_v0(val jsonb);
339+
340+
CREATE FUNCTION cs_ore_64_8_v1_v0(val jsonb)
314341
RETURNS ore_64_8_v1
315342
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
316343
BEGIN ATOMIC
317-
RETURN cs_ore_64_8_v1_v0_0(col);
344+
RETURN cs_ore_64_8_v1_v0_0(val);
318345
END;
319346

320-
DROP FUNCTION IF EXISTS cs_ore_64_8_v1(col jsonb);
347+
DROP FUNCTION IF EXISTS cs_ore_64_8_v1(val jsonb);
321348

322-
CREATE FUNCTION cs_ore_64_8_v1(col jsonb)
349+
CREATE FUNCTION cs_ore_64_8_v1(val jsonb)
323350
RETURNS ore_64_8_v1
324351
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
325352
BEGIN ATOMIC
326-
RETURN cs_ore_64_8_v1_v0_0(col);
353+
RETURN cs_ore_64_8_v1_v0_0(val);
327354
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: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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_ste_vec_v1('{"sv": "sv"}'::jsonb)));
8+
END;
9+
$$ LANGUAGE plpgsql;
10+
11+
DO $$
12+
BEGIN
13+
BEGIN
14+
PERFORM cs_unique_v1_v0('{}'::jsonb);
15+
RAISE NOTICE 'Missing index. Function call should have failed.';
16+
ASSERT false;
17+
EXCEPTION
18+
WHEN OTHERS THEN
19+
ASSERT true;
20+
END;
21+
END;
22+
$$ LANGUAGE plpgsql;
23+
24+
DO $$
25+
BEGIN
26+
BEGIN
27+
PERFORM cs_ste_vec_v1('{}'::jsonb);
28+
RAISE NOTICE 'Missing index. Function call should have failed.';
29+
ASSERT false;
30+
EXCEPTION
31+
WHEN OTHERS THEN
32+
ASSERT true;
33+
END;
34+
END;
35+
$$ LANGUAGE plpgsql;
36+
37+

0 commit comments

Comments
 (0)