2002-08-22 06:51:06 +02:00
|
|
|
-- Test basic TRUNCATE functionality.
|
|
|
|
CREATE TABLE truncate_a (col1 integer primary key);
|
|
|
|
INSERT INTO truncate_a VALUES (1);
|
|
|
|
INSERT INTO truncate_a VALUES (2);
|
|
|
|
SELECT * FROM truncate_a;
|
2002-11-23 05:05:52 +01:00
|
|
|
-- Roll truncate back
|
|
|
|
BEGIN;
|
2002-08-22 06:51:06 +02:00
|
|
|
TRUNCATE truncate_a;
|
2002-11-23 05:05:52 +01:00
|
|
|
ROLLBACK;
|
|
|
|
SELECT * FROM truncate_a;
|
|
|
|
-- Commit the truncate this time
|
|
|
|
BEGIN;
|
|
|
|
TRUNCATE truncate_a;
|
|
|
|
COMMIT;
|
2002-08-22 06:51:06 +02:00
|
|
|
SELECT * FROM truncate_a;
|
|
|
|
|
2005-01-27 04:19:37 +01:00
|
|
|
-- Test foreign-key checks
|
|
|
|
CREATE TABLE trunc_b (a int REFERENCES truncate_a);
|
|
|
|
CREATE TABLE trunc_c (a serial PRIMARY KEY);
|
|
|
|
CREATE TABLE trunc_d (a int REFERENCES trunc_c);
|
|
|
|
CREATE TABLE trunc_e (a int REFERENCES truncate_a, b int REFERENCES trunc_c);
|
|
|
|
|
|
|
|
TRUNCATE TABLE truncate_a; -- fail
|
|
|
|
TRUNCATE TABLE truncate_a,trunc_b; -- fail
|
|
|
|
TRUNCATE TABLE truncate_a,trunc_b,trunc_e; -- ok
|
|
|
|
TRUNCATE TABLE truncate_a,trunc_e; -- fail
|
|
|
|
TRUNCATE TABLE trunc_c; -- fail
|
|
|
|
TRUNCATE TABLE trunc_c,trunc_d; -- fail
|
|
|
|
TRUNCATE TABLE trunc_c,trunc_d,trunc_e; -- ok
|
|
|
|
TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a; -- fail
|
|
|
|
TRUNCATE TABLE trunc_c,trunc_d,trunc_e,truncate_a,trunc_b; -- ok
|
|
|
|
|
2006-03-03 04:30:54 +01:00
|
|
|
TRUNCATE TABLE truncate_a RESTRICT; -- fail
|
|
|
|
TRUNCATE TABLE truncate_a CASCADE; -- ok
|
|
|
|
|
2005-01-27 04:19:37 +01:00
|
|
|
-- circular references
|
|
|
|
ALTER TABLE truncate_a ADD FOREIGN KEY (col1) REFERENCES trunc_c;
|
|
|
|
|
|
|
|
-- Add some data to verify that truncating actually works ...
|
|
|
|
INSERT INTO trunc_c VALUES (1);
|
2002-08-22 06:51:06 +02:00
|
|
|
INSERT INTO truncate_a VALUES (1);
|
2005-01-27 04:19:37 +01:00
|
|
|
INSERT INTO trunc_b VALUES (1);
|
|
|
|
INSERT INTO trunc_d VALUES (1);
|
|
|
|
INSERT INTO trunc_e VALUES (1,1);
|
|
|
|
TRUNCATE TABLE trunc_c;
|
2006-06-29 18:07:29 +02:00
|
|
|
TRUNCATE TABLE trunc_c,truncate_a;
|
|
|
|
TRUNCATE TABLE trunc_c,truncate_a,trunc_d;
|
|
|
|
TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e;
|
|
|
|
TRUNCATE TABLE trunc_c,truncate_a,trunc_d,trunc_e,trunc_b;
|
2005-01-27 04:19:37 +01:00
|
|
|
|
|
|
|
-- Verify that truncating did actually work
|
|
|
|
SELECT * FROM truncate_a
|
|
|
|
UNION ALL
|
|
|
|
SELECT * FROM trunc_c
|
|
|
|
UNION ALL
|
|
|
|
SELECT * FROM trunc_b
|
|
|
|
UNION ALL
|
|
|
|
SELECT * FROM trunc_d;
|
|
|
|
SELECT * FROM trunc_e;
|
2002-08-22 06:51:06 +02:00
|
|
|
|
2006-03-03 04:30:54 +01:00
|
|
|
-- Add data again to test TRUNCATE ... CASCADE
|
|
|
|
INSERT INTO trunc_c VALUES (1);
|
|
|
|
INSERT INTO truncate_a VALUES (1);
|
|
|
|
INSERT INTO trunc_b VALUES (1);
|
|
|
|
INSERT INTO trunc_d VALUES (1);
|
|
|
|
INSERT INTO trunc_e VALUES (1,1);
|
|
|
|
|
|
|
|
TRUNCATE TABLE trunc_c CASCADE; -- ok
|
|
|
|
|
|
|
|
SELECT * FROM truncate_a
|
|
|
|
UNION ALL
|
|
|
|
SELECT * FROM trunc_c
|
|
|
|
UNION ALL
|
|
|
|
SELECT * FROM trunc_b
|
|
|
|
UNION ALL
|
|
|
|
SELECT * FROM trunc_d;
|
|
|
|
SELECT * FROM trunc_e;
|
|
|
|
|
2005-01-27 04:19:37 +01:00
|
|
|
DROP TABLE truncate_a,trunc_c,trunc_b,trunc_d,trunc_e CASCADE;
|
2008-03-28 01:21:56 +01:00
|
|
|
|
|
|
|
-- Test ON TRUNCATE triggers
|
|
|
|
|
|
|
|
CREATE TABLE trunc_trigger_test (f1 int, f2 text, f3 text);
|
|
|
|
CREATE TABLE trunc_trigger_log (tgop text, tglevel text, tgwhen text,
|
|
|
|
tgargv text, tgtable name, rowcount bigint);
|
|
|
|
|
|
|
|
CREATE FUNCTION trunctrigger() RETURNS trigger as $$
|
|
|
|
declare c bigint;
|
|
|
|
begin
|
|
|
|
execute 'select count(*) from ' || quote_ident(tg_table_name) into c;
|
|
|
|
insert into trunc_trigger_log values
|
|
|
|
(TG_OP, TG_LEVEL, TG_WHEN, TG_ARGV[0], tg_table_name, c);
|
|
|
|
return null;
|
|
|
|
end;
|
|
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
|
|
|
|
-- basic before trigger
|
|
|
|
INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux');
|
|
|
|
|
|
|
|
CREATE TRIGGER t
|
|
|
|
BEFORE TRUNCATE ON trunc_trigger_test
|
|
|
|
FOR EACH STATEMENT
|
|
|
|
EXECUTE PROCEDURE trunctrigger('before trigger truncate');
|
|
|
|
|
|
|
|
SELECT count(*) as "Row count in test table" FROM trunc_trigger_test;
|
|
|
|
SELECT * FROM trunc_trigger_log;
|
|
|
|
TRUNCATE trunc_trigger_test;
|
|
|
|
SELECT count(*) as "Row count in test table" FROM trunc_trigger_test;
|
|
|
|
SELECT * FROM trunc_trigger_log;
|
|
|
|
|
|
|
|
DROP TRIGGER t ON trunc_trigger_test;
|
|
|
|
|
|
|
|
truncate trunc_trigger_log;
|
|
|
|
|
|
|
|
-- same test with an after trigger
|
|
|
|
INSERT INTO trunc_trigger_test VALUES(1, 'foo', 'bar'), (2, 'baz', 'quux');
|
|
|
|
|
|
|
|
CREATE TRIGGER tt
|
|
|
|
AFTER TRUNCATE ON trunc_trigger_test
|
|
|
|
FOR EACH STATEMENT
|
|
|
|
EXECUTE PROCEDURE trunctrigger('after trigger truncate');
|
|
|
|
|
|
|
|
SELECT count(*) as "Row count in test table" FROM trunc_trigger_test;
|
|
|
|
SELECT * FROM trunc_trigger_log;
|
|
|
|
TRUNCATE trunc_trigger_test;
|
|
|
|
SELECT count(*) as "Row count in test table" FROM trunc_trigger_test;
|
|
|
|
SELECT * FROM trunc_trigger_log;
|
|
|
|
|
|
|
|
DROP TABLE trunc_trigger_test;
|
|
|
|
DROP TABLE trunc_trigger_log;
|
|
|
|
|
|
|
|
DROP FUNCTION trunctrigger();
|
2008-05-17 01:36:05 +02:00
|
|
|
|
|
|
|
-- test TRUNCATE ... RESTART IDENTITY
|
|
|
|
CREATE SEQUENCE truncate_a_id1 START WITH 33;
|
|
|
|
CREATE TABLE truncate_a (id serial,
|
|
|
|
id1 integer default nextval('truncate_a_id1'));
|
|
|
|
ALTER SEQUENCE truncate_a_id1 OWNED BY truncate_a.id1;
|
|
|
|
|
|
|
|
INSERT INTO truncate_a DEFAULT VALUES;
|
|
|
|
INSERT INTO truncate_a DEFAULT VALUES;
|
|
|
|
SELECT * FROM truncate_a;
|
|
|
|
|
|
|
|
TRUNCATE truncate_a;
|
|
|
|
|
|
|
|
INSERT INTO truncate_a DEFAULT VALUES;
|
|
|
|
INSERT INTO truncate_a DEFAULT VALUES;
|
|
|
|
SELECT * FROM truncate_a;
|
|
|
|
|
|
|
|
TRUNCATE truncate_a RESTART IDENTITY;
|
|
|
|
|
|
|
|
INSERT INTO truncate_a DEFAULT VALUES;
|
|
|
|
INSERT INTO truncate_a DEFAULT VALUES;
|
|
|
|
SELECT * FROM truncate_a;
|
|
|
|
|
|
|
|
DROP TABLE truncate_a;
|
|
|
|
|
|
|
|
SELECT nextval('truncate_a_id1'); -- fail, seq should have been dropped
|