On Thu, Feb 13, 2020 at 11:26:45AM -0500, Tom Lane wrote: > I see where you're coming from, but I do not think that repeating the > whole from_item syntax in UPDATE and DELETE is the best way forward. > In the first place, we'd inevitably forget to update those copies, > and in the second, I'm not sure that the syntax is all that helpful > without all the supporting text in the SELECT ref page --- which > surely we aren't going to duplicate. > > I think the real problem with the places Alexey is on about is that > they're too waffle-y. They use wording like "similar to", leaving > one wondering what discrepancies exist but are being papered over. > In point of fact, as a look into gram.y will show, what you can > write after UPDATE ... FROM or DELETE ... USING is *exactly* the > same thing as what you can write after SELECT ... FROM. So what > I'm in favor of here is: > > * Change the synopsis entries to look like "FROM from_item [, ...]" > and "USING from_item [, ...]", so that they match the SELECT > synopsis exactly. > > * In the text, describe from_item as being exactly the same as > it is in SELECT. > > (Compare the handling of with_query, which has pretty much the > same problem of being way too complex to document three times.)
I have implemented the ideas above in the attached patch. I have synchronized the syntax to match SELECT, and synchronized the paragraphs describing the item. -- Bruce Momjian <br...@momjian.us> https://momjian.us EnterpriseDB https://enterprisedb.com + As you are, so once was I. As I am, so you will be. + + Ancient Roman grave inscription +
diff --git a/doc/src/sgml/ref/delete.sgml b/doc/src/sgml/ref/delete.sgml index df8cea48cf..9f0ef0e681 100644 --- a/doc/src/sgml/ref/delete.sgml +++ b/doc/src/sgml/ref/delete.sgml @@ -23,7 +23,7 @@ PostgreSQL documentation <synopsis> [ WITH [ RECURSIVE ] <replaceable class="parameter">with_query</replaceable> [, ...] ] DELETE FROM [ ONLY ] <replaceable class="parameter">table_name</replaceable> [ * ] [ [ AS ] <replaceable class="parameter">alias</replaceable> ] - [ USING <replaceable class="parameter">using_list</replaceable> ] + [ USING <replaceable class="parameter">using_item</replaceable> [, ...] ] [ WHERE <replaceable class="parameter">condition</replaceable> | WHERE CURRENT OF <replaceable class="parameter">cursor_name</replaceable> ] [ RETURNING * | <replaceable class="parameter">output_expression</replaceable> [ [ AS ] <replaceable class="parameter">output_name</replaceable> ] [, ...] ] </synopsis> @@ -117,17 +117,18 @@ DELETE FROM [ ONLY ] <replaceable class="parameter">table_name</replaceable> [ * </varlistentry> <varlistentry> - <term><replaceable class="parameter">using_list</replaceable></term> + <term><replaceable class="parameter">using_item</replaceable></term> <listitem> <para> - A list of table expressions, allowing columns from other tables - to appear in the <literal>WHERE</literal> condition. This is similar - to the list of tables that can be specified in the <xref - linkend="sql-from" endterm="sql-from-title"/> of a - <command>SELECT</command> statement; for example, an alias for - the table name can be specified. Do not repeat the target table - in the <replaceable class="parameter">using_list</replaceable>, - unless you wish to set up a self-join. + A table expression allowing columns from other tables to appear + in the <literal>WHERE</literal> condition. This is the same as + the table that can be specified in the <xref linkend="sql-from" + endterm="sql-from-title"/> of a <command>SELECT</command> + statement; for example, an alias for the table name can be + specified. Do not repeat the target table as a <replaceable + class="parameter">using_item</replaceable> unless you wish to set + up a self-join (in which case it must appear with an alias in the + <replaceable>using_item</replaceable>). </para> </listitem> </varlistentry> diff --git a/doc/src/sgml/ref/update.sgml b/doc/src/sgml/ref/update.sgml index f58dcd8877..d1e74a7c3b 100644 --- a/doc/src/sgml/ref/update.sgml +++ b/doc/src/sgml/ref/update.sgml @@ -27,7 +27,7 @@ UPDATE [ ONLY ] <replaceable class="parameter">table_name</replaceable> [ * ] [ ( <replaceable class="parameter">column_name</replaceable> [, ...] ) = [ ROW ] ( { <replaceable class="parameter">expression</replaceable> | DEFAULT } [, ...] ) | ( <replaceable class="parameter">column_name</replaceable> [, ...] ) = ( <replaceable class="parameter">sub-SELECT</replaceable> ) } [, ...] - [ FROM <replaceable class="parameter">from_list</replaceable> ] + [ FROM <replaceable class="parameter">from_item</replaceable> [, ...] ] [ WHERE <replaceable class="parameter">condition</replaceable> | WHERE CURRENT OF <replaceable class="parameter">cursor_name</replaceable> ] [ RETURNING * | <replaceable class="parameter">output_expression</replaceable> [ [ AS ] <replaceable class="parameter">output_name</replaceable> ] [, ...] ] </synopsis> @@ -164,17 +164,18 @@ UPDATE [ ONLY ] <replaceable class="parameter">table_name</replaceable> [ * ] [ </varlistentry> <varlistentry> - <term><replaceable class="parameter">from_list</replaceable></term> + <term><replaceable class="parameter">from_item</replaceable></term> <listitem> <para> - A list of table expressions, allowing columns from other tables - to appear in the <literal>WHERE</literal> condition and the update - expressions. This is similar to the list of tables that can be - specified in the <xref linkend="sql-from" - endterm="sql-from-title"/> of a <command>SELECT</command> - statement. Note that the target table must not appear in the - <replaceable>from_list</replaceable>, unless you intend a self-join (in which - case it must appear with an alias in the <replaceable>from_list</replaceable>). + A table expression allowing columns from other tables to + appear in the <literal>WHERE</literal> condition and update + expressions. This is the same as the table that can be specified + in the <xref linkend="sql-from" endterm="sql-from-title"/> of a + <command>SELECT</command> statement; for example, an alias for + the table name can be specified. Do not repeat the target table + as a <replaceable>from_item</replaceable> unless you intend a + self-join (in which case it must appear with an alias in the + <replaceable>from_item</replaceable>). </para> </listitem> </varlistentry> @@ -264,7 +265,7 @@ UPDATE <replaceable class="parameter">count</replaceable> <para> When a <literal>FROM</literal> clause is present, what essentially happens is that the target table is joined to the tables mentioned in the - <replaceable>from_list</replaceable>, and each output row of the join + <replaceable>from_item</replaceable> list, and each output row of the join represents an update operation for the target table. When using <literal>FROM</literal> you should ensure that the join produces at most one output row for each row to be modified. In