aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2018-11-05 09:15:08 +0900
committerMichael Paquier <michael@paquier.xyz>2018-11-05 09:15:08 +0900
commit948af52324fb0ab635ebb1c1379980dbfc589aba (patch)
treebcf6b05b64bce58d63ad5257269d2e855c6f6f2e /src
parent84010b9989d92bd7fb4a4b7c0e96dbe81ef101f4 (diff)
downloadpostgresql-948af52324fb0ab635ebb1c1379980dbfc589aba.tar.gz
postgresql-948af52324fb0ab635ebb1c1379980dbfc589aba.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/heap.c7
-rw-r--r--src/test/regress/expected/temp.out17
-rw-r--r--src/test/regress/sql/temp.sql14
3 files changed, 38 insertions, 0 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 61ce44830bd..4e2ce4c44ef 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -3146,6 +3146,13 @@ heap_truncate_one_rel(Relation rel)
{
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) */
RelationTruncate(rel, 0);
diff --git a/src/test/regress/expected/temp.out b/src/test/regress/expected/temp.out
index addf1ec4443..a769abe9bba 100644
--- a/src/test/regress/expected/temp.out
+++ b/src/test/regress/expected/temp.out
@@ -199,3 +199,20 @@ select pg_temp.whoami();
(1 row)
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;
diff --git a/src/test/regress/sql/temp.sql b/src/test/regress/sql/temp.sql
index 5183c727f5e..1074c7cfac8 100644
--- a/src/test/regress/sql/temp.sql
+++ b/src/test/regress/sql/temp.sql
@@ -151,3 +151,17 @@ select whoami();
select pg_temp.whoami();
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;