Fix xslt_process() to ensure that it inserts a NULL terminator after the
[PostgreSQL.git] / src / test / regress / expected / truncate.out
blob7f43df710c6736ac1e12c5d394e5433405ffd0bc
1 -- Test basic TRUNCATE functionality.
2 CREATE TABLE truncate_a (col1 integer primary key);
3 NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "truncate_a_pkey" for table "truncate_a"
4 INSERT INTO truncate_a VALUES (1);
5 INSERT INTO truncate_a VALUES (2);
6 SELECT * FROM truncate_a;
7  col1 
8 ------
9     1
10     2
11 (2 rows)
13 -- Roll truncate back
14 BEGIN;
15 TRUNCATE truncate_a;
16 ROLLBACK;
17 SELECT * FROM truncate_a;
18  col1 
19 ------
20     1
21     2
22 (2 rows)
24 -- Commit the truncate this time
25 BEGIN;
26 TRUNCATE truncate_a;
27 COMMIT;
28 SELECT * FROM truncate_a;
29  col1 
30 ------
31 (0 rows)
33 -- Test foreign-key checks
34 CREATE TABLE trunc_b (a int REFERENCES truncate_a);
35 CREATE TABLE trunc_c (a serial PRIMARY KEY);
36 NOTICE:  CREATE TABLE will create implicit sequence "trunc_c_a_seq" for serial column "trunc_c.a"
37 NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "trunc_c_pkey" for table "trunc_c"
38 CREATE TABLE trunc_d (a int REFERENCES trunc_c);
39 CREATE TABLE trunc_e (a int REFERENCES truncate_a, b int REFERENCES trunc_c);
40 TRUNCATE TABLE truncate_a;              -- fail
41 ERROR:  cannot truncate a table referenced in a foreign key constraint
42 DETAIL:  Table "trunc_b" references "truncate_a".
43 HINT:  Truncate table "trunc_b" at the same time, or use TRUNCATE ... CASCADE.
44 TRUNCATE TABLE truncate_a,trunc_b;              -- fail
45 ERROR:  cannot truncate a table referenced in a foreign key constraint
46 DETAIL:  Table "trunc_e" references "truncate_a".
47 HINT:  Truncate table "trunc_e" at the same time, or use TRUNCATE ... CASCADE.
48 TRUNCATE TABLE truncate_a,trunc_b,trunc_e;      -- ok
49 TRUNCATE TABLE truncate_a,trunc_e;              -- fail
50 ERROR:  cannot truncate a table referenced in a foreign key constraint
51 DETAIL:  Table "trunc_b" references "truncate_a".
52 HINT:  Truncate table "trunc_b" at the same time, or use TRUNCATE ... CASCADE.
53 TRUNCATE TABLE trunc_c;         -- fail
54 ERROR:  cannot truncate a table referenced in a foreign key constraint
55 DETAIL:  Table "trunc_d" references "trunc_c".
56 HINT:  Truncate table "trunc_d" at the same time, or use TRUNCATE ... CASCADE.
57 TRUNCATE TABLE trunc_c,trunc_d;         -- fail
58 ERROR:  cannot truncate a table referenced in a foreign key constraint
59 DETAIL:  Table "trunc_e" references "trunc_c".
60 HINT:  Truncate table "trunc_e" at the same time, or use TRUNCATE ... CASCADE.
61 TRUNCATE TABLE trunc_c,trunc_d,trunc_e; -- ok
62 TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a;      -- fail
63 ERROR:  cannot truncate a table referenced in a foreign key constraint
64 DETAIL:  Table "trunc_b" references "truncate_a".
65 HINT:  Truncate table "trunc_b" at the same time, or use TRUNCATE ... CASCADE.
66 TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a,trunc_b;      -- ok
67 TRUNCATE TABLE truncate_a RESTRICT; -- fail
68 ERROR:  cannot truncate a table referenced in a foreign key constraint
69 DETAIL:  Table "trunc_b" references "truncate_a".
70 HINT:  Truncate table "trunc_b" at the same time, or use TRUNCATE ... CASCADE.
71 TRUNCATE TABLE truncate_a CASCADE;  -- ok
72 NOTICE:  truncate cascades to table "trunc_b"
73 NOTICE:  truncate cascades to table "trunc_e"
74 -- circular references
75 ALTER TABLE truncate_a ADD FOREIGN KEY (col1) REFERENCES trunc_c;
76 -- Add some data to verify that truncating actually works ...
77 INSERT INTO trunc_c VALUES (1);
78 INSERT INTO truncate_a VALUES (1);
79 INSERT INTO trunc_b VALUES (1);
80 INSERT INTO trunc_d VALUES (1);
81 INSERT INTO trunc_e VALUES (1,1);
82 TRUNCATE TABLE trunc_c;
83 ERROR:  cannot truncate a table referenced in a foreign key constraint
84 DETAIL:  Table "truncate_a" references "trunc_c".
85 HINT:  Truncate table "truncate_a" at the same time, or use TRUNCATE ... CASCADE.
86 TRUNCATE TABLE trunc_c,truncate_a;
87 ERROR:  cannot truncate a table referenced in a foreign key constraint
88 DETAIL:  Table "trunc_d" references "trunc_c".
89 HINT:  Truncate table "trunc_d" at the same time, or use TRUNCATE ... CASCADE.
90 TRUNCATE TABLE trunc_c,truncate_a,trunc_d;
91 ERROR:  cannot truncate a table referenced in a foreign key constraint
92 DETAIL:  Table "trunc_e" references "trunc_c".
93 HINT:  Truncate table "trunc_e" at the same time, or use TRUNCATE ... CASCADE.
94 TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e;
95 ERROR:  cannot truncate a table referenced in a foreign key constraint
96 DETAIL:  Table "trunc_b" references "truncate_a".
97 HINT:  Truncate table "trunc_b" at the same time, or use TRUNCATE ... CASCADE.
98 TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e,trunc_b;
99 -- Verify that truncating did actually work
100 SELECT * FROM truncate_a
101    UNION ALL
102  SELECT * FROM trunc_c
103    UNION ALL
104  SELECT * FROM trunc_b
105    UNION ALL
106  SELECT * FROM trunc_d;
107  col1 
108 ------
109 (0 rows)
111 SELECT * FROM trunc_e;
112  a | b 
113 ---+---
114 (0 rows)
116 -- Add data again to test TRUNCATE ... CASCADE
117 INSERT INTO trunc_c VALUES (1);
118 INSERT INTO truncate_a VALUES (1);
119 INSERT INTO trunc_b VALUES (1);
120 INSERT INTO trunc_d VALUES (1);
121 INSERT INTO trunc_e VALUES (1,1);
122 TRUNCATE TABLE trunc_c CASCADE;  -- ok
123 NOTICE:  truncate cascades to table "truncate_a"
124 NOTICE:  truncate cascades to table "trunc_d"
125 NOTICE:  truncate cascades to table "trunc_e"
126 NOTICE:  truncate cascades to table "trunc_b"
127 SELECT * FROM truncate_a
128    UNION ALL
129  SELECT * FROM trunc_c
130    UNION ALL
131  SELECT * FROM trunc_b
132    UNION ALL
133  SELECT * FROM trunc_d;
134  col1 
135 ------
136 (0 rows)
138 SELECT * FROM trunc_e;
139  a | b 
140 ---+---
141 (0 rows)
143 DROP TABLE truncate_a,trunc_c,trunc_b,trunc_d,trunc_e CASCADE;
144 -- Test TRUNCATE with inheritance
145 CREATE TABLE trunc_f (col1 integer primary key);
146 NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "trunc_f_pkey" for table "trunc_f"
147 INSERT INTO trunc_f VALUES (1);
148 INSERT INTO trunc_f VALUES (2);
149 CREATE TABLE trunc_fa (col2a text) INHERITS (trunc_f);
150 INSERT INTO trunc_fa VALUES (3, 'three');
151 CREATE TABLE trunc_fb (col2b int) INHERITS (trunc_f);
152 INSERT INTO trunc_fb VALUES (4, 444);
153 CREATE TABLE trunc_faa (col3 text) INHERITS (trunc_fa);
154 INSERT INTO trunc_faa VALUES (5, 'five', 'FIVE');
155 BEGIN;
156 SELECT * FROM trunc_f;
157  col1 
158 ------
159     1
160     2
161     3
162     4
163     5
164 (5 rows)
166 TRUNCATE trunc_f;
167 SELECT * FROM trunc_f;
168  col1 
169 ------
170 (0 rows)
172 ROLLBACK;
173 BEGIN;
174 SELECT * FROM trunc_f;
175  col1 
176 ------
177     1
178     2
179     3
180     4
181     5
182 (5 rows)
184 TRUNCATE ONLY trunc_f;
185 SELECT * FROM trunc_f;
186  col1 
187 ------
188     3
189     4
190     5
191 (3 rows)
193 ROLLBACK;
194 BEGIN;
195 SELECT * FROM trunc_f;
196  col1 
197 ------
198     1
199     2
200     3
201     4
202     5
203 (5 rows)
205 SELECT * FROM trunc_fa;
206  col1 | col2a 
207 ------+-------
208     3 | three
209     5 | five
210 (2 rows)
212 SELECT * FROM trunc_faa;
213  col1 | col2a | col3 
214 ------+-------+------
215     5 | five  | FIVE
216 (1 row)
218 TRUNCATE ONLY trunc_fb, ONLY trunc_fa;
219 SELECT * FROM trunc_f;
220  col1 
221 ------
222     1
223     2
224     5
225 (3 rows)
227 SELECT * FROM trunc_fa;
228  col1 | col2a 
229 ------+-------
230     5 | five
231 (1 row)
233 SELECT * FROM trunc_faa;
234  col1 | col2a | col3 
235 ------+-------+------
236     5 | five  | FIVE
237 (1 row)
239 ROLLBACK;
240 BEGIN;
241 SELECT * FROM trunc_f;
242  col1 
243 ------
244     1
245     2
246     3
247     4
248     5
249 (5 rows)
251 SELECT * FROM trunc_fa;
252  col1 | col2a 
253 ------+-------
254     3 | three
255     5 | five
256 (2 rows)
258 SELECT * FROM trunc_faa;
259  col1 | col2a | col3 
260 ------+-------+------
261     5 | five  | FIVE
262 (1 row)
264 TRUNCATE ONLY trunc_fb, trunc_fa;
265 SELECT * FROM trunc_f;
266  col1 
267 ------
268     1
269     2
270 (2 rows)
272 SELECT * FROM trunc_fa;
273  col1 | col2a 
274 ------+-------
275 (0 rows)
277 SELECT * FROM trunc_faa;
278  col1 | col2a | col3 
279 ------+-------+------
280 (0 rows)
282 ROLLBACK;
283 DROP TABLE trunc_f CASCADE;
284 NOTICE:  drop cascades to 3 other objects
285 DETAIL:  drop cascades to table trunc_fa
286 drop cascades to table trunc_faa
287 drop cascades to table trunc_fb
288 -- Test ON TRUNCATE triggers
289 CREATE TABLE trunc_trigger_test (f1 int, f2 text, f3 text);
290 CREATE TABLE trunc_trigger_log (tgop text, tglevel text, tgwhen text,
291         tgargv text, tgtable name, rowcount bigint);
292 CREATE FUNCTION trunctrigger() RETURNS trigger as $$
293 declare c bigint;
294 begin
295     execute 'select count(*) from ' || quote_ident(tg_table_name) into c;
296     insert into trunc_trigger_log values
297       (TG_OP, TG_LEVEL, TG_WHEN, TG_ARGV[0], tg_table_name, c);
298     return null;
299 end;
300 $$ LANGUAGE plpgsql;
301 -- basic before trigger
302 INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux');
303 CREATE TRIGGER t
304 BEFORE TRUNCATE ON trunc_trigger_test
305 FOR EACH STATEMENT 
306 EXECUTE PROCEDURE trunctrigger('before trigger truncate');
307 SELECT count(*) as "Row count in test table" FROM trunc_trigger_test;
308  Row count in test table 
309 -------------------------
310                        2
311 (1 row)
313 SELECT * FROM trunc_trigger_log;
314  tgop | tglevel | tgwhen | tgargv | tgtable | rowcount 
315 ------+---------+--------+--------+---------+----------
316 (0 rows)
318 TRUNCATE trunc_trigger_test;
319 SELECT count(*) as "Row count in test table" FROM trunc_trigger_test;
320  Row count in test table 
321 -------------------------
322                        0
323 (1 row)
325 SELECT * FROM trunc_trigger_log;
326    tgop   |  tglevel  | tgwhen |         tgargv          |      tgtable       | rowcount 
327 ----------+-----------+--------+-------------------------+--------------------+----------
328  TRUNCATE | STATEMENT | BEFORE | before trigger truncate | trunc_trigger_test |        2
329 (1 row)
331 DROP TRIGGER t ON trunc_trigger_test;
332 truncate trunc_trigger_log;
333 -- same test with an after trigger
334 INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux');
335 CREATE TRIGGER tt
336 AFTER TRUNCATE ON trunc_trigger_test
337 FOR EACH STATEMENT 
338 EXECUTE PROCEDURE trunctrigger('after trigger truncate');
339 SELECT count(*) as "Row count in test table" FROM trunc_trigger_test;
340  Row count in test table 
341 -------------------------
342                        2
343 (1 row)
345 SELECT * FROM trunc_trigger_log;
346  tgop | tglevel | tgwhen | tgargv | tgtable | rowcount 
347 ------+---------+--------+--------+---------+----------
348 (0 rows)
350 TRUNCATE trunc_trigger_test;
351 SELECT count(*) as "Row count in test table" FROM trunc_trigger_test;
352  Row count in test table 
353 -------------------------
354                        0
355 (1 row)
357 SELECT * FROM trunc_trigger_log;
358    tgop   |  tglevel  | tgwhen |         tgargv         |      tgtable       | rowcount 
359 ----------+-----------+--------+------------------------+--------------------+----------
360  TRUNCATE | STATEMENT | AFTER  | after trigger truncate | trunc_trigger_test |        0
361 (1 row)
363 DROP TABLE trunc_trigger_test;
364 DROP TABLE trunc_trigger_log;
365 DROP FUNCTION trunctrigger();
366 -- test TRUNCATE ... RESTART IDENTITY
367 CREATE SEQUENCE truncate_a_id1 START WITH 33;
368 CREATE TABLE truncate_a (id serial,
369                          id1 integer default nextval('truncate_a_id1'));
370 NOTICE:  CREATE TABLE will create implicit sequence "truncate_a_id_seq" for serial column "truncate_a.id"
371 ALTER SEQUENCE truncate_a_id1 OWNED BY truncate_a.id1;
372 INSERT INTO truncate_a DEFAULT VALUES;
373 INSERT INTO truncate_a DEFAULT VALUES;
374 SELECT * FROM truncate_a;
375  id | id1 
376 ----+-----
377   1 |  33
378   2 |  34
379 (2 rows)
381 TRUNCATE truncate_a;
382 INSERT INTO truncate_a DEFAULT VALUES;
383 INSERT INTO truncate_a DEFAULT VALUES;
384 SELECT * FROM truncate_a;
385  id | id1 
386 ----+-----
387   3 |  35
388   4 |  36
389 (2 rows)
391 TRUNCATE truncate_a RESTART IDENTITY;
392 INSERT INTO truncate_a DEFAULT VALUES;
393 INSERT INTO truncate_a DEFAULT VALUES;
394 SELECT * FROM truncate_a;
395  id | id1 
396 ----+-----
397   1 |  33
398   2 |  34
399 (2 rows)
401 DROP TABLE truncate_a;
402 SELECT nextval('truncate_a_id1'); -- fail, seq should have been dropped
403 ERROR:  relation "truncate_a_id1" does not exist
404 LINE 1: SELECT nextval('truncate_a_id1');
405                        ^