OSDN Git Service

Fixed regression tests to avoid test failure for 9.1.
[pgdbmsstats/pg_dbms_stats.git] / sql / ut-common.sql
1 \pset null '(null)'
2
3 /*
4  * No.2-3 dbms_stats.backup_history_id_seq
5  */
6 -- No.2-3-1
7 SELECT setval('dbms_stats.backup_history_id_seq', 0, false);
8 -- No.2-3-2
9 SELECT setval('dbms_stats.backup_history_id_seq', 1, false);
10 INSERT INTO dbms_stats.backup_history(time, unit)
11     VALUES ('2011-01-01', 't');
12 SELECT id, time, unit FROM dbms_stats.backup_history
13  ORDER BY id;
14 -- No.2-3-3
15 INSERT INTO dbms_stats.backup_history(time, unit)
16     VALUES ('2011-01-02', 'c'), ('2011-01-03', 'd');
17 SELECT id, time, unit FROM dbms_stats.backup_history
18  ORDER BY id;
19 -- clean up
20 SELECT setval('dbms_stats.backup_history_id_seq', 1, false);
21 DELETE FROM dbms_stats.backup_history;
22
23 /*
24  * No.3-1 dbms_stats.use_locked_stats
25  */
26 DELETE FROM dbms_stats.relation_stats_locked;
27 EXPLAIN (costs false) SELECT * FROM s0.st2 WHERE id < 1;
28 SELECT dbms_stats.lock_table_stats('s0.st2'::regclass);
29 UPDATE dbms_stats.relation_stats_locked SET curpages = 10000;
30 VACUUM ANALYZE;
31 -- No.3-1-1
32 SET pg_dbms_stats.use_locked_stats TO ON;
33 EXPLAIN (costs false) SELECT * FROM s0.st2 WHERE id < 1;
34 -- No.3-1-2
35 SET pg_dbms_stats.use_locked_stats TO OFF;
36 EXPLAIN (costs false) SELECT * FROM s0.st2 WHERE id < 1;
37 -- No.3-1-3
38 /* Reconnection as regular user */
39 \c - regular_user
40 SHOW pg_dbms_stats.use_locked_stats;
41 SET pg_dbms_stats.use_locked_stats TO OFF;
42 SHOW pg_dbms_stats.use_locked_stats;
43 EXPLAIN (costs false) SELECT * FROM s0.st2 WHERE id < 1;
44 RESET pg_dbms_stats.use_locked_stats;
45 EXPLAIN (costs false) SELECT * FROM s0.st2 WHERE id < 1;
46 -- clean up
47 /* Reconnection as super user */
48 \c - super_user
49 DELETE FROM dbms_stats.relation_stats_locked;
50
51 /*
52  * No.4-1 DATA TYPE dbms_stats.anyarray
53  */
54 CREATE TABLE st3(id integer, name char(1000), num_arr char(5)[]);
55 INSERT INTO st3 SELECT i, i , ARRAY[i::char, 'a'] FROM generate_series(1,10) g(i);
56 ANALYZE st3;
57 SELECT staattnum, stavalues1 FROM pg_statistic
58  WHERE starelid = 'public.st3'::regclass
59  ORDER BY staattnum;
60 \copy (SELECT stavalues1::dbms_stats.anyarray FROM dbms_stats.column_stats_effective WHERE starelid = 'st3'::regclass) TO 'results/anyarray_test.cp' binary
61 CREATE TABLE st4 (arr dbms_stats.anyarray);
62
63 SELECT t.typname, n.nspname,
64        t.typlen, t.typbyval, t.typtype,
65        t.typcategory, t.typispreferred, t.typispreferred,
66        t.typdelim, t.typrelid, t.typmodin,
67        t.typmodout, t.typanalyze, t.typalign,
68        t.typstorage, t.typnotnull, t.typbasetype, t.typtypmod,
69        t.typndims, t.typcollation, t.typdefaultbin, t.typdefault
70   FROM pg_type t, pg_namespace n
71  WHERE t.typname = 'anyarray'
72    AND t.typnamespace = n.oid
73  ORDER BY t.typname;
74 -- No.4-1-1
75 INSERT INTO st4 VALUES(NULL);
76 SELECT * FROM st4;
77 -- No.4-1-2
78 DELETE FROM st4;
79 SELECT stavalues1::dbms_stats.anyarray
80   FROM dbms_stats.column_stats_effective
81  WHERE starelid = 'st3'::regclass
82    AND staattnum = 1;
83 SELECT count(*) FROM st4;
84 INSERT INTO st4
85      SELECT stavalues1::dbms_stats.anyarray
86        FROM dbms_stats.column_stats_effective
87       WHERE starelid = 'st3'::regclass
88         AND staattnum = 1;
89 SELECT * FROM st4;
90 -- No.4-1-3
91 DELETE FROM st4;
92 SELECT stavalues1::dbms_stats.anyarray
93   FROM dbms_stats.column_stats_effective
94  WHERE starelid = 'st3'::regclass
95    AND staattnum = 2;
96 SELECT count(*) FROM st4;
97 INSERT INTO st4
98      SELECT stavalues1::dbms_stats.anyarray
99        FROM dbms_stats.column_stats_effective
100       WHERE starelid = 'st3'::regclass
101         AND staattnum = 2;
102 SELECT * FROM st4;
103 -- No.4-1-4
104 DELETE FROM st4;
105 SELECT stavalues1::dbms_stats.anyarray
106   FROM dbms_stats.column_stats_effective
107  WHERE starelid = 'st3'::regclass
108    AND staattnum = 1;
109 SELECT count(*) FROM st4;
110 INSERT INTO st4
111      SELECT stavalues1::dbms_stats.anyarray
112        FROM dbms_stats.column_stats_effective
113       WHERE starelid = 'st3'::regclass
114         AND staattnum = 1;
115 SELECT * FROM st4;
116 -- No.4-1-5
117 DELETE FROM st4;
118 SELECT stavalues1::dbms_stats.anyarray
119   FROM dbms_stats.column_stats_effective
120  WHERE starelid = 'st3'::regclass
121    AND staattnum = 3;
122 SELECT count(*) FROM st4;
123 INSERT INTO st4
124      SELECT stavalues1::dbms_stats.anyarray
125        FROM dbms_stats.column_stats_effective
126       WHERE starelid = 'st3'::regclass
127         AND staattnum = 3;
128 SELECT * FROM st4;
129 -- No.4-1-6
130 DELETE FROM st4;
131 SELECT stavalues1::dbms_stats.anyarray
132   FROM dbms_stats.column_stats_effective
133  WHERE starelid = 'st3'::regclass;
134 \copy st4(arr) FROM 'results/anyarray_test.cp' binary
135 SELECT * FROM st4;
136 -- clean up
137 DROP TABLE st3;
138 DROP TABLE st4;
139
140 SELECT dbms_stats.unlock_database_stats();
141 SELECT dbms_stats.lock_table_stats('st1');
142
143 /*
144  * No.5-2 invalid calls of dbms_stats.invalidate_column_cache
145  */
146 -- No.5-2-1
147 SELECT dbms_stats.invalidate_column_cache();
148
149 -- No.5-2-2
150 /*
151  * Driver function dbms_stats.invalidate_cache1
152  */
153 CREATE TRIGGER invalidate_cache1
154  AFTER INSERT OR DELETE OR UPDATE
155     ON pt0
156    FOR EACH ROW EXECUTE PROCEDURE dbms_stats.invalidate_column_cache();
157 INSERT INTO pt0 VALUES (1,'2012/12/12');
158 DROP TRIGGER invalidate_cache1 ON pt0;
159
160 -- No.5-2-3
161 /*
162  * Driver function dbms_stats.invalidate_cache2
163  */
164 CREATE TRIGGER invalidate_cache2
165 BEFORE INSERT OR DELETE OR UPDATE
166     ON pt0
167    FOR EACH STATEMENT EXECUTE PROCEDURE dbms_stats.invalidate_column_cache();
168 INSERT INTO pt0 VALUES (1,'2012/12/12');
169 DROP TRIGGER invalidate_cache2 ON pt0;
170
171 -- No.5-2-4
172 /*
173  * Driver function dbms_stats.invalidate_cache3
174  */
175 CREATE TRIGGER invalidate_cache3
176 BEFORE TRUNCATE
177     ON pt0
178    FOR EACH STATEMENT EXECUTE PROCEDURE dbms_stats.invalidate_column_cache();
179 TRUNCATE TABLE pt0;
180 DROP TRIGGER invalidate_cache3 ON pt0;
181
182 -- No.5-2-5
183 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
184 INSERT INTO dbms_stats.relation_stats_locked (relid, relname) VALUES (0, 'dummy');
185 INSERT INTO dbms_stats.column_stats_locked (starelid, staattnum, stainherit)
186     VALUES (0, 1, true);
187 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
188
189 -- No.5-2-6
190 INSERT INTO dbms_stats.column_stats_locked (starelid, staattnum, stainherit)
191     VALUES ('st1_idx'::regclass, 1, true);
192 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
193
194 -- No.5-2-7
195 INSERT INTO dbms_stats.column_stats_locked (starelid, staattnum, stainherit)
196     VALUES ('complex'::regclass, 1, true);
197 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
198
199 -- No.5-2-9
200 UPDATE dbms_stats.column_stats_locked SET stanullfrac = 1
201  WHERE starelid = 'st1'::regclass
202    AND staattnum = 1
203    AND stainherit = false;
204 VACUUM ANALYZE;
205 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
206
207 -- No.5-2-10
208 DELETE FROM dbms_stats.column_stats_locked
209  WHERE starelid = 'st1'::regclass
210    AND staattnum = 1
211    AND stainherit = false;
212 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
213
214 -- No.5-2-8
215 INSERT INTO dbms_stats.column_stats_locked
216     (starelid, staattnum, stainherit, stanullfrac)
217     VALUES ('st1'::regclass, 1, false, 1);
218 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
219
220 -- No.5-2-11
221 PREPARE p2 AS SELECT str FROM st1 WHERE lower(str) IS NULL;
222 EXPLAIN (costs false) SELECT str FROM st1 WHERE lower(str) IS NULL;
223 EXPLAIN (costs false) EXECUTE p2;
224 INSERT INTO dbms_stats.relation_stats_locked (relid, relname)
225     VALUES ('st1_exp'::regclass, 'dummy');
226 INSERT INTO dbms_stats.column_stats_locked
227     (starelid, staattnum, stainherit, stanullfrac)
228     VALUES ('st1_exp'::regclass, 1, false, 1);
229 EXPLAIN (costs false) SELECT str FROM st1 WHERE lower(str) IS NULL;
230 EXPLAIN (costs false) EXECUTE p2;
231
232 DEALLOCATE p2;
233
234 SELECT dbms_stats.unlock_database_stats();
235
236
237 /*
238  * No.5-3 dbms_stats.invalidate_relation_cache
239  */
240 -- No.5-3-1
241 SELECT dbms_stats.invalidate_relation_cache();
242
243 -- No.5-3-2
244 /*
245  * Driver function dbms_stats.invalidate_cache1
246  */
247 CREATE TRIGGER invalidate_cache1
248  AFTER INSERT OR DELETE OR UPDATE
249     ON pt0
250    FOR EACH ROW EXECUTE PROCEDURE dbms_stats.invalidate_relation_cache();
251 INSERT INTO pt0 VALUES (1,'2012/12/12');
252 DROP TRIGGER invalidate_cache1 ON pt0;
253
254 -- No.5-3-3
255 /*
256  * Driver function dbms_stats.invalidate_cache2
257  */
258 CREATE TRIGGER invalidate_cache2
259 BEFORE INSERT OR DELETE OR UPDATE
260     ON pt0
261    FOR EACH STATEMENT EXECUTE PROCEDURE dbms_stats.invalidate_relation_cache();
262 INSERT INTO pt0 VALUES (1,'2012/12/12');
263 DROP TRIGGER invalidate_cache2 ON pt0;
264
265 -- No.5-3-4
266 /*
267  * Driver function dbms_stats.invalidate_cache3
268  */
269 CREATE TRIGGER invalidate_cache3
270 BEFORE TRUNCATE
271     ON pt0
272    FOR EACH STATEMENT EXECUTE PROCEDURE dbms_stats.invalidate_relation_cache();
273 TRUNCATE TABLE pt0;
274 DROP TRIGGER invalidate_cache3 ON pt0;
275
276 -- No.5-3-5
277 SELECT dbms_stats.unlock_database_stats();
278 SELECT dbms_stats.lock_table_stats('st1');
279 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
280 INSERT INTO dbms_stats.relation_stats_locked (relid, relname) VALUES (0, 'dummy');
281 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
282
283 -- No.5-3-6
284 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
285 INSERT INTO dbms_stats.relation_stats_locked (relid, relname)
286     VALUES ('st1_idx'::regclass, 'st1_idx');
287 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
288
289 -- No.5-3-7
290 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
291 INSERT INTO dbms_stats.relation_stats_locked (relid, relname)
292     VALUES ('complex'::regclass, 'complex');
293 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
294
295 -- No.5-3-9
296 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
297 UPDATE dbms_stats.relation_stats_locked SET curpages = 1
298  WHERE relid = 'st1'::regclass;
299 VACUUM ANALYZE;
300 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
301
302 -- No.5-3-10
303 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
304 DELETE FROM dbms_stats.relation_stats_locked
305  WHERE relid = 'st1'::regclass;
306 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
307
308 -- No.5-3-8
309 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
310 INSERT INTO dbms_stats.relation_stats_locked (relid, relname, curpages)
311     VALUES ('st1'::regclass, 'st1', 1);
312 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
313
314 -- No.5-3-11
315 SELECT dbms_stats.unlock_database_stats();
316 SELECT dbms_stats.lock_table_stats('st1');
317 SELECT relname, curpages FROM dbms_stats.relation_stats_locked
318  WHERE relid = 'st1'::regclass;
319 SELECT pg_sleep(0.7);
320 SELECT reset_stat_and_cache();
321 VACUUM ANALYZE;
322 UPDATE dbms_stats.relation_stats_locked SET curpages = 1000
323  WHERE relid = 'st1_exp'::regclass;
324 SELECT pg_sleep(0.7);
325 SELECT * FROM lockd_io;
326 SELECT reset_stat_and_cache();
327 SELECT relname, curpages FROM dbms_stats.relation_stats_locked
328  WHERE relid = 'st1'::regclass;
329 SELECT pg_sleep(0.7);
330 SELECT * FROM lockd_io;
331
332 /*
333  * No.5-4 StatsCacheRelCallback
334  */
335 -- No.5-4-1
336 UPDATE dbms_stats.relation_stats_locked SET curpages = 1
337  WHERE relid = 'st1'::regclass;
338 VACUUM ANALYZE;
339 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
340 \c
341 SET pg_dbms_stats.use_locked_stats to NO;
342 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
343 SET pg_dbms_stats.use_locked_stats to YES;
344 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
345
346 SELECT dbms_stats.unlock_database_stats();
347 SELECT dbms_stats.lock_table_stats('st1');
348 -- No.5-4-3
349 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
350 \! psql contrib_regression -c "UPDATE dbms_stats.column_stats_locked SET stanullfrac = 1 WHERE starelid = 'st1'::regclass"
351 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
352
353 -- No.5-4-4
354 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
355 \! psql contrib_regression -c "DELETE FROM dbms_stats.column_stats_locked WHERE starelid = 'st1'::regclass"
356 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
357
358 -- No.5-4-2
359 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
360 \! psql contrib_regression -c "INSERT INTO dbms_stats.column_stats_locked (starelid, staattnum, stainherit, stanullfrac) VALUES ('st1'::regclass, 1, false, 1)"
361 EXPLAIN (costs false) SELECT * FROM st1 WHERE val IS NULL;
362
363 SELECT dbms_stats.unlock_database_stats();
364
365 -- No.5-4-5
366 CREATE TABLE s0.droptest(id integer);
367 INSERT INTO s0.droptest VALUES (1),(2),(3);
368 VACUUM ANALYZE;
369 SELECT * FROM s0.droptest
370  WHERE id = 1;
371 SELECT pg_sleep(0.7);
372 SELECT reset_stat_and_cache();
373 ALTER TABLE s0.droptest RENAME TO test;
374 SELECT pg_sleep(0.7);
375 SELECT * FROM lockd_io;
376 SELECT reset_stat_and_cache();
377 SELECT * FROM s0.test
378  WHERE id = 1;
379 SELECT pg_sleep(0.7);
380 SELECT * FROM lockd_io;
381 ALTER TABLE s0.test RENAME TO droptest;
382
383 -- No.5-4-6
384 VACUUM ANALYZE;
385 SELECT * FROM s0.droptest
386  WHERE id = 1;
387 SELECT pg_sleep(0.7);
388 SELECT reset_stat_and_cache();
389 ALTER TABLE s0.droptest RENAME id TO test;
390 SELECT pg_sleep(0.7);
391 SELECT * FROM lockd_io;
392 SELECT reset_stat_and_cache();
393 SELECT * FROM s0.droptest
394  WHERE test = 1;
395 SELECT pg_sleep(0.7);
396 SELECT * FROM lockd_io;
397 ALTER TABLE s0.droptest RENAME test TO id;
398
399 -- No.5-4-8
400 INSERT INTO s0.droptest VALUES (4);
401 SELECT * FROM s0.droptest
402  WHERE id = 1;
403 SELECT pg_sleep(0.7);
404 SELECT reset_stat_and_cache();
405 ANALYZE;
406 SELECT pg_sleep(0.7);
407 SELECT * FROM lockd_io;
408 SELECT reset_stat_and_cache();
409 SELECT * FROM s0.droptest
410  WHERE id = 1;
411 SELECT pg_sleep(1.0);
412 SELECT * FROM lockd_io;
413
414 -- No.5-4-9
415 DELETE FROM s0.droptest;
416 INSERT INTO s0.droptest VALUES (4),(5);
417 SELECT * FROM s0.droptest
418  WHERE id = 4;
419 SELECT pg_sleep(0.7);
420 SELECT reset_stat_and_cache();
421 VACUUM ANALYZE;
422 SELECT pg_sleep(0.7);
423 SELECT * FROM lockd_io;
424 SELECT reset_stat_and_cache();
425 SELECT * FROM s0.droptest
426  WHERE id = 4;
427 SELECT pg_sleep(0.7);
428 SELECT * FROM lockd_io;
429
430 -- clean up
431 DROP TABLE s0.droptest;
432
433 /*
434  * No.6-1 dbms_stats.relname
435  */
436 -- No.6-1-1
437 SELECT dbms_stats.relname('aaa', 'bbb');
438 -- No.6-1-2
439 SELECT dbms_stats.relname(NULL, 'bbb');
440 -- No.6-1-3
441 SELECT dbms_stats.relname('aaa', NULL);
442 -- No.6-1-4
443 SELECT dbms_stats.relname(NULL, NULL);
444 -- No.6-1-5
445 SELECT dbms_stats.relname('', '');
446 -- No.6-1-6
447 SELECT dbms_stats.relname('aAa', 'bBb');
448 -- No.6-1-7
449 SELECT dbms_stats.relname('a a', 'b b');
450 -- No.6-1-8
451 SELECT dbms_stats.relname('a.a', 'b.b');
452 -- No.6-1-9
453 SELECT dbms_stats.relname(E'a\na', E'b\nb');
454 -- No.6-1-10
455 SELECT dbms_stats.relname('a"a', 'b"b');
456 -- No.6-1-11
457 SELECT dbms_stats.relname('あいう', '亞伊卯');
458
459 /*
460  * No.6-2 dbms_stats.is_system_schema
461  */
462 -- No.6-2-1
463 SELECT dbms_stats.is_system_schema('pg_catalog');
464 -- No.6-2-2
465 SELECT dbms_stats.is_system_schema('pg_toast');
466 -- No.6-2-3
467 SELECT dbms_stats.is_system_schema('information_schema');
468 -- No.6-2-4
469 SELECT dbms_stats.is_system_schema('dbms_stats');
470 -- No.6-2-5
471 SELECT dbms_stats.is_system_schema(NULL);
472 -- No.6-2-6
473 SELECT dbms_stats.is_system_schema('');
474 -- No.6-2-7
475 SELECT dbms_stats.is_system_schema('s0');
476 -- No.6-2-8
477 /*
478  * Driver function dbms_stats.is_system_schema1
479  */
480 CREATE FUNCTION dbms_stats.is_system_schema1(schemaname text)
481  RETURNS integer AS
482  '$libdir/pg_dbms_stats', 'dbms_stats_is_system_schema'
483  LANGUAGE C IMMUTABLE STRICT;
484 SELECT dbms_stats.is_system_schema1('s0');
485 DROP FUNCTION dbms_stats.is_system_schema1(schemaname text);
486
487 /*
488  * No.6-3 dbms_stats.is_system_catalog
489  */
490 -- No.6-3-1
491 SELECT dbms_stats.is_system_catalog('s0.st0');
492 -- No.6-3-2
493 SELECT dbms_stats.is_system_catalog('st0');
494 -- No.6-3-3
495 SELECT dbms_stats.is_system_catalog('s00.s0');
496 -- No.6-3-4
497 SELECT dbms_stats.is_system_catalog(NULL);
498 -- No.6-3-5
499 /*
500  * Driver function dbms_stats.is_system_catalog1
501  */
502 CREATE FUNCTION dbms_stats.is_system_catalog1(relid regclass)
503 RETURNS integer AS
504 '$libdir/pg_dbms_stats', 'dbms_stats_is_system_catalog'
505 LANGUAGE C STABLE;
506 SELECT dbms_stats.is_system_catalog1('s0.st0');
507 DROP FUNCTION dbms_stats.is_system_catalog1(relid regclass);
508
509
510 /*
511  * No.6-4 dbms_stats.is_target_relkind
512  */
513 -- No.6-4-1
514 SELECT dbms_stats.is_target_relkind('r');
515 -- No.6-4-2
516 SELECT dbms_stats.is_target_relkind('i');
517 -- No.6-4-3
518 SELECT dbms_stats.is_target_relkind('S');
519 -- No.6-4-4
520 SELECT dbms_stats.is_target_relkind('v');
521 -- No.6-4-5
522 SELECT dbms_stats.is_target_relkind('c');
523 -- No.6-4-6
524 SELECT dbms_stats.is_target_relkind('t');
525 -- No.6-4-7
526 SELECT dbms_stats.is_target_relkind('a');
527 -- No.6-4-8
528 SELECT dbms_stats.is_target_relkind('');
529 -- No.6-4-9
530 SELECT dbms_stats.is_target_relkind(NULL);
531 --#No.6-4-10 result varies according to a version
532 --#No.6-4-11 result varies according to a version
533
534 /*
535  * No.7-1 dbms_stats.backup
536  */
537 INSERT INTO dbms_stats.backup_history(id, time, unit) values(1, '2012-01-01', 'd');
538 -- No.7-1-1
539 DELETE FROM dbms_stats.relation_stats_backup;
540 SELECT dbms_stats.backup(1, 's0.st0'::regclass, NULL);
541 SELECT relid::regclass FROM dbms_stats.relation_stats_backup
542  GROUP BY relid
543  ORDER BY relid;
544 SELECT starelid::regclass, staattnum FROM dbms_stats.column_stats_backup
545  GROUP BY starelid, staattnum
546  ORDER BY starelid, staattnum;
547
548 -- No.7-1-2
549 DELETE FROM dbms_stats.relation_stats_backup;
550 SELECT dbms_stats.backup(1, 'st0'::regclass, NULL);
551 SELECT relid::regclass FROM dbms_stats.relation_stats_backup
552  GROUP BY relid
553  ORDER BY relid;
554 SELECT starelid::regclass, staattnum FROM dbms_stats.column_stats_backup
555  GROUP BY starelid, staattnum
556  ORDER BY starelid, staattnum;
557
558 -- No.7-1-3
559 DELETE FROM dbms_stats.relation_stats_backup;
560 SELECT dbms_stats.backup(1, 'public.notfound'::regclass, NULL);
561 SELECT count(*) FROM dbms_stats.relation_stats_backup;
562 SELECT count(*) FROM dbms_stats.column_stats_backup;
563
564 -- No.7-1-4
565 DELETE FROM dbms_stats.relation_stats_backup;
566 SELECT dbms_stats.backup(1, 's0.st0'::regclass, NULL);
567 SELECT relid::regclass FROM dbms_stats.relation_stats_backup
568  GROUP BY relid
569  ORDER BY relid;
570 SELECT starelid::regclass, staattnum FROM dbms_stats.column_stats_backup
571  GROUP BY starelid, staattnum
572  ORDER BY starelid, staattnum;
573
574 -- No.7-1-5
575 DELETE FROM dbms_stats.relation_stats_backup;
576 SELECT dbms_stats.backup(1, 'pg_toast.pg_toast_2618'::regclass, NULL);
577 SELECT relid::regclass FROM dbms_stats.relation_stats_backup
578  GROUP BY relid
579  ORDER BY relid;
580 SELECT starelid::regclass, staattnum FROM dbms_stats.column_stats_backup
581  GROUP BY starelid, staattnum
582  ORDER BY starelid, staattnum;
583
584 -- No.7-1-6
585 DELETE FROM dbms_stats.relation_stats_backup;
586 SELECT dbms_stats.backup(1, 's0.st0_idx'::regclass, NULL);
587 SELECT relid::regclass FROM dbms_stats.relation_stats_backup
588  GROUP BY relid
589  ORDER BY relid;
590 SELECT starelid::regclass, staattnum FROM dbms_stats.column_stats_backup
591  GROUP BY starelid, staattnum
592  ORDER BY starelid, staattnum;
593
594 -- No.7-1-7
595 DELETE FROM dbms_stats.relation_stats_backup;
596 SELECT dbms_stats.backup(1, 's0.ss0'::regclass, NULL);
597 SELECT count(*) FROM dbms_stats.relation_stats_backup;
598 SELECT count(*) FROM dbms_stats.column_stats_backup;
599
600 -- No.7-1-8
601 DELETE FROM dbms_stats.relation_stats_backup;
602 SELECT dbms_stats.backup(1, 's0.sc0'::regclass, NULL);
603 SELECT count(*) FROM dbms_stats.relation_stats_backup;
604 SELECT count(*) FROM dbms_stats.column_stats_backup;
605
606 --#No.7-1-9 ut-<PG Version>
607 --#No.7-1-10 ut-<PG Version>
608
609 -- No.7-1-11
610 DELETE FROM dbms_stats.relation_stats_backup;
611 SELECT dbms_stats.backup(1, 's0.st0'::regclass, 1::int2);
612 SELECT relid::regclass FROM dbms_stats.relation_stats_backup
613  GROUP BY relid
614  ORDER BY relid;
615 SELECT starelid::regclass, staattnum FROM dbms_stats.column_stats_backup
616  GROUP BY starelid, staattnum
617  ORDER BY starelid, staattnum;
618
619 --#No.7-1-12 ut-<PG Version>
620
621 -- No.7-1-13
622 DELETE FROM dbms_stats.relation_stats_backup;
623 SELECT dbms_stats.backup(1, 's0.st0'::regclass, NULL);
624 SELECT relid::regclass FROM dbms_stats.relation_stats_backup
625  GROUP BY relid
626  ORDER BY relid;
627 SELECT starelid::regclass, staattnum FROM dbms_stats.column_stats_backup
628  GROUP BY starelid, staattnum
629  ORDER BY starelid, staattnum;
630
631 --#No.7-1-14 ut-<PG Version>
632
633 -- No.7-1-15
634 DELETE FROM dbms_stats.relation_stats_backup;
635 SELECT dbms_stats.backup(1, 'pg_catalog.pg_class'::regclass, NULL);
636 SELECT count(*) FROM dbms_stats.relation_stats_backup;
637 SELECT count(*) FROM dbms_stats.column_stats_backup;
638
639 -- No.7-1-16
640 SELECT dbms_stats.backup(1, 's0.st0'::regclass, NULL);
641 DELETE FROM dbms_stats.column_stats_backup;
642 SELECT starelid::regclass, staattnum FROM dbms_stats.column_stats_backup
643  GROUP BY starelid, staattnum
644  ORDER BY starelid, staattnum;
645 SELECT count(*) FROM dbms_stats.relation_stats_backup;
646 -- SELECT dbms_stats.backup(1, 's0.st0'::regclass, NULL);
647 -- To avoid test unstability caused by relation id allocation, unique
648 -- constraint which used to be checked above is now checked more
649 -- directly in the following step.
650 SELECT ic.relname idxname, i.indisprimary
651  FROM pg_index i
652  JOIN pg_class c ON (c.oid = i.indrelid)
653  JOIN pg_namespace n ON (n.oid = c.relnamespace)
654  JOIN pg_class ic ON (ic.oid = i.indexrelid)
655  WHERE n.nspname = 'dbms_stats' AND c.relname = 'relation_stats_backup';
656 SELECT count(*) FROM dbms_stats.relation_stats_backup;
657 SELECT count(*) FROM dbms_stats.column_stats_backup;
658
659 --#No.7-1-18 ut-<PG Version>
660
661 /*
662  * Stab function dbms_stats.backup
663  */
664 ALTER FUNCTION dbms_stats.backup(
665     backup_id int8,
666     relid regclass,
667     attnum int2)
668     RENAME TO truth_func_backup;
669
670 CREATE OR REPLACE FUNCTION dbms_stats.backup(
671     backup_id int8,
672     regclass,
673     attnum int2)
674 RETURNS int8 AS
675 $$
676 BEGIN
677     RAISE NOTICE 'arguments are %, %, %', $1, $2, $3;
678     RETURN 1;
679 END;
680 $$
681 LANGUAGE plpgsql;
682
683 ALTER FUNCTION dbms_stats.backup(
684     relid regclass,
685     attname text,
686     comment text)
687     RENAME TO truth_func_backup;
688 CREATE OR REPLACE FUNCTION dbms_stats.backup(
689     relid regclass DEFAULT NULL,
690     attname text DEFAULT NULL,
691     comment text DEFAULT NULL)
692 RETURNS int8 AS
693 $$
694 BEGIN
695     IF $3 = '<NULL>' THEN
696         RAISE NOTICE 'third argument is not NULL but string "<NULL>"';
697     END IF;
698     RAISE NOTICE 'arguments are %, %, %', $1, $2, $3;
699     RETURN 1;
700 END;
701 $$
702 LANGUAGE plpgsql;
703
704 /*
705  * No.8-2 dbms_stats.backup_database_stats
706  */
707 SELECT setval('dbms_stats.backup_history_id_seq',8);
708 -- No.8-2-1
709 SELECT dbms_stats.backup_database_stats('comment');
710
711 /*
712  * No.8-4 dbms_stats.backup_table_stats(regclass,comment)
713  */
714 -- No.8-4-1
715 SELECT dbms_stats.backup_table_stats('s0.st0', 'comment');
716 -- No.8-4-2
717 SELECT dbms_stats.backup_table_stats('st0', 'comment');
718 -- No.8-4-3
719 SELECT dbms_stats.backup_table_stats('s00.s0', 'comment');
720
721 /*
722  * No.8-5 dbms_stats.backup_table_stats(schemaname, tablename, comment)
723  */
724 -- No.8-5-1
725 SELECT dbms_stats.backup_table_stats('s0', 'st0', 'comment');
726 -- No.8-5-2
727 SELECT dbms_stats.backup_table_stats('s00', 's0', 'comment');
728
729 /*
730  * No.8-6 dbms_stats.backup_column_stats(regclass, attname, comment)
731  */
732 -- No.8-6-1
733 SELECT dbms_stats.backup_column_stats('s0.st0', 'id', 'comment');
734 -- No.8-6-2
735 SELECT dbms_stats.backup_column_stats('st0', 'id', 'comment');
736 -- No.8-6-3
737 SELECT dbms_stats.backup_column_stats('s00.s0', 'id', 'comment');
738
739 /*
740  * No.8-7 dbms_stats.backup_column_stats(schemaname, tablename, attname, comment)
741  */
742 -- No.8-7-1
743 SELECT dbms_stats.backup_column_stats('s0', 'st0', 'id', 'comment');
744 -- No.8-7-2
745 SELECT dbms_stats.backup_column_stats('s00', 's0', 'id', 'comment');
746
747 /*
748  * Delete stab function dbms_stats.backup
749  */
750 DROP FUNCTION dbms_stats.backup(
751     backup_id int8,
752     regclass,
753     attnum int2);
754 ALTER FUNCTION dbms_stats.truth_func_backup(
755     backup_id int8,
756     regclass,
757     attnum int2)
758     RENAME TO backup;
759 DROP FUNCTION dbms_stats.backup(
760     regclass,
761     attname text,
762     comment text);
763 ALTER FUNCTION dbms_stats.truth_func_backup(
764     regclass,
765     attname text,
766     comment text)
767     RENAME TO backup;
768 VACUUM ANALYZE;
769
770 /*
771  * create backup statistics state A
772  */
773 DELETE FROM dbms_stats.backup_history;
774
775 INSERT INTO dbms_stats.backup_history(id, time, unit)
776     VALUES (1, '2012-02-29 23:59:56.999999', 'd');
777
778 SELECT setval('dbms_stats.backup_history_id_seq',1);
779 SELECT dbms_stats.backup();
780 UPDATE dbms_stats.backup_history
781    SET time = '2012-02-29 23:59:57'
782  WHERE id = 2;
783 SELECT dbms_stats.backup('s0.st0');
784 UPDATE dbms_stats.backup_history
785    SET time = '2012-02-29 23:59:57.000001'
786  WHERE id = 3;
787 SELECT dbms_stats.backup();
788 UPDATE dbms_stats.backup_history
789    SET time = '2012-02-29 23:59:58'
790  WHERE id = 4;
791 DELETE FROM dbms_stats.relation_stats_backup
792  WHERE id = 4;
793 SELECT dbms_stats.backup('s0.st0', 'id');
794 UPDATE dbms_stats.backup_history
795    SET time = '2012-03-01 00:00:00'
796  WHERE id = 5;
797 SELECT dbms_stats.backup('s0.st0');
798 UPDATE dbms_stats.backup_history
799    SET time = '2012-03-01 00:00:02'
800  WHERE id = 6;
801 SELECT dbms_stats.backup('public.st0');
802 UPDATE dbms_stats.backup_history
803    SET time = '2012-03-01 00:00:04'
804  WHERE id = 7;
805 INSERT INTO dbms_stats.backup_history(time, unit)
806     VALUES ('2012-03-01 00:00:06', 's');
807 SELECT dbms_stats.backup(8, c.oid, NULL)
808   FROM pg_catalog.pg_class c,
809        pg_catalog.pg_namespace n
810  WHERE n.nspname = 's0'
811    AND c.relnamespace = n.oid
812    AND c.relkind IN ('r', 'i');
813
814 SELECT * FROM dbms_stats.backup_history
815  ORDER BY id;
816
817 VACUUM ANALYZE;
818
819 /*
820  * Stab function dbms_stats.restore
821  */
822 ALTER FUNCTION dbms_stats.restore(int8, regclass, text)
823       RENAME TO truth_func_restore;
824 CREATE FUNCTION dbms_stats.restore(int8, regclass DEFAULT NULL, text DEFAULT NULL)
825 RETURNS SETOF regclass AS
826 $$
827 BEGIN
828     RAISE NOTICE 'arguments are "%, %, %"', $1, $2, $3;
829     RETURN QUERY
830         SELECT c.oid::regclass
831           FROM pg_class c, dbms_stats.relation_stats_backup b
832          WHERE (c.oid = $2 OR $2 IS NULL)
833            AND c.oid = b.relid
834            AND c.relkind IN ('r', 'i')
835            AND (b.id <= $1 OR $1 IS NOT NULL)
836          GROUP BY c.oid
837          ORDER BY c.oid::regclass::text;
838 END;
839 $$
840 LANGUAGE plpgsql;
841
842 /*
843  * No.10-3 dbms_stats.restore_table_stats(regclass, as_of_timestamp)
844  */
845 -- No.10-3-1
846 SELECT dbms_stats.restore_table_stats('s0.st0', '2012-02-29 23:59:57');
847 -- No.10-3-2
848 SELECT dbms_stats.restore_table_stats('s0.st0', '2012-02-29 23:59:57.000002');
849 -- No.10-3-3
850 SELECT dbms_stats.restore_table_stats('s0.st0', '2012-01-01 00:00:00');
851 --#No.10-3-4 is skipped after lock tests
852 -- No.10-3-5
853 SELECT dbms_stats.restore_table_stats('s0.st0', '2012-02-29 23:59:57');
854 -- No.10-3-6
855 SELECT dbms_stats.restore_table_stats('st0', '2012-02-29 23:59:57');
856 -- No.10-3-7
857 SELECT dbms_stats.restore_table_stats('s00.s0', '2012-02-29 23:59:57');
858 /*
859  * Stab dbms_stats.restore_table_stats(regclass, as_of_timestamp)
860  */
861 ALTER FUNCTION dbms_stats.restore_table_stats(regclass,
862                                                                                           timestamp with time zone)
863       RENAME TO truth_func_restore_table_stats;
864 CREATE OR REPLACE FUNCTION dbms_stats.restore_table_stats(
865     relid regclass,
866     as_of_timestamp timestamp with time zone)
867 RETURNS SETOF regclass AS
868 $$
869 BEGIN
870     RAISE NOTICE 'arguments are %, %', $1, $2;
871     RETURN QUERY
872         SELECT $1;
873 END
874 $$
875 LANGUAGE plpgsql;
876
877 /*
878  * No.10-4 dbms_stats.restore_table_stats(schemaname, tablename, as_of_timestamp)
879  */
880 -- No.10-4-1
881 SELECT dbms_stats.restore_table_stats('s0', 'st0', '2012-02-29 23:59:57');
882 DROP FUNCTION dbms_stats.restore_table_stats(regclass,
883                                                                                          timestamp with time zone);
884 ALTER FUNCTION dbms_stats.truth_func_restore_table_stats(regclass,
885                                                                                           timestamp with time zone)
886       RENAME TO restore_table_stats;
887
888 /*
889  * No.10-5 dbms_stats.restore_column_stats(regclass, attname, as_of_timestamp)
890  */
891 -- No.10-5-1
892 SELECT dbms_stats.restore_column_stats('s0.st0', 'id', '2012-02-29 23:59:57');
893 -- No.10-5-2
894 SELECT dbms_stats.restore_column_stats('s0.st0', 'id', '2012-02-29 23:59:57.000002');
895 -- No.10-5-3
896 SELECT dbms_stats.restore_column_stats('s0.st0', 'id', '2012-01-01 00:00:00');
897 --#No.10-5-4 is skipped after lock tests
898 -- No.10-5-5
899 SELECT dbms_stats.restore_column_stats('s0.st0', 'id', '2012-02-29 23:59:57');
900 -- No.10-5-6
901 SELECT dbms_stats.restore_column_stats('st0', 'id', '2012-02-29 23:59:57');
902 -- No.10-5-7
903 SELECT dbms_stats.restore_column_stats('s00.s0', 'id', '2012-02-29 23:59:57');
904
905 /*
906  * No.10-6 dbms_stats.restore_column_stats(
907  *        schemaname, tablename, attname, as_of_timestamp)
908  */
909 -- No.10-6-1
910 SELECT dbms_stats.restore_column_stats('s0', 'st0', 'id', '2012-02-29 23:59:57');
911
912 /*
913  * No.15-1 dbms_stats.purge_stats
914  */
915 -- No.15-1-1
916 SELECT * FROM dbms_stats.backup_history;
917 BEGIN;
918 SELECT relation::regclass, mode
919   FROM pg_locks
920   WHERE relation::regclass::text LIKE 'dbms_stats.\_%\_locked'
921      OR relation::regclass::text LIKE 'dbms_stats.backup_history'
922      OR relation::regclass::text LIKE 'dbms_stats.%\_backup'
923   ORDER BY relation::regclass::text, mode;
924 SELECT id, unit, comment FROM dbms_stats.purge_stats(2);
925 SELECT relation::regclass, mode
926   FROM pg_locks
927   WHERE relation::regclass::text LIKE 'dbms_stats.\_%\_locked'
928      OR relation::regclass::text LIKE 'dbms_stats.backup_history'
929      OR relation::regclass::text LIKE 'dbms_stats.%\_backup'
930   ORDER BY relation::regclass::text, mode;
931 COMMIT;
932 SELECT * FROM dbms_stats.backup_history;
933 -- No.15-1-6
934 SELECT id, unit, comment FROM dbms_stats.purge_stats(NULL);
935 -- No.15-1-7
936 SELECT id, unit, comment FROM dbms_stats.purge_stats(-1);
937 -- No.15-1-8
938 SELECT id, unit, comment FROM dbms_stats.purge_stats(2, NULL);
939 -- No.15-1-4
940 SELECT * FROM dbms_stats.backup_history;
941 SELECT id, unit, comment FROM dbms_stats.purge_stats(3);
942 SELECT * FROM dbms_stats.backup_history;
943 -- No.15-1-5
944 SELECT * FROM dbms_stats.backup_history;
945 SELECT id, unit, comment FROM dbms_stats.purge_stats(6);
946 SELECT * FROM dbms_stats.backup_history;
947 -- No.15-1-2
948 SELECT * FROM dbms_stats.backup_history;
949 SELECT id, unit, comment FROM dbms_stats.purge_stats(8);
950 SELECT * FROM dbms_stats.backup_history;
951 -- No.15-1-3
952 SELECT * FROM dbms_stats.backup_history;
953 SELECT id, unit, comment FROM dbms_stats.purge_stats(8, true);
954 SELECT * FROM dbms_stats.backup_history;
955
956 /*
957  * create backup statistics state A
958  */
959 DELETE FROM dbms_stats.backup_history;
960
961 INSERT INTO dbms_stats.backup_history(id, time, unit)
962     VALUES (1, '2012-02-29 23:59:56.999999', 'd');
963
964 SELECT setval('dbms_stats.backup_history_id_seq',1);
965 SELECT dbms_stats.backup();
966 UPDATE dbms_stats.backup_history
967    SET time = '2012-02-29 23:59:57'
968  WHERE id = 2;
969 SELECT dbms_stats.backup('s0.st0');
970 UPDATE dbms_stats.backup_history
971    SET time = '2012-02-29 23:59:57.000001'
972  WHERE id = 3;
973 SELECT dbms_stats.backup();
974 UPDATE dbms_stats.backup_history
975    SET time = '2012-02-29 23:59:58'
976  WHERE id = 4;
977 DELETE FROM dbms_stats.relation_stats_backup
978  WHERE id = 4;
979 SELECT dbms_stats.backup('s0.st0', 'id');
980 UPDATE dbms_stats.backup_history
981    SET time = '2012-03-01 00:00:00'
982  WHERE id = 5;
983 SELECT dbms_stats.backup('s0.st0');
984 UPDATE dbms_stats.backup_history
985    SET time = '2012-03-01 00:00:02'
986  WHERE id = 6;
987 SELECT dbms_stats.backup('public.st0');
988 UPDATE dbms_stats.backup_history
989    SET time = '2012-03-01 00:00:04'
990  WHERE id = 7;
991 INSERT INTO dbms_stats.backup_history(time, unit)
992     VALUES ('2012-03-01 00:00:06', 's');
993 SELECT dbms_stats.backup(8, c.oid, NULL)
994   FROM pg_catalog.pg_class c,
995        pg_catalog.pg_namespace n
996  WHERE n.nspname = 's0'
997    AND c.relnamespace = n.oid
998    AND c.relkind IN ('r', 'i');
999
1000 /*
1001  * restore test when only backup data does not exist 's0' schema
1002  */
1003 DELETE FROM dbms_stats.column_stats_backup;
1004 DELETE FROM dbms_stats.relation_stats_backup
1005  WHERE relname LIKE 's0.%';
1006 SELECT count(*) FROM dbms_stats.relation_stats_backup;
1007 SELECT count(*) FROM dbms_stats.column_stats_backup;
1008 -- No.10-2-8
1009 SELECT dbms_stats.restore_schema_stats('s0', '2012-03-01 00:00:04');
1010
1011 /*
1012  * restore test when there are only backup hisotory
1013  */
1014 DELETE FROM dbms_stats.relation_stats_backup;
1015 SELECT count(*) FROM dbms_stats.relation_stats_backup;
1016 SELECT count(*) FROM dbms_stats.column_stats_backup;
1017 -- No.10-1-5
1018 SELECT dbms_stats.restore_database_stats('2012-02-29 23:59:58');
1019 -- No.10-2-5
1020 SELECT dbms_stats.restore_schema_stats('s0', '2012-02-29 23:59:58');
1021 /*
1022  * restore when Backup does not exist
1023  */
1024 DELETE FROM dbms_stats.backup_history;
1025 SELECT count(*) FROM dbms_stats.backup_history;
1026 SELECT count(*) FROM dbms_stats.relation_stats_backup;
1027 SELECT count(*) FROM dbms_stats.column_stats_backup;
1028
1029 -- No.10-1-4
1030 SELECT dbms_stats.restore_database_stats('2012-02-29 23:59:57');
1031 -- No.10-2-4
1032 SELECT dbms_stats.restore_schema_stats('s0', '2012-02-29 23:59:57');
1033 -- No.10-3-4
1034 SELECT dbms_stats.restore_table_stats('s0.st0', '2012-02-29 23:59:57');
1035 -- No.10-5-4
1036 SELECT dbms_stats.restore_column_stats('s0.st0', 'id', '2012-02-29 23:59:57');
1037
1038 /*
1039  * Delete stab function dbms_stats.restore
1040  */
1041 DROP FUNCTION dbms_stats.restore(int8, regclass, text);
1042 ALTER FUNCTION dbms_stats.truth_func_restore(int8, regclass, text)
1043       RENAME TO restore;
1044
1045 /*
1046  * No.18-1 dbms_stats.clean_up_stats
1047  */
1048 CREATE TABLE clean_test(id integer, num integer);
1049 INSERT INTO clean_test SELECT i, i FROM generate_series(1,10) t(i);
1050 ANALYZE clean_test;
1051 -- No.18-1-1
1052 -- No.18-1-5
1053 SELECT dbms_stats.lock_table_stats('clean_test');
1054 SELECT count(*) FROM dbms_stats.relation_stats_locked;
1055 SELECT count(*) FROM dbms_stats.column_stats_locked;
1056 SELECT dbms_stats.clean_up_stats();
1057 SELECT count(*) FROM dbms_stats.relation_stats_locked;
1058 SELECT count(*) FROM dbms_stats.column_stats_locked;
1059 -- No.18-1-2
1060 -- No.18-1-7
1061 DELETE FROM dbms_stats.relation_stats_locked;
1062 SELECT count(*) FROM dbms_stats.relation_stats_locked;
1063 SELECT count(*) FROM dbms_stats.column_stats_locked;
1064 SELECT dbms_stats.clean_up_stats();
1065 SELECT count(*) FROM dbms_stats.relation_stats_locked;
1066 SELECT count(*) FROM dbms_stats.column_stats_locked;
1067 -- No.18-1-3
1068 SELECT dbms_stats.lock_table_stats('clean_test');
1069 DROP TABLE clean_test;
1070 SELECT count(*) FROM dbms_stats.relation_stats_locked;
1071 SELECT dbms_stats.clean_up_stats();
1072 SELECT count(*) FROM dbms_stats.relation_stats_locked;
1073 -- No.18-1-4
1074 DELETE FROM dbms_stats.relation_stats_locked;
1075 SELECT count(*) FROM dbms_stats.relation_stats_locked;
1076 SELECT dbms_stats.clean_up_stats();
1077 SELECT count(*) FROM dbms_stats.relation_stats_locked;
1078 -- No.18-1-6
1079 CREATE TABLE clean_test(id integer, num integer);
1080 INSERT INTO clean_test SELECT i, i FROM generate_series(1,10) t(i);
1081 ANALYZE clean_test;
1082 SELECT dbms_stats.lock_table_stats('clean_test');
1083 ALTER TABLE clean_test DROP COLUMN num;
1084 ALTER TABLE clean_test ADD num integer;
1085 UPDATE dbms_stats.column_stats_locked
1086    SET staattnum = 3
1087  WHERE starelid = 'clean_test'::regclass
1088    AND staattnum = 2;
1089 UPDATE clean_test SET num = id;
1090 SELECT count(*) FROM pg_statistic
1091  WHERE starelid = 'clean_test'::regclass;
1092 SELECT count(*) FROM dbms_stats.column_stats_locked
1093  WHERE starelid = 'clean_test'::regclass;
1094 SELECT dbms_stats.clean_up_stats();
1095 SELECT count(*) FROM dbms_stats.column_stats_locked
1096  WHERE starelid = 'clean_test'::regclass;
1097 -- No.18-1-8
1098 DELETE FROM dbms_stats.column_stats_locked
1099  WHERE starelid = 'clean_test'::regclass
1100    AND staattnum = 3;
1101 SELECT count(*) FROM pg_statistic
1102  WHERE starelid = 'clean_test'::regclass;
1103 SELECT count(*) FROM dbms_stats.column_stats_locked
1104  WHERE starelid = 'clean_test'::regclass;
1105 SELECT dbms_stats.clean_up_stats();
1106 SELECT count(*) FROM dbms_stats.column_stats_locked
1107  WHERE starelid = 'clean_test'::regclass;
1108 -- No.18-1-9
1109 ANALYZE clean_test;
1110 SELECT dbms_stats.lock_table_stats('clean_test');
1111 ALTER TABLE clean_test DROP COLUMN num;
1112 SELECT count(*) FROM dbms_stats.column_stats_locked
1113  WHERE starelid = 'clean_test'::regclass;
1114 SELECT dbms_stats.clean_up_stats();
1115 SELECT count(*) FROM dbms_stats.column_stats_locked
1116  WHERE starelid = 'clean_test'::regclass;
1117 -- No.18-1-10
1118 DELETE FROM dbms_stats.column_stats_locked
1119  WHERE starelid = 'clean_test'::regclass
1120    AND staattnum = 3;
1121 SELECT count(*) FROM dbms_stats.column_stats_locked
1122  WHERE starelid = 'clean_test'::regclass;
1123 SELECT dbms_stats.clean_up_stats();
1124 SELECT count(*) FROM dbms_stats.column_stats_locked
1125  WHERE starelid = 'clean_test'::regclass;
1126 DELETE FROM dbms_stats.relation_stats_locked;
1127 DROP TABLE clean_test;
1128
1129 /*
1130  * No.19-1 dummy statistics view for general users privileges.
1131  */
1132 SET SESSION AUTHORIZATION regular_user;
1133 -- No.19-1-1
1134 SELECT count(*) FROM dbms_stats.relation_stats_locked WHERE false;
1135 -- No.19-1-2
1136 SELECT count(*) FROM dbms_stats.column_stats_locked WHERE false;
1137 -- No.19-1-3
1138 SELECT count(*) FROM dbms_stats.stats WHERE false;
1139 RESET SESSION AUTHORIZATION;
1140
1141 /*
1142  * No.20-1 confirm change at 1.3.5.
1143  */
1144 SELECT CURRENT_USER;
1145 CREATE TABLE s0.st4 (a int, b text);
1146 CREATE INDEX i_st4_a on s0.st4 (a);
1147 CREATE VIEW s0.vst4 AS select * FROM s0.st4;
1148 GRANT SELECT ON s0.vst4 TO regular_user;
1149 INSERT INTO s0.st4 (SELECT a, a::text FROM generate_series(0, 999) a);
1150 ANALYZE s0.st4;
1151 SELECT dbms_stats.lock('s0.st4');
1152 DELETE FROM s0.st4;
1153 INSERT INTO s0.st4 (SELECT 1, a::text FROM generate_series(0, 999) a);
1154 ANALYZE s0.st4;
1155
1156 EXPLAIN (COSTS OFF) SELECT * FROM s0.vst4 WHERE a = 1;
1157 EXPLAIN (COSTS OFF) SELECT * FROM s0.st4  WHERE a = 1;
1158
1159 SET SESSION AUTHORIZATION regular_user;
1160
1161 EXPLAIN (COSTS OFF) SELECT * FROM s0.st4  WHERE a = 1;
1162 EXPLAIN (COSTS OFF) SELECT * FROM s0.vst4 WHERE a = 1;
1163
1164 SET pg_dbms_stats.use_locked_stats TO off;
1165 EXPLAIN (COSTS OFF) SELECT * FROM s0.vst4 WHERE a = 1;
1166 \c - super_user
1167 ALTER TABLE dbms_stats.relation_stats_locked OWNER TO super_user;
1168
1169 SELECT dbms_stats.unlock('s0.st4');
1170 DROP TABLE s0.st4 CASCADE;