Doc: improve description of IN and row-constructor comparisons.

IN and NOT IN work fine on records and arrays, so just say that
they accept "expressions" not "scalar expressions".  I think that
that phrasing was meant to say that they don't work on set-returning
expressions, but that's not the common meaning of "scalar".

Revise the description of row-constructor comparisons to make it
perhaps a bit less confusing.  (This partially reverts some
dubious wording changes made by commit f56651519.)

Per gripe from Ilya Nenashev.  Back-patch to supported branches.
In HEAD and v16, also drop a NOTE about pre-8.2 behavior, which
is hopefully no longer of interest to anybody.

Discussion: https://postgr.es/m/168968062460.632.14303906825812821399@wrigleys.postgresql.org
This commit is contained in:
Tom Lane 2023-07-19 11:00:34 -04:00
parent df73e8bad6
commit fd7c944690
1 changed files with 14 additions and 16 deletions

View File

@ -15565,7 +15565,7 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
<para> <para>
The right-hand side is a parenthesized list The right-hand side is a parenthesized list
of scalar expressions. The result is <quote>true</quote> if the left-hand expression's of expressions. The result is <quote>true</quote> if the left-hand expression's
result is equal to any of the right-hand expressions. This is a shorthand result is equal to any of the right-hand expressions. This is a shorthand
notation for notation for
@ -15596,7 +15596,7 @@ OR
<para> <para>
The right-hand side is a parenthesized list The right-hand side is a parenthesized list
of scalar expressions. The result is <quote>true</quote> if the left-hand expression's of expressions. The result is <quote>true</quote> if the left-hand expression's
result is unequal to all of the right-hand expressions. This is a shorthand result is unequal to all of the right-hand expressions. This is a shorthand
notation for notation for
@ -15707,26 +15707,24 @@ AND
<para> <para>
Each side is a row constructor, Each side is a row constructor,
as described in <xref linkend="sql-syntax-row-constructors"/>. as described in <xref linkend="sql-syntax-row-constructors"/>.
The two row values must have the same number of fields. The two row constructors must have the same number of fields.
Each side is evaluated and they are compared row-wise. Row constructor The given <replaceable>operator</replaceable> is applied to each pair
comparisons are allowed when the <replaceable>operator</replaceable> is of corresponding fields. (Since the fields could be of different
types, this means that a different specific operator could be selected
for each pair.)
All the selected operators must be members of some B-tree operator
class, or be the negator of an <literal>=</literal> member of a B-tree
operator class, meaning that row constructor comparison is only
possible when the <replaceable>operator</replaceable> is
<literal>=</literal>, <literal>=</literal>,
<literal>&lt;&gt;</literal>, <literal>&lt;&gt;</literal>,
<literal>&lt;</literal>, <literal>&lt;</literal>,
<literal>&lt;=</literal>, <literal>&lt;=</literal>,
<literal>&gt;</literal> or <literal>&gt;</literal>, or
<literal>&gt;=</literal>. <literal>&gt;=</literal>,
Every row element must be of a type which has a default B-tree operator or has semantics similar to one of these.
class or the attempted comparison may generate an error.
</para> </para>
<note>
<para>
Errors related to the number or types of elements might not occur if
the comparison is resolved using earlier columns.
</para>
</note>
<para> <para>
The <literal>=</literal> and <literal>&lt;&gt;</literal> cases work slightly differently The <literal>=</literal> and <literal>&lt;&gt;</literal> cases work slightly differently
from the others. Two rows are considered from the others. Two rows are considered