@oliphaunt/extension-pgtap-linux-arm64-gnu 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +6 -0
- package/THIRD_PARTY_NOTICES.md +20 -0
- package/extension-contract.json +31 -0
- package/package.json +49 -0
- package/runtime/share/licenses/pgtap/README.md +153 -0
- package/runtime/share/postgresql/extension/pgtap--0.90.0--0.91.0.sql +29 -0
- package/runtime/share/postgresql/extension/pgtap--0.91.0--0.92.0.sql +1650 -0
- package/runtime/share/postgresql/extension/pgtap--0.92.0--0.93.0.sql +679 -0
- package/runtime/share/postgresql/extension/pgtap--0.93.0--0.94.0.sql +193 -0
- package/runtime/share/postgresql/extension/pgtap--0.94.0--0.95.0.sql +639 -0
- package/runtime/share/postgresql/extension/pgtap--0.95.0--0.96.0.sql +415 -0
- package/runtime/share/postgresql/extension/pgtap--0.96.0--0.97.0.sql +375 -0
- package/runtime/share/postgresql/extension/pgtap--0.97.0--0.98.0.sql +441 -0
- package/runtime/share/postgresql/extension/pgtap--0.98.0--0.99.0.sql +209 -0
- package/runtime/share/postgresql/extension/pgtap--0.99.0--1.0.0.sql +737 -0
- package/runtime/share/postgresql/extension/pgtap--1.0.0--1.1.0.sql +186 -0
- package/runtime/share/postgresql/extension/pgtap--1.1.0--1.2.0.sql +889 -0
- package/runtime/share/postgresql/extension/pgtap--1.2.0--1.3.0.sql +495 -0
- package/runtime/share/postgresql/extension/pgtap--1.3.0--1.3.1.sql +229 -0
- package/runtime/share/postgresql/extension/pgtap--1.3.1--1.3.2.sql +34 -0
- package/runtime/share/postgresql/extension/pgtap--1.3.2--1.3.3.sql +42 -0
- package/runtime/share/postgresql/extension/pgtap--1.3.3--1.3.4.sql +89 -0
- package/runtime/share/postgresql/extension/pgtap--1.3.4--1.3.5.sql +1 -0
- package/runtime/share/postgresql/extension/pgtap--1.3.5.sql +11520 -0
- package/runtime/share/postgresql/extension/pgtap--unpackaged--0.91.0.sql +714 -0
- package/runtime/share/postgresql/extension/pgtap-core--1.3.5.sql +4390 -0
- package/runtime/share/postgresql/extension/pgtap-core.sql +4390 -0
- package/runtime/share/postgresql/extension/pgtap-schema--1.3.5.sql +6764 -0
- package/runtime/share/postgresql/extension/pgtap-schema.sql +6764 -0
- package/runtime/share/postgresql/extension/pgtap.control +6 -0
- package/runtime/share/postgresql/extension/pgtap.sql +11520 -0
- package/runtime/share/postgresql/extension/uninstall_pgtap.sql +1088 -0
- package/share/licenses/pgtap/README.md +153 -0
|
@@ -0,0 +1,679 @@
|
|
|
1
|
+
CREATE OR REPLACE FUNCTION pgtap_version()
|
|
2
|
+
RETURNS NUMERIC AS 'SELECT 0.93;'
|
|
3
|
+
LANGUAGE SQL IMMUTABLE;
|
|
4
|
+
|
|
5
|
+
-- _get_schema_owner( schema )
|
|
6
|
+
CREATE OR REPLACE FUNCTION _get_schema_owner( NAME )
|
|
7
|
+
RETURNS NAME AS $$
|
|
8
|
+
SELECT pg_catalog.pg_get_userbyid(nspowner)
|
|
9
|
+
FROM pg_catalog.pg_namespace
|
|
10
|
+
WHERE nspname = $1;
|
|
11
|
+
$$ LANGUAGE SQL;
|
|
12
|
+
|
|
13
|
+
-- schema_owner_is ( schema, user, description )
|
|
14
|
+
CREATE OR REPLACE FUNCTION schema_owner_is ( NAME, NAME, TEXT )
|
|
15
|
+
RETURNS TEXT AS $$
|
|
16
|
+
DECLARE
|
|
17
|
+
owner NAME := _get_schema_owner($1);
|
|
18
|
+
BEGIN
|
|
19
|
+
-- Make sure the schema exists.
|
|
20
|
+
IF owner IS NULL THEN
|
|
21
|
+
RETURN ok(FALSE, $3) || E'\n' || diag(
|
|
22
|
+
E' Schema ' || quote_ident($1) || ' does not exist'
|
|
23
|
+
);
|
|
24
|
+
END IF;
|
|
25
|
+
|
|
26
|
+
RETURN is(owner, $2, $3);
|
|
27
|
+
END;
|
|
28
|
+
$$ LANGUAGE plpgsql;
|
|
29
|
+
|
|
30
|
+
-- schema_owner_is ( schema, user )
|
|
31
|
+
CREATE OR REPLACE FUNCTION schema_owner_is ( NAME, NAME )
|
|
32
|
+
RETURNS TEXT AS $$
|
|
33
|
+
SELECT schema_owner_is(
|
|
34
|
+
$1, $2,
|
|
35
|
+
'Schema ' || quote_ident($1) || ' should be owned by ' || quote_ident($2)
|
|
36
|
+
);
|
|
37
|
+
$$ LANGUAGE sql;
|
|
38
|
+
|
|
39
|
+
CREATE OR REPLACE FUNCTION _constraint ( NAME, NAME, CHAR, NAME[], TEXT, TEXT )
|
|
40
|
+
RETURNS TEXT AS $$
|
|
41
|
+
DECLARE
|
|
42
|
+
akey NAME[];
|
|
43
|
+
keys TEXT[] := '{}';
|
|
44
|
+
have TEXT;
|
|
45
|
+
BEGIN
|
|
46
|
+
FOR akey IN SELECT * FROM _keys($1, $2, $3) LOOP
|
|
47
|
+
IF akey = $4 THEN RETURN pass($5); END IF;
|
|
48
|
+
keys = keys || akey::text;
|
|
49
|
+
END LOOP;
|
|
50
|
+
IF array_upper(keys, 0) = 1 THEN
|
|
51
|
+
have := 'No ' || $6 || ' constraints';
|
|
52
|
+
ELSE
|
|
53
|
+
have := array_to_string(keys, E'\n ');
|
|
54
|
+
END IF;
|
|
55
|
+
|
|
56
|
+
RETURN fail($5) || E'\n' || diag(
|
|
57
|
+
' have: ' || have
|
|
58
|
+
|| E'\n want: ' || CASE WHEN $4 IS NULL THEN 'NULL' ELSE $4::text END
|
|
59
|
+
);
|
|
60
|
+
END;
|
|
61
|
+
$$ LANGUAGE plpgsql;
|
|
62
|
+
|
|
63
|
+
CREATE OR REPLACE FUNCTION _constraint ( NAME, CHAR, NAME[], TEXT, TEXT )
|
|
64
|
+
RETURNS TEXT AS $$
|
|
65
|
+
DECLARE
|
|
66
|
+
akey NAME[];
|
|
67
|
+
keys TEXT[] := '{}';
|
|
68
|
+
have TEXT;
|
|
69
|
+
BEGIN
|
|
70
|
+
FOR akey IN SELECT * FROM _keys($1, $2) LOOP
|
|
71
|
+
IF akey = $3 THEN RETURN pass($4); END IF;
|
|
72
|
+
keys = keys || akey::text;
|
|
73
|
+
END LOOP;
|
|
74
|
+
IF array_upper(keys, 0) = 1 THEN
|
|
75
|
+
have := 'No ' || $5 || ' constraints';
|
|
76
|
+
ELSE
|
|
77
|
+
have := array_to_string(keys, E'\n ');
|
|
78
|
+
END IF;
|
|
79
|
+
|
|
80
|
+
RETURN fail($4) || E'\n' || diag(
|
|
81
|
+
' have: ' || have
|
|
82
|
+
|| E'\n want: ' || CASE WHEN $3 IS NULL THEN 'NULL' ELSE $3::text END
|
|
83
|
+
);
|
|
84
|
+
END;
|
|
85
|
+
$$ LANGUAGE plpgsql;
|
|
86
|
+
|
|
87
|
+
-- fk_ok( fk_table, fk_column[], pk_table, pk_column[], description )
|
|
88
|
+
CREATE OR REPLACE FUNCTION fk_ok ( NAME, NAME[], NAME, NAME[], TEXT )
|
|
89
|
+
RETURNS TEXT AS $$
|
|
90
|
+
DECLARE
|
|
91
|
+
tab name;
|
|
92
|
+
cols name[];
|
|
93
|
+
BEGIN
|
|
94
|
+
SELECT pk_table_name, pk_columns
|
|
95
|
+
FROM pg_all_foreign_keys
|
|
96
|
+
WHERE fk_table_name = $1
|
|
97
|
+
AND fk_columns = $2
|
|
98
|
+
AND pg_catalog.pg_table_is_visible(fk_table_oid)
|
|
99
|
+
INTO tab, cols;
|
|
100
|
+
|
|
101
|
+
RETURN is(
|
|
102
|
+
-- have
|
|
103
|
+
$1 || '(' || _ident_array_to_string( $2, ', ' )
|
|
104
|
+
|| ') REFERENCES ' || COALESCE( tab || '(' || _ident_array_to_string( cols, ', ' ) || ')', 'NOTHING'),
|
|
105
|
+
-- want
|
|
106
|
+
$1 || '(' || _ident_array_to_string( $2, ', ' )
|
|
107
|
+
|| ') REFERENCES ' ||
|
|
108
|
+
$3 || '(' || _ident_array_to_string( $4, ', ' ) || ')',
|
|
109
|
+
$5
|
|
110
|
+
);
|
|
111
|
+
END;
|
|
112
|
+
$$ LANGUAGE plpgsql;
|
|
113
|
+
|
|
114
|
+
-- _keys( table, constraint_type )
|
|
115
|
+
CREATE OR REPLACE FUNCTION _keys ( NAME, CHAR )
|
|
116
|
+
RETURNS SETOF NAME[] AS $$
|
|
117
|
+
SELECT _pg_sv_column_array(x.conrelid,x.conkey)
|
|
118
|
+
FROM pg_catalog.pg_class c
|
|
119
|
+
JOIN pg_catalog.pg_constraint x ON c.oid = x.conrelid
|
|
120
|
+
AND c.relname = $1
|
|
121
|
+
AND x.contype = $2
|
|
122
|
+
WHERE pg_catalog.pg_table_is_visible(c.oid)
|
|
123
|
+
$$ LANGUAGE sql;
|
|
124
|
+
|
|
125
|
+
CREATE OR REPLACE FUNCTION _trig ( NAME, NAME )
|
|
126
|
+
RETURNS BOOLEAN AS $$
|
|
127
|
+
SELECT EXISTS(
|
|
128
|
+
SELECT true
|
|
129
|
+
FROM pg_catalog.pg_trigger t
|
|
130
|
+
JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid
|
|
131
|
+
WHERE c.relname = $1
|
|
132
|
+
AND t.tgname = $2
|
|
133
|
+
AND pg_catalog.pg_table_is_visible(c.oid)
|
|
134
|
+
);
|
|
135
|
+
$$ LANGUAGE SQL;
|
|
136
|
+
|
|
137
|
+
CREATE OR REPLACE FUNCTION _fkexists ( NAME, NAME[] )
|
|
138
|
+
RETURNS BOOLEAN AS $$
|
|
139
|
+
SELECT EXISTS(
|
|
140
|
+
SELECT TRUE
|
|
141
|
+
FROM pg_all_foreign_keys
|
|
142
|
+
WHERE quote_ident(fk_table_name) = quote_ident($1)
|
|
143
|
+
AND pg_catalog.pg_table_is_visible(fk_table_oid)
|
|
144
|
+
AND fk_columns = $2
|
|
145
|
+
);
|
|
146
|
+
$$ LANGUAGE SQL;
|
|
147
|
+
|
|
148
|
+
DROP FUNCTION display_type ( OID, INTEGER );
|
|
149
|
+
DROP FUNCTION display_type ( NAME, OID, INTEGER );
|
|
150
|
+
|
|
151
|
+
CREATE OR REPLACE FUNCTION _get_col_type ( NAME, NAME, NAME )
|
|
152
|
+
RETURNS TEXT AS $$
|
|
153
|
+
SELECT pg_catalog.format_type(a.atttypid, a.atttypmod)
|
|
154
|
+
FROM pg_catalog.pg_namespace n
|
|
155
|
+
JOIN pg_catalog.pg_class c ON n.oid = c.relnamespace
|
|
156
|
+
JOIN pg_catalog.pg_attribute a ON c.oid = a.attrelid
|
|
157
|
+
WHERE n.nspname = $1
|
|
158
|
+
AND c.relname = $2
|
|
159
|
+
AND a.attname = $3
|
|
160
|
+
AND attnum > 0
|
|
161
|
+
AND NOT a.attisdropped
|
|
162
|
+
$$ LANGUAGE SQL;
|
|
163
|
+
|
|
164
|
+
CREATE OR REPLACE FUNCTION _get_col_type ( NAME, NAME )
|
|
165
|
+
RETURNS TEXT AS $$
|
|
166
|
+
SELECT pg_catalog.format_type(a.atttypid, a.atttypmod)
|
|
167
|
+
FROM pg_catalog.pg_attribute a
|
|
168
|
+
JOIN pg_catalog.pg_class c ON a.attrelid = c.oid
|
|
169
|
+
WHERE pg_catalog.pg_table_is_visible(c.oid)
|
|
170
|
+
AND c.relname = $1
|
|
171
|
+
AND a.attname = $2
|
|
172
|
+
AND attnum > 0
|
|
173
|
+
AND NOT a.attisdropped
|
|
174
|
+
$$ LANGUAGE SQL;
|
|
175
|
+
|
|
176
|
+
CREATE OR REPLACE FUNCTION _get_col_ns_type ( NAME, NAME, NAME )
|
|
177
|
+
RETURNS TEXT AS $$
|
|
178
|
+
-- Always include the namespace.
|
|
179
|
+
SELECT CASE WHEN pg_catalog.pg_type_is_visible(t.oid)
|
|
180
|
+
THEN quote_ident(tn.nspname) || '.'
|
|
181
|
+
ELSE ''
|
|
182
|
+
END || pg_catalog.format_type(a.atttypid, a.atttypmod)
|
|
183
|
+
FROM pg_catalog.pg_namespace n
|
|
184
|
+
JOIN pg_catalog.pg_class c ON n.oid = c.relnamespace
|
|
185
|
+
JOIN pg_catalog.pg_attribute a ON c.oid = a.attrelid
|
|
186
|
+
JOIN pg_catalog.pg_type t ON a.atttypid = t.oid
|
|
187
|
+
JOIN pg_catalog.pg_namespace tn ON t.typnamespace = tn.oid
|
|
188
|
+
WHERE n.nspname = $1
|
|
189
|
+
AND c.relname = $2
|
|
190
|
+
AND a.attname = $3
|
|
191
|
+
AND attnum > 0
|
|
192
|
+
AND NOT a.attisdropped
|
|
193
|
+
$$ LANGUAGE SQL;
|
|
194
|
+
|
|
195
|
+
-- _cdi( schema, table, column, default, description )
|
|
196
|
+
CREATE OR REPLACE FUNCTION _cdi ( NAME, NAME, NAME, anyelement, TEXT )
|
|
197
|
+
RETURNS TEXT AS $$
|
|
198
|
+
BEGIN
|
|
199
|
+
IF NOT _cexists( $1, $2, $3 ) THEN
|
|
200
|
+
RETURN fail( $5 ) || E'\n'
|
|
201
|
+
|| diag (' Column ' || quote_ident($1) || '.' || quote_ident($2) || '.' || quote_ident($3) || ' does not exist' );
|
|
202
|
+
END IF;
|
|
203
|
+
|
|
204
|
+
IF NOT _has_def( $1, $2, $3 ) THEN
|
|
205
|
+
RETURN fail( $5 ) || E'\n'
|
|
206
|
+
|| diag (' Column ' || quote_ident($1) || '.' || quote_ident($2) || '.' || quote_ident($3) || ' has no default' );
|
|
207
|
+
END IF;
|
|
208
|
+
|
|
209
|
+
RETURN _def_is(
|
|
210
|
+
pg_catalog.pg_get_expr(d.adbin, d.adrelid),
|
|
211
|
+
pg_catalog.format_type(a.atttypid, a.atttypmod),
|
|
212
|
+
$4, $5
|
|
213
|
+
)
|
|
214
|
+
FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c, pg_catalog.pg_attribute a,
|
|
215
|
+
pg_catalog.pg_attrdef d
|
|
216
|
+
WHERE n.oid = c.relnamespace
|
|
217
|
+
AND c.oid = a.attrelid
|
|
218
|
+
AND a.atthasdef
|
|
219
|
+
AND a.attrelid = d.adrelid
|
|
220
|
+
AND a.attnum = d.adnum
|
|
221
|
+
AND n.nspname = $1
|
|
222
|
+
AND c.relname = $2
|
|
223
|
+
AND a.attnum > 0
|
|
224
|
+
AND NOT a.attisdropped
|
|
225
|
+
AND a.attname = $3;
|
|
226
|
+
END;
|
|
227
|
+
$$ LANGUAGE plpgsql;
|
|
228
|
+
|
|
229
|
+
-- _cdi( table, column, default, description )
|
|
230
|
+
CREATE OR REPLACE FUNCTION _cdi ( NAME, NAME, anyelement, TEXT )
|
|
231
|
+
RETURNS TEXT AS $$
|
|
232
|
+
BEGIN
|
|
233
|
+
IF NOT _cexists( $1, $2 ) THEN
|
|
234
|
+
RETURN fail( $4 ) || E'\n'
|
|
235
|
+
|| diag (' Column ' || quote_ident($1) || '.' || quote_ident($2) || ' does not exist' );
|
|
236
|
+
END IF;
|
|
237
|
+
|
|
238
|
+
IF NOT _has_def( $1, $2 ) THEN
|
|
239
|
+
RETURN fail( $4 ) || E'\n'
|
|
240
|
+
|| diag (' Column ' || quote_ident($1) || '.' || quote_ident($2) || ' has no default' );
|
|
241
|
+
END IF;
|
|
242
|
+
|
|
243
|
+
RETURN _def_is(
|
|
244
|
+
pg_catalog.pg_get_expr(d.adbin, d.adrelid),
|
|
245
|
+
pg_catalog.format_type(a.atttypid, a.atttypmod),
|
|
246
|
+
$3, $4
|
|
247
|
+
)
|
|
248
|
+
FROM pg_catalog.pg_class c, pg_catalog.pg_attribute a, pg_catalog.pg_attrdef d
|
|
249
|
+
WHERE c.oid = a.attrelid
|
|
250
|
+
AND pg_table_is_visible(c.oid)
|
|
251
|
+
AND a.atthasdef
|
|
252
|
+
AND a.attrelid = d.adrelid
|
|
253
|
+
AND a.attnum = d.adnum
|
|
254
|
+
AND c.relname = $1
|
|
255
|
+
AND a.attnum > 0
|
|
256
|
+
AND NOT a.attisdropped
|
|
257
|
+
AND a.attname = $2;
|
|
258
|
+
END;
|
|
259
|
+
$$ LANGUAGE plpgsql;
|
|
260
|
+
|
|
261
|
+
CREATE OR REPLACE FUNCTION _cmp_types(oid, name)
|
|
262
|
+
RETURNS BOOLEAN AS $$
|
|
263
|
+
DECLARE
|
|
264
|
+
dtype TEXT := pg_catalog.format_type($1, NULL);
|
|
265
|
+
BEGIN
|
|
266
|
+
RETURN dtype = _quote_ident_like($2, dtype);
|
|
267
|
+
END;
|
|
268
|
+
$$ LANGUAGE plpgsql;
|
|
269
|
+
|
|
270
|
+
CREATE OR REPLACE FUNCTION _get_dtype( NAME, TEXT, BOOLEAN )
|
|
271
|
+
RETURNS TEXT AS $$
|
|
272
|
+
SELECT CASE WHEN $3 AND pg_catalog.pg_type_is_visible(t.oid)
|
|
273
|
+
THEN quote_ident(tn.nspname) || '.'
|
|
274
|
+
ELSE ''
|
|
275
|
+
END || pg_catalog.format_type(t.oid, t.typtypmod)
|
|
276
|
+
FROM pg_catalog.pg_type d
|
|
277
|
+
JOIN pg_catalog.pg_namespace dn ON d.typnamespace = dn.oid
|
|
278
|
+
JOIN pg_catalog.pg_type t ON d.typbasetype = t.oid
|
|
279
|
+
JOIN pg_catalog.pg_namespace tn ON t.typnamespace = tn.oid
|
|
280
|
+
WHERE d.typisdefined
|
|
281
|
+
AND dn.nspname = $1
|
|
282
|
+
AND d.typname = LOWER($2)
|
|
283
|
+
AND d.typtype = 'd'
|
|
284
|
+
$$ LANGUAGE sql;
|
|
285
|
+
|
|
286
|
+
CREATE OR REPLACE FUNCTION _get_dtype( NAME )
|
|
287
|
+
RETURNS TEXT AS $$
|
|
288
|
+
SELECT pg_catalog.format_type(t.oid, t.typtypmod)
|
|
289
|
+
FROM pg_catalog.pg_type d
|
|
290
|
+
JOIN pg_catalog.pg_type t ON d.typbasetype = t.oid
|
|
291
|
+
WHERE d.typisdefined
|
|
292
|
+
AND pg_catalog.pg_type_is_visible(d.oid)
|
|
293
|
+
AND d.typname = LOWER($1)
|
|
294
|
+
AND d.typtype = 'd'
|
|
295
|
+
$$ LANGUAGE sql;
|
|
296
|
+
|
|
297
|
+
-- casts_are( casts[], description )
|
|
298
|
+
CREATE OR REPLACE FUNCTION casts_are ( TEXT[], TEXT )
|
|
299
|
+
RETURNS TEXT AS $$
|
|
300
|
+
SELECT _areni(
|
|
301
|
+
'casts',
|
|
302
|
+
ARRAY(
|
|
303
|
+
SELECT pg_catalog.format_type(castsource, NULL)
|
|
304
|
+
|| ' AS ' || pg_catalog.format_type(casttarget, NULL)
|
|
305
|
+
FROM pg_catalog.pg_cast c
|
|
306
|
+
EXCEPT
|
|
307
|
+
SELECT $1[i]
|
|
308
|
+
FROM generate_series(1, array_upper($1, 1)) s(i)
|
|
309
|
+
),
|
|
310
|
+
ARRAY(
|
|
311
|
+
SELECT $1[i]
|
|
312
|
+
FROM generate_series(1, array_upper($1, 1)) s(i)
|
|
313
|
+
EXCEPT
|
|
314
|
+
SELECT pg_catalog.format_type(castsource, NULL)
|
|
315
|
+
|| ' AS ' || pg_catalog.format_type(casttarget, NULL)
|
|
316
|
+
FROM pg_catalog.pg_cast c
|
|
317
|
+
),
|
|
318
|
+
$2
|
|
319
|
+
);
|
|
320
|
+
$$ LANGUAGE sql;
|
|
321
|
+
|
|
322
|
+
-- _get_tablespace_owner( tablespace )
|
|
323
|
+
CREATE OR REPLACE FUNCTION _get_tablespace_owner( NAME )
|
|
324
|
+
RETURNS NAME AS $$
|
|
325
|
+
SELECT pg_catalog.pg_get_userbyid(spcowner)
|
|
326
|
+
FROM pg_catalog.pg_tablespace
|
|
327
|
+
WHERE spcname = $1;
|
|
328
|
+
$$ LANGUAGE SQL;
|
|
329
|
+
|
|
330
|
+
-- tablespace_owner_is ( tablespace, user, description )
|
|
331
|
+
CREATE OR REPLACE FUNCTION tablespace_owner_is ( NAME, NAME, TEXT )
|
|
332
|
+
RETURNS TEXT AS $$
|
|
333
|
+
DECLARE
|
|
334
|
+
owner NAME := _get_tablespace_owner($1);
|
|
335
|
+
BEGIN
|
|
336
|
+
-- Make sure the tablespace exists.
|
|
337
|
+
IF owner IS NULL THEN
|
|
338
|
+
RETURN ok(FALSE, $3) || E'\n' || diag(
|
|
339
|
+
E' Tablespace ' || quote_ident($1) || ' does not exist'
|
|
340
|
+
);
|
|
341
|
+
END IF;
|
|
342
|
+
|
|
343
|
+
RETURN is(owner, $2, $3);
|
|
344
|
+
END;
|
|
345
|
+
$$ LANGUAGE plpgsql;
|
|
346
|
+
|
|
347
|
+
-- tablespace_owner_is ( tablespace, user )
|
|
348
|
+
CREATE OR REPLACE FUNCTION tablespace_owner_is ( NAME, NAME )
|
|
349
|
+
RETURNS TEXT AS $$
|
|
350
|
+
SELECT tablespace_owner_is(
|
|
351
|
+
$1, $2,
|
|
352
|
+
'Tablespace ' || quote_ident($1) || ' should be owned by ' || quote_ident($2)
|
|
353
|
+
);
|
|
354
|
+
$$ LANGUAGE sql;
|
|
355
|
+
|
|
356
|
+
CREATE OR REPLACE FUNCTION _have_index( NAME, NAME, NAME)
|
|
357
|
+
RETURNS BOOLEAN AS $$
|
|
358
|
+
SELECT EXISTS (
|
|
359
|
+
SELECT TRUE
|
|
360
|
+
FROM pg_catalog.pg_index x
|
|
361
|
+
JOIN pg_catalog.pg_class ct ON ct.oid = x.indrelid
|
|
362
|
+
JOIN pg_catalog.pg_class ci ON ci.oid = x.indexrelid
|
|
363
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = ct.relnamespace
|
|
364
|
+
WHERE n.nspname = $1
|
|
365
|
+
AND ct.relname = $2
|
|
366
|
+
AND ci.relname = $3
|
|
367
|
+
);
|
|
368
|
+
$$ LANGUAGE sql;
|
|
369
|
+
|
|
370
|
+
CREATE OR REPLACE FUNCTION _have_index( NAME, NAME)
|
|
371
|
+
RETURNS BOOLEAN AS $$
|
|
372
|
+
SELECT EXISTS (
|
|
373
|
+
SELECT TRUE
|
|
374
|
+
FROM pg_catalog.pg_index x
|
|
375
|
+
JOIN pg_catalog.pg_class ct ON ct.oid = x.indrelid
|
|
376
|
+
JOIN pg_catalog.pg_class ci ON ci.oid = x.indexrelid
|
|
377
|
+
WHERE ct.relname = $1
|
|
378
|
+
AND ci.relname = $2
|
|
379
|
+
AND pg_catalog.pg_table_is_visible(ct.oid)
|
|
380
|
+
);
|
|
381
|
+
$$ LANGUAGE sql;
|
|
382
|
+
|
|
383
|
+
CREATE OR REPLACE FUNCTION _get_index_owner( NAME, NAME, NAME )
|
|
384
|
+
RETURNS NAME AS $$
|
|
385
|
+
SELECT pg_catalog.pg_get_userbyid(ci.relowner)
|
|
386
|
+
FROM pg_catalog.pg_index x
|
|
387
|
+
JOIN pg_catalog.pg_class ct ON ct.oid = x.indrelid
|
|
388
|
+
JOIN pg_catalog.pg_class ci ON ci.oid = x.indexrelid
|
|
389
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = ct.relnamespace
|
|
390
|
+
WHERE n.nspname = $1
|
|
391
|
+
AND ct.relname = $2
|
|
392
|
+
AND ci.relname = $3;
|
|
393
|
+
$$ LANGUAGE sql;
|
|
394
|
+
|
|
395
|
+
CREATE OR REPLACE FUNCTION _get_index_owner( NAME, NAME )
|
|
396
|
+
RETURNS NAME AS $$
|
|
397
|
+
SELECT pg_catalog.pg_get_userbyid(ci.relowner)
|
|
398
|
+
FROM pg_catalog.pg_index x
|
|
399
|
+
JOIN pg_catalog.pg_class ct ON ct.oid = x.indrelid
|
|
400
|
+
JOIN pg_catalog.pg_class ci ON ci.oid = x.indexrelid
|
|
401
|
+
WHERE ct.relname = $1
|
|
402
|
+
AND ci.relname = $2
|
|
403
|
+
AND pg_catalog.pg_table_is_visible(ct.oid);
|
|
404
|
+
$$ LANGUAGE sql;
|
|
405
|
+
|
|
406
|
+
-- index_owner_is ( schema, table, index, user, description )
|
|
407
|
+
CREATE OR REPLACE FUNCTION index_owner_is ( NAME, NAME, NAME, NAME, TEXT )
|
|
408
|
+
RETURNS TEXT AS $$
|
|
409
|
+
DECLARE
|
|
410
|
+
owner NAME := _get_index_owner($1, $2, $3);
|
|
411
|
+
BEGIN
|
|
412
|
+
-- Make sure the index exists.
|
|
413
|
+
IF owner IS NULL THEN
|
|
414
|
+
RETURN ok(FALSE, $5) || E'\n' || diag(
|
|
415
|
+
E' Index ' || quote_ident($3) || ' ON '
|
|
416
|
+
|| quote_ident($1) || '.' || quote_ident($2) || ' not found'
|
|
417
|
+
);
|
|
418
|
+
END IF;
|
|
419
|
+
|
|
420
|
+
RETURN is(owner, $4, $5);
|
|
421
|
+
END;
|
|
422
|
+
$$ LANGUAGE plpgsql;
|
|
423
|
+
|
|
424
|
+
-- index_owner_is ( schema, table, index, user )
|
|
425
|
+
CREATE OR REPLACE FUNCTION index_owner_is ( NAME, NAME, NAME, NAME )
|
|
426
|
+
RETURNS TEXT AS $$
|
|
427
|
+
SELECT index_owner_is(
|
|
428
|
+
$1, $2, $3, $4,
|
|
429
|
+
'Index ' || quote_ident($3) || ' ON '
|
|
430
|
+
|| quote_ident($1) || '.' || quote_ident($2)
|
|
431
|
+
|| ' should be owned by ' || quote_ident($4)
|
|
432
|
+
);
|
|
433
|
+
$$ LANGUAGE sql;
|
|
434
|
+
|
|
435
|
+
-- index_owner_is ( table, index, user, description )
|
|
436
|
+
CREATE OR REPLACE FUNCTION index_owner_is ( NAME, NAME, NAME, TEXT )
|
|
437
|
+
RETURNS TEXT AS $$
|
|
438
|
+
DECLARE
|
|
439
|
+
owner NAME := _get_index_owner($1, $2);
|
|
440
|
+
BEGIN
|
|
441
|
+
-- Make sure the index exists.
|
|
442
|
+
IF owner IS NULL THEN
|
|
443
|
+
RETURN ok(FALSE, $4) || E'\n' || diag(
|
|
444
|
+
E' Index ' || quote_ident($2) || ' ON ' || quote_ident($1) || ' not found'
|
|
445
|
+
);
|
|
446
|
+
END IF;
|
|
447
|
+
|
|
448
|
+
RETURN is(owner, $3, $4);
|
|
449
|
+
END;
|
|
450
|
+
$$ LANGUAGE plpgsql;
|
|
451
|
+
|
|
452
|
+
-- index_owner_is ( table, index, user )
|
|
453
|
+
CREATE OR REPLACE FUNCTION index_owner_is ( NAME, NAME, NAME )
|
|
454
|
+
RETURNS TEXT AS $$
|
|
455
|
+
SELECT index_owner_is(
|
|
456
|
+
$1, $2, $3,
|
|
457
|
+
'Index ' || quote_ident($2) || ' ON '
|
|
458
|
+
|| quote_ident($1) || ' should be owned by ' || quote_ident($3)
|
|
459
|
+
);
|
|
460
|
+
$$ LANGUAGE sql;
|
|
461
|
+
|
|
462
|
+
-- _get_language_owner( language )
|
|
463
|
+
CREATE OR REPLACE FUNCTION _get_language_owner( NAME )
|
|
464
|
+
RETURNS NAME AS $$
|
|
465
|
+
SELECT pg_catalog.pg_get_userbyid(lanowner)
|
|
466
|
+
FROM pg_catalog.pg_language
|
|
467
|
+
WHERE lanname = $1;
|
|
468
|
+
$$ LANGUAGE SQL;
|
|
469
|
+
|
|
470
|
+
-- language_owner_is ( language, user, description )
|
|
471
|
+
CREATE OR REPLACE FUNCTION language_owner_is ( NAME, NAME, TEXT )
|
|
472
|
+
RETURNS TEXT AS $$
|
|
473
|
+
DECLARE
|
|
474
|
+
owner NAME := _get_language_owner($1);
|
|
475
|
+
BEGIN
|
|
476
|
+
-- Make sure the language exists.
|
|
477
|
+
IF owner IS NULL THEN
|
|
478
|
+
RETURN ok(FALSE, $3) || E'\n' || diag(
|
|
479
|
+
E' Language ' || quote_ident($1) || ' does not exist'
|
|
480
|
+
);
|
|
481
|
+
END IF;
|
|
482
|
+
|
|
483
|
+
RETURN is(owner, $2, $3);
|
|
484
|
+
END;
|
|
485
|
+
$$ LANGUAGE plpgsql;
|
|
486
|
+
|
|
487
|
+
-- language_owner_is ( language, user )
|
|
488
|
+
CREATE OR REPLACE FUNCTION language_owner_is ( NAME, NAME )
|
|
489
|
+
RETURNS TEXT AS $$
|
|
490
|
+
SELECT language_owner_is(
|
|
491
|
+
$1, $2,
|
|
492
|
+
'Language ' || quote_ident($1) || ' should be owned by ' || quote_ident($2)
|
|
493
|
+
);
|
|
494
|
+
$$ LANGUAGE sql;
|
|
495
|
+
|
|
496
|
+
CREATE OR REPLACE FUNCTION _get_opclass_owner ( NAME, NAME )
|
|
497
|
+
RETURNS NAME AS $$
|
|
498
|
+
SELECT pg_catalog.pg_get_userbyid(opcowner)
|
|
499
|
+
FROM pg_catalog.pg_opclass oc
|
|
500
|
+
JOIN pg_catalog.pg_namespace n ON oc.opcnamespace = n.oid
|
|
501
|
+
WHERE n.nspname = $1
|
|
502
|
+
AND opcname = $2;
|
|
503
|
+
$$ LANGUAGE SQL;
|
|
504
|
+
|
|
505
|
+
CREATE OR REPLACE FUNCTION _get_opclass_owner ( NAME )
|
|
506
|
+
RETURNS NAME AS $$
|
|
507
|
+
SELECT pg_catalog.pg_get_userbyid(opcowner)
|
|
508
|
+
FROM pg_catalog.pg_opclass
|
|
509
|
+
WHERE opcname = $1
|
|
510
|
+
AND pg_catalog.pg_opclass_is_visible(oid);
|
|
511
|
+
$$ LANGUAGE SQL;
|
|
512
|
+
|
|
513
|
+
-- opclass_owner_is( schema, opclass, user, description )
|
|
514
|
+
CREATE OR REPLACE FUNCTION opclass_owner_is ( NAME, NAME, NAME, TEXT )
|
|
515
|
+
RETURNS TEXT AS $$
|
|
516
|
+
DECLARE
|
|
517
|
+
owner NAME := _get_opclass_owner($1, $2);
|
|
518
|
+
BEGIN
|
|
519
|
+
-- Make sure the opclass exists.
|
|
520
|
+
IF owner IS NULL THEN
|
|
521
|
+
RETURN ok(FALSE, $4) || E'\n' || diag(
|
|
522
|
+
E' Operator class ' || quote_ident($1) || '.' || quote_ident($2)
|
|
523
|
+
|| ' not found'
|
|
524
|
+
);
|
|
525
|
+
END IF;
|
|
526
|
+
|
|
527
|
+
RETURN is(owner, $3, $4);
|
|
528
|
+
END;
|
|
529
|
+
$$ LANGUAGE plpgsql;
|
|
530
|
+
|
|
531
|
+
-- opclass_owner_is( schema, opclass, user )
|
|
532
|
+
CREATE OR REPLACE FUNCTION opclass_owner_is( NAME, NAME, NAME )
|
|
533
|
+
RETURNS TEXT AS $$
|
|
534
|
+
SELECT opclass_owner_is(
|
|
535
|
+
$1, $2, $3,
|
|
536
|
+
'Operator class ' || quote_ident($1) || '.' || quote_ident($2) ||
|
|
537
|
+
' should be owned by ' || quote_ident($3)
|
|
538
|
+
);
|
|
539
|
+
$$ LANGUAGE sql;
|
|
540
|
+
|
|
541
|
+
-- opclass_owner_is( opclass, user, description )
|
|
542
|
+
CREATE OR REPLACE FUNCTION opclass_owner_is ( NAME, NAME, TEXT )
|
|
543
|
+
RETURNS TEXT AS $$
|
|
544
|
+
DECLARE
|
|
545
|
+
owner NAME := _get_opclass_owner($1);
|
|
546
|
+
BEGIN
|
|
547
|
+
-- Make sure the opclass exists.
|
|
548
|
+
IF owner IS NULL THEN
|
|
549
|
+
RETURN ok(FALSE, $3) || E'\n' || diag(
|
|
550
|
+
E' Operator class ' || quote_ident($1) || ' not found'
|
|
551
|
+
);
|
|
552
|
+
END IF;
|
|
553
|
+
|
|
554
|
+
RETURN is(owner, $2, $3);
|
|
555
|
+
END;
|
|
556
|
+
$$ LANGUAGE plpgsql;
|
|
557
|
+
|
|
558
|
+
-- opclass_owner_is( opclass, user )
|
|
559
|
+
CREATE OR REPLACE FUNCTION opclass_owner_is( NAME, NAME )
|
|
560
|
+
RETURNS TEXT AS $$
|
|
561
|
+
SELECT opclass_owner_is(
|
|
562
|
+
$1, $2,
|
|
563
|
+
'Operator class ' || quote_ident($1) || ' should be owned by ' || quote_ident($2)
|
|
564
|
+
);
|
|
565
|
+
$$ LANGUAGE sql;
|
|
566
|
+
|
|
567
|
+
CREATE OR REPLACE FUNCTION _opc_exists( NAME, NAME )
|
|
568
|
+
RETURNS BOOLEAN AS $$
|
|
569
|
+
SELECT EXISTS (
|
|
570
|
+
SELECT TRUE
|
|
571
|
+
FROM pg_catalog.pg_opclass oc
|
|
572
|
+
JOIN pg_catalog.pg_namespace n ON oc.opcnamespace = n.oid
|
|
573
|
+
WHERE n.nspname = $1
|
|
574
|
+
AND oc.opcname = $2
|
|
575
|
+
);
|
|
576
|
+
$$ LANGUAGE SQL;
|
|
577
|
+
|
|
578
|
+
CREATE OR REPLACE FUNCTION _opc_exists( NAME )
|
|
579
|
+
RETURNS BOOLEAN AS $$
|
|
580
|
+
SELECT EXISTS (
|
|
581
|
+
SELECT TRUE
|
|
582
|
+
FROM pg_catalog.pg_opclass oc
|
|
583
|
+
WHERE oc.opcname = $1
|
|
584
|
+
AND pg_opclass_is_visible(oid)
|
|
585
|
+
);
|
|
586
|
+
$$ LANGUAGE SQL;
|
|
587
|
+
|
|
588
|
+
-- has_opclass( name, description )
|
|
589
|
+
CREATE OR REPLACE FUNCTION has_opclass( NAME, TEXT )
|
|
590
|
+
RETURNS TEXT AS $$
|
|
591
|
+
SELECT ok( _opc_exists( $1 ), $2)
|
|
592
|
+
$$ LANGUAGE SQL;
|
|
593
|
+
|
|
594
|
+
-- has_opclass( name )
|
|
595
|
+
CREATE OR REPLACE FUNCTION has_opclass( NAME )
|
|
596
|
+
RETURNS TEXT AS $$
|
|
597
|
+
SELECT ok( _opc_exists( $1 ), 'Operator class ' || quote_ident($1) || ' should exist' );
|
|
598
|
+
$$ LANGUAGE SQL;
|
|
599
|
+
|
|
600
|
+
-- hasnt_opclass( name, description )
|
|
601
|
+
CREATE OR REPLACE FUNCTION hasnt_opclass( NAME, TEXT )
|
|
602
|
+
RETURNS TEXT AS $$
|
|
603
|
+
SELECT ok( NOT _opc_exists( $1 ), $2)
|
|
604
|
+
$$ LANGUAGE SQL;
|
|
605
|
+
|
|
606
|
+
-- hasnt_opclass( name )
|
|
607
|
+
CREATE OR REPLACE FUNCTION hasnt_opclass( NAME )
|
|
608
|
+
RETURNS TEXT AS $$
|
|
609
|
+
SELECT ok( NOT _opc_exists( $1 ), 'Operator class ' || quote_ident($1) || ' should exist' );
|
|
610
|
+
$$ LANGUAGE SQL;
|
|
611
|
+
|
|
612
|
+
CREATE OR REPLACE FUNCTION _get_type_owner ( NAME, NAME )
|
|
613
|
+
RETURNS NAME AS $$
|
|
614
|
+
SELECT pg_catalog.pg_get_userbyid(t.typowner)
|
|
615
|
+
FROM pg_catalog.pg_type t
|
|
616
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
|
|
617
|
+
WHERE n.nspname = $1
|
|
618
|
+
AND t.typname = $2
|
|
619
|
+
$$ LANGUAGE SQL;
|
|
620
|
+
|
|
621
|
+
CREATE OR REPLACE FUNCTION _get_type_owner ( NAME )
|
|
622
|
+
RETURNS NAME AS $$
|
|
623
|
+
SELECT pg_catalog.pg_get_userbyid(typowner)
|
|
624
|
+
FROM pg_catalog.pg_type
|
|
625
|
+
WHERE typname = $1
|
|
626
|
+
AND pg_catalog.pg_type_is_visible(oid)
|
|
627
|
+
$$ LANGUAGE SQL;
|
|
628
|
+
|
|
629
|
+
-- type_owner_is ( schema, type, user, description )
|
|
630
|
+
CREATE OR REPLACE FUNCTION type_owner_is ( NAME, NAME, NAME, TEXT )
|
|
631
|
+
RETURNS TEXT AS $$
|
|
632
|
+
DECLARE
|
|
633
|
+
owner NAME := _get_type_owner($1, $2);
|
|
634
|
+
BEGIN
|
|
635
|
+
-- Make sure the type exists.
|
|
636
|
+
IF owner IS NULL THEN
|
|
637
|
+
RETURN ok(FALSE, $4) || E'\n' || diag(
|
|
638
|
+
E' Type ' || quote_ident($1) || '.' || quote_ident($2) || ' not found'
|
|
639
|
+
);
|
|
640
|
+
END IF;
|
|
641
|
+
|
|
642
|
+
RETURN is(owner, $3, $4);
|
|
643
|
+
END;
|
|
644
|
+
$$ LANGUAGE plpgsql;
|
|
645
|
+
|
|
646
|
+
-- type_owner_is ( schema, type, user )
|
|
647
|
+
CREATE OR REPLACE FUNCTION type_owner_is ( NAME, NAME, NAME )
|
|
648
|
+
RETURNS TEXT AS $$
|
|
649
|
+
SELECT type_owner_is(
|
|
650
|
+
$1, $2, $3,
|
|
651
|
+
'Type ' || quote_ident($1) || '.' || quote_ident($2) || ' should be owned by ' || quote_ident($3)
|
|
652
|
+
);
|
|
653
|
+
$$ LANGUAGE sql;
|
|
654
|
+
|
|
655
|
+
-- type_owner_is ( type, user, description )
|
|
656
|
+
CREATE OR REPLACE FUNCTION type_owner_is ( NAME, NAME, TEXT )
|
|
657
|
+
RETURNS TEXT AS $$
|
|
658
|
+
DECLARE
|
|
659
|
+
owner NAME := _get_type_owner($1);
|
|
660
|
+
BEGIN
|
|
661
|
+
-- Make sure the type exists.
|
|
662
|
+
IF owner IS NULL THEN
|
|
663
|
+
RETURN ok(FALSE, $3) || E'\n' || diag(
|
|
664
|
+
E' Type ' || quote_ident($1) || ' not found'
|
|
665
|
+
);
|
|
666
|
+
END IF;
|
|
667
|
+
|
|
668
|
+
RETURN is(owner, $2, $3);
|
|
669
|
+
END;
|
|
670
|
+
$$ LANGUAGE plpgsql;
|
|
671
|
+
|
|
672
|
+
-- type_owner_is ( type, user )
|
|
673
|
+
CREATE OR REPLACE FUNCTION type_owner_is ( NAME, NAME )
|
|
674
|
+
RETURNS TEXT AS $$
|
|
675
|
+
SELECT type_owner_is(
|
|
676
|
+
$1, $2,
|
|
677
|
+
'Type ' || quote_ident($1) || ' should be owned by ' || quote_ident($2)
|
|
678
|
+
);
|
|
679
|
+
$$ LANGUAGE sql;
|