mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
Re-add type conversion examples.
This commit is contained in:
parent
2e6f97560a
commit
da1534d952
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$Header: /cvsroot/pgsql/doc/src/sgml/typeconv.sgml,v 1.28 2003/03/19 21:20:52 momjian Exp $
|
$Header: /cvsroot/pgsql/doc/src/sgml/typeconv.sgml,v 1.29 2003/03/20 16:17:32 momjian Exp $
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<chapter Id="typeconv">
|
<chapter Id="typeconv">
|
||||||
@ -403,6 +403,57 @@ type to resolve the unknown literals to.
|
|||||||
</para>
|
</para>
|
||||||
</example>
|
</example>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>Absolute-Value and Factorial Operator Type Resolution</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The <productname>PostgreSQL</productname> operator catalog has several
|
||||||
|
entries for the prefix operator <literal>@</>, all of which implement
|
||||||
|
absolute-value operations for various numeric data types. One of these
|
||||||
|
entries is for type <type>float8</type>, which is the preferred type in
|
||||||
|
the numeric category. Therefore, <productname>PostgreSQL</productname>
|
||||||
|
will use that entry when faced with a non-numeric input:
|
||||||
|
<screen>
|
||||||
|
SELECT @ '-4.5' AS "abs";
|
||||||
|
abs
|
||||||
|
-----
|
||||||
|
4.5
|
||||||
|
(1 row)
|
||||||
|
</screen>
|
||||||
|
Here the system has performed an implicit conversion from <type>text</type> to <type>float8</type>
|
||||||
|
before applying the chosen operator. We can verify that <type>float8</type> and
|
||||||
|
not some other type was used:
|
||||||
|
<screen>
|
||||||
|
SELECT @ '-4.5e500' AS "abs";
|
||||||
|
|
||||||
|
ERROR: Input '-4.5e500' is out of range for float8
|
||||||
|
</screen>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
On the other hand, the postfix operator <literal>!</> (factorial)
|
||||||
|
is defined only for integer data types, not for <type>float8</type>. So, if we
|
||||||
|
try a similar case with <literal>!</>, we get:
|
||||||
|
<screen>
|
||||||
|
SELECT '20' ! AS "factorial";
|
||||||
|
|
||||||
|
ERROR: Unable to identify a postfix operator '!' for type 'text'
|
||||||
|
You may need to add parentheses or an explicit cast
|
||||||
|
</screen>
|
||||||
|
This happens because the system can't decide which of the several
|
||||||
|
possible <literal>!</> operators should be preferred. We can help
|
||||||
|
it out with an explicit cast:
|
||||||
|
<screen>
|
||||||
|
SELECT CAST('20' AS int8) ! AS "factorial";
|
||||||
|
|
||||||
|
factorial
|
||||||
|
---------------------
|
||||||
|
2432902008176640000
|
||||||
|
(1 row)
|
||||||
|
</screen>
|
||||||
|
</para>
|
||||||
|
</example>
|
||||||
|
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
<sect1 id="typeconv-func">
|
<sect1 id="typeconv-func">
|
||||||
|
Loading…
Reference in New Issue
Block a user