aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-08-17 15:40:07 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2020-08-17 15:40:07 -0400
commit314f65716c37d515979eb2f06430b18bb7a09a0d (patch)
tree551486be67e88ce7f2e5816483f68eb5d0ea542a
parent9f44d71b06b0d457ad3e5d7fdcbba2039f3000ef (diff)
downloadpostgresql-314f65716c37d515979eb2f06430b18bb7a09a0d.tar.gz
postgresql-314f65716c37d515979eb2f06430b18bb7a09a0d.zip
Doc: fix description of UNION/CASE/etc type unification.
The description of what select_common_type() does was not terribly accurate. Improve it. David Johnston and Tom Lane Discussion: https://postgr.es/m/1019930.1597613200@sss.pgh.pa.us
-rw-r--r--doc/src/sgml/typeconv.sgml33
1 files changed, 19 insertions, 14 deletions
diff --git a/doc/src/sgml/typeconv.sgml b/doc/src/sgml/typeconv.sgml
index 81dba7dacfe..8900d0eb383 100644
--- a/doc/src/sgml/typeconv.sgml
+++ b/doc/src/sgml/typeconv.sgml
@@ -1069,7 +1069,7 @@ domain's base type for all subsequent steps.
functions, this behavior allows a domain type to be preserved through
a <literal>UNION</literal> or similar construct, so long as the user is
careful to ensure that all inputs are implicitly or explicitly of that
- exact type. Otherwise the domain's base type will be preferred.
+ exact type. Otherwise the domain's base type will be used.
</para>
</footnote>
</para>
@@ -1092,24 +1092,29 @@ If the non-unknown inputs are not all of the same type category, fail.
<step performance="required">
<para>
-Choose the first non-unknown input type which is a preferred type in
-that category, if there is one.
-</para>
-</step>
-
-<step performance="required">
-<para>
-Otherwise, choose the last non-unknown input type that allows all the
-preceding non-unknown inputs to be implicitly converted to it. (There
-always is such a type, since at least the first type in the list must
-satisfy this condition.)
+Select the first non-unknown input type as the candidate type,
+then consider each other non-unknown input type, left to right.
+ <footnote>
+ <para>
+ For historical reasons, <literal>CASE</literal> treats
+ its <literal>ELSE</literal> clause (if any) as the <quote>first</quote>
+ input, with the <literal>THEN</literal> clauses(s) considered after
+ that. In all other cases, <quote>left to right</quote> means the order
+ in which the expressions appear in the query text.
+ </para>
+ </footnote>
+If the candidate type can be implicitly converted to the other type,
+but not vice-versa, select the other type as the new candidate type.
+Then continue considering the remaining inputs. If, at any stage of this
+process, a preferred type is selected, stop considering additional
+inputs.
</para>
</step>
<step performance="required">
<para>
-Convert all inputs to the selected type. Fail if there is not a
-conversion from a given input to the selected type.
+Convert all inputs to the final candidate type. Fail if there is not an
+implicit conversion from a given input type to the candidate type.
</para>
</step>
</procedure>