Commit 4bc772e2 authored by Michael Paquier's avatar Michael Paquier

Ignore partitioned tables when processing ON COMMIT DELETE ROWS

Those tables have no physical storage, making this option unusable with
partition trees as at commit time an actual truncation was attempted.
There are still issues with the way ON COMMIT actions are done when
mixing several action types, however this impacts as well inheritance
trees, so this issue will be dealt with later.

Reported-by: Rajkumar Raghuwanshi
Author: Amit Langote
Reviewed-by: Michael Paquier, Tom Lane
Discussion: https://postgr.es/m/CAKcux6mhgcjSiB_egqEAEFgX462QZtncU8QCAJ2HZwM-wWGVew@mail.gmail.com
parent fa534b41
...@@ -3181,6 +3181,13 @@ heap_truncate_one_rel(Relation rel) ...@@ -3181,6 +3181,13 @@ heap_truncate_one_rel(Relation rel)
{ {
Oid toastrelid; Oid toastrelid;
/*
* Truncate the relation. Partitioned tables have no storage, so there is
* nothing to do for them here.
*/
if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
return;
/* Truncate the actual file (and discard buffers) */ /* Truncate the actual file (and discard buffers) */
RelationTruncate(rel, 0); RelationTruncate(rel, 0);
......
...@@ -199,3 +199,20 @@ select pg_temp.whoami(); ...@@ -199,3 +199,20 @@ select pg_temp.whoami();
(1 row) (1 row)
drop table public.whereami; drop table public.whereami;
-- For partitioned temp tables, ON COMMIT actions ignore storage-less
-- partitioned tables.
begin;
create temp table temp_parted_oncommit (a int)
partition by list (a) on commit delete rows;
create temp table temp_parted_oncommit_1
partition of temp_parted_oncommit
for values in (1) on commit delete rows;
insert into temp_parted_oncommit values (1);
commit;
-- partitions are emptied by the previous commit
select * from temp_parted_oncommit;
a
---
(0 rows)
drop table temp_parted_oncommit;
...@@ -151,3 +151,17 @@ select whoami(); ...@@ -151,3 +151,17 @@ select whoami();
select pg_temp.whoami(); select pg_temp.whoami();
drop table public.whereami; drop table public.whereami;
-- For partitioned temp tables, ON COMMIT actions ignore storage-less
-- partitioned tables.
begin;
create temp table temp_parted_oncommit (a int)
partition by list (a) on commit delete rows;
create temp table temp_parted_oncommit_1
partition of temp_parted_oncommit
for values in (1) on commit delete rows;
insert into temp_parted_oncommit values (1);
commit;
-- partitions are emptied by the previous commit
select * from temp_parted_oncommit;
drop table temp_parted_oncommit;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment