Project

General

Profile

1 2094 aaronmk
--
2
-- PostgreSQL database dump
3
--
4
5
SET statement_timeout = 0;
6
SET client_encoding = 'UTF8';
7 6213 aaronmk
SET standard_conforming_strings = on;
8 2094 aaronmk
SET check_function_bodies = false;
9
SET client_min_messages = warning;
10
11
--
12 8183 aaronmk
-- Name: util; Type: SCHEMA; Schema: -; Owner: -
13 2094 aaronmk
--
14
15 8183 aaronmk
CREATE SCHEMA util;
16 2094 aaronmk
17
18 4982 aaronmk
--
19 8183 aaronmk
-- Name: SCHEMA util; Type: COMMENT; Schema: -; Owner: -
20 4982 aaronmk
--
21
22 10378 aaronmk
COMMENT ON SCHEMA util IS 'IMPORTANT: Functions must always return NULL in place of '''' (the empty string). This ensures that empty strings do not find their way into VegBIEN.
23 4982 aaronmk
24 10378 aaronmk
NOTE: IMMUTABLE SQL-language functions should never be declared STRICT, because this prevents them from being inlined. inlining can create a significant speed improvement (7x+), by avoiding function calls and enabling additional constant folding.';
25 4982 aaronmk
26 10378 aaronmk
27 8183 aaronmk
SET search_path = util, pg_catalog;
28 2107 aaronmk
29 2094 aaronmk
--
30 8183 aaronmk
-- Name: col_cast; Type: TYPE; Schema: util; Owner: -
31 8107 aaronmk
--
32
33
CREATE TYPE col_cast AS (
34
	col_name text,
35
	type regtype
36
);
37
38
39
--
40 8183 aaronmk
-- Name: col_ref; Type: TYPE; Schema: util; Owner: -
41 8106 aaronmk
--
42
43
CREATE TYPE col_ref AS (
44
	table_ regclass,
45
	name text
46
);
47
48
49
--
50 8183 aaronmk
-- Name: compass_dir; Type: TYPE; Schema: util; Owner: -
51 7673 aaronmk
--
52
53
CREATE TYPE compass_dir AS ENUM (
54
    'N',
55
    'E',
56
    'S',
57
    'W'
58
);
59
60
61
--
62 8183 aaronmk
-- Name: datatype; Type: TYPE; Schema: util; Owner: -
63 2610 aaronmk
--
64
65
CREATE TYPE datatype AS ENUM (
66
    'str',
67
    'float'
68
);
69
70
71
--
72 8183 aaronmk
-- Name: _alt(anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement); Type: FUNCTION; Schema: util; Owner: -
73 2596 aaronmk
--
74
75 4501 aaronmk
CREATE FUNCTION _alt("0" anyelement DEFAULT NULL::unknown, "1" anyelement DEFAULT NULL::unknown, "2" anyelement DEFAULT NULL::unknown, "3" anyelement DEFAULT NULL::unknown, "4" anyelement DEFAULT NULL::unknown, "5" anyelement DEFAULT NULL::unknown, "6" anyelement DEFAULT NULL::unknown, "7" anyelement DEFAULT NULL::unknown, "8" anyelement DEFAULT NULL::unknown, "9" anyelement DEFAULT NULL::unknown, "10" anyelement DEFAULT NULL::unknown, "11" anyelement DEFAULT NULL::unknown, "12" anyelement DEFAULT NULL::unknown) RETURNS anyelement
76 3422 aaronmk
    LANGUAGE sql IMMUTABLE
77
    AS $_$
78 4501 aaronmk
SELECT coalesce($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
79 3422 aaronmk
$_$;
80
81
82
--
83 8183 aaronmk
-- Name: _and(boolean, boolean, boolean, boolean, boolean); Type: FUNCTION; Schema: util; Owner: -
84 5937 aaronmk
--
85
86 5956 aaronmk
CREATE FUNCTION _and("0" boolean DEFAULT NULL::boolean, "1" boolean DEFAULT NULL::boolean, "2" boolean DEFAULT NULL::boolean, "3" boolean DEFAULT NULL::boolean, "4" boolean DEFAULT NULL::boolean) RETURNS boolean
87 5937 aaronmk
    LANGUAGE sql IMMUTABLE
88
    AS $_$
89
SELECT bool_and(value)
90
FROM
91
(VALUES
92
      ($1)
93
    , ($2)
94 5956 aaronmk
    , ($3)
95
    , ($4)
96
    , ($5)
97 5937 aaronmk
)
98
AS v (value)
99
$_$;
100
101
102
--
103 8183 aaronmk
-- Name: FUNCTION _and("0" boolean, "1" boolean, "2" boolean, "3" boolean, "4" boolean); Type: COMMENT; Schema: util; Owner: -
104 5937 aaronmk
--
105
106 6437 aaronmk
COMMENT ON FUNCTION _and("0" boolean, "1" boolean, "2" boolean, "3" boolean, "4" boolean) IS '_and() ignores NULL values, while AND combines them with the other values to potentially convert true to NULL. AND should be used with required fields, and _and() with optional fields.';
107 5937 aaronmk
108
109
--
110 8183 aaronmk
-- Name: _avg(double precision, double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: util; Owner: -
111 7704 aaronmk
--
112
113
CREATE FUNCTION _avg("0" double precision DEFAULT NULL::double precision, "1" double precision DEFAULT NULL::double precision, "2" double precision DEFAULT NULL::double precision, "3" double precision DEFAULT NULL::double precision, "4" double precision DEFAULT NULL::double precision) RETURNS double precision
114
    LANGUAGE sql IMMUTABLE
115
    AS $_$
116
SELECT avg(value)
117
FROM
118
(VALUES
119
      ($1)
120
    , ($2)
121
    , ($3)
122
    , ($4)
123
    , ($5)
124
)
125
AS v (value)
126
$_$;
127
128
129
--
130 8183 aaronmk
-- Name: _dms_to_dd(text); Type: FUNCTION; Schema: util; Owner: -
131 7679 aaronmk
--
132
133
CREATE FUNCTION _dms_to_dd(value text DEFAULT NULL::text) RETURNS double precision
134
    LANGUAGE sql IMMUTABLE STRICT
135
    AS $_$
136 8183 aaronmk
SELECT (g[1]||'1')::integer*util._dms_to_dd(deg := g[2]::double precision, min := g[3]::double precision, sec := g[4]::double precision, dir := g[5]::util.compass_dir)
137 7698 aaronmk
FROM
138
(
139
    SELECT regexp_matches($1, '^ *(-?)(\d{1,3}(?:\.\d*)?)(?:(?:deg|[°º])(?: *([\d.]+)(?:min|[''’]))?(?: *([\d.]+)(?:sec|["”]))?)? *([NESW])? *$')
140
    UNION ALL
141 7702 aaronmk
    SELECT ARRAY[g[1], g[2], g[3]||'.'||g[4], NULL, g[5]]
142
    FROM regexp_matches($1, '^ *(-?)(\d{2,3})(\d{2})(\d{3}) *([NESW])? *$') matches (g) -- [D]DDMMmmm, where MMmmm = MM.mmm
143 7698 aaronmk
)
144
matches (g)
145 7679 aaronmk
$_$;
146
147
148
--
149 8183 aaronmk
-- Name: _dms_to_dd(double precision, double precision, double precision, compass_dir); Type: FUNCTION; Schema: util; Owner: -
150 7672 aaronmk
--
151
152 7674 aaronmk
CREATE FUNCTION _dms_to_dd(deg double precision DEFAULT NULL::double precision, min double precision DEFAULT NULL::double precision, sec double precision DEFAULT NULL::double precision, dir compass_dir DEFAULT NULL::compass_dir) RETURNS double precision
153 7672 aaronmk
    LANGUAGE sql IMMUTABLE
154
    AS $_$
155 8183 aaronmk
SELECT sum(value)*COALESCE(util._map('N=>1,E=>1,S=>-1,W=>-1', $4::text)::integer, 1)
156 7672 aaronmk
FROM
157
(VALUES
158 7677 aaronmk
      ($1)
159 7672 aaronmk
    , ($2/60)
160
    , ($3/60/60)
161
)
162
AS v (value)
163
$_$;
164
165
166
--
167 8183 aaronmk
-- Name: _dms_to_dd(text, text, text, text); Type: FUNCTION; Schema: util; Owner: -
168 7723 aaronmk
--
169
170
CREATE FUNCTION _dms_to_dd(deg text DEFAULT NULL::text, min text DEFAULT NULL::text, sec text DEFAULT NULL::text, dir text DEFAULT NULL::text) RETURNS double precision
171
    LANGUAGE sql IMMUTABLE
172
    AS $_$
173 8183 aaronmk
SELECT util._dms_to_dd($1::double precision, $2::double precision, $3::double precision, $4::util.compass_dir)
174 7723 aaronmk
$_$;
175
176
177
--
178 8183 aaronmk
-- Name: _eq(anyelement, anyelement); Type: FUNCTION; Schema: util; Owner: -
179 4142 aaronmk
--
180
181
CREATE FUNCTION _eq("left" anyelement DEFAULT NULL::unknown, "right" anyelement DEFAULT NULL::unknown) RETURNS boolean
182
    LANGUAGE sql IMMUTABLE
183
    AS $_$
184
SELECT $1 = $2
185
$_$;
186
187
188
--
189 8183 aaronmk
-- Name: _fix_date(date, date); Type: FUNCTION; Schema: util; Owner: -
190 7396 aaronmk
--
191
192
CREATE FUNCTION _fix_date(value date DEFAULT NULL::date, threshold date DEFAULT NULL::date) RETURNS date
193
    LANGUAGE sql IMMUTABLE
194
    AS $_$
195
-- Fix dates after threshold date
196
-- This fixes e.g. 2-digit years before 1970 misinterpreted as 20xx
197
SELECT (CASE WHEN $1 > COALESCE($2, now()) THEN ($1 - '100 years'::interval)::date ELSE $1 END)
198
$_$;
199
200
201
--
202 8183 aaronmk
-- Name: _if(boolean, anyelement, anyelement); Type: FUNCTION; Schema: util; Owner: -
203 4147 aaronmk
--
204
205
CREATE FUNCTION _if(cond boolean DEFAULT NULL::boolean, "then" anyelement DEFAULT NULL::unknown, "else" anyelement DEFAULT NULL::unknown) RETURNS anyelement
206
    LANGUAGE sql IMMUTABLE
207
    AS $_$
208
SELECT (CASE WHEN $1 THEN $2 ELSE $3 END)
209
$_$;
210
211
212
--
213 8183 aaronmk
-- Name: _if(text, anyelement, anyelement); Type: FUNCTION; Schema: util; Owner: -
214 4147 aaronmk
--
215
216
CREATE FUNCTION _if(cond text DEFAULT NULL::text, "then" anyelement DEFAULT NULL::unknown, "else" anyelement DEFAULT NULL::unknown) RETURNS anyelement
217
    LANGUAGE sql IMMUTABLE
218
    AS $_$
219 8183 aaronmk
SELECT util._if($1 != '', $2, $3)
220 4147 aaronmk
$_$;
221
222
223
--
224 10699 aaronmk
-- Name: _join(text, text, text, text, text, text, text, text, text, text); Type: FUNCTION; Schema: util; Owner: -
225 4325 aaronmk
--
226
227 10699 aaronmk
CREATE FUNCTION _join("0" text DEFAULT NULL::text, "1" text DEFAULT NULL::text, "2" text DEFAULT NULL::text, "3" text DEFAULT NULL::text, "4" text DEFAULT NULL::text, "5" text DEFAULT NULL::text, "6" text DEFAULT NULL::text, "7" text DEFAULT NULL::text, "8" text DEFAULT NULL::text, "9" text DEFAULT NULL::text) RETURNS text
228 4325 aaronmk
    LANGUAGE sql IMMUTABLE
229
    AS $_$
230 7848 aaronmk
SELECT NULLIF(concat_ws('; ', $1, $2, $3, $4, $5, $6, $7, $8, $9, $10), '')
231 4325 aaronmk
$_$;
232
233
234
--
235 10699 aaronmk
-- Name: _join_words(text, text, text, text, text, text, text, text, text, text); Type: FUNCTION; Schema: util; Owner: -
236 5009 aaronmk
--
237
238 10699 aaronmk
CREATE FUNCTION _join_words("0" text DEFAULT NULL::text, "1" text DEFAULT NULL::text, "2" text DEFAULT NULL::text, "3" text DEFAULT NULL::text, "4" text DEFAULT NULL::text, "5" text DEFAULT NULL::text, "6" text DEFAULT NULL::text, "7" text DEFAULT NULL::text, "8" text DEFAULT NULL::text, "9" text DEFAULT NULL::text) RETURNS text
239 5009 aaronmk
    LANGUAGE sql IMMUTABLE
240
    AS $_$
241 7848 aaronmk
SELECT NULLIF(concat_ws(' ', $1, $2, $3, $4, $5, $6, $7, $8, $9, $10), '')
242 5009 aaronmk
$_$;
243
244
245
--
246 10699 aaronmk
-- Name: _label(text, text); Type: FUNCTION; Schema: util; Owner: -
247 3422 aaronmk
--
248
249 10699 aaronmk
CREATE FUNCTION _label(label text, value text) RETURNS text
250 4682 aaronmk
    LANGUAGE sql IMMUTABLE
251
    AS $_$
252
SELECT coalesce($1 || ': ', '') || $2
253
$_$;
254 2596 aaronmk
255
256
--
257 8825 aaronmk
-- Name: _lowercase(text); Type: FUNCTION; Schema: util; Owner: -
258
--
259
260
CREATE FUNCTION _lowercase(value text) RETURNS text
261 10388 aaronmk
    LANGUAGE sql IMMUTABLE
262 8825 aaronmk
    AS $_$
263
SELECT lower($1)
264
$_$;
265
266
267
--
268 8183 aaronmk
-- Name: _map(hstore, text); Type: FUNCTION; Schema: util; Owner: -
269 6222 aaronmk
--
270
271
CREATE FUNCTION _map(map hstore, value text) RETURNS text
272 7820 aaronmk
    LANGUAGE plpgsql IMMUTABLE STRICT
273 6222 aaronmk
    AS $$
274
DECLARE
275 6271 aaronmk
    match text := map -> value;
276 6222 aaronmk
BEGIN
277 6271 aaronmk
    IF match IS NULL AND NOT map ? value THEN -- no match rather than NULL match
278
        match := map -> '*'; -- use default entry
279
        IF match IS NULL AND NOT map ? '*' THEN match := '!'; -- no default
280
        END IF;
281
    END IF;
282
283
    -- Interpret result
284 6243 aaronmk
    IF match = '!' THEN RAISE 'Value not in map: %', value USING ERRCODE = 'data_exception';
285
    ELSIF match = '*' THEN RETURN value;
286
    ELSE RETURN match;
287 6222 aaronmk
    END IF;
288
END;
289
$$;
290
291
292
--
293 10314 aaronmk
-- Name: _map(hstore, anyelement); Type: FUNCTION; Schema: util; Owner: -
294
--
295
296
CREATE FUNCTION _map(map hstore, value anyelement) RETURNS anyelement
297
    LANGUAGE plpgsql IMMUTABLE STRICT
298
    AS $$
299
DECLARE
300 10315 aaronmk
    result value%TYPE := util._map(map, value::text)::unknown;
301 10314 aaronmk
BEGIN
302
    RETURN result;
303
END;
304
$$;
305
306
307
--
308 8183 aaronmk
-- Name: _max(anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement); Type: FUNCTION; Schema: util; Owner: -
309 5408 aaronmk
--
310
311
CREATE FUNCTION _max("0" anyelement DEFAULT NULL::unknown, "1" anyelement DEFAULT NULL::unknown, "2" anyelement DEFAULT NULL::unknown, "3" anyelement DEFAULT NULL::unknown, "4" anyelement DEFAULT NULL::unknown, "5" anyelement DEFAULT NULL::unknown, "6" anyelement DEFAULT NULL::unknown, "7" anyelement DEFAULT NULL::unknown, "8" anyelement DEFAULT NULL::unknown, "9" anyelement DEFAULT NULL::unknown) RETURNS anyelement
312
    LANGUAGE sql IMMUTABLE
313
    AS $_$
314 7289 aaronmk
SELECT GREATEST($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
315 5408 aaronmk
$_$;
316
317
318
--
319 8183 aaronmk
-- Name: _merge(anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement); Type: FUNCTION; Schema: util; Owner: -
320 2940 aaronmk
--
321
322 4150 aaronmk
CREATE FUNCTION _merge("0" anyelement DEFAULT NULL::unknown, "1" anyelement DEFAULT NULL::unknown, "2" anyelement DEFAULT NULL::unknown, "3" anyelement DEFAULT NULL::unknown, "4" anyelement DEFAULT NULL::unknown, "5" anyelement DEFAULT NULL::unknown, "6" anyelement DEFAULT NULL::unknown, "7" anyelement DEFAULT NULL::unknown, "8" anyelement DEFAULT NULL::unknown, "9" anyelement DEFAULT NULL::unknown) RETURNS anyelement
323 2940 aaronmk
    LANGUAGE sql IMMUTABLE
324
    AS $_$
325 8183 aaronmk
SELECT util.join_strs(value, '; ')
326 2940 aaronmk
FROM
327
(
328
    SELECT *
329
    FROM
330
    (
331
        SELECT
332
        DISTINCT ON (value)
333
        *
334
        FROM
335
        (VALUES
336 4012 aaronmk
              (1, $1)
337
            , (2, $2)
338
            , (3, $3)
339
            , (4, $4)
340
            , (5, $5)
341
            , (6, $6)
342
            , (7, $7)
343
            , (8, $8)
344
            , (9, $9)
345
            , (10, $10)
346 2940 aaronmk
        )
347
        AS v (sort_order, value)
348 4011 aaronmk
        WHERE value IS NOT NULL
349 2940 aaronmk
    )
350
    AS v
351
    ORDER BY sort_order
352
)
353
AS v
354
$_$;
355
356
357
--
358 8183 aaronmk
-- Name: _merge_prefix(text, text); Type: FUNCTION; Schema: util; Owner: -
359 7140 aaronmk
--
360
361
CREATE FUNCTION _merge_prefix(prefix text DEFAULT NULL::text, value text DEFAULT NULL::text) RETURNS text
362
    LANGUAGE sql IMMUTABLE
363
    AS $_$
364
SELECT _join_words((CASE WHEN $2 ~ ('^'||$1||E'\\y') THEN NULL ELSE $1 END), $2)
365
$_$;
366
367
368
--
369 8183 aaronmk
-- Name: _merge_words(anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement); Type: FUNCTION; Schema: util; Owner: -
370 6354 aaronmk
--
371
372
CREATE FUNCTION _merge_words("0" anyelement DEFAULT NULL::unknown, "1" anyelement DEFAULT NULL::unknown, "2" anyelement DEFAULT NULL::unknown, "3" anyelement DEFAULT NULL::unknown, "4" anyelement DEFAULT NULL::unknown, "5" anyelement DEFAULT NULL::unknown, "6" anyelement DEFAULT NULL::unknown, "7" anyelement DEFAULT NULL::unknown, "8" anyelement DEFAULT NULL::unknown, "9" anyelement DEFAULT NULL::unknown) RETURNS anyelement
373
    LANGUAGE sql IMMUTABLE
374
    AS $_$
375 8183 aaronmk
SELECT util.join_strs(value, ' ')
376 6354 aaronmk
FROM
377
(
378
    SELECT *
379
    FROM
380
    (
381
        SELECT
382
        DISTINCT ON (value)
383
        *
384
        FROM
385
        (VALUES
386
              (1, $1)
387
            , (2, $2)
388
            , (3, $3)
389
            , (4, $4)
390
            , (5, $5)
391
            , (6, $6)
392
            , (7, $7)
393
            , (8, $8)
394
            , (9, $9)
395
            , (10, $10)
396
        )
397
        AS v (sort_order, value)
398
        WHERE value IS NOT NULL
399
    )
400
    AS v
401
    ORDER BY sort_order
402
)
403
AS v
404
$_$;
405
406
407
--
408 8183 aaronmk
-- Name: _min(anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement, anyelement); Type: FUNCTION; Schema: util; Owner: -
409 5408 aaronmk
--
410
411
CREATE FUNCTION _min("0" anyelement DEFAULT NULL::unknown, "1" anyelement DEFAULT NULL::unknown, "2" anyelement DEFAULT NULL::unknown, "3" anyelement DEFAULT NULL::unknown, "4" anyelement DEFAULT NULL::unknown, "5" anyelement DEFAULT NULL::unknown, "6" anyelement DEFAULT NULL::unknown, "7" anyelement DEFAULT NULL::unknown, "8" anyelement DEFAULT NULL::unknown, "9" anyelement DEFAULT NULL::unknown) RETURNS anyelement
412
    LANGUAGE sql IMMUTABLE
413
    AS $_$
414 7289 aaronmk
SELECT LEAST($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
415 5408 aaronmk
$_$;
416
417
418
--
419 8183 aaronmk
-- Name: _not(boolean); Type: FUNCTION; Schema: util; Owner: -
420 6316 aaronmk
--
421
422
CREATE FUNCTION _not(value boolean) RETURNS boolean
423 10388 aaronmk
    LANGUAGE sql IMMUTABLE
424 6316 aaronmk
    AS $_$
425
SELECT NOT $1
426
$_$;
427
428
429
--
430 8183 aaronmk
-- Name: _now(); Type: FUNCTION; Schema: util; Owner: -
431 7104 aaronmk
--
432
433
CREATE FUNCTION _now() RETURNS timestamp with time zone
434
    LANGUAGE sql STABLE
435
    AS $$
436
SELECT now()
437
$$;
438
439
440
--
441 8183 aaronmk
-- Name: _nullIf(anyelement, text, datatype); Type: FUNCTION; Schema: util; Owner: -
442 2949 aaronmk
--
443
444 4475 aaronmk
CREATE FUNCTION "_nullIf"(value anyelement, "null" text, type datatype DEFAULT 'str'::datatype) RETURNS anyelement
445 2949 aaronmk
    LANGUAGE plpgsql IMMUTABLE
446
    AS $$
447
DECLARE
448 8183 aaronmk
    type util.datatype NOT NULL := type; -- add NOT NULL
449 2949 aaronmk
BEGIN
450 4475 aaronmk
    IF type = 'str' THEN RETURN nullif(value::text, "null");
451 2722 aaronmk
    -- Invalid value is ignored, but invalid null value generates error
452 2949 aaronmk
    ELSIF type = 'float' THEN
453 2722 aaronmk
        DECLARE
454
            -- Outside the try block so that invalid null value generates error
455 2949 aaronmk
            "null" double precision := "null"::double precision;
456 2722 aaronmk
        BEGIN
457 2949 aaronmk
            RETURN nullif(value::double precision, "null");
458 2722 aaronmk
        EXCEPTION
459 2949 aaronmk
            WHEN data_exception THEN RETURN value; -- ignore invalid value
460 2722 aaronmk
        END;
461 2610 aaronmk
    END IF;
462
END;
463
$$;
464
465
466
--
467 8183 aaronmk
-- Name: _nullIf(anyelement, text, text); Type: FUNCTION; Schema: util; Owner: -
468 4479 aaronmk
--
469
470
CREATE FUNCTION "_nullIf"(value anyelement, "null" text, type text) RETURNS anyelement
471
    LANGUAGE sql IMMUTABLE
472
    AS $_$
473 8183 aaronmk
SELECT util."_nullIf"($1, $2, $3::util.datatype)
474 4479 aaronmk
$_$;
475
476
477
--
478 8183 aaronmk
-- Name: _or(boolean, boolean, boolean, boolean, boolean); Type: FUNCTION; Schema: util; Owner: -
479 6355 aaronmk
--
480
481
CREATE FUNCTION _or("0" boolean DEFAULT NULL::boolean, "1" boolean DEFAULT NULL::boolean, "2" boolean DEFAULT NULL::boolean, "3" boolean DEFAULT NULL::boolean, "4" boolean DEFAULT NULL::boolean) RETURNS boolean
482
    LANGUAGE sql IMMUTABLE
483
    AS $_$
484
SELECT bool_or(value)
485
FROM
486
(VALUES
487
      ($1)
488
    , ($2)
489
    , ($3)
490
    , ($4)
491
    , ($5)
492
)
493
AS v (value)
494
$_$;
495
496
497
--
498 8183 aaronmk
-- Name: FUNCTION _or("0" boolean, "1" boolean, "2" boolean, "3" boolean, "4" boolean); Type: COMMENT; Schema: util; Owner: -
499 6437 aaronmk
--
500
501
COMMENT ON FUNCTION _or("0" boolean, "1" boolean, "2" boolean, "3" boolean, "4" boolean) IS '_or() ignores NULL values, while OR combines them with the other values to potentially convert false to NULL. OR should be used with required fields, and _or() with optional fields.';
502
503
504
--
505 8183 aaronmk
-- Name: _range(double precision, double precision); Type: FUNCTION; Schema: util; Owner: -
506 7706 aaronmk
--
507
508
CREATE FUNCTION _range("from" double precision DEFAULT NULL::double precision, "to" double precision DEFAULT NULL::double precision) RETURNS double precision
509
    LANGUAGE sql IMMUTABLE
510
    AS $_$
511
SELECT $2 - $1
512
$_$;
513
514
515
--
516 8183 aaronmk
-- Name: _split(text, text); Type: FUNCTION; Schema: util; Owner: -
517 6793 aaronmk
--
518
519
CREATE FUNCTION _split(value text DEFAULT NULL::text, separator text DEFAULT '; '::text) RETURNS SETOF text
520 10388 aaronmk
    LANGUAGE sql IMMUTABLE
521 6793 aaronmk
    AS $_$
522
SELECT regexp_split_to_table($1, $2)
523
$_$;
524
525
526
--
527 10594 aaronmk
-- Name: added_cols(regclass, regclass); Type: FUNCTION; Schema: util; Owner: -
528
--
529
530
CREATE FUNCTION added_cols(table_ regclass, names regclass) RETURNS SETOF text
531
    LANGUAGE sql STABLE STRICT
532
    AS $_$
533
SELECT util.derived_cols($1, $2)
534
UNION
535
SELECT util.eval2set($$
536
SELECT col
537
FROM util.col_names($$||quote_nullable($1)||$$::regclass) f (col)
538
JOIN $$||$2||$$ ON "to" = col
539
WHERE "from" LIKE ':%'
540
$$, NULL::text)
541
$_$;
542
543
544
--
545
-- Name: FUNCTION added_cols(table_ regclass, names regclass); Type: COMMENT; Schema: util; Owner: -
546
--
547
548
COMMENT ON FUNCTION added_cols(table_ regclass, names regclass) IS 'gets table_''s added columns (all the columns not in the original data)';
549
550
551
--
552 9959 aaronmk
-- Name: all_same_final(anyarray); Type: FUNCTION; Schema: util; Owner: -
553
--
554
555
CREATE FUNCTION all_same_final(state anyarray) RETURNS boolean
556
    LANGUAGE sql IMMUTABLE
557
    AS $_$
558
SELECT $1 IS NULL/*no rows*/ OR util.not_empty($1)/*not no_match_sentinel*/
559
$_$;
560
561
562
--
563
-- Name: all_same_transform(anyarray, anyelement); Type: FUNCTION; Schema: util; Owner: -
564
--
565
566
CREATE FUNCTION all_same_transform(state anyarray, value anyelement) RETURNS anyarray
567
    LANGUAGE plpgsql IMMUTABLE
568
    AS $$
569
DECLARE
570
	value_cmp         state%TYPE = ARRAY[value];
571
	state             state%TYPE = COALESCE(state, value_cmp);
572
	no_match_sentinel state%TYPE = value_cmp[1:0]/*=ARRAY[]::state%TYPE*/;
573
BEGIN
574
	RETURN (CASE WHEN value_cmp IS NOT DISTINCT FROM state THEN state ELSE no_match_sentinel END);
575
END;
576
$$;
577
578
579
--
580 10305 aaronmk
-- Name: array_fill(anyelement, integer); Type: FUNCTION; Schema: util; Owner: -
581
--
582
583
CREATE FUNCTION array_fill(value anyelement, length integer) RETURNS anyarray
584
    LANGUAGE sql IMMUTABLE
585
    AS $_$
586
SELECT pg_catalog.array_fill($1, ARRAY[$2])
587
$_$;
588
589
590
--
591 10303 aaronmk
-- Name: array_length(anyarray); Type: FUNCTION; Schema: util; Owner: -
592
--
593
594
CREATE FUNCTION array_length("array" anyarray) RETURNS integer
595 10354 aaronmk
    LANGUAGE sql IMMUTABLE
596 10303 aaronmk
    AS $_$
597 10321 aaronmk
SELECT util.array_length($1, 1)
598 10303 aaronmk
$_$;
599
600
601
--
602 10304 aaronmk
-- Name: array_length(anyarray, integer); Type: FUNCTION; Schema: util; Owner: -
603
--
604
605
CREATE FUNCTION array_length("array" anyarray, dimension integer) RETURNS integer
606 10354 aaronmk
    LANGUAGE sql IMMUTABLE
607 10304 aaronmk
    AS $_$
608 10354 aaronmk
SELECT CASE WHEN $1 IS NULL THEN NULL ELSE COALESCE(pg_catalog.array_length($1, $2), 0) END
609 10304 aaronmk
$_$;
610
611
612
--
613
-- Name: FUNCTION array_length("array" anyarray, dimension integer); Type: COMMENT; Schema: util; Owner: -
614
--
615
616
COMMENT ON FUNCTION array_length("array" anyarray, dimension integer) IS 'returns 0 instead of NULL for empty arrays';
617
618
619
--
620 8183 aaronmk
-- Name: cluster_index(regclass); Type: FUNCTION; Schema: util; Owner: -
621 8104 aaronmk
--
622
623
CREATE FUNCTION cluster_index(table_ regclass) RETURNS regclass
624
    LANGUAGE sql STABLE STRICT
625
    AS $_$
626
SELECT indexrelid FROM pg_index WHERE indrelid = $1 AND indisclustered
627
$_$;
628
629
630
--
631 8183 aaronmk
-- Name: cluster_once(regclass, regclass); Type: FUNCTION; Schema: util; Owner: -
632 8105 aaronmk
--
633
634
CREATE FUNCTION cluster_once(table_ regclass, index regclass) RETURNS void
635
    LANGUAGE plpgsql STRICT
636
    AS $_$
637
BEGIN
638
    -- not yet clustered (ARRAY[] compares NULLs literally)
639 8183 aaronmk
    IF ARRAY[util.cluster_index(table_)] != ARRAY[index] THEN
640 8105 aaronmk
        EXECUTE $$CLUSTER $$||table_||$$ USING $$||index;
641
    END IF;
642
END;
643
$_$;
644
645
646
--
647 8183 aaronmk
-- Name: FUNCTION cluster_once(table_ regclass, index regclass); Type: COMMENT; Schema: util; Owner: -
648 8105 aaronmk
--
649
650
COMMENT ON FUNCTION cluster_once(table_ regclass, index regclass) IS 'idempotent';
651
652
653
--
654 10986 aaronmk
-- Name: col__min(col_ref); Type: FUNCTION; Schema: util; Owner: -
655
--
656
657
CREATE FUNCTION col__min(col col_ref) RETURNS integer
658
    LANGUAGE sql STABLE
659
    AS $_$
660
SELECT util.eval2val($$
661
SELECT $$||quote_ident($1.name)||$$
662
FROM $$||$1.table_||$$
663
ORDER BY $$||quote_ident($1.name)||$$ ASC
664
LIMIT 1
665
$$, NULL::integer)
666
$_$;
667
668
669
--
670 10136 aaronmk
-- Name: col_comment(col_ref); Type: FUNCTION; Schema: util; Owner: -
671
--
672
673
CREATE FUNCTION col_comment(col col_ref) RETURNS text
674
    LANGUAGE plpgsql STABLE STRICT
675
    AS $$
676
DECLARE
677
	comment text;
678
BEGIN
679
	SELECT description
680
	FROM pg_attribute
681
	LEFT JOIN pg_description ON objoid = attrelid
682
		AND classoid = 'pg_class'::regclass AND objsubid = attnum
683
	WHERE attrelid = col.table_ AND attname = col.name
684
	INTO STRICT comment
685
	;
686
	RETURN comment;
687
EXCEPTION
688
	WHEN no_data_found THEN PERFORM util.raise_undefined_column(col);
689
END;
690
$$;
691
692
693
--
694 10130 aaronmk
-- Name: col_default_sql(col_ref); Type: FUNCTION; Schema: util; Owner: -
695
--
696
697
CREATE FUNCTION col_default_sql(col col_ref) RETURNS text
698
    LANGUAGE plpgsql STABLE STRICT
699
    AS $$
700
DECLARE
701
	default_sql text;
702
BEGIN
703
	SELECT adsrc
704
	FROM pg_attribute
705
	LEFT JOIN pg_attrdef ON adrelid = attrelid AND adnum = attnum
706
	WHERE attrelid = col.table_ AND attname = col.name
707
	INTO STRICT default_sql
708
	;
709
	RETURN default_sql;
710
EXCEPTION
711
	WHEN no_data_found THEN PERFORM util.raise_undefined_column(col);
712
END;
713
$$;
714
715
716
--
717 10134 aaronmk
-- Name: col_default_value(col_ref, anyelement); Type: FUNCTION; Schema: util; Owner: -
718
--
719
720
CREATE FUNCTION col_default_value(col col_ref, ret_type_null anyelement DEFAULT NULL::text) RETURNS anyelement
721
    LANGUAGE sql STABLE
722
    AS $_$
723
SELECT util.eval_expr_passthru(util.col_default_sql($1), $2)
724
$_$;
725
726
727
--
728
-- Name: FUNCTION col_default_value(col col_ref, ret_type_null anyelement); Type: COMMENT; Schema: util; Owner: -
729
--
730
731
COMMENT ON FUNCTION col_default_value(col col_ref, ret_type_null anyelement) IS 'ret_type_null: NULL::ret_type';
732
733
734
--
735 8183 aaronmk
-- Name: col_exists(col_ref); Type: FUNCTION; Schema: util; Owner: -
736 8180 aaronmk
--
737
738
CREATE FUNCTION col_exists(col col_ref) RETURNS boolean
739
    LANGUAGE plpgsql STRICT
740
    AS $$
741
BEGIN
742 8183 aaronmk
    PERFORM util.col_type(col);
743 8180 aaronmk
    RETURN true;
744
EXCEPTION
745
    WHEN undefined_column THEN RETURN false;
746
END;
747
$$;
748
749
750
--
751 8183 aaronmk
-- Name: col_global_names(regtype); Type: FUNCTION; Schema: util; Owner: -
752 8084 aaronmk
--
753
754
CREATE FUNCTION col_global_names(type regtype, OUT name text, OUT global_name text) RETURNS SETOF record
755 8097 aaronmk
    LANGUAGE plpgsql STABLE STRICT
756 8084 aaronmk
    AS $$
757
DECLARE
758 8183 aaronmk
    prefix text := util.name(type)||'.';
759 8084 aaronmk
BEGIN
760
    RETURN QUERY
761 8183 aaronmk
        SELECT name_, (CASE WHEN util.contains(search_for:='.', in_str:=name_) THEN '' ELSE prefix END)||name_
762
        FROM util.col_names(type) f (name_);
763 8084 aaronmk
END;
764
$$;
765
766
767
--
768 8183 aaronmk
-- Name: col_names(regtype); Type: FUNCTION; Schema: util; Owner: -
769 8082 aaronmk
--
770
771
CREATE FUNCTION col_names(type regtype) RETURNS SETOF text
772 8097 aaronmk
    LANGUAGE plpgsql STABLE STRICT
773 8082 aaronmk
    AS $_$
774
BEGIN
775
    RETURN QUERY EXECUTE $$SELECT skeys(hstore(NULL::$$||type||$$))$$;
776
END;
777
$_$;
778
779
780
--
781 8183 aaronmk
-- Name: col_names(regclass); Type: FUNCTION; Schema: util; Owner: -
782 8151 aaronmk
--
783
784
CREATE FUNCTION col_names(table_ regclass) RETURNS SETOF text
785
    LANGUAGE sql STABLE STRICT
786
    AS $_$
787
SELECT attname::text
788
FROM pg_attribute
789 10158 aaronmk
WHERE attrelid = $1 AND attnum >= 1 AND NOT attisdropped
790 8151 aaronmk
ORDER BY attnum
791
$_$;
792
793
794
--
795 8183 aaronmk
-- Name: col_type(col_ref); Type: FUNCTION; Schema: util; Owner: -
796 8106 aaronmk
--
797
798
CREATE FUNCTION col_type(col col_ref) RETURNS regtype
799 8169 aaronmk
    LANGUAGE plpgsql STABLE STRICT
800
    AS $$
801
DECLARE
802
    type regtype;
803
BEGIN
804
    SELECT atttypid FROM pg_attribute
805
    WHERE attrelid = col.table_ AND attname = col.name
806
    INTO STRICT type
807
    ;
808
    RETURN type;
809
EXCEPTION
810 8171 aaronmk
    WHEN no_data_found THEN
811 8181 aaronmk
        RAISE undefined_column USING MESSAGE =
812
            concat('undefined column: ', col.name);
813 8169 aaronmk
END;
814
$$;
815 8106 aaronmk
816
817
--
818 11005 aaronmk
-- Name: concat_esc(text, text); Type: FUNCTION; Schema: util; Owner: -
819
--
820
821
CREATE FUNCTION concat_esc("left" text, "right" text) RETURNS text
822
    LANGUAGE sql IMMUTABLE
823
    AS $_$
824
SELECT util.esc_name__append($2, $1)
825
$_$;
826
827
828
--
829 8183 aaronmk
-- Name: contains(text, text); Type: FUNCTION; Schema: util; Owner: -
830 8095 aaronmk
--
831
832
CREATE FUNCTION contains(search_for text, in_str text) RETURNS boolean
833 10388 aaronmk
    LANGUAGE sql IMMUTABLE
834 8095 aaronmk
    AS $_$
835
SELECT position($1 in $2) > 0 /*1-based offset*/
836
$_$;
837
838
839
--
840 8183 aaronmk
-- Name: create_if_not_exists(text); Type: FUNCTION; Schema: util; Owner: -
841 8094 aaronmk
--
842
843
CREATE FUNCTION create_if_not_exists(sql text) RETURNS void
844
    LANGUAGE plpgsql STRICT
845
    AS $$
846
BEGIN
847 10146 aaronmk
    PERFORM util.eval(sql);
848 8094 aaronmk
EXCEPTION
849 8103 aaronmk
    WHEN duplicate_table  THEN NULL;
850 10181 aaronmk
    WHEN duplicate_object THEN NULL; -- e.g. constraint
851 8103 aaronmk
    WHEN duplicate_column THEN NULL;
852 10244 aaronmk
    WHEN invalid_table_definition THEN
853
        IF SQLERRM LIKE 'multiple primary keys for table % are not allowed' THEN NULL;
854
        ELSE RAISE USING ERRCODE = SQLSTATE, MESSAGE = SQLERRM; -- rethrow
855
        END IF;
856 8094 aaronmk
END;
857
$$;
858
859
860
--
861 8183 aaronmk
-- Name: FUNCTION create_if_not_exists(sql text); Type: COMMENT; Schema: util; Owner: -
862 8094 aaronmk
--
863
864
COMMENT ON FUNCTION create_if_not_exists(sql text) IS 'idempotent';
865
866
867
--
868 10364 aaronmk
-- Name: derived_cols(regclass, regclass); Type: FUNCTION; Schema: util; Owner: -
869
--
870
871
CREATE FUNCTION derived_cols(table_ regclass, names regclass) RETURNS SETOF text
872
    LANGUAGE sql STABLE STRICT
873
    AS $_$
874
SELECT util.eval2set($$
875
SELECT col
876
FROM util.col_names($$||quote_nullable($1)||$$::regclass) f (col)
877
LEFT JOIN $$||$2||$$ ON "to" = col
878
WHERE "from" IS NULL
879
$$, NULL::text)
880
$_$;
881
882
883
--
884
-- Name: FUNCTION derived_cols(table_ regclass, names regclass); Type: COMMENT; Schema: util; Owner: -
885
--
886
887
COMMENT ON FUNCTION derived_cols(table_ regclass, names regclass) IS 'gets table_''s derived columns (all the columns not in the names table)';
888
889
890
--
891 8200 aaronmk
-- Name: do_optionally_ignore(text, boolean); Type: FUNCTION; Schema: util; Owner: -
892
--
893
894
CREATE FUNCTION do_optionally_ignore(sql text, ignore boolean) RETURNS void
895
    LANGUAGE sql STRICT
896
    AS $_$
897
SELECT CASE WHEN $2 THEN util.try_create($1) ELSE util.create_if_not_exists($1) END
898
$_$;
899
900
901
--
902
-- Name: FUNCTION do_optionally_ignore(sql text, ignore boolean); Type: COMMENT; Schema: util; Owner: -
903
--
904
905
COMMENT ON FUNCTION do_optionally_ignore(sql text, ignore boolean) IS 'idempotent';
906
907
908
--
909 10362 aaronmk
-- Name: drop_column(col_ref); Type: FUNCTION; Schema: util; Owner: -
910
--
911
912
CREATE FUNCTION drop_column(col col_ref) RETURNS void
913
    LANGUAGE sql STRICT
914
    AS $_$
915
SELECT util.eval($$ALTER TABLE $$||$1.table_||$$ DROP COLUMN IF EXISTS $$||
916
quote_ident($1.name))
917
$_$;
918
919
920
--
921
-- Name: FUNCTION drop_column(col col_ref); Type: COMMENT; Schema: util; Owner: -
922
--
923
924
COMMENT ON FUNCTION drop_column(col col_ref) IS 'idempotent';
925
926
927
--
928 10150 aaronmk
-- Name: drop_table(text); Type: FUNCTION; Schema: util; Owner: -
929
--
930
931
CREATE FUNCTION drop_table(table_ text) RETURNS void
932
    LANGUAGE sql STRICT
933
    AS $_$
934
SELECT util.eval($$DROP TABLE IF EXISTS $$||$1)
935
$_$;
936
937
938
--
939
-- Name: FUNCTION drop_table(table_ text); Type: COMMENT; Schema: util; Owner: -
940
--
941
942
COMMENT ON FUNCTION drop_table(table_ text) IS 'idempotent';
943
944
945
--
946 10322 aaronmk
-- Name: empty_array(anyelement); Type: FUNCTION; Schema: util; Owner: -
947
--
948
949
CREATE FUNCTION empty_array(elem_type_null anyelement DEFAULT NULL::text) RETURNS anyarray
950
    LANGUAGE sql IMMUTABLE
951
    AS $_$
952
SELECT util.array_fill($1, 0)
953
$_$;
954
955
956
--
957
-- Name: FUNCTION empty_array(elem_type_null anyelement); Type: COMMENT; Schema: util; Owner: -
958
--
959
960
COMMENT ON FUNCTION empty_array(elem_type_null anyelement) IS 'constructs proper empty 1-dimensional array whose dimensions are not NULL ( ''{}''::text[] does not do this)';
961
962
963
--
964 8183 aaronmk
-- Name: ensure_prefix(text, text); Type: FUNCTION; Schema: util; Owner: -
965 8086 aaronmk
--
966
967
CREATE FUNCTION ensure_prefix(prefix text, str text) RETURNS text
968 10388 aaronmk
    LANGUAGE sql IMMUTABLE
969 8086 aaronmk
    AS $_$
970 8183 aaronmk
SELECT (CASE WHEN util.has_prefix($1, $2) THEN $2 ELSE $1||$2 END)
971 8086 aaronmk
$_$;
972
973
974
--
975 10987 aaronmk
-- Name: esc_name__append(text, text); Type: FUNCTION; Schema: util; Owner: -
976
--
977
978
CREATE FUNCTION esc_name__append(suffix text, esc_name text) RETURNS text
979
    LANGUAGE sql IMMUTABLE
980
    AS $_$
981
SELECT regexp_replace($2, '("?)$', $1||'\1')
982
$_$;
983
984
985
--
986 9824 aaronmk
-- Name: eval(text); Type: FUNCTION; Schema: util; Owner: -
987
--
988
989
CREATE FUNCTION eval(sql text) RETURNS void
990
    LANGUAGE plpgsql STRICT
991
    AS $$
992
BEGIN
993
    RAISE NOTICE '%', sql;
994
    EXECUTE sql;
995
END;
996
$$;
997
998
999
--
1000 10363 aaronmk
-- Name: eval2set(text, anyelement); Type: FUNCTION; Schema: util; Owner: -
1001
--
1002
1003
CREATE FUNCTION eval2set(sql text, ret_type_null anyelement DEFAULT NULL::text) RETURNS SETOF anyelement
1004
    LANGUAGE plpgsql
1005
    AS $$
1006
BEGIN
1007
	RAISE NOTICE '%', sql;
1008
	RETURN QUERY EXECUTE sql;
1009
END;
1010
$$;
1011
1012
1013
--
1014
-- Name: FUNCTION eval2set(sql text, ret_type_null anyelement); Type: COMMENT; Schema: util; Owner: -
1015
--
1016
1017
COMMENT ON FUNCTION eval2set(sql text, ret_type_null anyelement) IS 'ret_type_null: NULL::ret_type';
1018
1019
1020
--
1021 10129 aaronmk
-- Name: eval2val(text, anyelement); Type: FUNCTION; Schema: util; Owner: -
1022 10128 aaronmk
--
1023
1024 10129 aaronmk
CREATE FUNCTION eval2val(sql text, ret_type_null anyelement DEFAULT NULL::text) RETURNS anyelement
1025 10128 aaronmk
    LANGUAGE plpgsql
1026
    AS $$
1027
DECLARE
1028
	ret_val ret_type_null%TYPE;
1029
BEGIN
1030
	RAISE NOTICE '%', sql;
1031
	EXECUTE sql INTO STRICT ret_val;
1032
	RETURN ret_val;
1033
END;
1034
$$;
1035
1036
1037
--
1038 10129 aaronmk
-- Name: FUNCTION eval2val(sql text, ret_type_null anyelement); Type: COMMENT; Schema: util; Owner: -
1039 10128 aaronmk
--
1040
1041 10129 aaronmk
COMMENT ON FUNCTION eval2val(sql text, ret_type_null anyelement) IS 'ret_type_null: NULL::ret_type';
1042 10128 aaronmk
1043
1044
--
1045 10131 aaronmk
-- Name: eval_expr(text, anyelement); Type: FUNCTION; Schema: util; Owner: -
1046
--
1047
1048
CREATE FUNCTION eval_expr(sql text, ret_type_null anyelement DEFAULT NULL::text) RETURNS anyelement
1049
    LANGUAGE sql
1050
    AS $_$
1051 10132 aaronmk
SELECT util.eval2val($$SELECT $$||$1, $2)
1052 10131 aaronmk
$_$;
1053
1054
1055
--
1056
-- Name: FUNCTION eval_expr(sql text, ret_type_null anyelement); Type: COMMENT; Schema: util; Owner: -
1057
--
1058
1059
COMMENT ON FUNCTION eval_expr(sql text, ret_type_null anyelement) IS 'ret_type_null: NULL::ret_type';
1060
1061
1062
--
1063 10133 aaronmk
-- Name: eval_expr_passthru(text, anyelement); Type: FUNCTION; Schema: util; Owner: -
1064
--
1065
1066
CREATE FUNCTION eval_expr_passthru(sql text, ret_type_null anyelement DEFAULT NULL::text) RETURNS anyelement
1067
    LANGUAGE sql
1068
    AS $_$
1069
SELECT CASE WHEN $1 IS NULL THEN NULL ELSE util.eval_expr($1, $2) END
1070
$_$;
1071
1072
1073
--
1074
-- Name: FUNCTION eval_expr_passthru(sql text, ret_type_null anyelement); Type: COMMENT; Schema: util; Owner: -
1075
--
1076
1077
COMMENT ON FUNCTION eval_expr_passthru(sql text, ret_type_null anyelement) IS 'sql: can be NULL, which will be passed through
1078
ret_type_null: NULL::ret_type';
1079
1080
1081
--
1082 8183 aaronmk
-- Name: existing_cols(regclass, text[]); Type: FUNCTION; Schema: util; Owner: -
1083 8182 aaronmk
--
1084
1085
CREATE FUNCTION existing_cols(table_ regclass, VARIADIC col_names text[]) RETURNS SETOF text
1086
    LANGUAGE sql STABLE STRICT
1087
    AS $_$
1088
SELECT col_name
1089
FROM unnest($2) s (col_name)
1090 8183 aaronmk
WHERE util.col_exists(($1, col_name))
1091 8182 aaronmk
$_$;
1092
1093
1094
--
1095 10323 aaronmk
-- Name: fix_array(anyarray); Type: FUNCTION; Schema: util; Owner: -
1096
--
1097
1098
CREATE FUNCTION fix_array("array" anyarray) RETURNS anyarray
1099 10355 aaronmk
    LANGUAGE sql IMMUTABLE
1100 10323 aaronmk
    AS $_$
1101
-- STRICT handles NULLs, so that the array will always be a value
1102 10355 aaronmk
SELECT CASE WHEN $1 IS NULL THEN NULL ELSE (
1103
	CASE WHEN pg_catalog.array_ndims($1) IS NULL THEN util.empty_array($1[1]) ELSE $1 END
1104
) END
1105 10323 aaronmk
$_$;
1106
1107
1108
--
1109
-- Name: FUNCTION fix_array("array" anyarray); Type: COMMENT; Schema: util; Owner: -
1110
--
1111
1112
COMMENT ON FUNCTION fix_array("array" anyarray) IS 'ensures that an array will always have proper non-NULL dimensions';
1113
1114
1115
--
1116 8321 aaronmk
-- Name: force_update_view(text, text); Type: FUNCTION; Schema: util; Owner: -
1117
--
1118
1119
CREATE FUNCTION force_update_view(view_ text, query text) RETURNS void
1120
    LANGUAGE plpgsql STRICT
1121
    AS $_$
1122
DECLARE
1123
	mk_view text = $$CREATE OR REPLACE VIEW $$||view_||$$ AS
1124
$$||query;
1125
BEGIN
1126
	EXECUTE mk_view;
1127
EXCEPTION
1128
WHEN invalid_table_definition THEN
1129 8323 aaronmk
	IF SQLERRM = 'cannot drop columns from view'
1130
	OR SQLERRM LIKE 'cannot change name of view column "%" to "%"'
1131
	THEN
1132 8321 aaronmk
		EXECUTE $$DROP VIEW $$||view_||$$ CASCADE$$;
1133
		EXECUTE mk_view;
1134
	ELSE RAISE USING ERRCODE = SQLSTATE, MESSAGE = SQLERRM;
1135
	END IF;
1136
END;
1137
$_$;
1138
1139
1140
--
1141
-- Name: FUNCTION force_update_view(view_ text, query text); Type: COMMENT; Schema: util; Owner: -
1142
--
1143
1144
COMMENT ON FUNCTION force_update_view(view_ text, query text) IS 'idempotent';
1145
1146
1147
--
1148 11655 aaronmk
-- Name: grants_users(); Type: FUNCTION; Schema: util; Owner: -
1149
--
1150
1151
CREATE FUNCTION grants_users() RETURNS SETOF text
1152
    LANGUAGE sql IMMUTABLE
1153
    AS $$
1154
VALUES ('bien_read'), ('public_')
1155
$$;
1156
1157
1158
--
1159 8183 aaronmk
-- Name: has_prefix(text, text); Type: FUNCTION; Schema: util; Owner: -
1160 8085 aaronmk
--
1161
1162
CREATE FUNCTION has_prefix(prefix text, str text) RETURNS boolean
1163 10388 aaronmk
    LANGUAGE sql IMMUTABLE
1164 8085 aaronmk
    AS $_$
1165
SELECT substring($2 for length($1)) = $1
1166
$_$;
1167
1168
1169
--
1170 10307 aaronmk
-- Name: hstore(text[], text); Type: FUNCTION; Schema: util; Owner: -
1171
--
1172
1173
CREATE FUNCTION hstore(keys text[], value text) RETURNS hstore
1174
    LANGUAGE sql IMMUTABLE
1175
    AS $_$
1176 10324 aaronmk
SELECT hstore(util.fix_array($1), util.array_fill($2, util.array_length($1)))
1177 10307 aaronmk
$_$;
1178
1179
1180
--
1181
-- Name: FUNCTION hstore(keys text[], value text); Type: COMMENT; Schema: util; Owner: -
1182
--
1183
1184
COMMENT ON FUNCTION hstore(keys text[], value text) IS 'avoids repeating the same value for each key';
1185
1186
1187
--
1188 10137 aaronmk
-- Name: is_constant(col_ref); Type: FUNCTION; Schema: util; Owner: -
1189
--
1190
1191
CREATE FUNCTION is_constant(col col_ref) RETURNS boolean
1192
    LANGUAGE sql STABLE STRICT
1193
    AS $_$
1194
SELECT COALESCE(util.col_comment($1) LIKE 'constant%', false)
1195
$_$;
1196
1197
1198
--
1199 11659 aaronmk
-- Name: is_empty(anyarray); Type: FUNCTION; Schema: util; Owner: -
1200
--
1201
1202
CREATE FUNCTION is_empty("array" anyarray) RETURNS boolean
1203
    LANGUAGE sql IMMUTABLE
1204
    AS $_$
1205
SELECT util.array_length($1) = 0
1206
$_$;
1207
1208
1209
--
1210 10391 aaronmk
-- Name: is_more_complete_than(anyelement, anyelement); Type: FUNCTION; Schema: util; Owner: -
1211
--
1212
1213
CREATE FUNCTION is_more_complete_than("left" anyelement, "right" anyelement) RETURNS boolean
1214
    LANGUAGE sql IMMUTABLE
1215
    AS $_$
1216
SELECT $1 IS NOT DISTINCT FROM $2 OR ($1 IS NOT NULL AND $2 IS NULL)
1217
$_$;
1218
1219
1220
--
1221 10613 aaronmk
-- Name: is_populated_more_often_than(anyelement, anyelement); Type: FUNCTION; Schema: util; Owner: -
1222
--
1223
1224
CREATE FUNCTION is_populated_more_often_than("left" anyelement, "right" anyelement) RETURNS boolean
1225
    LANGUAGE sql IMMUTABLE
1226
    AS $_$
1227
SELECT $1 IS NOT NULL >= $2 IS NOT NULL -- true > false
1228
$_$;
1229
1230
1231
--
1232 8183 aaronmk
-- Name: join_strs_transform(text, text, text); Type: FUNCTION; Schema: util; Owner: -
1233 4009 aaronmk
--
1234
1235 4053 aaronmk
CREATE FUNCTION join_strs_transform(state text, value text, delim text) RETURNS text
1236 4054 aaronmk
    LANGUAGE sql IMMUTABLE STRICT
1237 4009 aaronmk
    AS $_$
1238 4054 aaronmk
SELECT $1 || $3 || $2
1239 2595 aaronmk
$_$;
1240
1241
1242
--
1243 10989 aaronmk
-- Name: limit2row_num(integer, integer, integer); Type: FUNCTION; Schema: util; Owner: -
1244 10985 aaronmk
--
1245
1246 10989 aaronmk
CREATE FUNCTION limit2row_num(limit_ integer, offset_ integer DEFAULT NULL::integer, min_row_num integer DEFAULT 1) RETURNS integer
1247 10985 aaronmk
    LANGUAGE sql IMMUTABLE
1248
    AS $_$
1249 10989 aaronmk
SELECT COALESCE(util.offset2row_num($2, $3) + $1 - 1, 2147483647)
1250 10985 aaronmk
$_$;
1251
1252
1253
--
1254 10110 aaronmk
-- Name: map_filter_insert(); Type: FUNCTION; Schema: util; Owner: -
1255
--
1256
1257
CREATE FUNCTION map_filter_insert() RETURNS trigger
1258
    LANGUAGE plpgsql
1259
    AS $$
1260
BEGIN
1261
	IF new."from" LIKE ':%' THEN RETURN NULL; END IF; -- exclude metadata values
1262
	RETURN new;
1263
END;
1264
$$;
1265
1266
1267
--
1268 8183 aaronmk
-- Name: map_get(regclass, text); Type: FUNCTION; Schema: util; Owner: -
1269 8146 aaronmk
--
1270
1271
CREATE FUNCTION map_get(map regclass, key text) RETURNS text
1272
    LANGUAGE plpgsql STABLE STRICT
1273
    AS $_$
1274
DECLARE
1275
    value text;
1276
BEGIN
1277
    EXECUTE $$SELECT "to" FROM $$||map||$$ WHERE "from" = $1$$
1278 8149 aaronmk
        INTO value USING key;
1279 8146 aaronmk
    RETURN value;
1280
END;
1281
$_$;
1282
1283
1284
--
1285 10358 aaronmk
-- Name: map_nulls(text[], anyelement); Type: FUNCTION; Schema: util; Owner: -
1286 10325 aaronmk
--
1287
1288 10358 aaronmk
CREATE FUNCTION map_nulls(nulls text[], value anyelement) RETURNS anyelement
1289 10353 aaronmk
    LANGUAGE sql IMMUTABLE
1290 10325 aaronmk
    AS $_$
1291 10374 aaronmk
SELECT util._map(util.nulls_map($1), $2)
1292 10325 aaronmk
$_$;
1293
1294
1295
--
1296 10359 aaronmk
-- Name: FUNCTION map_nulls(nulls text[], value anyelement); Type: COMMENT; Schema: util; Owner: -
1297
--
1298
1299
COMMENT ON FUNCTION map_nulls(nulls text[], value anyelement) IS 'due to dynamic inlining[1], this is just as fast as util._map() which it wraps[2].
1300
1301
[1] inlining of function calls, which is different from constant folding
1302
[2] _map()''s profiling query
1303
SELECT util._map(''"1"=>NULL, "2"=>NULL, "3"=>NULL, *=>*'', v) FROM unnest(array_fill(1, array[100000])) f (v)
1304
and map_nulls()''s profiling query
1305
SELECT util.map_nulls(array[1, 2, 3]::text[], v) FROM unnest(array_fill(1, array[100000])) f (v)
1306 10375 aaronmk
both take ~920 ms.
1307
also, /inputs/REMIB/Specimen/postprocess.sql > country takes the same amount of time (56000 ms) to build with map_nulls() as with a literal hstore.';
1308 10359 aaronmk
1309
1310
--
1311 8183 aaronmk
-- Name: map_values(regclass); Type: FUNCTION; Schema: util; Owner: -
1312 8150 aaronmk
--
1313
1314
CREATE FUNCTION map_values(map regclass) RETURNS SETOF text
1315
    LANGUAGE plpgsql STABLE STRICT
1316
    AS $_$
1317
BEGIN
1318
    RETURN QUERY EXECUTE $$SELECT "to" FROM $$||map;
1319
END;
1320
$_$;
1321
1322
1323
--
1324 8190 aaronmk
-- Name: mk_const_col(col_ref, anyelement); Type: FUNCTION; Schema: util; Owner: -
1325
--
1326
1327
CREATE FUNCTION mk_const_col(col col_ref, value anyelement) RETURNS void
1328
    LANGUAGE sql STRICT
1329
    AS $_$
1330 10135 aaronmk
SELECT util.create_if_not_exists($$
1331
ALTER TABLE $$||$1.table_||$$ ADD COLUMN $$
1332 8190 aaronmk
||quote_ident($1.name)||$$ $$||pg_typeof($2)||util.type_qual($2)||$$ DEFAULT $$
1333 10135 aaronmk
||quote_literal($2)||$$;
1334
COMMENT ON COLUMN $$||$1.table_||$$.$$||quote_ident($1.name)||$$ IS 'constant';
1335
$$)
1336 8190 aaronmk
$_$;
1337
1338
1339
--
1340
-- Name: FUNCTION mk_const_col(col col_ref, value anyelement); Type: COMMENT; Schema: util; Owner: -
1341
--
1342
1343
COMMENT ON FUNCTION mk_const_col(col col_ref, value anyelement) IS 'idempotent';
1344
1345
1346
--
1347 10296 aaronmk
-- Name: mk_derived_col(col_ref, text, boolean); Type: FUNCTION; Schema: util; Owner: -
1348 8187 aaronmk
--
1349
1350 10296 aaronmk
CREATE FUNCTION mk_derived_col(col col_ref, expr text, overwrite boolean DEFAULT false) RETURNS void
1351 8187 aaronmk
    LANGUAGE plpgsql STRICT
1352
    AS $_$
1353
DECLARE
1354
    type regtype = util.typeof(expr, col.table_::text::regtype);
1355
    col_name_sql text = quote_ident(col.name);
1356
BEGIN
1357 10296 aaronmk
    PERFORM util.create_if_not_exists((CASE WHEN overwrite THEN '' ELSE $$
1358
ALTER TABLE $$||col.table_||$$ ADD   COLUMN $$||col_name_sql||$$      $$||type||$$;$$ END)||$$
1359 8187 aaronmk
ALTER TABLE $$||col.table_||$$ ALTER COLUMN $$||col_name_sql||$$ TYPE $$||type||$$ USING
1360
$$||expr||$$;
1361
$$);
1362
END;
1363
$_$;
1364
1365
1366
--
1367 10296 aaronmk
-- Name: FUNCTION mk_derived_col(col col_ref, expr text, overwrite boolean); Type: COMMENT; Schema: util; Owner: -
1368 8188 aaronmk
--
1369
1370 10296 aaronmk
COMMENT ON FUNCTION mk_derived_col(col col_ref, expr text, overwrite boolean) IS 'idempotent';
1371 8188 aaronmk
1372
1373
--
1374 8183 aaronmk
-- Name: mk_map_table(text); Type: FUNCTION; Schema: util; Owner: -
1375 8139 aaronmk
--
1376
1377
CREATE FUNCTION mk_map_table(table_ text) RETURNS void
1378 8141 aaronmk
    LANGUAGE sql STRICT
1379 8139 aaronmk
    AS $_$
1380 8183 aaronmk
SELECT util.create_if_not_exists($$
1381 8141 aaronmk
CREATE TABLE $$||$1||$$
1382 8139 aaronmk
(
1383 8183 aaronmk
    LIKE util.map INCLUDING ALL
1384 10110 aaronmk
);
1385
1386
CREATE TRIGGER map_filter_insert
1387
  BEFORE INSERT
1388
  ON $$||$1||$$
1389
  FOR EACH ROW
1390
  EXECUTE PROCEDURE util.map_filter_insert();
1391 8141 aaronmk
$$)
1392 8139 aaronmk
$_$;
1393
1394
1395
--
1396 10113 aaronmk
-- Name: mk_source_col(regclass); Type: FUNCTION; Schema: util; Owner: -
1397
--
1398
1399
CREATE FUNCTION mk_source_col(table_ regclass) RETURNS void
1400
    LANGUAGE sql STRICT
1401
    AS $_$
1402
SELECT util.mk_const_col(($1, 'source'), util.table_schema($1))
1403
$_$;
1404
1405
1406
--
1407
-- Name: FUNCTION mk_source_col(table_ regclass); Type: COMMENT; Schema: util; Owner: -
1408
--
1409
1410
COMMENT ON FUNCTION mk_source_col(table_ regclass) IS 'idempotent';
1411
1412
1413
--
1414 11011 aaronmk
-- Name: mk_subset_by_row_num_func(regclass); Type: FUNCTION; Schema: util; Owner: -
1415
--
1416
1417
CREATE FUNCTION mk_subset_by_row_num_func(view_ regclass) RETURNS void
1418
    LANGUAGE plpgsql STRICT
1419
    AS $_$
1420
DECLARE
1421
	view_qual_name text = util.qual_name(view_);
1422
BEGIN
1423
	EXECUTE $$
1424
CREATE OR REPLACE FUNCTION $$||view_||$$(limit_ integer DEFAULT NULL::integer, offset_ integer DEFAULT NULL)
1425
  RETURNS SETOF $$||view_||$$ AS
1426
$BODY1$
1427
SELECT * FROM $$||view_qual_name||$$
1428
ORDER BY sort_col
1429
LIMIT $1 OFFSET $2
1430
$BODY1$
1431
  LANGUAGE sql STABLE
1432
  COST 100
1433
  ROWS 1000
1434
$$;
1435
1436
	PERFORM util.mk_subset_by_row_num_no_sort_func(view_);
1437
END;
1438
$_$;
1439
1440
1441
--
1442 8325 aaronmk
-- Name: mk_subset_by_row_num_func(regclass, text); Type: FUNCTION; Schema: util; Owner: -
1443
--
1444
1445
CREATE FUNCTION mk_subset_by_row_num_func(view_ regclass, row_num_col text) RETURNS void
1446
    LANGUAGE plpgsql STRICT
1447
    AS $_$
1448 10990 aaronmk
DECLARE
1449
	view_qual_name text = util.qual_name(view_);
1450
	row_num__min__fn text = util.esc_name__append('__row_num__min', view_qual_name);
1451 8325 aaronmk
BEGIN
1452
	EXECUTE $$
1453 10990 aaronmk
CREATE OR REPLACE FUNCTION $$||row_num__min__fn||$$()
1454
  RETURNS integer AS
1455
$BODY1$
1456
SELECT $$||quote_ident(row_num_col)||$$
1457
FROM $$||view_qual_name||$$
1458
ORDER BY $$||quote_ident(row_num_col)||$$ ASC
1459
LIMIT 1
1460
$BODY1$
1461
  LANGUAGE sql STABLE
1462
  COST 100;
1463
$$;
1464
1465
	EXECUTE $$
1466 8325 aaronmk
CREATE OR REPLACE FUNCTION $$||view_||$$(limit_ integer DEFAULT NULL::integer, offset_ integer DEFAULT NULL)
1467
  RETURNS SETOF $$||view_||$$ AS
1468
$BODY1$
1469 10990 aaronmk
SELECT * FROM $$||view_qual_name||$$
1470
WHERE $$||quote_ident(row_num_col)||$$ BETWEEN
1471
	util.offset2row_num(    $2, $$||row_num__min__fn||$$())
1472
AND util.limit2row_num ($1, $2, $$||row_num__min__fn||$$())
1473 10991 aaronmk
ORDER BY $$||quote_ident(row_num_col)||$$
1474 8325 aaronmk
$BODY1$
1475
  LANGUAGE sql STABLE
1476
  COST 100
1477
  ROWS 1000
1478
$$;
1479 11010 aaronmk
1480
	PERFORM util.mk_subset_by_row_num_no_sort_func(view_);
1481
END;
1482
$_$;
1483
1484
1485
--
1486
-- Name: mk_subset_by_row_num_no_sort_func(regclass); Type: FUNCTION; Schema: util; Owner: -
1487
--
1488
1489
CREATE FUNCTION mk_subset_by_row_num_no_sort_func(view_ regclass) RETURNS void
1490
    LANGUAGE plpgsql STRICT
1491
    AS $_$
1492
DECLARE
1493
	view_qual_name text = util.qual_name(view_);
1494
BEGIN
1495 8326 aaronmk
	EXECUTE $$
1496
CREATE OR REPLACE FUNCTION $$||view_||$$(no_sort boolean, limit_ integer DEFAULT NULL::integer, offset_ integer DEFAULT NULL)
1497
  RETURNS SETOF $$||view_||$$
1498
  SET enable_sort TO 'off'
1499
  AS
1500
$BODY1$
1501 10990 aaronmk
SELECT * FROM $$||view_qual_name||$$($2, $3)
1502 8326 aaronmk
$BODY1$
1503
  LANGUAGE sql STABLE
1504
  COST 100
1505
  ROWS 1000
1506
;
1507
COMMENT ON FUNCTION $$||view_||$$(no_sort boolean, limit_ integer, offset_ integer) IS '
1508
Use this for limit values greater than ~100,000 to avoid unwanted slow sorts.
1509
If you want to run EXPLAIN and get expanded output, use the regular subset
1510
function instead. (When a config param is set on a function, EXPLAIN produces
1511
just a function scan.)
1512
';
1513
$$;
1514 8325 aaronmk
END;
1515
$_$;
1516
1517
1518
--
1519 11010 aaronmk
-- Name: FUNCTION mk_subset_by_row_num_no_sort_func(view_ regclass); Type: COMMENT; Schema: util; Owner: -
1520
--
1521
1522
COMMENT ON FUNCTION mk_subset_by_row_num_no_sort_func(view_ regclass) IS 'creates subset function which turns off enable_sort';
1523
1524
1525
--
1526 8183 aaronmk
-- Name: name(regtype); Type: FUNCTION; Schema: util; Owner: -
1527 8083 aaronmk
--
1528
1529
CREATE FUNCTION name(type regtype) RETURNS text
1530 8097 aaronmk
    LANGUAGE sql STABLE STRICT
1531 8083 aaronmk
    AS $_$
1532
SELECT typname::text FROM pg_type WHERE oid = $1
1533
$_$;
1534
1535
1536
--
1537 9958 aaronmk
-- Name: not_empty(anyarray); Type: FUNCTION; Schema: util; Owner: -
1538
--
1539
1540
CREATE FUNCTION not_empty(value anyarray) RETURNS boolean
1541
    LANGUAGE sql IMMUTABLE
1542
    AS $_$
1543 10329 aaronmk
SELECT $1 IS NOT NULL AND util.array_length($1) > 0
1544 9958 aaronmk
$_$;
1545
1546
1547
--
1548 9956 aaronmk
-- Name: not_null(anyelement); Type: FUNCTION; Schema: util; Owner: -
1549
--
1550
1551
CREATE FUNCTION not_null(value anyelement) RETURNS boolean
1552 9957 aaronmk
    LANGUAGE sql IMMUTABLE
1553 9956 aaronmk
    AS $_$
1554
SELECT $1 IS NOT NULL
1555
$_$;
1556
1557
1558
--
1559 10373 aaronmk
-- Name: nulls_map(text[]); Type: FUNCTION; Schema: util; Owner: -
1560
--
1561
1562
CREATE FUNCTION nulls_map(nulls text[]) RETURNS hstore
1563
    LANGUAGE sql IMMUTABLE
1564
    AS $_$
1565
SELECT util.hstore($1, NULL) || '*=>*'
1566
$_$;
1567
1568
1569
--
1570
-- Name: FUNCTION nulls_map(nulls text[]); Type: COMMENT; Schema: util; Owner: -
1571
--
1572
1573
COMMENT ON FUNCTION nulls_map(nulls text[]) IS 'for use with _map()';
1574
1575
1576
--
1577 10989 aaronmk
-- Name: offset2row_num(integer, integer); Type: FUNCTION; Schema: util; Owner: -
1578 10984 aaronmk
--
1579
1580 10989 aaronmk
CREATE FUNCTION offset2row_num(offset_ integer, min_row_num integer DEFAULT 1) RETURNS integer
1581 10984 aaronmk
    LANGUAGE sql IMMUTABLE
1582
    AS $_$
1583 10989 aaronmk
SELECT $2 + COALESCE($1, 0)
1584 10984 aaronmk
$_$;
1585
1586
1587
--
1588 10988 aaronmk
-- Name: qual_name(regclass); Type: FUNCTION; Schema: util; Owner: -
1589
--
1590
1591
CREATE FUNCTION qual_name(table_ regclass) RETURNS text
1592
    LANGUAGE sql STABLE
1593
    AS $_$
1594
SELECT util.type_qual_name($1::text::regtype)
1595
$_$;
1596
1597
1598
--
1599 10116 aaronmk
-- Name: raise_undefined_column(col_ref); Type: FUNCTION; Schema: util; Owner: -
1600
--
1601
1602
CREATE FUNCTION raise_undefined_column(col col_ref) RETURNS text
1603
    LANGUAGE plpgsql IMMUTABLE STRICT
1604
    AS $$
1605
BEGIN
1606
	RAISE undefined_column USING MESSAGE = concat('undefined column: ', col.name);
1607
END;
1608
$$;
1609
1610
1611
--
1612 11657 aaronmk
-- Name: regexp_matches_group(text, text, integer); Type: FUNCTION; Schema: util; Owner: -
1613
--
1614
1615
CREATE FUNCTION regexp_matches_group(str text, re text, group_ integer DEFAULT 1) RETURNS SETOF text
1616
    LANGUAGE sql IMMUTABLE
1617
    AS $_$
1618
SELECT regexp_matches[$3] FROM regexp_matches($1, $2, 'g')
1619
$_$;
1620
1621
1622
--
1623 8183 aaronmk
-- Name: rename_cols(regclass, anyelement); Type: FUNCTION; Schema: util; Owner: -
1624 8137 aaronmk
--
1625
1626 8148 aaronmk
CREATE FUNCTION rename_cols(table_ regclass, renames anyelement) RETURNS void
1627 8137 aaronmk
    LANGUAGE sql STRICT
1628
    AS $_$
1629 8212 aaronmk
SELECT util.try_create($$ALTER TABLE $$||$1||$$ RENAME $$
1630 8137 aaronmk
||quote_ident(name)||$$ TO $$||quote_ident($2 -> name))
1631 10309 aaronmk
FROM util.col_names($1::text::regtype) f (name);
1632
SELECT NULL::void; -- don't fold away functions called in previous query
1633 8137 aaronmk
$_$;
1634
1635
1636
--
1637 8183 aaronmk
-- Name: FUNCTION rename_cols(table_ regclass, renames anyelement); Type: COMMENT; Schema: util; Owner: -
1638 8137 aaronmk
--
1639
1640 8148 aaronmk
COMMENT ON FUNCTION rename_cols(table_ regclass, renames anyelement) IS 'idempotent';
1641 8137 aaronmk
1642
1643
--
1644 10297 aaronmk
-- Name: reset_col_names(regclass, regclass); Type: FUNCTION; Schema: util; Owner: -
1645
--
1646
1647
CREATE FUNCTION reset_col_names(table_ regclass, names regclass) RETURNS void
1648
    LANGUAGE sql STRICT
1649
    AS $_$
1650 10596 aaronmk
SELECT util.eval($$DELETE FROM $$||$2||$$ WHERE "from" LIKE ':%'$$);
1651
SELECT util.mk_derived_col(($2, 'to'), $$"from"$$, overwrite := true);
1652 10297 aaronmk
SELECT util.set_col_names($1, $2);
1653
$_$;
1654
1655
1656
--
1657
-- Name: FUNCTION reset_col_names(table_ regclass, names regclass); Type: COMMENT; Schema: util; Owner: -
1658
--
1659
1660
COMMENT ON FUNCTION reset_col_names(table_ regclass, names regclass) IS 'idempotent.
1661
alters the names table, so it will need to be repopulated after running this function.';
1662
1663
1664
--
1665 8183 aaronmk
-- Name: reset_map_table(text); Type: FUNCTION; Schema: util; Owner: -
1666 8143 aaronmk
--
1667
1668
CREATE FUNCTION reset_map_table(table_ text) RETURNS void
1669
    LANGUAGE sql STRICT
1670
    AS $_$
1671 10152 aaronmk
SELECT util.drop_table($1);
1672 8183 aaronmk
SELECT util.mk_map_table($1);
1673 8143 aaronmk
$_$;
1674
1675
1676
--
1677 11652 aaronmk
-- Name: save_drop_view(text); Type: FUNCTION; Schema: util; Owner: -
1678
--
1679
1680
CREATE FUNCTION save_drop_view(view_ text) RETURNS text
1681
    LANGUAGE plpgsql STRICT
1682
    AS $_$
1683
DECLARE
1684
	result text = NULL;
1685
BEGIN
1686
	BEGIN
1687
		result = util.show_create_view(view_);
1688
		PERFORM util.eval($$DROP VIEW $$||view_);
1689
	EXCEPTION
1690
		WHEN undefined_table THEN NULL;
1691
	END;
1692
	RETURN result;
1693
END;
1694
$_$;
1695
1696
1697
--
1698 11660 aaronmk
-- Name: save_drop_views(text[]); Type: FUNCTION; Schema: util; Owner: -
1699
--
1700
1701
CREATE FUNCTION save_drop_views(views text[]) RETURNS text
1702
    LANGUAGE sql
1703
    AS $_$
1704
SELECT concat(util.save_drop_view(unnest)) FROM unnest($1)
1705
$_$;
1706
1707
1708
--
1709 10794 aaronmk
-- Name: schema(regtype); Type: FUNCTION; Schema: util; Owner: -
1710
--
1711
1712
CREATE FUNCTION schema(type regtype) RETURNS text
1713
    LANGUAGE sql STABLE
1714
    AS $_$
1715
SELECT nspname::text
1716
FROM pg_type
1717
JOIN pg_namespace ON pg_namespace.oid = typnamespace
1718
WHERE pg_type.oid = $1
1719
$_$;
1720
1721
1722
--
1723
-- Name: schema(anyelement); Type: FUNCTION; Schema: util; Owner: -
1724
--
1725
1726
CREATE FUNCTION schema(type_null anyelement) RETURNS text
1727
    LANGUAGE sql STABLE
1728
    AS $_$
1729
SELECT util.schema(pg_typeof($1))
1730
$_$;
1731
1732
1733
--
1734 10795 aaronmk
-- Name: schema_ident(anyelement); Type: FUNCTION; Schema: util; Owner: -
1735
--
1736
1737
CREATE FUNCTION schema_ident(type_null anyelement) RETURNS text
1738
    LANGUAGE sql STABLE
1739
    AS $_$
1740
SELECT quote_ident(util.schema($1))
1741
$_$;
1742
1743
1744
--
1745 9825 aaronmk
-- Name: search_path_append(text); Type: FUNCTION; Schema: util; Owner: -
1746
--
1747
1748
CREATE FUNCTION search_path_append(schemas text) RETURNS void
1749
    LANGUAGE sql STRICT
1750
    AS $_$
1751
SELECT util.eval(
1752
$$SET search_path TO $$||current_setting('search_path')||$$, $$||$1);
1753
$_$;
1754
1755
1756
--
1757 8183 aaronmk
-- Name: set_col_names(regclass, regclass); Type: FUNCTION; Schema: util; Owner: -
1758 8153 aaronmk
--
1759
1760
CREATE FUNCTION set_col_names(table_ regclass, names regclass) RETURNS void
1761
    LANGUAGE plpgsql STRICT
1762
    AS $_$
1763
DECLARE
1764 8183 aaronmk
    old text[] = ARRAY(SELECT util.col_names(table_));
1765
    new text[] = ARRAY(SELECT util.map_values(names));
1766 8153 aaronmk
BEGIN
1767
    old = old[1:array_length(new, 1)]; -- truncate to same length
1768 10345 aaronmk
    PERFORM util.eval($$ALTER TABLE $$||$1||$$ RENAME $$||quote_ident(key)
1769
||$$ TO $$||quote_ident(value))
1770 10149 aaronmk
    FROM each(hstore(old, new))
1771
    WHERE value != key -- not same name
1772
    ;
1773 8153 aaronmk
END;
1774
$_$;
1775
1776
1777
--
1778 8183 aaronmk
-- Name: FUNCTION set_col_names(table_ regclass, names regclass); Type: COMMENT; Schema: util; Owner: -
1779 8153 aaronmk
--
1780
1781
COMMENT ON FUNCTION set_col_names(table_ regclass, names regclass) IS 'idempotent';
1782
1783
1784
--
1785 10145 aaronmk
-- Name: set_col_names_with_metadata(regclass, regclass); Type: FUNCTION; Schema: util; Owner: -
1786
--
1787
1788
CREATE FUNCTION set_col_names_with_metadata(table_ regclass, names regclass) RETURNS void
1789
    LANGUAGE plpgsql STRICT
1790
    AS $_$
1791
DECLARE
1792
	row_ util.map;
1793
BEGIN
1794 10715 aaronmk
	-- rename any metadata cols rather than re-adding them with new names
1795
	BEGIN
1796
		PERFORM util.set_col_names(table_, names);
1797
	EXCEPTION
1798
		WHEN array_subscript_error THEN -- selective suppress
1799
			IF SQLERRM LIKE 'arrays must have same bounds' THEN NULL;
1800
				-- metadata cols not yet added
1801
			ELSE RAISE USING ERRCODE = SQLSTATE, MESSAGE = SQLERRM; -- rethrow
1802
			END IF;
1803
	END;
1804
1805 10157 aaronmk
	FOR row_ IN EXECUTE $$SELECT * FROM $$||names||$$ WHERE "from" LIKE ':%'$$
1806 10145 aaronmk
	LOOP
1807 10147 aaronmk
		PERFORM util.mk_const_col((table_, row_."to"),
1808
			substring(row_."from" from 2));
1809 10145 aaronmk
	END LOOP;
1810
1811
	PERFORM util.set_col_names(table_, names);
1812
END;
1813
$_$;
1814
1815
1816
--
1817
-- Name: FUNCTION set_col_names_with_metadata(table_ regclass, names regclass); Type: COMMENT; Schema: util; Owner: -
1818
--
1819
1820
COMMENT ON FUNCTION set_col_names_with_metadata(table_ regclass, names regclass) IS 'idempotent.
1821 10157 aaronmk
the metadata mappings must be *last* in the names table.';
1822 10145 aaronmk
1823
1824
--
1825 8183 aaronmk
-- Name: set_col_types(regclass, col_cast[]); Type: FUNCTION; Schema: util; Owner: -
1826 8107 aaronmk
--
1827
1828
CREATE FUNCTION set_col_types(table_ regclass, col_casts col_cast[]) RETURNS void
1829
    LANGUAGE plpgsql STRICT
1830
    AS $_$
1831
DECLARE
1832
    sql text = $$ALTER TABLE $$||table_||$$
1833
$$||NULLIF(array_to_string(ARRAY(
1834
    SELECT
1835
    $$ALTER COLUMN $$||col_name_sql||$$ TYPE $$||target_type
1836
    ||$$ USING $$||col_name_sql||$$::$$||target_type
1837
    FROM
1838
    (
1839
        SELECT
1840
          quote_ident(col_name) AS col_name_sql
1841 8183 aaronmk
        , util.col_type((table_, col_name)) AS curr_type
1842 8107 aaronmk
        , type AS target_type
1843
        FROM unnest(col_casts)
1844
    ) s
1845
    WHERE curr_type != target_type
1846
), '
1847
, '), '');
1848
BEGIN
1849
    RAISE NOTICE '%', sql;
1850
    EXECUTE COALESCE(sql, '');
1851
END;
1852
$_$;
1853
1854
1855
--
1856 8183 aaronmk
-- Name: FUNCTION set_col_types(table_ regclass, col_casts col_cast[]); Type: COMMENT; Schema: util; Owner: -
1857 8107 aaronmk
--
1858
1859
COMMENT ON FUNCTION set_col_types(table_ regclass, col_casts col_cast[]) IS 'idempotent';
1860
1861
1862
--
1863 11651 aaronmk
-- Name: show_create_view(regclass); Type: FUNCTION; Schema: util; Owner: -
1864
--
1865
1866
CREATE FUNCTION show_create_view(view_ regclass) RETURNS text
1867
    LANGUAGE sql STABLE
1868
    AS $_$
1869 11656 aaronmk
SELECT $$CREATE OR REPLACE VIEW $$||$1||$$ AS $$||pg_get_viewdef($1)||$$;
1870
$$||util.show_grants_for($1)
1871 11651 aaronmk
$_$;
1872
1873
1874
--
1875 11655 aaronmk
-- Name: show_grants_for(regclass); Type: FUNCTION; Schema: util; Owner: -
1876
--
1877
1878
CREATE FUNCTION show_grants_for(table_ regclass) RETURNS text
1879
    LANGUAGE sql STABLE
1880
    AS $_$
1881
SELECT concat(cmd)
1882
FROM
1883
(
1884
	SELECT (CASE WHEN has_table_privilege(user_, $1, 'SELECT') THEN
1885
$$GRANT SELECT ON TABLE $$||$1||$$ TO $$||quote_ident(user_)||$$;
1886
$$ ELSE '' END) AS cmd
1887
	FROM util.grants_users() f (user_)
1888
) s
1889
$_$;
1890
1891
1892
--
1893 8183 aaronmk
-- Name: table2hstore(regclass); Type: FUNCTION; Schema: util; Owner: -
1894 8144 aaronmk
--
1895
1896
CREATE FUNCTION table2hstore(table_ regclass) RETURNS hstore
1897 8145 aaronmk
    LANGUAGE plpgsql STABLE STRICT
1898 8144 aaronmk
    AS $_$
1899
DECLARE
1900
    hstore hstore;
1901
BEGIN
1902
    EXECUTE $$SELECT hstore(ARRAY(SELECT unnest(ARRAY["from", "to"]) FROM $$||
1903
        table_||$$))$$ INTO STRICT hstore;
1904
    RETURN hstore;
1905
END;
1906
$_$;
1907
1908
1909
--
1910 10184 aaronmk
-- Name: table_flag__get(regclass, text); Type: FUNCTION; Schema: util; Owner: -
1911
--
1912
1913
CREATE FUNCTION table_flag__get(table_ regclass, flag text) RETURNS boolean
1914
    LANGUAGE sql STABLE STRICT
1915
    AS $_$
1916
SELECT COUNT(*) > 0 FROM pg_constraint
1917
WHERE conrelid = $1 AND contype = 'c' AND conname = $2
1918
$_$;
1919
1920
1921
--
1922
-- Name: FUNCTION table_flag__get(table_ regclass, flag text); Type: COMMENT; Schema: util; Owner: -
1923
--
1924
1925
COMMENT ON FUNCTION table_flag__get(table_ regclass, flag text) IS 'gets whether a status flag is set by the presence of a table constraint';
1926
1927
1928
--
1929 10182 aaronmk
-- Name: table_flag__set(regclass, text); Type: FUNCTION; Schema: util; Owner: -
1930
--
1931
1932
CREATE FUNCTION table_flag__set(table_ regclass, flag text) RETURNS void
1933
    LANGUAGE sql STRICT
1934
    AS $_$
1935
SELECT util.create_if_not_exists($$ALTER TABLE $$||$1||$$ ADD CONSTRAINT $$
1936
||quote_ident($2)||$$ CHECK (true)$$)
1937
$_$;
1938
1939
1940
--
1941
-- Name: FUNCTION table_flag__set(table_ regclass, flag text); Type: COMMENT; Schema: util; Owner: -
1942
--
1943
1944
COMMENT ON FUNCTION table_flag__set(table_ regclass, flag text) IS 'stores a status flag by the presence of a table constraint.
1945
idempotent.';
1946
1947
1948
--
1949 10185 aaronmk
-- Name: table_nulls_mapped__get(regclass); Type: FUNCTION; Schema: util; Owner: -
1950
--
1951
1952
CREATE FUNCTION table_nulls_mapped__get(table_ regclass) RETURNS boolean
1953
    LANGUAGE sql STABLE STRICT
1954
    AS $_$
1955
SELECT util.table_flag__get($1, 'nulls_mapped')
1956
$_$;
1957
1958
1959
--
1960
-- Name: FUNCTION table_nulls_mapped__get(table_ regclass); Type: COMMENT; Schema: util; Owner: -
1961
--
1962
1963
COMMENT ON FUNCTION table_nulls_mapped__get(table_ regclass) IS 'gets whether a table''s NULL-equivalent strings have been replaced with NULL';
1964
1965
1966
--
1967 10183 aaronmk
-- Name: table_nulls_mapped__set(regclass); Type: FUNCTION; Schema: util; Owner: -
1968
--
1969
1970
CREATE FUNCTION table_nulls_mapped__set(table_ regclass) RETURNS void
1971
    LANGUAGE sql STRICT
1972
    AS $_$
1973
SELECT util.table_flag__set($1, 'nulls_mapped')
1974
$_$;
1975
1976
1977
--
1978
-- Name: FUNCTION table_nulls_mapped__set(table_ regclass); Type: COMMENT; Schema: util; Owner: -
1979
--
1980
1981
COMMENT ON FUNCTION table_nulls_mapped__set(table_ regclass) IS 'sets that a table''s NULL-equivalent strings have been replaced with NULL.
1982
idempotent.';
1983
1984
1985
--
1986 10112 aaronmk
-- Name: table_schema(regclass); Type: FUNCTION; Schema: util; Owner: -
1987
--
1988
1989
CREATE FUNCTION table_schema(table_ regclass) RETURNS text
1990
    LANGUAGE sql STABLE STRICT
1991
    AS $_$
1992
SELECT nspname::text FROM pg_namespace WHERE oid = (SELECT relnamespace FROM pg_class WHERE oid = $1)
1993
$_$;
1994
1995
1996
--
1997 8183 aaronmk
-- Name: to_global_col_names(regclass); Type: FUNCTION; Schema: util; Owner: -
1998 8088 aaronmk
--
1999
2000
CREATE FUNCTION to_global_col_names(table_ regclass) RETURNS void
2001
    LANGUAGE plpgsql STRICT
2002
    AS $_$
2003
DECLARE
2004
    row record;
2005
BEGIN
2006 8183 aaronmk
    FOR row IN SELECT * FROM util.col_global_names(table_::text::regtype)
2007 8088 aaronmk
    LOOP
2008
        IF row.global_name != row.name THEN
2009
            EXECUTE $$ALTER TABLE $$||table_||$$ RENAME $$
2010
                ||quote_ident(row.name)||$$ TO $$||quote_ident(row.global_name);
2011
        END IF;
2012
    END LOOP;
2013
END;
2014
$_$;
2015
2016
2017
--
2018 8183 aaronmk
-- Name: FUNCTION to_global_col_names(table_ regclass); Type: COMMENT; Schema: util; Owner: -
2019 8088 aaronmk
--
2020
2021
COMMENT ON FUNCTION to_global_col_names(table_ regclass) IS 'idempotent';
2022
2023
2024
--
2025 10365 aaronmk
-- Name: trim(regclass, regclass); Type: FUNCTION; Schema: util; Owner: -
2026
--
2027
2028
CREATE FUNCTION "trim"(table_ regclass, names regclass) RETURNS void
2029
    LANGUAGE sql STRICT
2030
    AS $_$
2031 10595 aaronmk
SELECT util.drop_column(($1, col)) FROM util.added_cols($1, $2) f (col);
2032 10365 aaronmk
SELECT NULL::void; -- don't fold away functions called in previous query
2033
$_$;
2034
2035
2036
--
2037
-- Name: FUNCTION "trim"(table_ regclass, names regclass); Type: COMMENT; Schema: util; Owner: -
2038
--
2039
2040 10595 aaronmk
COMMENT ON FUNCTION "trim"(table_ regclass, names regclass) IS 'trims table_ to include only columns in the original data.
2041 10365 aaronmk
idempotent.';
2042
2043
2044
--
2045 8183 aaronmk
-- Name: truncate(regclass); Type: FUNCTION; Schema: util; Owner: -
2046 8142 aaronmk
--
2047
2048
CREATE FUNCTION truncate(table_ regclass) RETURNS void
2049
    LANGUAGE plpgsql STRICT
2050
    AS $_$
2051
BEGIN
2052
    EXECUTE $$TRUNCATE $$||table_||$$ CASCADE$$;
2053
END;
2054
$_$;
2055
2056
2057
--
2058 8183 aaronmk
-- Name: FUNCTION truncate(table_ regclass); Type: COMMENT; Schema: util; Owner: -
2059 8142 aaronmk
--
2060
2061
COMMENT ON FUNCTION truncate(table_ regclass) IS 'idempotent';
2062
2063
2064
--
2065 8199 aaronmk
-- Name: try_create(text); Type: FUNCTION; Schema: util; Owner: -
2066
--
2067
2068
CREATE FUNCTION try_create(sql text) RETURNS void
2069
    LANGUAGE plpgsql STRICT
2070
    AS $$
2071
BEGIN
2072 10146 aaronmk
    PERFORM util.eval(sql);
2073 8199 aaronmk
EXCEPTION
2074 10071 aaronmk
    WHEN wrong_object_type THEN NULL; -- trying to alter a view's columns
2075 8199 aaronmk
    WHEN undefined_column THEN NULL;
2076
    WHEN duplicate_column THEN NULL;
2077
END;
2078
$$;
2079
2080
2081
--
2082
-- Name: FUNCTION try_create(sql text); Type: COMMENT; Schema: util; Owner: -
2083
--
2084
2085
COMMENT ON FUNCTION try_create(sql text) IS 'idempotent';
2086
2087
2088
--
2089 8209 aaronmk
-- Name: try_mk_derived_col(col_ref, text); Type: FUNCTION; Schema: util; Owner: -
2090
--
2091
2092
CREATE FUNCTION try_mk_derived_col(col col_ref, expr text) RETURNS void
2093
    LANGUAGE sql STRICT
2094
    AS $_$
2095
SELECT util.try_create($$SELECT util.mk_derived_col($$||quote_literal($1)||$$, $$||quote_literal($2)||$$)$$)
2096
$_$;
2097
2098
2099
--
2100
-- Name: FUNCTION try_mk_derived_col(col col_ref, expr text); Type: COMMENT; Schema: util; Owner: -
2101
--
2102
2103
COMMENT ON FUNCTION try_mk_derived_col(col col_ref, expr text) IS 'idempotent';
2104
2105
2106
--
2107 8189 aaronmk
-- Name: type_qual(anyelement); Type: FUNCTION; Schema: util; Owner: -
2108
--
2109
2110
CREATE FUNCTION type_qual(value anyelement) RETURNS text
2111
    LANGUAGE sql IMMUTABLE
2112
    AS $_$
2113
SELECT CASE WHEN $1 IS NULL THEN '' ELSE $$ NOT NULL$$ END
2114
$_$;
2115
2116
2117
--
2118 10161 aaronmk
-- Name: FUNCTION type_qual(value anyelement); Type: COMMENT; Schema: util; Owner: -
2119
--
2120
2121
COMMENT ON FUNCTION type_qual(value anyelement) IS 'a type''s NOT NULL qualifier';
2122
2123
2124
--
2125 8324 aaronmk
-- Name: type_qual_name(regtype); Type: FUNCTION; Schema: util; Owner: -
2126
--
2127
2128
CREATE FUNCTION type_qual_name(type regtype) RETURNS text
2129
    LANGUAGE sql STABLE STRICT
2130
    SET search_path TO pg_temp
2131
    AS $_$
2132
SELECT $1::text
2133
$_$;
2134
2135
2136
--
2137 10161 aaronmk
-- Name: FUNCTION type_qual_name(type regtype); Type: COMMENT; Schema: util; Owner: -
2138
--
2139
2140
COMMENT ON FUNCTION type_qual_name(type regtype) IS 'a type''s schema-qualified name';
2141
2142
2143
--
2144 8185 aaronmk
-- Name: typeof(text, regtype); Type: FUNCTION; Schema: util; Owner: -
2145
--
2146
2147 10160 aaronmk
CREATE FUNCTION typeof(expr text, table_ regtype DEFAULT NULL::regtype) RETURNS regtype
2148
    LANGUAGE plpgsql STABLE
2149 8185 aaronmk
    AS $_$
2150
DECLARE
2151
    type regtype;
2152
BEGIN
2153 10160 aaronmk
    EXECUTE $$SELECT pg_typeof($$||expr||$$)$$||
2154
COALESCE($$ FROM (SELECT (NULL::$$||table_||$$).*) _s$$, '') INTO STRICT type;
2155 8185 aaronmk
    RETURN type;
2156
END;
2157
$_$;
2158
2159
2160
--
2161 9959 aaronmk
-- Name: all_same(anyelement); Type: AGGREGATE; Schema: util; Owner: -
2162
--
2163
2164
CREATE AGGREGATE all_same(anyelement) (
2165
    SFUNC = all_same_transform,
2166
    STYPE = anyarray,
2167
    FINALFUNC = all_same_final
2168
);
2169
2170
2171
--
2172
-- Name: AGGREGATE all_same(anyelement); Type: COMMENT; Schema: util; Owner: -
2173
--
2174
2175
COMMENT ON AGGREGATE all_same(anyelement) IS 'includes NULLs in comparison';
2176
2177
2178
--
2179 8183 aaronmk
-- Name: join_strs(text, text); Type: AGGREGATE; Schema: util; Owner: -
2180 2595 aaronmk
--
2181
2182
CREATE AGGREGATE join_strs(text, text) (
2183 4052 aaronmk
    SFUNC = join_strs_transform,
2184 4010 aaronmk
    STYPE = text
2185 2595 aaronmk
);
2186
2187
2188 8147 aaronmk
--
2189 8183 aaronmk
-- Name: ->; Type: OPERATOR; Schema: util; Owner: -
2190 8147 aaronmk
--
2191
2192
CREATE OPERATOR -> (
2193
    PROCEDURE = map_get,
2194
    LEFTARG = regclass,
2195
    RIGHTARG = text
2196
);
2197
2198
2199 10308 aaronmk
--
2200
-- Name: =>; Type: OPERATOR; Schema: util; Owner: -
2201
--
2202
2203
CREATE OPERATOR => (
2204
    PROCEDURE = hstore,
2205 10357 aaronmk
    LEFTARG = text[],
2206 10608 aaronmk
    RIGHTARG = text
2207 10308 aaronmk
);
2208
2209
2210
--
2211 10608 aaronmk
-- Name: OPERATOR => (text[], text); Type: COMMENT; Schema: util; Owner: -
2212 10308 aaronmk
--
2213
2214 10608 aaronmk
COMMENT ON OPERATOR => (text[], text) IS 'usage: array[''key1'', ...]::text[] => ''value''';
2215 10308 aaronmk
2216
2217 10391 aaronmk
--
2218 10613 aaronmk
-- Name: ?*>=; Type: OPERATOR; Schema: util; Owner: -
2219
--
2220
2221
CREATE OPERATOR ?*>= (
2222
    PROCEDURE = is_populated_more_often_than,
2223
    LEFTARG = anyelement,
2224
    RIGHTARG = anyelement
2225
);
2226
2227
2228
--
2229 10391 aaronmk
-- Name: ?>=; Type: OPERATOR; Schema: util; Owner: -
2230
--
2231
2232
CREATE OPERATOR ?>= (
2233
    PROCEDURE = is_more_complete_than,
2234
    LEFTARG = anyelement,
2235
    RIGHTARG = anyelement
2236
);
2237
2238
2239 11005 aaronmk
--
2240
-- Name: ||%; Type: OPERATOR; Schema: util; Owner: -
2241
--
2242
2243
CREATE OPERATOR ||% (
2244
    PROCEDURE = concat_esc,
2245
    LEFTARG = text,
2246
    RIGHTARG = text
2247
);
2248
2249
2250
--
2251
-- Name: OPERATOR ||% (text, text); Type: COMMENT; Schema: util; Owner: -
2252
--
2253
2254
COMMENT ON OPERATOR ||% (text, text) IS '% indicates an identifier, as in Perl hashes and one of the x86 assembler syntaxes for registers';
2255
2256
2257 8140 aaronmk
SET default_tablespace = '';
2258
2259
SET default_with_oids = false;
2260
2261 2107 aaronmk
--
2262 8183 aaronmk
-- Name: map; Type: TABLE; Schema: util; Owner: -; Tablespace:
2263 8140 aaronmk
--
2264
2265
CREATE TABLE map (
2266
    "from" text NOT NULL,
2267 8158 aaronmk
    "to" text,
2268
    filter text,
2269
    notes text
2270 8140 aaronmk
);
2271
2272
2273
--
2274 8183 aaronmk
-- Data for Name: map; Type: TABLE DATA; Schema: util; Owner: -
2275 8140 aaronmk
--
2276
2277
2278
2279
--
2280 10342 aaronmk
-- Name: map__unique__from; Type: CONSTRAINT; Schema: util; Owner: -; Tablespace:
2281 8140 aaronmk
--
2282
2283
ALTER TABLE ONLY map
2284 10342 aaronmk
    ADD CONSTRAINT map__unique__from UNIQUE ("from");
2285 8140 aaronmk
2286
2287
--
2288 10343 aaronmk
-- Name: map__unique__to; Type: CONSTRAINT; Schema: util; Owner: -; Tablespace:
2289
--
2290
2291
ALTER TABLE ONLY map
2292
    ADD CONSTRAINT map__unique__to UNIQUE ("to");
2293
2294
2295
--
2296 10110 aaronmk
-- Name: map_filter_insert; Type: TRIGGER; Schema: util; Owner: -
2297
--
2298
2299
CREATE TRIGGER map_filter_insert BEFORE INSERT ON map FOR EACH ROW EXECUTE PROCEDURE map_filter_insert();
2300
2301
2302
--
2303 2136 aaronmk
-- PostgreSQL database dump complete
2304
--