From a96a1d656274d3e1ca7cd4c34b7ba79a2754b71d Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 8 Dec 2021 16:54:31 -0500
Subject: [PATCH] Doc: improve xfunc-c-type-table.

List types numeric and timestamptz, which don't seem to have ever been
included here.  Restore bigint, which was no-doubt-accidentally deleted
in v12.  Fix some errors, or at least obsolete usages (nobody declares
float arguments as "float8*" anymore, even though they might be that
under the hood).  Re-alphabetize.  Remove the seeming claim that this
is a complete list of built-in types.

Per question from Oskar Stenberg.

Discussion: https://postgr.es/m/HE1PR03MB2971DE2527ECE1E99D6C19A8F96E9@HE1PR03MB2971.eurprd03.prod.outlook.com
---
 doc/src/sgml/xfunc.sgml | 52 +++++++++++++++++++++++++----------------
 1 file changed, 32 insertions(+), 20 deletions(-)

diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml
index 8d40359193..365df66ee1 100644
--- a/doc/src/sgml/xfunc.sgml
+++ b/doc/src/sgml/xfunc.sgml
@@ -2104,16 +2104,18 @@ memcpy(destination->data, buffer, 40);
     </para>
 
     <para>
-     <xref linkend="xfunc-c-type-table"/> specifies which C type
-     corresponds to which SQL type when writing a C-language function
-     that uses a built-in type of <productname>PostgreSQL</productname>.
+     <xref linkend="xfunc-c-type-table"/> shows the C types
+     corresponding to many of the built-in SQL data types
+     of <productname>PostgreSQL</productname>.
      The <quote>Defined In</quote> column gives the header file that
      needs to be included to get the type definition.  (The actual
      definition might be in a different file that is included by the
      listed file.  It is recommended that users stick to the defined
      interface.)  Note that you should always include
-     <filename>postgres.h</filename> first in any source file, because
-     it declares a number of things that you will need anyway.
+     <filename>postgres.h</filename> first in any source file of server
+     code, because it declares a number of things that you will need
+     anyway, and because including other headers first can cause
+     portability issues.
     </para>
 
      <table tocentry="1" id="xfunc-c-type-table">
@@ -2172,28 +2174,28 @@ memcpy(destination->data, buffer, 40);
          <entry><filename>utils/date.h</filename></entry>
         </row>
         <row>
-         <entry><type>smallint</type> (<type>int2</type>)</entry>
+         <entry><type>float4</type> (<type>real</type>)</entry>
+         <entry><type>float4</type></entry>
+        <entry><filename>postgres.h</filename></entry>
+        </row>
+        <row>
+         <entry><type>float8</type> (<type>double precision</type>)</entry>
+         <entry><type>float8</type></entry>
+         <entry><filename>postgres.h</filename></entry>
+        </row>
+        <row>
+         <entry><type>int2</type> (<type>smallint</type>)</entry>
          <entry><type>int16</type></entry>
          <entry><filename>postgres.h</filename></entry>
         </row>
         <row>
-         <entry><type>int2vector</type></entry>
-         <entry><type>int2vector*</type></entry>
-         <entry><filename>postgres.h</filename></entry>
-        </row>
-        <row>
-         <entry><type>integer</type> (<type>int4</type>)</entry>
+         <entry><type>int4</type> (<type>integer</type>)</entry>
          <entry><type>int32</type></entry>
          <entry><filename>postgres.h</filename></entry>
         </row>
         <row>
-         <entry><type>real</type> (<type>float4</type>)</entry>
-         <entry><type>float4*</type></entry>
-        <entry><filename>postgres.h</filename></entry>
-        </row>
-        <row>
-         <entry><type>double precision</type> (<type>float8</type>)</entry>
-         <entry><type>float8*</type></entry>
+         <entry><type>int8</type> (<type>bigint</type>)</entry>
+         <entry><type>int64</type></entry>
          <entry><filename>postgres.h</filename></entry>
         </row>
         <row>
@@ -2211,6 +2213,11 @@ memcpy(destination->data, buffer, 40);
          <entry><type>Name</type></entry>
          <entry><filename>postgres.h</filename></entry>
         </row>
+        <row>
+         <entry><type>numeric</type></entry>
+         <entry><type>Numeric</type></entry>
+         <entry><filename>utils/numeric.h</filename></entry>
+        </row>
         <row>
          <entry><type>oid</type></entry>
          <entry><type>Oid</type></entry>
@@ -2233,7 +2240,7 @@ memcpy(destination->data, buffer, 40);
         </row>
         <row>
          <entry><type>regproc</type></entry>
-         <entry><type>regproc</type></entry>
+         <entry><type>RegProcedure</type></entry>
          <entry><filename>postgres.h</filename></entry>
         </row>
         <row>
@@ -2261,6 +2268,11 @@ memcpy(destination->data, buffer, 40);
          <entry><type>Timestamp</type></entry>
          <entry><filename>datatype/timestamp.h</filename></entry>
         </row>
+        <row>
+         <entry><type>timestamp with time zone</type></entry>
+         <entry><type>TimestampTz</type></entry>
+         <entry><filename>datatype/timestamp.h</filename></entry>
+        </row>
         <row>
          <entry><type>varchar</type></entry>
          <entry><type>VarChar*</type></entry>