postgresql/src/backend/commands
Alvaro Herrera 71f4c8c6f7
ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY
Allow a partition be detached from its partitioned table without
blocking concurrent queries, by running in two transactions and only
requiring ShareUpdateExclusive in the partitioned table.

Because it runs in two transactions, it cannot be used in a transaction
block.  This is the main reason to use dedicated syntax: so that users
can choose to use the original mode if they need it.  But also, it
doesn't work when a default partition exists (because an exclusive lock
would still need to be obtained on it, in order to change its partition
constraint.)

In case the second transaction is cancelled or a crash occurs, there's
ALTER TABLE .. DETACH PARTITION .. FINALIZE, which executes the final
steps.

The main trick to make this work is the addition of column
pg_inherits.inhdetachpending, initially false; can only be set true in
the first part of this command.  Once that is committed, concurrent
transactions that use a PartitionDirectory will include or ignore
partitions so marked: in optimizer they are ignored if the row is marked
committed for the snapshot; in executor they are always included.  As a
result, and because of the way PartitionDirectory caches partition
descriptors, queries that were planned before the detach will see the
rows in the detached partition and queries that are planned after the
detach, won't.

A CHECK constraint is created that duplicates the partition constraint.
This is probably not strictly necessary, and some users will prefer to
remove it afterwards, but if the partition is re-attached to a
partitioned table, the constraint needn't be rechecked.

Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
Reviewed-by: Amit Langote <amitlangote09@gmail.com>
Reviewed-by: Justin Pryzby <pryzby@telsasoft.com>
Discussion: https://postgr.es/m/20200803234854.GA24158@alvherre.pgsql
2021-03-25 18:00:28 -03:00
..
Makefile Split copy.c into four files. 2020-11-23 10:50:50 +02:00
aggregatecmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
alter.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
amcmds.c Fix some typos, grammar and style in docs and comments 2021-02-24 16:13:17 +09:00
analyze.c Use pre-fetching for ANALYZE 2021-03-16 14:46:48 -04:00
async.c Remove server and libpq support for old FE/BE protocol version 2. 2021-03-04 10:45:55 +02:00
cluster.c Refactor option handling of CLUSTER, REINDEX and VACUUM 2021-01-18 14:03:10 +09:00
collationcmds.c Validate the OID argument of pg_import_system_collations(). 2021-03-08 18:21:51 -05:00
comment.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
constraint.c Pass down "logically unchanged index" hint. 2021-01-13 08:11:00 -08:00
conversioncmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
copy.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
copyfrom.c Add support for more progress reporting in COPY 2021-03-09 14:21:03 +09:00
copyfromparse.c Remove server and libpq support for old FE/BE protocol version 2. 2021-03-04 10:45:55 +02:00
copyto.c Add support for more progress reporting in COPY 2021-03-09 14:21:03 +09:00
createas.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
dbcommands.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
define.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
discard.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
dropcmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
event_trigger.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
explain.c Add TID Range Scans to support efficient scanning ranges of TIDs 2021-02-27 22:59:36 +13:00
extension.c Add mbverifystr() functions specific to each encoding. 2021-01-28 14:40:07 +02:00
foreigncmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
functioncmds.c Re-implement pl/pgsql's expression and assignment parsing. 2021-01-04 11:52:00 -05:00
indexcmds.c ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY 2021-03-25 18:00:28 -03:00
lockcmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
matview.c Enable parallelism in REFRESH MATERIALIZED VIEW. 2021-03-17 15:04:17 +13:00
opclasscmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
operatorcmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
policy.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
portalcmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
prepare.c Improve performance of repeated CALLs within plpgsql procedures. 2021-01-25 22:28:29 -05:00
proclang.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
publicationcmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
schemacmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
seclabel.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
sequence.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
statscmds.c Disallow CREATE STATISTICS on system catalogs 2021-01-15 23:31:22 +01:00
subscriptioncmds.c Use errmsg_internal for debug messages 2021-02-17 11:33:25 +01:00
tablecmds.c ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY 2021-03-25 18:00:28 -03:00
tablespace.c Prevent drop of tablespaces used by partitioned relations 2021-01-14 15:32:14 -03:00
trigger.c ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY 2021-03-25 18:00:28 -03:00
tsearchcmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
typecmds.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
user.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
vacuum.c ReadNewTransactionId() -> ReadNextTransactionId(). 2021-02-15 13:17:02 +13:00
variable.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
view.c Update copyright for 2021 2021-01-02 13:06:25 -05:00