1
1
CREATE EXTENSION IF NOT EXISTS pgcrypto;
2
2
3
- CREATE TYPE ore_64_8_v1_term AS (
4
- bytes bytea
5
- );
6
-
7
- CREATE TYPE ore_64_8_v1 AS (
8
- terms ore_64_8_v1_term[]
9
- );
10
-
3
+ CREATE DOMAIN ore_64_8_index_v1 AS bytea [];
11
4
12
- DROP FUNCTION IF EXISTS compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term);
13
5
DROP FUNCTION IF EXISTS compare_ore_64_8_v1_term(a bytea , b bytea );
14
6
15
- CREATE FUNCTION compare_ore_64_8_v1_term (a ore_64_8_v1_term, b ore_64_8_v1_term) returns integer AS $$
16
- BEGIN
17
- SELECT compare_ore_64_8_v1_term(a .bytes , b .bytes );
18
- END;
19
- $$ LANGUAGE plpgsql;
20
-
21
7
CREATE FUNCTION compare_ore_64_8_v1_term (a bytea , b bytea ) returns integer AS $$
22
8
DECLARE
23
9
eq boolean := true;
@@ -95,177 +81,40 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a bytea, b bytea) returns integer AS $$
95
81
$$ LANGUAGE plpgsql;
96
82
97
83
98
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_eq(a ore_64_8_v1_term, b ore_64_8_v1_term);
99
-
100
- CREATE FUNCTION ore_64_8_v1_term_eq (a ore_64_8_v1_term, b ore_64_8_v1_term)
101
- RETURNS boolean AS $$
102
- SELECT compare_ore_64_8_v1_term(a, b) = 0
103
- $$ LANGUAGE SQL;
104
-
105
-
106
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_neq(a ore_64_8_v1_term, b ore_64_8_v1_term);
107
-
108
- CREATE FUNCTION ore_64_8_v1_term_neq (a ore_64_8_v1_term, b ore_64_8_v1_term)
109
- RETURNS boolean AS $$
110
- SELECT compare_ore_64_8_v1_term(a, b) <> 0
111
- $$ LANGUAGE SQL;
112
-
113
-
114
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_lt(a ore_64_8_v1_term, b ore_64_8_v1_term);
115
-
116
- CREATE FUNCTION ore_64_8_v1_term_lt (a ore_64_8_v1_term, b ore_64_8_v1_term)
117
- RETURNS boolean AS $$
118
- SELECT compare_ore_64_8_v1_term(a, b) = - 1
119
- $$ LANGUAGE SQL;
120
-
121
-
122
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_lte(a ore_64_8_v1_term, b ore_64_8_v1_term);
123
-
124
- CREATE FUNCTION ore_64_8_v1_term_lte (a ore_64_8_v1_term, b ore_64_8_v1_term)
125
- RETURNS boolean AS $$
126
- SELECT compare_ore_64_8_v1_term(a, b) != 1
127
- $$ LANGUAGE SQL;
128
-
129
-
130
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_gt(a ore_64_8_v1_term, b ore_64_8_v1_term);
131
-
132
- CREATE FUNCTION ore_64_8_v1_term_gt (a ore_64_8_v1_term, b ore_64_8_v1_term)
133
- RETURNS boolean AS $$
134
- SELECT compare_ore_64_8_v1_term(a, b) = 1
135
- $$ LANGUAGE SQL;
136
-
137
-
138
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_gte(a ore_64_8_v1_term, b ore_64_8_v1_term);
139
-
140
- CREATE FUNCTION ore_64_8_v1_term_gte (a ore_64_8_v1_term, b ore_64_8_v1_term)
141
- RETURNS boolean AS $$
142
- SELECT compare_ore_64_8_v1_term(a, b) != - 1
143
- $$ LANGUAGE SQL;
144
-
145
-
146
- DROP OPERATOR IF EXISTS = (ore_64_8_v1_term, ore_64_8_v1_term);
147
-
148
- CREATE OPERATOR = (
149
- PROCEDURE= " ore_64_8_v1_term_eq" ,
150
- LEFTARG= ore_64_8_v1_term,
151
- RIGHTARG= ore_64_8_v1_term,
152
- NEGATOR = <> ,
153
- RESTRICT = eqsel,
154
- JOIN = eqjoinsel,
155
- HASHES,
156
- MERGES
157
- );
158
-
159
-
160
- DROP OPERATOR IF EXISTS <> (ore_64_8_v1_term, ore_64_8_v1_term);
161
-
162
- CREATE OPERATOR <> (
163
- PROCEDURE= " ore_64_8_v1_term_neq" ,
164
- LEFTARG= ore_64_8_v1_term,
165
- RIGHTARG= ore_64_8_v1_term,
166
- NEGATOR = = ,
167
- RESTRICT = eqsel,
168
- JOIN = eqjoinsel,
169
- HASHES,
170
- MERGES
171
- );
172
-
173
- DROP OPERATOR IF EXISTS > (ore_64_8_v1_term, ore_64_8_v1_term);
174
-
175
- CREATE OPERATOR > (
176
- PROCEDURE= " ore_64_8_v1_term_gt" ,
177
- LEFTARG= ore_64_8_v1_term,
178
- RIGHTARG= ore_64_8_v1_term,
179
- COMMUTATOR = < ,
180
- NEGATOR = <= ,
181
- RESTRICT = scalargtsel,
182
- JOIN = scalargtjoinsel
183
- );
184
-
185
- DROP OPERATOR IF EXISTS < (ore_64_8_v1_term, ore_64_8_v1_term);
186
-
187
- CREATE OPERATOR < (
188
- PROCEDURE= " ore_64_8_v1_term_lt" ,
189
- LEFTARG= ore_64_8_v1_term,
190
- RIGHTARG= ore_64_8_v1_term,
191
- COMMUTATOR = > ,
192
- NEGATOR = >= ,
193
- RESTRICT = scalarltsel,
194
- JOIN = scalarltjoinsel
195
- );
196
-
197
- DROP OPERATOR IF EXISTS <= (ore_64_8_v1_term, ore_64_8_v1_term);
198
-
199
- CREATE OPERATOR <= (
200
- PROCEDURE= " ore_64_8_v1_term_lte" ,
201
- LEFTARG= ore_64_8_v1_term,
202
- RIGHTARG= ore_64_8_v1_term,
203
- COMMUTATOR = >= ,
204
- NEGATOR = > ,
205
- RESTRICT = scalarlesel,
206
- JOIN = scalarlejoinsel
207
- );
208
-
209
- DROP OPERATOR IF EXISTS >= (ore_64_8_v1_term, ore_64_8_v1_term);
210
-
211
- CREATE OPERATOR >= (
212
- PROCEDURE= " ore_64_8_v1_term_gte" ,
213
- LEFTARG= ore_64_8_v1_term,
214
- RIGHTARG= ore_64_8_v1_term,
215
- COMMUTATOR = <= ,
216
- NEGATOR = < ,
217
- RESTRICT = scalarlesel,
218
- JOIN = scalarlejoinsel
219
- );
220
-
221
- DROP OPERATOR FAMILY IF EXISTS ore_64_8_v1_term_btree_ops USING btree;
222
-
223
- CREATE OPERATOR FAMILY ore_64_8_v1_term_btree_ops USING btree;
224
-
225
-
226
- DROP OPERATOR CLASS IF EXISTS ore_64_8_v1_term_btree_ops USING btree;
227
-
228
- CREATE OPERATOR CLASS ore_64_8_v1_term_btree_ops DEFAULT FOR TYPE ore_64_8_v1_term USING btree FAMILY ore_64_8_v1_term_btree_ops AS
229
- OPERATOR 1 < ,
230
- OPERATOR 2 <= ,
231
- OPERATOR 3 = ,
232
- OPERATOR 4 >= ,
233
- OPERATOR 5 > ,
234
- FUNCTION 1 compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term);
235
-
236
84
-- Compare the "head" of each array and recurse if necessary
237
85
-- This function assumes an empty string is "less than" everything else
238
86
-- so if a is empty we return -1, if be is empty and a isn't, we return 1.
239
87
-- If both are empty we return 0. This cases probably isn't necessary as equality
240
88
-- doesn't always make sense but it's here for completeness.
241
89
-- If both are non-empty, we compare the first element. If they are equal
242
90
-- we need to consider the next block so we recurse, otherwise we return the comparison result.
243
- -- DROP FUNCTION IF EXISTS compare_ore_array(a ore_64_8_v1_term[], b ore_64_8_v1_term[]);
244
91
245
- -- CREATE FUNCTION compare_ore_array(a ore_64_8_v1_term[], b ore_64_8_v1_term[])
246
- -- RETURNS integer AS $$
247
- -- BEGIN
248
- -- -- SELECT compare_ore_array(a, b);
249
- -- SELECT compare_ore_array(CAST(a AS bytea[]), CAST(b AS bytea[]));
250
- -- END
251
- -- $$ LANGUAGE plpgsql;
252
92
253
93
CREATE FUNCTION compare_ore_array (a bytea [], b bytea [])
254
94
RETURNS integer AS $$
255
95
DECLARE
256
96
cmp_result integer ;
97
+ len_a integer ;
98
+ len_b integer ;
257
99
BEGIN
100
+
101
+ SELECT array_length(a, 1 ) INTO len_a;
102
+ SELECT array_length(b, 1 ) INTO len_b;
103
+
258
104
IF (array_length(a, 1 ) = 0 OR a IS NULL ) AND (array_length(b, 1 ) = 0 OR b IS NULL ) THEN
259
105
RETURN 0 ;
260
106
END IF;
107
+
261
108
IF array_length(a, 1 ) = 0 OR a IS NULL THEN
262
109
RETURN - 1 ;
263
110
END IF;
111
+
264
112
IF array_length(b, 1 ) = 0 OR a IS NULL THEN
265
113
RETURN 1 ;
266
114
END IF;
267
115
268
116
cmp_result := compare_ore_64_8_v1_term(a[1 ], b[1 ]);
117
+
269
118
IF cmp_result = 0 THEN
270
119
-- Removes the first element in the array, and calls this fn again to compare the next element/s in the array.
271
120
RETURN compare_ore_array(a[2 :array_length(a,1 )], b[2 :array_length(b,1 )]);
@@ -276,80 +125,68 @@ RETURNS integer AS $$
276
125
$$ LANGUAGE plpgsql;
277
126
278
127
-- This function uses lexicographic comparison
279
- DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a ore_64_8_v1 , b ore_64_8_v1 );
128
+ DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
280
129
281
- CREATE FUNCTION compare_ore_64_8_v1 (a ore_64_8_v1 , b ore_64_8_v1 )
130
+ CREATE FUNCTION compare_ore_64_8_v1 (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
282
131
RETURNS integer AS $$
283
- DECLARE
284
- cmp_result integer ;
285
- BEGIN
286
- -- Recursively compare blocks bailing as soon as we can make a decision
287
- RETURN compare_ore_array(a .terms ::bytea [], b .terms ::bytea []);
288
- END
289
- $$ LANGUAGE plpgsql;
290
-
291
- DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a bytea [], b bytea []);
292
-
293
- CREATE FUNCTION compare_ore_64_8_v1 (a bytea [], b bytea [])
294
- RETURNS integer AS $$
295
- DECLARE
296
- cmp_result integer ;
297
132
BEGIN
298
133
-- Recursively compare blocks bailing as soon as we can make a decision
299
134
RETURN compare_ore_array(a, b);
300
135
END
301
136
$$ LANGUAGE plpgsql;
302
137
303
138
304
- DROP FUNCTION IF EXISTS ore_64_8_v1_eq(a ore_64_8_v1 , b ore_64_8_v1 );
139
+ DROP FUNCTION IF EXISTS ore_64_8_v1_eq(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
305
140
306
- CREATE FUNCTION ore_64_8_v1_eq (a ore_64_8_v1 , b ore_64_8_v1 )
141
+ CREATE FUNCTION ore_64_8_v1_eq (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
307
142
RETURNS boolean AS $$
308
143
SELECT compare_ore_64_8_v1(a, b) = 0
309
144
$$ LANGUAGE SQL;
310
145
311
146
312
- DROP FUNCTION IF EXISTS ore_64_8_v1_neq(a ore_64_8_v1 , b ore_64_8_v1 );
147
+ DROP FUNCTION IF EXISTS ore_64_8_v1_neq(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
313
148
314
- CREATE FUNCTION ore_64_8_v1_neq (a ore_64_8_v1 , b ore_64_8_v1 )
149
+ CREATE FUNCTION ore_64_8_v1_neq (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
315
150
RETURNS boolean AS $$
316
151
SELECT compare_ore_64_8_v1(a, b) <> 0
317
152
$$ LANGUAGE SQL;
318
153
319
154
320
- DROP FUNCTION IF EXISTS ore_64_8_v1_lt(a ore_64_8_v1 , b ore_64_8_v1 );
155
+ DROP FUNCTION IF EXISTS ore_64_8_v1_lt(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
321
156
322
- CREATE FUNCTION ore_64_8_v1_lt (a ore_64_8_v1 , b ore_64_8_v1 )
157
+ CREATE FUNCTION ore_64_8_v1_lt (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
323
158
RETURNS boolean AS $$
324
159
SELECT compare_ore_64_8_v1(a, b) = - 1
325
160
$$ LANGUAGE SQL;
326
161
327
162
328
- DROP FUNCTION IF EXISTS ore_64_8_v1_lte(a ore_64_8_v1 , b ore_64_8_v1 );
163
+ DROP FUNCTION IF EXISTS ore_64_8_v1_lte(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
329
164
330
- CREATE FUNCTION ore_64_8_v1_lte (a ore_64_8_v1 , b ore_64_8_v1 )
165
+ CREATE FUNCTION ore_64_8_v1_lte (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
331
166
RETURNS boolean AS $$
332
167
SELECT compare_ore_64_8_v1(a, b) != 1
333
168
$$ LANGUAGE SQL;
334
169
335
170
336
- DROP FUNCTION IF EXISTS ore_64_8_v1_gt(a ore_64_8_v1 , b ore_64_8_v1 );
171
+ DROP FUNCTION IF EXISTS ore_64_8_v1_gt(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
337
172
338
- CREATE FUNCTION ore_64_8_v1_gt (a ore_64_8_v1 , b ore_64_8_v1 )
173
+ CREATE FUNCTION ore_64_8_v1_gt (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
339
174
RETURNS boolean AS $$
340
- SELECT compare_ore_64_8_v1(a, b) = 1
341
- $$ LANGUAGE SQL;
175
+ BEGIN
176
+ SELECT compare_ore_64_8_v1(a, b) = 1 ;
177
+ END;
178
+ $$ LANGUAGE plpgsql;
342
179
343
180
344
- DROP FUNCTION IF EXISTS ore_64_8_v1_gte(a ore_64_8_v1 , b ore_64_8_v1 );
181
+ DROP FUNCTION IF EXISTS ore_64_8_v1_gte(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
345
182
346
- CREATE FUNCTION ore_64_8_v1_gte (a ore_64_8_v1 , b ore_64_8_v1 )
183
+ CREATE FUNCTION ore_64_8_v1_gte (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
347
184
RETURNS boolean AS $$
348
185
SELECT compare_ore_64_8_v1(a, b) != - 1
349
186
$$ LANGUAGE SQL;
350
187
351
188
352
- DROP OPERATOR IF EXISTS = (ore_64_8_v1, ore_64_8_v1 );
189
+ DROP OPERATOR IF EXISTS = (ore_64_8_index_v1, ore_64_8_index_v1 );
353
190
354
191
CREATE OPERATOR = (
355
192
PROCEDURE= " ore_64_8_v1_eq" ,
@@ -363,7 +200,7 @@ CREATE OPERATOR = (
363
200
);
364
201
365
202
366
- DROP OPERATOR IF EXISTS <> (ore_64_8_v1, ore_64_8_v1 );
203
+ DROP OPERATOR IF EXISTS <> (ore_64_8_index_v1, ore_64_8_index_v1 );
367
204
368
205
CREATE OPERATOR <> (
369
206
PROCEDURE= " ore_64_8_v1_neq" ,
@@ -376,7 +213,7 @@ CREATE OPERATOR <> (
376
213
MERGES
377
214
);
378
215
379
- DROP OPERATOR IF EXISTS > (ore_64_8_v1, ore_64_8_v1 );
216
+ DROP OPERATOR IF EXISTS > (ore_64_8_index_v1, ore_64_8_index_v1 );
380
217
381
218
CREATE OPERATOR > (
382
219
PROCEDURE= " ore_64_8_v1_gt" ,
@@ -389,7 +226,7 @@ CREATE OPERATOR > (
389
226
);
390
227
391
228
392
- DROP OPERATOR IF EXISTS < (ore_64_8_v1, ore_64_8_v1 );
229
+ DROP OPERATOR IF EXISTS < (ore_64_8_index_v1, ore_64_8_index_v1 );
393
230
394
231
CREATE OPERATOR < (
395
232
PROCEDURE= " ore_64_8_v1_lt" ,
@@ -402,7 +239,7 @@ CREATE OPERATOR < (
402
239
);
403
240
404
241
405
- DROP OPERATOR IF EXISTS <= (ore_64_8_v1, ore_64_8_v1 );
242
+ DROP OPERATOR IF EXISTS <= (ore_64_8_index_v1, ore_64_8_index_v1 );
406
243
407
244
CREATE OPERATOR <= (
408
245
PROCEDURE= " ore_64_8_v1_lte" ,
@@ -415,7 +252,7 @@ CREATE OPERATOR <= (
415
252
);
416
253
417
254
418
- DROP OPERATOR IF EXISTS >= (ore_64_8_v1, ore_64_8_v1 );
255
+ DROP OPERATOR IF EXISTS >= (ore_64_8_index_v1, ore_64_8_index_v1 );
419
256
420
257
CREATE OPERATOR >= (
421
258
PROCEDURE= " ore_64_8_v1_gte" ,
@@ -441,4 +278,4 @@ CREATE OPERATOR CLASS ore_64_8_v1_btree_ops DEFAULT FOR TYPE ore_64_8_v1 USING b
441
278
OPERATOR 3 = ,
442
279
OPERATOR 4 >= ,
443
280
OPERATOR 5 > ,
444
- FUNCTION 1 compare_ore_64_8_v1(a ore_64_8_v1 , b ore_64_8_v1 );
281
+ FUNCTION 1 compare_ore_64_8_v1(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
0 commit comments