summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-04-10 13:12:58 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2020-04-10 13:12:58 -0400
commit1d676ffd41be443d0c7a715f3e03841430ba4a2b (patch)
tree2987e717282434cbb110aca6776a7b1e4ce2b17f
parent89e54113416018ad5fadeeca8e009a2e1dc233cd (diff)
Doc: clarify locking requirements for ALTER TABLE ADD FOREIGN KEY.
The docs explained that a SHARE ROW EXCLUSIVE lock is needed on the referenced table, but failed to say the same about the table being altered. Since the page says that ACCESS EXCLUSIVE lock is taken unless otherwise stated, this left readers with the wrong conclusion. Discussion: https://postgr.es/m/834603375.3470346.1586482852542@mail.yahoo.com
-rw-r--r--doc/src/sgml/ref/alter_table.sgml21
1 files changed, 16 insertions, 5 deletions
diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml
index 68df9745d80..b3ae1455353 100644
--- a/doc/src/sgml/ref/alter_table.sgml
+++ b/doc/src/sgml/ref/alter_table.sgml
@@ -92,9 +92,9 @@ ALTER TABLE ALL IN TABLESPACE <replaceable class="PARAMETER">name</replaceable>
<para>
<command>ALTER TABLE</command> changes the definition of an existing table.
There are several subforms described below. Note that the lock level required
- may differ for each subform. An <literal>ACCESS EXCLUSIVE</literal> lock is held
- unless explicitly noted. When multiple subcommands are listed, the lock
- held will be the strictest one required from any subcommand.
+ may differ for each subform. An <literal>ACCESS EXCLUSIVE</literal> lock is
+ acquired unless explicitly noted. When multiple subcommands are given, the
+ lock acquired will be the strictest one required by any subcommand.
<variablelist>
<varlistentry>
@@ -260,8 +260,8 @@ ALTER TABLE ALL IN TABLESPACE <replaceable class="PARAMETER">name</replaceable>
<term><literal>ADD <replaceable class="PARAMETER">table_constraint</replaceable> [ NOT VALID ]</literal></term>
<listitem>
<para>
- This form adds a new constraint to a table using the same syntax as
- <xref linkend="SQL-CREATETABLE">, plus the option <literal>NOT
+ This form adds a new constraint to a table using the same constraint
+ syntax as <xref linkend="sql-createtable">, plus the option <literal>NOT
VALID</literal>, which is currently only allowed for foreign key
and CHECK constraints.
</para>
@@ -282,6 +282,17 @@ ALTER TABLE ALL IN TABLESPACE <replaceable class="PARAMETER">name</replaceable>
endterm="sql-altertable-notes-title"> below for more information
about using the <literal>NOT VALID</literal> option.
</para>
+
+ <para>
+ Although most forms of <literal>ADD
+ <replaceable class="parameter">table_constraint</replaceable></literal>
+ require an <literal>ACCESS EXCLUSIVE</literal> lock, <literal>ADD
+ FOREIGN KEY</literal> requires only a <literal>SHARE ROW
+ EXCLUSIVE</literal> lock. Note that <literal>ADD FOREIGN KEY</literal>
+ also acquires a <literal>SHARE ROW EXCLUSIVE</literal> lock on the
+ referenced table, in addition to the lock on the table on which the
+ constraint is declared.
+ </para>
</listitem>
</varlistentry>