OSDN Git Service

Re-add type conversion examples.
authorBruce Momjian <bruce@momjian.us>
Thu, 20 Mar 2003 16:17:32 +0000 (16:17 +0000)
committerBruce Momjian <bruce@momjian.us>
Thu, 20 Mar 2003 16:17:32 +0000 (16:17 +0000)
doc/src/sgml/typeconv.sgml

index f17e2e5..3aaffdc 100644 (file)
@@ -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">
@@ -403,6 +403,57 @@ type to resolve the unknown literals to.
 </para>
 </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 id="typeconv-func">