postgresql/src/backend/parser
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
..
.gitignore Convert cvsignore to gitignore, and add .gitignore for build targets. 2010-09-22 12:57:04 +02:00
Makefile Split all OBJS style lines in makefiles into one-line-per-entry style. 2019-11-05 14:41:07 -08:00
README Move keywords.c/kwlookup.c into src/common/. 2016-03-23 20:22:08 -04:00
analyze.c Implement GROUP BY DISTINCT 2021-03-18 18:22:18 +01:00
check_keywords.pl Update copyright for 2021 2021-01-02 13:06:25 -05:00
gram.y ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY 2021-03-25 18:00:28 -03:00
parse_agg.c Use lfirst_int in cmp_list_len_contents_asc 2021-03-20 00:04:25 +01:00
parse_clause.c Remove no-longer-used RTE argument of markVarForSelectPriv(). 2021-02-11 11:23:25 -05:00
parse_coerce.c Re-implement pl/pgsql's expression and assignment parsing. 2021-01-04 11:52:00 -05:00
parse_collate.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
parse_cte.c Fix list-manipulation bug in WITH RECURSIVE processing. 2021-02-25 20:47:32 -05:00
parse_enr.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
parse_expr.c Remove no-longer-used RTE argument of markVarForSelectPriv(). 2021-02-11 11:23:25 -05:00
parse_func.c SEARCH and CYCLE clauses 2021-02-01 14:32:51 +01:00
parse_node.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
parse_oper.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
parse_param.c Update copyright for 2021 2021-01-02 13:06:25 -05:00
parse_relation.c Remove no-longer-used RTE argument of markVarForSelectPriv(). 2021-02-11 11:23:25 -05:00
parse_target.c Remove no-longer-used RTE argument of markVarForSelectPriv(). 2021-02-11 11:23:25 -05:00
parse_type.c Add the ability for the core grammar to have more than one parse target. 2021-01-04 11:03:22 -05:00
parse_utilcmd.c Allow configurable LZ4 TOAST compression. 2021-03-19 15:10:38 -04:00
parser.c Re-implement pl/pgsql's expression and assignment parsing. 2021-01-04 11:52:00 -05:00
scan.l Update copyright for 2021 2021-01-02 13:06:25 -05:00
scansup.c Update copyright for 2021 2021-01-02 13:06:25 -05:00

README

src/backend/parser/README

Parser
======

This directory does more than tokenize and parse SQL queries.  It also
creates Query structures for the various complex queries that are passed
to the optimizer and then executor.

parser.c	things start here
scan.l		break query into tokens
scansup.c	handle escapes in input strings
gram.y		parse the tokens and produce a "raw" parse tree
analyze.c	top level of parse analysis for optimizable queries
parse_agg.c	handle aggregates, like SUM(col1),  AVG(col2), ...
parse_clause.c	handle clauses like WHERE, ORDER BY, GROUP BY, ...
parse_coerce.c	handle coercing expressions to different data types
parse_collate.c	assign collation information in completed expressions
parse_cte.c	handle Common Table Expressions (WITH clauses)
parse_expr.c	handle expressions like col, col + 3, x = 3 or x = 4
parse_func.c	handle functions, table.column and column identifiers
parse_node.c	create nodes for various structures
parse_oper.c	handle operators in expressions
parse_param.c	handle Params (for the cases used in the core backend)
parse_relation.c support routines for tables and column handling
parse_target.c	handle the result list of the query
parse_type.c	support routines for data type handling
parse_utilcmd.c	parse analysis for utility commands (done at execution time)

See also src/common/keywords.c, which contains the table of standard
keywords and the keyword lookup function.  We separated that out because
various frontend code wants to use it too.