v1-0006-split-sect1-functions-info-from-func.sgml.patch

text/x-patch

Filename: v1-0006-split-sect1-functions-info-from-func.sgml.patch
Type: text/x-patch
Part: 1
Message: Re: documentation structure

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: format-patch
Series: patch v1-0006
Subject: split sect1: "functions-info" from func.sgml
File+
doc/src/sgml/filelist.sgml 1 0
doc/src/sgml/func-info.sgml 3640 0
doc/src/sgml/func.sgml 1 3640
From e0dd23cd9bbfcae5af64ccc248564176826617d9 Mon Sep 17 00:00:00 2001
From: jian he <jian.universality@gmail.com>
Date: Fri, 26 Apr 2024 15:12:49 +0800
Subject: [PATCH v1 6/7] split sect1: "functions-info" from func.sgml

"functions-info" lives in a new file: doc/src/sgml/func-info.sgml,
it will hold doc/src/sgml/html/functions-info.html content.

http://postgr.es/m/CACJufxEcMjjn-m6fpC2wXHsQbE5nyd%3Dxt6k-jDizBVUKK6O4KQ%40mail.gmail.com
---
 doc/src/sgml/filelist.sgml  |    1 +
 doc/src/sgml/func-info.sgml | 3640 ++++++++++++++++++++++++++++++++++
 doc/src/sgml/func.sgml      | 3641 +----------------------------------
 3 files changed, 3642 insertions(+), 3640 deletions(-)
 create mode 100644 doc/src/sgml/func-info.sgml

diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml
index 13694aca..4e80d2b4 100644
--- a/doc/src/sgml/filelist.sgml
+++ b/doc/src/sgml/filelist.sgml
@@ -23,6 +23,7 @@
 <!ENTITY func-datetime       SYSTEM "func-datetime.sgml">
 <!ENTITY func-json       SYSTEM "func-json.sgml">
 <!ENTITY func-aggregate       SYSTEM "func-aggregate.sgml">
+<!ENTITY func-info       SYSTEM "func-info.sgml">
 <!ENTITY indices    SYSTEM "indices.sgml">
 <!ENTITY json       SYSTEM "json.sgml">
 <!ENTITY mvcc       SYSTEM "mvcc.sgml">
diff --git a/doc/src/sgml/func-info.sgml b/doc/src/sgml/func-info.sgml
new file mode 100644
index 00000000..c77302ff
--- /dev/null
+++ b/doc/src/sgml/func-info.sgml
@@ -0,0 +1,3640 @@
+ <sect1 id="functions-info">
+  <title>System Information Functions and Operators</title>
+
+   <para>
+    The functions described in this section are used to obtain various
+    information about a <productname>PostgreSQL</productname> installation.
+   </para>
+
+  <sect2 id="functions-info-session">
+   <title>Session Information Functions</title>
+
+  <para>
+   <xref linkend="functions-info-session-table"/> shows several
+   functions that extract session and system information.
+  </para>
+
+  <para>
+   In addition to the functions listed in this section, there are a number of
+   functions related to the statistics system that also provide system
+   information. See <xref linkend="monitoring-stats-functions"/> for more
+   information.
+  </para>
+
+   <table id="functions-info-session-table">
+    <title>Session Information Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>current_catalog</primary>
+        </indexterm>
+        <function>current_catalog</function>
+        <returnvalue>name</returnvalue>
+       </para>
+       <para role="func_signature">
+        <indexterm>
+         <primary>current_database</primary>
+        </indexterm>
+        <function>current_database</function> ()
+        <returnvalue>name</returnvalue>
+       </para>
+       <para>
+        Returns the name of the current database.  (Databases are
+        called <quote>catalogs</quote> in the SQL standard,
+        so <function>current_catalog</function> is the standard's
+        spelling.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>current_query</primary>
+        </indexterm>
+        <function>current_query</function> ()
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns the text of the currently executing query, as submitted
+        by the client (which might contain more than one statement).
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>current_role</primary>
+        </indexterm>
+        <function>current_role</function>
+        <returnvalue>name</returnvalue>
+       </para>
+       <para>
+        This is equivalent to <function>current_user</function>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>current_schema</primary>
+        </indexterm>
+        <indexterm>
+         <primary>schema</primary>
+         <secondary>current</secondary>
+        </indexterm>
+        <function>current_schema</function>
+        <returnvalue>name</returnvalue>
+       </para>
+       <para role="func_signature">
+        <function>current_schema</function> ()
+        <returnvalue>name</returnvalue>
+       </para>
+       <para>
+        Returns the name of the schema that is first in the search path (or a
+        null value if the search path is empty).  This is the schema that will
+        be used for any tables or other named objects that are created without
+        specifying a target schema.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>current_schemas</primary>
+        </indexterm>
+        <indexterm>
+         <primary>search path</primary>
+         <secondary>current</secondary>
+        </indexterm>
+        <function>current_schemas</function> ( <parameter>include_implicit</parameter> <type>boolean</type> )
+        <returnvalue>name[]</returnvalue>
+       </para>
+       <para>
+        Returns an array of the names of all schemas presently in the
+        effective search path, in their priority order.  (Items in the current
+        <xref linkend="guc-search-path"/> setting that do not correspond to
+        existing, searchable schemas are omitted.)  If the Boolean argument
+        is <literal>true</literal>, then implicitly-searched system schemas
+        such as <literal>pg_catalog</literal> are included in the result.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>current_user</primary>
+        </indexterm>
+        <indexterm>
+         <primary>user</primary>
+         <secondary>current</secondary>
+        </indexterm>
+        <function>current_user</function>
+        <returnvalue>name</returnvalue>
+       </para>
+       <para>
+        Returns the user name of the current execution context.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>inet_client_addr</primary>
+        </indexterm>
+        <function>inet_client_addr</function> ()
+        <returnvalue>inet</returnvalue>
+       </para>
+       <para>
+        Returns the IP address of the current client,
+        or <literal>NULL</literal> if the current connection is via a
+        Unix-domain socket.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>inet_client_port</primary>
+        </indexterm>
+        <function>inet_client_port</function> ()
+        <returnvalue>integer</returnvalue>
+       </para>
+       <para>
+        Returns the IP port number of the current client,
+        or <literal>NULL</literal> if the current connection is via a
+        Unix-domain socket.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>inet_server_addr</primary>
+        </indexterm>
+        <function>inet_server_addr</function> ()
+        <returnvalue>inet</returnvalue>
+       </para>
+       <para>
+        Returns the IP address on which the server accepted the current
+        connection,
+        or <literal>NULL</literal> if the current connection is via a
+        Unix-domain socket.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>inet_server_port</primary>
+        </indexterm>
+        <function>inet_server_port</function> ()
+        <returnvalue>integer</returnvalue>
+       </para>
+       <para>
+        Returns the IP port number on which the server accepted the current
+        connection,
+        or <literal>NULL</literal> if the current connection is via a
+        Unix-domain socket.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_backend_pid</primary>
+        </indexterm>
+        <function>pg_backend_pid</function> ()
+        <returnvalue>integer</returnvalue>
+       </para>
+       <para>
+        Returns the process ID of the server process attached to the current
+        session.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_blocking_pids</primary>
+        </indexterm>
+        <function>pg_blocking_pids</function> ( <type>integer</type> )
+        <returnvalue>integer[]</returnvalue>
+       </para>
+       <para>
+        Returns an array of the process ID(s) of the sessions that are
+        blocking the server process with the specified process ID from
+        acquiring a lock, or an empty array if there is no such server process
+        or it is not blocked.
+       </para>
+       <para>
+        One server process blocks another if it either holds a lock that
+        conflicts with the blocked process's lock request (hard block), or is
+        waiting for a lock that would conflict with the blocked process's lock
+        request and is ahead of it in the wait queue (soft block).  When using
+        parallel queries the result always lists client-visible process IDs
+        (that is, <function>pg_backend_pid</function> results) even if the
+        actual lock is held or awaited by a child worker process.  As a result
+        of that, there may be duplicated PIDs in the result.  Also note that
+        when a prepared transaction holds a conflicting lock, it will be
+        represented by a zero process ID.
+       </para>
+       <para>
+        Frequent calls to this function could have some impact on database
+        performance, because it needs exclusive access to the lock manager's
+        shared state for a short time.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_conf_load_time</primary>
+        </indexterm>
+        <function>pg_conf_load_time</function> ()
+        <returnvalue>timestamp with time zone</returnvalue>
+       </para>
+       <para>
+        Returns the time when the server configuration files were last loaded.
+        If the current session was alive at the time, this will be the time
+        when the session itself re-read the configuration files (so the
+        reading will vary a little in different sessions).  Otherwise it is
+        the time when the postmaster process re-read the configuration files.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_current_logfile</primary>
+        </indexterm>
+        <indexterm>
+         <primary>Logging</primary>
+         <secondary>pg_current_logfile function</secondary>
+        </indexterm>
+        <indexterm>
+          <primary>current_logfiles</primary>
+          <secondary>and the pg_current_logfile function</secondary>
+        </indexterm>
+        <indexterm>
+         <primary>Logging</primary>
+         <secondary>current_logfiles file and the pg_current_logfile
+         function</secondary>
+        </indexterm>
+        <function>pg_current_logfile</function> ( <optional> <type>text</type> </optional> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns the path name of the log file currently in use by the logging
+        collector.  The path includes the <xref linkend="guc-log-directory"/>
+        directory and the individual log file name.  The result
+        is <literal>NULL</literal> if the logging collector is disabled.
+        When multiple log files exist, each in a different
+        format, <function>pg_current_logfile</function> without an argument
+        returns the path of the file having the first format found in the
+        ordered list: <literal>stderr</literal>,
+        <literal>csvlog</literal>, <literal>jsonlog</literal>.
+        <literal>NULL</literal> is returned if no log file has any of these
+        formats.
+        To request information about a specific log file format, supply
+        either <literal>csvlog</literal>, <literal>jsonlog</literal> or
+        <literal>stderr</literal> as the
+        value of the optional parameter. The result is <literal>NULL</literal>
+        if the log format requested is not configured in
+        <xref linkend="guc-log-destination"/>.
+        The result reflects the contents of
+        the <filename>current_logfiles</filename> file.
+       </para>
+       <para>
+        This function is restricted to superusers and roles with privileges of
+        the <literal>pg_monitor</literal> role by default, but other users can
+        be granted EXECUTE to run the function.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_my_temp_schema</primary>
+        </indexterm>
+        <function>pg_my_temp_schema</function> ()
+        <returnvalue>oid</returnvalue>
+       </para>
+       <para>
+        Returns the OID of the current session's temporary schema, or zero if
+        it has none (because it has not created any temporary tables).
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_is_other_temp_schema</primary>
+        </indexterm>
+        <function>pg_is_other_temp_schema</function> ( <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Returns true if the given OID is the OID of another session's
+        temporary schema.  (This can be useful, for example, to exclude other
+        sessions' temporary tables from a catalog display.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_jit_available</primary>
+        </indexterm>
+        <function>pg_jit_available</function> ()
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Returns true if a <acronym>JIT</acronym> compiler extension is
+        available (see <xref linkend="jit"/>) and the
+        <xref linkend="guc-jit"/> configuration parameter is set to
+        <literal>on</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_listening_channels</primary>
+        </indexterm>
+        <function>pg_listening_channels</function> ()
+        <returnvalue>setof text</returnvalue>
+       </para>
+       <para>
+        Returns the set of names of asynchronous notification channels that
+        the current session is listening to.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_notification_queue_usage</primary>
+        </indexterm>
+        <function>pg_notification_queue_usage</function> ()
+        <returnvalue>double precision</returnvalue>
+       </para>
+       <para>
+        Returns the fraction (0&ndash;1) of the asynchronous notification
+        queue's maximum size that is currently occupied by notifications that
+        are waiting to be processed.
+        See <xref linkend="sql-listen"/> and <xref linkend="sql-notify"/>
+        for more information.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_postmaster_start_time</primary>
+        </indexterm>
+        <function>pg_postmaster_start_time</function> ()
+        <returnvalue>timestamp with time zone</returnvalue>
+       </para>
+       <para>
+        Returns the time when the server started.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_safe_snapshot_blocking_pids</primary>
+        </indexterm>
+        <function>pg_safe_snapshot_blocking_pids</function> ( <type>integer</type> )
+        <returnvalue>integer[]</returnvalue>
+       </para>
+       <para>
+        Returns an array of the process ID(s) of the sessions that are blocking
+        the server process with the specified process ID from acquiring a safe
+        snapshot, or an empty array if there is no such server process or it
+        is not blocked.
+       </para>
+       <para>
+        A session running a <literal>SERIALIZABLE</literal> transaction blocks
+        a <literal>SERIALIZABLE READ ONLY DEFERRABLE</literal> transaction
+        from acquiring a snapshot until the latter determines that it is safe
+        to avoid taking any predicate locks.  See
+        <xref linkend="xact-serializable"/> for more information about
+        serializable and deferrable transactions.
+       </para>
+       <para>
+        Frequent calls to this function could have some impact on database
+        performance, because it needs access to the predicate lock manager's
+        shared state for a short time.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_trigger_depth</primary>
+        </indexterm>
+        <function>pg_trigger_depth</function> ()
+        <returnvalue>integer</returnvalue>
+       </para>
+       <para>
+        Returns the current nesting level
+        of <productname>PostgreSQL</productname> triggers (0 if not called,
+        directly or indirectly, from inside a trigger).
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>session_user</primary>
+        </indexterm>
+        <function>session_user</function>
+        <returnvalue>name</returnvalue>
+       </para>
+       <para>
+        Returns the session user's name.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>system_user</primary>
+        </indexterm>
+        <function>system_user</function>
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns the authentication method and the identity (if any) that the
+        user presented during the authentication cycle before they were
+        assigned a database role. It is represented as
+        <literal>auth_method:identity</literal> or
+        <literal>NULL</literal> if the user has not been authenticated (for
+        example if <link linkend="auth-trust">Trust authentication</link> has
+        been used).
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>user</primary>
+        </indexterm>
+        <function>user</function>
+        <returnvalue>name</returnvalue>
+       </para>
+       <para>
+        This is equivalent to <function>current_user</function>.
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+   <note>
+    <para>
+     <function>current_catalog</function>,
+     <function>current_role</function>,
+     <function>current_schema</function>,
+     <function>current_user</function>,
+     <function>session_user</function>,
+     and <function>user</function> have special syntactic status
+     in <acronym>SQL</acronym>: they must be called without trailing
+     parentheses.  In PostgreSQL, parentheses can optionally be used with
+     <function>current_schema</function>, but not with the others.
+    </para>
+   </note>
+
+   <para>
+    The <function>session_user</function> is normally the user who initiated
+    the current database connection; but superusers can change this setting
+    with <xref linkend="sql-set-session-authorization"/>.
+    The <function>current_user</function> is the user identifier
+    that is applicable for permission checking. Normally it is equal
+    to the session user, but it can be changed with
+    <xref linkend="sql-set-role"/>.
+    It also changes during the execution of
+    functions with the attribute <literal>SECURITY DEFINER</literal>.
+    In Unix parlance, the session user is the <quote>real user</quote> and
+    the current user is the <quote>effective user</quote>.
+    <function>current_role</function> and <function>user</function> are
+    synonyms for <function>current_user</function>.  (The SQL standard draws
+    a distinction between <function>current_role</function>
+    and <function>current_user</function>, but <productname>PostgreSQL</productname>
+    does not, since it unifies users and roles into a single kind of entity.)
+   </para>
+
+  </sect2>
+
+  <sect2 id="functions-info-access">
+   <title>Access Privilege Inquiry Functions</title>
+
+  <indexterm>
+   <primary>privilege</primary>
+   <secondary>querying</secondary>
+  </indexterm>
+
+  <para>
+   <xref linkend="functions-info-access-table"/> lists functions that
+   allow querying object access privileges programmatically.
+   (See <xref linkend="ddl-priv"/> for more information about
+   privileges.)
+   In these functions, the user whose privileges are being inquired about
+   can be specified by name or by OID
+   (<structname>pg_authid</structname>.<structfield>oid</structfield>), or if
+   the name is given as <literal>public</literal> then the privileges of the
+   PUBLIC pseudo-role are checked.  Also, the <parameter>user</parameter>
+   argument can be omitted entirely, in which case
+   the <function>current_user</function> is assumed.
+   The object that is being inquired about can be specified either by name or
+   by OID, too.  When specifying by name, a schema name can be included if
+   relevant.
+   The access privilege of interest is specified by a text string, which must
+   evaluate to one of the appropriate privilege keywords for the object's type
+   (e.g., <literal>SELECT</literal>).  Optionally, <literal>WITH GRANT
+   OPTION</literal> can be added to a privilege type to test whether the
+   privilege is held with grant option. Also, multiple privilege types can be
+   listed separated by commas, in which case the result will be true if any of
+   the listed privileges is held. (Case of the privilege string is not
+   significant, and extra whitespace is allowed between but not within
+   privilege names.)
+   Some examples:
+<programlisting>
+SELECT has_table_privilege('myschema.mytable', 'select');
+SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');
+</programlisting>
+  </para>
+
+   <table id="functions-info-access-table">
+    <title>Access Privilege Inquiry Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_any_column_privilege</primary>
+        </indexterm>
+        <function>has_any_column_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>table</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for any column of table?
+        This succeeds either if the privilege is held for the whole table, or
+        if there is a column-level grant of the privilege for at least one
+        column.
+        Allowable privilege types are
+        <literal>SELECT</literal>, <literal>INSERT</literal>,
+        <literal>UPDATE</literal>, and <literal>REFERENCES</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_column_privilege</primary>
+        </indexterm>
+        <function>has_column_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>table</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>column</parameter> <type>text</type> or <type>smallint</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for the specified table column?
+        This succeeds either if the privilege is held for the whole table, or
+        if there is a column-level grant of the privilege for the column.
+        The column can be specified by name or by attribute number
+        (<structname>pg_attribute</structname>.<structfield>attnum</structfield>).
+        Allowable privilege types are
+        <literal>SELECT</literal>, <literal>INSERT</literal>,
+        <literal>UPDATE</literal>, and <literal>REFERENCES</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_database_privilege</primary>
+        </indexterm>
+        <function>has_database_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>database</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for database?
+        Allowable privilege types are
+        <literal>CREATE</literal>,
+        <literal>CONNECT</literal>,
+        <literal>TEMPORARY</literal>, and
+        <literal>TEMP</literal> (which is equivalent to
+        <literal>TEMPORARY</literal>).
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_foreign_data_wrapper_privilege</primary>
+        </indexterm>
+        <function>has_foreign_data_wrapper_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>fdw</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for foreign-data wrapper?
+        The only allowable privilege type is <literal>USAGE</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_function_privilege</primary>
+        </indexterm>
+        <function>has_function_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>function</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for function?
+        The only allowable privilege type is <literal>EXECUTE</literal>.
+       </para>
+       <para>
+        When specifying a function by name rather than by OID, the allowed
+        input is the same as for the <type>regprocedure</type> data type (see
+        <xref linkend="datatype-oid"/>).
+        An example is:
+<programlisting>
+SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');
+</programlisting>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_language_privilege</primary>
+        </indexterm>
+        <function>has_language_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>language</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for language?
+        The only allowable privilege type is <literal>USAGE</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_parameter_privilege</primary>
+        </indexterm>
+        <function>has_parameter_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>parameter</parameter> <type>text</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for configuration parameter?
+        The parameter name is case-insensitive.
+        Allowable privilege types are <literal>SET</literal>
+        and <literal>ALTER SYSTEM</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_schema_privilege</primary>
+        </indexterm>
+        <function>has_schema_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>schema</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for schema?
+        Allowable privilege types are
+        <literal>CREATE</literal> and
+        <literal>USAGE</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_sequence_privilege</primary>
+        </indexterm>
+        <function>has_sequence_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>sequence</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for sequence?
+        Allowable privilege types are
+        <literal>USAGE</literal>,
+        <literal>SELECT</literal>, and
+        <literal>UPDATE</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_server_privilege</primary>
+        </indexterm>
+        <function>has_server_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>server</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for foreign server?
+        The only allowable privilege type is <literal>USAGE</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_table_privilege</primary>
+        </indexterm>
+        <function>has_table_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>table</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for table?
+        Allowable privilege types
+        are <literal>SELECT</literal>, <literal>INSERT</literal>,
+        <literal>UPDATE</literal>, <literal>DELETE</literal>,
+        <literal>TRUNCATE</literal>, <literal>REFERENCES</literal>,
+        <literal>TRIGGER</literal>, and <literal>MAINTAIN</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_tablespace_privilege</primary>
+        </indexterm>
+        <function>has_tablespace_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>tablespace</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for tablespace?
+        The only allowable privilege type is <literal>CREATE</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>has_type_privilege</primary>
+        </indexterm>
+        <function>has_type_privilege</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>type</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for data type?
+        The only allowable privilege type is <literal>USAGE</literal>.
+        When specifying a type by name rather than by OID, the allowed input
+        is the same as for the <type>regtype</type> data type (see
+        <xref linkend="datatype-oid"/>).
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_has_role</primary>
+        </indexterm>
+        <function>pg_has_role</function> (
+          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
+          <parameter>role</parameter> <type>text</type> or <type>oid</type>,
+          <parameter>privilege</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Does user have privilege for role?
+        Allowable privilege types are
+        <literal>MEMBER</literal>, <literal>USAGE</literal>,
+        and <literal>SET</literal>.
+        <literal>MEMBER</literal> denotes direct or indirect membership in
+        the role without regard to what specific privileges may be conferred.
+        <literal>USAGE</literal> denotes whether the privileges of the role
+        are immediately available without doing <command>SET ROLE</command>,
+        while <literal>SET</literal> denotes whether it is possible to change
+        to the role using the <literal>SET ROLE</literal> command.
+        This function does not allow the special case of
+        setting <parameter>user</parameter> to <literal>public</literal>,
+        because the PUBLIC pseudo-role can never be a member of real roles.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>row_security_active</primary>
+        </indexterm>
+        <function>row_security_active</function> (
+          <parameter>table</parameter> <type>text</type> or <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is row-level security active for the specified table in the context of
+        the current user and current environment?
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+  <para>
+   <xref linkend="functions-aclitem-op-table"/> shows the operators
+   available for the <type>aclitem</type> type, which is the catalog
+   representation of access privileges.  See <xref linkend="ddl-priv"/>
+   for information about how to read access privilege values.
+  </para>
+
+    <table id="functions-aclitem-op-table">
+     <title><type>aclitem</type> Operators</title>
+     <tgroup cols="1">
+      <thead>
+       <row>
+        <entry role="func_table_entry"><para role="func_signature">
+         Operator
+        </para>
+        <para>
+         Description
+        </para>
+        <para>
+         Example(s)
+        </para></entry>
+       </row>
+      </thead>
+
+      <tbody>
+       <row>
+        <entry role="func_table_entry"><para role="func_signature">
+         <indexterm>
+          <primary>aclitemeq</primary>
+         </indexterm>
+         <type>aclitem</type> <literal>=</literal> <type>aclitem</type>
+         <returnvalue>boolean</returnvalue>
+        </para>
+        <para>
+         Are <type>aclitem</type>s equal?  (Notice that
+         type <type>aclitem</type> lacks the usual set of comparison
+         operators; it has only equality.  In turn, <type>aclitem</type>
+         arrays can only be compared for equality.)
+        </para>
+        <para>
+         <literal>'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitem</literal>
+         <returnvalue>f</returnvalue>
+        </para></entry>
+       </row>
+
+       <row>
+        <entry role="func_table_entry"><para role="func_signature">
+         <indexterm>
+          <primary>aclcontains</primary>
+         </indexterm>
+         <type>aclitem[]</type> <literal>@&gt;</literal> <type>aclitem</type>
+         <returnvalue>boolean</returnvalue>
+        </para>
+        <para>
+         Does array contain the specified privileges?  (This is true if there
+         is an array entry that matches the <type>aclitem</type>'s grantee and
+         grantor, and has at least the specified set of privileges.)
+        </para>
+        <para>
+         <literal>'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] @&gt; 'calvin=r*/hobbes'::aclitem</literal>
+         <returnvalue>t</returnvalue>
+        </para></entry>
+       </row>
+
+       <row>
+        <entry role="func_table_entry"><para role="func_signature">
+         <type>aclitem[]</type> <literal>~</literal> <type>aclitem</type>
+         <returnvalue>boolean</returnvalue>
+        </para>
+        <para>
+         This is a deprecated alias for <literal>@&gt;</literal>.
+        </para>
+        <para>
+         <literal>'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*/hobbes'::aclitem</literal>
+         <returnvalue>t</returnvalue>
+        </para></entry>
+       </row>
+      </tbody>
+     </tgroup>
+    </table>
+
+   <para>
+    <xref linkend="functions-aclitem-fn-table"/> shows some additional
+    functions to manage the <type>aclitem</type> type.
+   </para>
+
+   <table id="functions-aclitem-fn-table">
+    <title><type>aclitem</type> Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>acldefault</primary>
+        </indexterm>
+        <function>acldefault</function> (
+          <parameter>type</parameter> <type>"char"</type>,
+          <parameter>ownerId</parameter> <type>oid</type> )
+        <returnvalue>aclitem[]</returnvalue>
+       </para>
+       <para>
+        Constructs an <type>aclitem</type> array holding the default access
+        privileges for an object of type <parameter>type</parameter> belonging
+        to the role with OID <parameter>ownerId</parameter>.  This represents
+        the access privileges that will be assumed when an object's ACL entry
+        is null.  (The default access privileges are described in
+        <xref linkend="ddl-priv"/>.)
+        The <parameter>type</parameter> parameter must be one of
+        'c' for <literal>COLUMN</literal>,
+        'r' for <literal>TABLE</literal> and table-like objects,
+        's' for <literal>SEQUENCE</literal>,
+        'd' for <literal>DATABASE</literal>,
+        'f' for <literal>FUNCTION</literal> or <literal>PROCEDURE</literal>,
+        'l' for <literal>LANGUAGE</literal>,
+        'L' for <literal>LARGE OBJECT</literal>,
+        'n' for <literal>SCHEMA</literal>,
+        'p' for <literal>PARAMETER</literal>,
+        't' for <literal>TABLESPACE</literal>,
+        'F' for <literal>FOREIGN DATA WRAPPER</literal>,
+        'S' for <literal>FOREIGN SERVER</literal>,
+        or
+        'T' for <literal>TYPE</literal> or <literal>DOMAIN</literal>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>aclexplode</primary>
+        </indexterm>
+        <function>aclexplode</function> ( <type>aclitem[]</type> )
+        <returnvalue>setof record</returnvalue>
+        ( <parameter>grantor</parameter> <type>oid</type>,
+        <parameter>grantee</parameter> <type>oid</type>,
+        <parameter>privilege_type</parameter> <type>text</type>,
+        <parameter>is_grantable</parameter> <type>boolean</type> )
+       </para>
+       <para>
+        Returns the <type>aclitem</type> array as a set of rows.
+        If the grantee is the pseudo-role PUBLIC, it is represented by zero in
+        the <parameter>grantee</parameter> column.  Each granted privilege is
+        represented as <literal>SELECT</literal>, <literal>INSERT</literal>,
+        etc (see <xref linkend="privilege-abbrevs-table"/> for a full list).
+        Note that each privilege is broken out as a separate row, so
+        only one keyword appears in the <parameter>privilege_type</parameter>
+        column.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>makeaclitem</primary>
+        </indexterm>
+        <function>makeaclitem</function> (
+          <parameter>grantee</parameter> <type>oid</type>,
+          <parameter>grantor</parameter> <type>oid</type>,
+          <parameter>privileges</parameter> <type>text</type>,
+          <parameter>is_grantable</parameter> <type>boolean</type> )
+        <returnvalue>aclitem</returnvalue>
+       </para>
+       <para>
+        Constructs an <type>aclitem</type> with the given properties.
+        <parameter>privileges</parameter> is a comma-separated list of
+        privilege names such as <literal>SELECT</literal>,
+        <literal>INSERT</literal>, etc, all of which are set in the
+        result.  (Case of the privilege string is not significant, and
+        extra whitespace is allowed between but not within privilege
+        names.)
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+  </sect2>
+
+  <sect2 id="functions-info-schema">
+   <title>Schema Visibility Inquiry Functions</title>
+
+  <para>
+   <xref linkend="functions-info-schema-table"/> shows functions that
+   determine whether a certain object is <firstterm>visible</firstterm> in the
+   current schema search path.
+   For example, a table is said to be visible if its
+   containing schema is in the search path and no table of the same
+   name appears earlier in the search path.  This is equivalent to the
+   statement that the table can be referenced by name without explicit
+   schema qualification.  Thus, to list the names of all visible tables:
+<programlisting>
+SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
+</programlisting>
+   For functions and operators, an object in the search path is said to be
+   visible if there is no object of the same name <emphasis>and argument data
+   type(s)</emphasis> earlier in the path.  For operator classes and families,
+   both the name and the associated index access method are considered.
+  </para>
+
+   <indexterm>
+    <primary>search path</primary>
+    <secondary>object visibility</secondary>
+   </indexterm>
+
+   <table id="functions-info-schema-table">
+    <title>Schema Visibility Inquiry Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_collation_is_visible</primary>
+        </indexterm>
+        <function>pg_collation_is_visible</function> ( <parameter>collation</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is collation visible in search path?
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_conversion_is_visible</primary>
+        </indexterm>
+        <function>pg_conversion_is_visible</function> ( <parameter>conversion</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is conversion visible in search path?
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_function_is_visible</primary>
+        </indexterm>
+        <function>pg_function_is_visible</function> ( <parameter>function</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is function visible in search path?
+        (This also works for procedures and aggregates.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_opclass_is_visible</primary>
+        </indexterm>
+        <function>pg_opclass_is_visible</function> ( <parameter>opclass</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is operator class visible in search path?
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_operator_is_visible</primary>
+        </indexterm>
+        <function>pg_operator_is_visible</function> ( <parameter>operator</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is operator visible in search path?
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_opfamily_is_visible</primary>
+        </indexterm>
+        <function>pg_opfamily_is_visible</function> ( <parameter>opclass</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is operator family visible in search path?
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_statistics_obj_is_visible</primary>
+        </indexterm>
+        <function>pg_statistics_obj_is_visible</function> ( <parameter>stat</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is statistics object visible in search path?
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_table_is_visible</primary>
+        </indexterm>
+        <function>pg_table_is_visible</function> ( <parameter>table</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is table visible in search path?
+        (This works for all types of relations, including views, materialized
+        views, indexes, sequences and foreign tables.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_ts_config_is_visible</primary>
+        </indexterm>
+        <function>pg_ts_config_is_visible</function> ( <parameter>config</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is text search configuration visible in search path?
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_ts_dict_is_visible</primary>
+        </indexterm>
+        <function>pg_ts_dict_is_visible</function> ( <parameter>dict</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is text search dictionary visible in search path?
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_ts_parser_is_visible</primary>
+        </indexterm>
+        <function>pg_ts_parser_is_visible</function> ( <parameter>parser</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is text search parser visible in search path?
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_ts_template_is_visible</primary>
+        </indexterm>
+        <function>pg_ts_template_is_visible</function> ( <parameter>template</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is text search template visible in search path?
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_type_is_visible</primary>
+        </indexterm>
+        <function>pg_type_is_visible</function> ( <parameter>type</parameter> <type>oid</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is type (or domain) visible in search path?
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+   <para>
+    All these functions require object OIDs to identify the object to be
+    checked.  If you want to test an object by name, it is convenient to use
+    the OID alias types (<type>regclass</type>, <type>regtype</type>,
+    <type>regprocedure</type>, <type>regoperator</type>, <type>regconfig</type>,
+    or <type>regdictionary</type>),
+    for example:
+<programlisting>
+SELECT pg_type_is_visible('myschema.widget'::regtype);
+</programlisting>
+    Note that it would not make much sense to test a non-schema-qualified
+    type name in this way &mdash; if the name can be recognized at all, it must be visible.
+   </para>
+
+  </sect2>
+
+  <sect2 id="functions-info-catalog">
+   <title>System Catalog Information Functions</title>
+
+  <para>
+   <xref linkend="functions-info-catalog-table"/> lists functions that
+   extract information from the system catalogs.
+  </para>
+
+   <table id="functions-info-catalog-table">
+    <title>System Catalog Information Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry id="format-type" xreflabel="format_type" role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>format_type</primary>
+        </indexterm>
+        <function>format_type</function> ( <parameter>type</parameter> <type>oid</type>, <parameter>typemod</parameter> <type>integer</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns the SQL name for a data type that is identified by its type
+        OID and possibly a type modifier.  Pass NULL for the type modifier if
+        no specific modifier is known.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_basetype</primary>
+        </indexterm>
+        <function>pg_basetype</function> ( <type>regtype</type> )
+        <returnvalue>regtype</returnvalue>
+       </para>
+       <para>
+        Returns the OID of the base type of a domain identified by its
+        type OID.  If the argument is the OID of a non-domain type,
+        returns the argument as-is.  Returns NULL if the argument is
+        not a valid type OID.  If there's a chain of domain dependencies,
+        it will recurse until finding the base type.
+       </para>
+       <para>
+        Assuming <literal>CREATE DOMAIN mytext AS text</literal>:
+       </para>
+       <para>
+        <literal>pg_basetype('mytext'::regtype)</literal>
+        <returnvalue>text</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry id="pg-char-to-encoding" role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_char_to_encoding</primary>
+        </indexterm>
+        <function>pg_char_to_encoding</function> ( <parameter>encoding</parameter> <type>name</type> )
+        <returnvalue>integer</returnvalue>
+       </para>
+       <para>
+        Converts the supplied encoding name into an integer representing the
+        internal identifier used in some system catalog tables.
+        Returns <literal>-1</literal> if an unknown encoding name is provided.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry id="pg-encoding-to-char" role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_encoding_to_char</primary>
+        </indexterm>
+        <function>pg_encoding_to_char</function> ( <parameter>encoding</parameter> <type>integer</type> )
+        <returnvalue>name</returnvalue>
+       </para>
+       <para>
+        Converts the integer used as the internal identifier of an encoding in some
+        system catalog tables into a human-readable string.
+        Returns an empty string if an invalid encoding number is provided.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_catalog_foreign_keys</primary>
+        </indexterm>
+        <function>pg_get_catalog_foreign_keys</function> ()
+        <returnvalue>setof record</returnvalue>
+        ( <parameter>fktable</parameter> <type>regclass</type>,
+          <parameter>fkcols</parameter> <type>text[]</type>,
+          <parameter>pktable</parameter> <type>regclass</type>,
+          <parameter>pkcols</parameter> <type>text[]</type>,
+          <parameter>is_array</parameter> <type>boolean</type>,
+          <parameter>is_opt</parameter> <type>boolean</type> )
+       </para>
+       <para>
+        Returns a set of records describing the foreign key relationships
+        that exist within the <productname>PostgreSQL</productname> system
+        catalogs.
+        The <parameter>fktable</parameter> column contains the name of the
+        referencing catalog, and the <parameter>fkcols</parameter> column
+        contains the name(s) of the referencing column(s).  Similarly,
+        the <parameter>pktable</parameter> column contains the name of the
+        referenced catalog, and the <parameter>pkcols</parameter> column
+        contains the name(s) of the referenced column(s).
+        If <parameter>is_array</parameter> is true, the last referencing
+        column is an array, each of whose elements should match some entry
+        in the referenced catalog.
+        If <parameter>is_opt</parameter> is true, the referencing column(s)
+        are allowed to contain zeroes instead of a valid reference.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_constraintdef</primary>
+        </indexterm>
+        <function>pg_get_constraintdef</function> ( <parameter>constraint</parameter> <type>oid</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the creating command for a constraint.
+        (This is a decompiled reconstruction, not the original text
+        of the command.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_expr</primary>
+        </indexterm>
+        <function>pg_get_expr</function> ( <parameter>expr</parameter> <type>pg_node_tree</type>, <parameter>relation</parameter> <type>oid</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Decompiles the internal form of an expression stored in the system
+        catalogs, such as the default value for a column.  If the expression
+        might contain Vars, specify the OID of the relation they refer to as
+        the second parameter; if no Vars are expected, passing zero is
+        sufficient.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_functiondef</primary>
+        </indexterm>
+        <function>pg_get_functiondef</function> ( <parameter>func</parameter> <type>oid</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the creating command for a function or procedure.
+        (This is a decompiled reconstruction, not the original text
+        of the command.)
+        The result is a complete <command>CREATE OR REPLACE FUNCTION</command>
+        or <command>CREATE OR REPLACE PROCEDURE</command> statement.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_function_arguments</primary>
+        </indexterm>
+        <function>pg_get_function_arguments</function> ( <parameter>func</parameter> <type>oid</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the argument list of a function or procedure, in the form
+        it would need to appear in within <command>CREATE FUNCTION</command>
+        (including default values).
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_function_identity_arguments</primary>
+        </indexterm>
+        <function>pg_get_function_identity_arguments</function> ( <parameter>func</parameter> <type>oid</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the argument list necessary to identify a function or
+        procedure, in the form it would need to appear in within commands such
+        as <command>ALTER FUNCTION</command>.  This form omits default values.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_function_result</primary>
+        </indexterm>
+        <function>pg_get_function_result</function> ( <parameter>func</parameter> <type>oid</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the <literal>RETURNS</literal> clause of a function, in
+        the form it would need to appear in within <command>CREATE
+        FUNCTION</command>.  Returns <literal>NULL</literal> for a procedure.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_indexdef</primary>
+        </indexterm>
+        <function>pg_get_indexdef</function> ( <parameter>index</parameter> <type>oid</type> <optional>, <parameter>column</parameter> <type>integer</type>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the creating command for an index.
+        (This is a decompiled reconstruction, not the original text
+        of the command.)  If <parameter>column</parameter> is supplied and is
+        not zero, only the definition of that column is reconstructed.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_keywords</primary>
+        </indexterm>
+        <function>pg_get_keywords</function> ()
+        <returnvalue>setof record</returnvalue>
+        ( <parameter>word</parameter> <type>text</type>,
+        <parameter>catcode</parameter> <type>"char"</type>,
+        <parameter>barelabel</parameter> <type>boolean</type>,
+        <parameter>catdesc</parameter> <type>text</type>,
+        <parameter>baredesc</parameter> <type>text</type> )
+       </para>
+       <para>
+        Returns a set of records describing the SQL keywords recognized by the
+        server.  The <parameter>word</parameter> column contains the
+        keyword.  The <parameter>catcode</parameter> column contains a
+        category code: <literal>U</literal> for an unreserved
+        keyword, <literal>C</literal> for a keyword that can be a column
+        name, <literal>T</literal> for a keyword that can be a type or
+        function name, or <literal>R</literal> for a fully reserved keyword.
+        The <parameter>barelabel</parameter> column
+        contains <literal>true</literal> if the keyword can be used as
+        a <quote>bare</quote> column label in <command>SELECT</command> lists,
+        or <literal>false</literal> if it can only be used
+        after <literal>AS</literal>.
+        The <parameter>catdesc</parameter> column contains a
+        possibly-localized string describing the keyword's category.
+        The <parameter>baredesc</parameter> column contains a
+        possibly-localized string describing the keyword's column label status.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_partkeydef</primary>
+        </indexterm>
+        <function>pg_get_partkeydef</function> ( <parameter>table</parameter> <type>oid</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the definition of a partitioned table's partition
+        key, in the form it would have in the <literal>PARTITION
+        BY</literal> clause of <command>CREATE TABLE</command>.
+        (This is a decompiled reconstruction, not the original text
+        of the command.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_ruledef</primary>
+        </indexterm>
+        <function>pg_get_ruledef</function> ( <parameter>rule</parameter> <type>oid</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the creating command for a rule.
+        (This is a decompiled reconstruction, not the original text
+        of the command.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_serial_sequence</primary>
+        </indexterm>
+        <function>pg_get_serial_sequence</function> ( <parameter>table</parameter> <type>text</type>, <parameter>column</parameter> <type>text</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns the name of the sequence associated with a column,
+        or NULL if no sequence is associated with the column.
+        If the column is an identity column, the associated sequence is the
+        sequence internally created for that column.
+        For columns created using one of the serial types
+        (<type>serial</type>, <type>smallserial</type>, <type>bigserial</type>),
+        it is the sequence created for that serial column definition.
+        In the latter case, the association can be modified or removed
+        with <command>ALTER SEQUENCE OWNED BY</command>.
+        (This function probably should have been
+        called <function>pg_get_owned_sequence</function>; its current name
+        reflects the fact that it has historically been used with serial-type
+        columns.)  The first parameter is a table name with optional
+        schema, and the second parameter is a column name.  Because the first
+        parameter potentially contains both schema and table names, it is
+        parsed per usual SQL rules, meaning it is lower-cased by default.
+        The second parameter, being just a column name, is treated literally
+        and so has its case preserved.  The result is suitably formatted
+        for passing to the sequence functions (see
+        <xref linkend="functions-sequence"/>).
+       </para>
+       <para>
+        A typical use is in reading the current value of the sequence for an
+        identity or serial column, for example:
+<programlisting>
+SELECT currval(pg_get_serial_sequence('sometable', 'id'));
+</programlisting>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_statisticsobjdef</primary>
+        </indexterm>
+        <function>pg_get_statisticsobjdef</function> ( <parameter>statobj</parameter> <type>oid</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the creating command for an extended statistics object.
+        (This is a decompiled reconstruction, not the original text
+        of the command.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_triggerdef</primary>
+        </indexterm>
+<function>pg_get_triggerdef</function> ( <parameter>trigger</parameter> <type>oid</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the creating command for a trigger.
+        (This is a decompiled reconstruction, not the original text
+        of the command.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_userbyid</primary>
+        </indexterm>
+        <function>pg_get_userbyid</function> ( <parameter>role</parameter> <type>oid</type> )
+        <returnvalue>name</returnvalue>
+       </para>
+       <para>
+        Returns a role's name given its OID.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_viewdef</primary>
+        </indexterm>
+        <function>pg_get_viewdef</function> ( <parameter>view</parameter> <type>oid</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the underlying <command>SELECT</command> command for a
+        view or materialized view.  (This is a decompiled reconstruction, not
+        the original text of the command.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <function>pg_get_viewdef</function> ( <parameter>view</parameter> <type>oid</type>, <parameter>wrap_column</parameter> <type>integer</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the underlying <command>SELECT</command> command for a
+        view or materialized view.  (This is a decompiled reconstruction, not
+        the original text of the command.)  In this form of the function,
+        pretty-printing is always enabled, and long lines are wrapped to try
+        to keep them shorter than the specified number of columns.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <function>pg_get_viewdef</function> ( <parameter>view</parameter> <type>text</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reconstructs the underlying <command>SELECT</command> command for a
+        view or materialized view, working from a textual name for the view
+        rather than its OID.  (This is deprecated; use the OID variant
+        instead.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_index_column_has_property</primary>
+        </indexterm>
+        <function>pg_index_column_has_property</function> ( <parameter>index</parameter> <type>regclass</type>, <parameter>column</parameter> <type>integer</type>, <parameter>property</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Tests whether an index column has the named property.
+        Common index column properties are listed in
+        <xref linkend="functions-info-index-column-props"/>.
+        (Note that extension access methods can define additional property
+        names for their indexes.)
+        <literal>NULL</literal> is returned if the property name is not known
+        or does not apply to the particular object, or if the OID or column
+        number does not identify a valid object.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_index_has_property</primary>
+        </indexterm>
+        <function>pg_index_has_property</function> ( <parameter>index</parameter> <type>regclass</type>, <parameter>property</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Tests whether an index has the named property.
+        Common index properties are listed in
+        <xref linkend="functions-info-index-props"/>.
+        (Note that extension access methods can define additional property
+        names for their indexes.)
+        <literal>NULL</literal> is returned if the property name is not known
+        or does not apply to the particular object, or if the OID does not
+        identify a valid object.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_indexam_has_property</primary>
+        </indexterm>
+        <function>pg_indexam_has_property</function> ( <parameter>am</parameter> <type>oid</type>, <parameter>property</parameter> <type>text</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Tests whether an index access method has the named property.
+        Access method properties are listed in
+        <xref linkend="functions-info-indexam-props"/>.
+        <literal>NULL</literal> is returned if the property name is not known
+        or does not apply to the particular object, or if the OID does not
+        identify a valid object.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_options_to_table</primary>
+        </indexterm>
+        <function>pg_options_to_table</function> ( <parameter>options_array</parameter> <type>text[]</type> )
+        <returnvalue>setof record</returnvalue>
+        ( <parameter>option_name</parameter> <type>text</type>,
+        <parameter>option_value</parameter> <type>text</type> )
+       </para>
+       <para>
+        Returns the set of storage options represented by a value from
+        <structname>pg_class</structname>.<structfield>reloptions</structfield> or
+        <structname>pg_attribute</structname>.<structfield>attoptions</structfield>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_settings_get_flags</primary>
+        </indexterm>
+        <function>pg_settings_get_flags</function> ( <parameter>guc</parameter> <type>text</type> )
+        <returnvalue>text[]</returnvalue>
+       </para>
+       <para>
+        Returns an array of the flags associated with the given GUC, or
+        <literal>NULL</literal> if it does not exist. The result is
+        an empty array if the GUC exists but there are no flags to show.
+        Only the most useful flags listed in
+        <xref linkend="functions-pg-settings-flags"/> are exposed.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_tablespace_databases</primary>
+        </indexterm>
+        <function>pg_tablespace_databases</function> ( <parameter>tablespace</parameter> <type>oid</type> )
+        <returnvalue>setof oid</returnvalue>
+       </para>
+       <para>
+        Returns the set of OIDs of databases that have objects stored in the
+        specified tablespace.  If this function returns any rows, the
+        tablespace is not empty and cannot be dropped.  To identify the specific
+        objects populating the tablespace, you will need to connect to the
+        database(s) identified by <function>pg_tablespace_databases</function>
+        and query their <structname>pg_class</structname> catalogs.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_tablespace_location</primary>
+        </indexterm>
+        <function>pg_tablespace_location</function> ( <parameter>tablespace</parameter> <type>oid</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns the file system path that this tablespace is located in.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_typeof</primary>
+        </indexterm>
+        <function>pg_typeof</function> ( <type>"any"</type> )
+        <returnvalue>regtype</returnvalue>
+       </para>
+       <para>
+        Returns the OID of the data type of the value that is passed to it.
+        This can be helpful for troubleshooting or dynamically constructing
+        SQL queries.  The function is declared as
+        returning <type>regtype</type>, which is an OID alias type (see
+        <xref linkend="datatype-oid"/>); this means that it is the same as an
+        OID for comparison purposes but displays as a type name.
+       </para>
+       <para>
+        <literal>pg_typeof(33)</literal>
+        <returnvalue>integer</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>COLLATION FOR</primary>
+        </indexterm>
+        <function>COLLATION FOR</function> ( <type>"any"</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns the name of the collation of the value that is passed to it.
+        The value is quoted and schema-qualified if necessary.  If no
+        collation was derived for the argument expression,
+        then <literal>NULL</literal> is returned.  If the argument is not of a
+        collatable data type, then an error is raised.
+       </para>
+       <para>
+        <literal>collation for ('foo'::text)</literal>
+        <returnvalue>"default"</returnvalue>
+       </para>
+       <para>
+        <literal>collation for ('foo' COLLATE "de_DE")</literal>
+        <returnvalue>"de_DE"</returnvalue>
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>to_regclass</primary>
+        </indexterm>
+        <function>to_regclass</function> ( <type>text</type> )
+        <returnvalue>regclass</returnvalue>
+       </para>
+       <para>
+        Translates a textual relation name to its OID.  A similar result is
+        obtained by casting the string to type <type>regclass</type> (see
+        <xref linkend="datatype-oid"/>); however, this function will return
+        <literal>NULL</literal> rather than throwing an error if the name is
+        not found.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>to_regcollation</primary>
+        </indexterm>
+        <function>to_regcollation</function> ( <type>text</type> )
+        <returnvalue>regcollation</returnvalue>
+       </para>
+       <para>
+        Translates a textual collation name to its OID.  A similar result is
+        obtained by casting the string to type <type>regcollation</type> (see
+        <xref linkend="datatype-oid"/>); however, this function will return
+        <literal>NULL</literal> rather than throwing an error if the name is
+        not found.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>to_regnamespace</primary>
+        </indexterm>
+        <function>to_regnamespace</function> ( <type>text</type> )
+        <returnvalue>regnamespace</returnvalue>
+       </para>
+       <para>
+        Translates a textual schema name to its OID.  A similar result is
+        obtained by casting the string to type <type>regnamespace</type> (see
+        <xref linkend="datatype-oid"/>); however, this function will return
+        <literal>NULL</literal> rather than throwing an error if the name is
+        not found.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>to_regoper</primary>
+        </indexterm>
+        <function>to_regoper</function> ( <type>text</type> )
+        <returnvalue>regoper</returnvalue>
+       </para>
+       <para>
+        Translates a textual operator name to its OID.  A similar result is
+        obtained by casting the string to type <type>regoper</type> (see
+        <xref linkend="datatype-oid"/>); however, this function will return
+        <literal>NULL</literal> rather than throwing an error if the name is
+        not found or is ambiguous.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>to_regoperator</primary>
+        </indexterm>
+        <function>to_regoperator</function> ( <type>text</type> )
+        <returnvalue>regoperator</returnvalue>
+       </para>
+       <para>
+        Translates a textual operator name (with parameter types) to its OID.  A similar result is
+        obtained by casting the string to type <type>regoperator</type> (see
+        <xref linkend="datatype-oid"/>); however, this function will return
+        <literal>NULL</literal> rather than throwing an error if the name is
+        not found.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>to_regproc</primary>
+        </indexterm>
+        <function>to_regproc</function> ( <type>text</type> )
+        <returnvalue>regproc</returnvalue>
+       </para>
+       <para>
+        Translates a textual function or procedure name to its OID.  A similar result is
+        obtained by casting the string to type <type>regproc</type> (see
+        <xref linkend="datatype-oid"/>); however, this function will return
+        <literal>NULL</literal> rather than throwing an error if the name is
+        not found or is ambiguous.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>to_regprocedure</primary>
+        </indexterm>
+        <function>to_regprocedure</function> ( <type>text</type> )
+        <returnvalue>regprocedure</returnvalue>
+       </para>
+       <para>
+        Translates a textual function or procedure name (with argument types) to its OID.  A similar result is
+        obtained by casting the string to type <type>regprocedure</type> (see
+        <xref linkend="datatype-oid"/>); however, this function will return
+        <literal>NULL</literal> rather than throwing an error if the name is
+        not found.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>to_regrole</primary>
+        </indexterm>
+        <function>to_regrole</function> ( <type>text</type> )
+        <returnvalue>regrole</returnvalue>
+       </para>
+       <para>
+        Translates a textual role name to its OID.  A similar result is
+        obtained by casting the string to type <type>regrole</type> (see
+        <xref linkend="datatype-oid"/>); however, this function will return
+        <literal>NULL</literal> rather than throwing an error if the name is
+        not found.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry id="to-regtype" xreflabel="to_regtype" role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>to_regtype</primary>
+        </indexterm>
+        <function>to_regtype</function> ( <type>text</type> )
+        <returnvalue>regtype</returnvalue>
+       </para>
+       <para>
+        Parses a string of text, extracts a potential type name from it,
+        and translates that name into a type OID.  A syntax error in the
+        string will result in an error; but if the string is a
+        syntactically valid type name that happens not to be found in the
+        catalogs, the result is <literal>NULL</literal>.  A similar result
+        is obtained by casting the string to type <type>regtype</type>
+        (see <xref linkend="datatype-oid"/>), except that that will throw
+        error for name not found.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>to_regtypemod</primary>
+        </indexterm>
+        <function>to_regtypemod</function> ( <type>text</type> )
+        <returnvalue>integer</returnvalue>
+       </para>
+       <para>
+        Parses a string of text, extracts a potential type name from it,
+        and translates its type modifier, if any.  A syntax error in the
+        string will result in an error; but if the string is a
+        syntactically valid type name that happens not to be found in the
+        catalogs, the result is <literal>NULL</literal>.  The result is
+        <literal>-1</literal> if no type modifier is present.
+       </para>
+       <para>
+        <function>to_regtypemod</function> can be combined with
+        <xref linkend="to-regtype"/> to produce appropriate inputs for
+        <xref linkend="format-type"/>, allowing a string representing a
+        type name to be canonicalized.
+       </para>
+       <para>
+        <literal>format_type(to_regtype('varchar(32)'), to_regtypemod('varchar(32)'))</literal>
+        <returnvalue>character varying(32)</returnvalue>
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+  <para>
+   Most of the functions that reconstruct (decompile) database objects
+   have an optional <parameter>pretty</parameter> flag, which
+   if <literal>true</literal> causes the result to
+   be <quote>pretty-printed</quote>.  Pretty-printing suppresses unnecessary
+   parentheses and adds whitespace for legibility.
+   The pretty-printed format is more readable, but the default format
+   is more likely to be interpreted the same way by future versions of
+   <productname>PostgreSQL</productname>; so avoid using pretty-printed output
+   for dump purposes.  Passing <literal>false</literal> for
+   the <parameter>pretty</parameter> parameter yields the same result as
+   omitting the parameter.
+  </para>
+
+  <table id="functions-info-index-column-props">
+   <title>Index Column Properties</title>
+   <tgroup cols="2">
+    <thead>
+     <row><entry>Name</entry><entry>Description</entry></row>
+    </thead>
+    <tbody>
+     <row>
+      <entry><literal>asc</literal></entry>
+      <entry>Does the column sort in ascending order on a forward scan?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>desc</literal></entry>
+      <entry>Does the column sort in descending order on a forward scan?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>nulls_first</literal></entry>
+      <entry>Does the column sort with nulls first on a forward scan?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>nulls_last</literal></entry>
+      <entry>Does the column sort with nulls last on a forward scan?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>orderable</literal></entry>
+      <entry>Does the column possess any defined sort ordering?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>distance_orderable</literal></entry>
+      <entry>Can the column be scanned in order by a <quote>distance</quote>
+      operator, for example <literal>ORDER BY col &lt;-&gt; constant</literal> ?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>returnable</literal></entry>
+      <entry>Can the column value be returned by an index-only scan?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>search_array</literal></entry>
+      <entry>Does the column natively support <literal>col = ANY(array)</literal>
+      searches?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>search_nulls</literal></entry>
+      <entry>Does the column support <literal>IS NULL</literal> and
+      <literal>IS NOT NULL</literal> searches?
+      </entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+  <table id="functions-info-index-props">
+   <title>Index Properties</title>
+   <tgroup cols="2">
+    <thead>
+     <row><entry>Name</entry><entry>Description</entry></row>
+    </thead>
+    <tbody>
+     <row>
+      <entry><literal>clusterable</literal></entry>
+      <entry>Can the index be used in a <literal>CLUSTER</literal> command?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>index_scan</literal></entry>
+      <entry>Does the index support plain (non-bitmap) scans?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>bitmap_scan</literal></entry>
+      <entry>Does the index support bitmap scans?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>backward_scan</literal></entry>
+      <entry>Can the scan direction be changed in mid-scan (to
+             support <literal>FETCH BACKWARD</literal> on a cursor without
+             needing materialization)?
+      </entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+  <table id="functions-info-indexam-props">
+   <title>Index Access Method Properties</title>
+   <tgroup cols="2">
+    <thead>
+     <row><entry>Name</entry><entry>Description</entry></row>
+    </thead>
+    <tbody>
+     <row>
+      <entry><literal>can_order</literal></entry>
+      <entry>Does the access method support <literal>ASC</literal>,
+      <literal>DESC</literal> and related keywords in
+      <literal>CREATE INDEX</literal>?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>can_unique</literal></entry>
+      <entry>Does the access method support unique indexes?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>can_multi_col</literal></entry>
+      <entry>Does the access method support indexes with multiple columns?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>can_exclude</literal></entry>
+      <entry>Does the access method support exclusion constraints?
+      </entry>
+     </row>
+     <row>
+      <entry><literal>can_include</literal></entry>
+      <entry>Does the access method support the <literal>INCLUDE</literal>
+        clause of <literal>CREATE INDEX</literal>?
+      </entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+  <table id="functions-pg-settings-flags">
+   <title>GUC Flags</title>
+   <tgroup cols="2">
+    <thead>
+     <row><entry>Flag</entry><entry>Description</entry></row>
+    </thead>
+    <tbody>
+     <row>
+      <entry><literal>EXPLAIN</literal></entry>
+      <entry>Parameters with this flag are included in
+       <command>EXPLAIN (SETTINGS)</command> commands.
+      </entry>
+     </row>
+     <row>
+      <entry><literal>NO_SHOW_ALL</literal></entry>
+      <entry>Parameters with this flag are excluded from
+       <command>SHOW ALL</command> commands.
+      </entry>
+     </row>
+     <row>
+      <entry><literal>NO_RESET</literal></entry>
+      <entry>Parameters with this flag do not support
+      <command>RESET</command> commands.
+      </entry>
+     </row>
+     <row>
+      <entry><literal>NO_RESET_ALL</literal></entry>
+      <entry>Parameters with this flag are excluded from
+       <command>RESET ALL</command> commands.
+      </entry>
+     </row>
+     <row>
+      <entry><literal>NOT_IN_SAMPLE</literal></entry>
+      <entry>Parameters with this flag are not included in
+       <filename>postgresql.conf</filename> by default.
+      </entry>
+     </row>
+     <row>
+      <entry><literal>RUNTIME_COMPUTED</literal></entry>
+      <entry>Parameters with this flag are runtime-computed ones.
+      </entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+  </sect2>
+
+  <sect2 id="functions-info-object">
+   <title>Object Information and Addressing Functions</title>
+
+  <para>
+   <xref linkend="functions-info-object-table"/> lists functions related to
+   database object identification and addressing.
+  </para>
+
+   <table id="functions-info-object-table">
+    <title>Object Information and Addressing Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_describe_object</primary>
+        </indexterm>
+        <function>pg_describe_object</function> ( <parameter>classid</parameter> <type>oid</type>, <parameter>objid</parameter> <type>oid</type>, <parameter>objsubid</parameter> <type>integer</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns a textual description of a database object identified by
+        catalog OID, object OID, and sub-object ID (such as a column number
+        within a table; the sub-object ID is zero when referring to a whole
+        object).  This description is intended to be human-readable, and might
+        be translated, depending on server configuration.  This is especially
+        useful to determine the identity of an object referenced in the
+        <structname>pg_depend</structname> catalog. This function returns
+        <literal>NULL</literal> values for undefined objects.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_identify_object</primary>
+        </indexterm>
+        <function>pg_identify_object</function> ( <parameter>classid</parameter> <type>oid</type>, <parameter>objid</parameter> <type>oid</type>, <parameter>objsubid</parameter> <type>integer</type> )
+        <returnvalue>record</returnvalue>
+        ( <parameter>type</parameter> <type>text</type>,
+        <parameter>schema</parameter> <type>text</type>,
+        <parameter>name</parameter> <type>text</type>,
+        <parameter>identity</parameter> <type>text</type> )
+       </para>
+       <para>
+        Returns a row containing enough information to uniquely identify the
+        database object specified by catalog OID, object OID and sub-object
+        ID.
+        This information is intended to be machine-readable, and is never
+        translated.
+        <parameter>type</parameter> identifies the type of database object;
+        <parameter>schema</parameter> is the schema name that the object
+        belongs in, or <literal>NULL</literal> for object types that do not
+        belong to schemas;
+        <parameter>name</parameter> is the name of the object, quoted if
+        necessary, if the name (along with schema name, if pertinent) is
+        sufficient to uniquely identify the object,
+        otherwise <literal>NULL</literal>;
+        <parameter>identity</parameter> is the complete object identity, with
+        the precise format depending on object type, and each name within the
+        format being schema-qualified and quoted as necessary. Undefined
+        objects are identified with <literal>NULL</literal> values.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_identify_object_as_address</primary>
+        </indexterm>
+        <function>pg_identify_object_as_address</function> ( <parameter>classid</parameter> <type>oid</type>, <parameter>objid</parameter> <type>oid</type>, <parameter>objsubid</parameter> <type>integer</type> )
+        <returnvalue>record</returnvalue>
+        ( <parameter>type</parameter> <type>text</type>,
+        <parameter>object_names</parameter> <type>text[]</type>,
+        <parameter>object_args</parameter> <type>text[]</type> )
+       </para>
+       <para>
+        Returns a row containing enough information to uniquely identify the
+        database object specified by catalog OID, object OID and sub-object
+        ID.
+        The returned information is independent of the current server, that
+        is, it could be used to identify an identically named object in
+        another server.
+        <parameter>type</parameter> identifies the type of database object;
+        <parameter>object_names</parameter> and
+        <parameter>object_args</parameter>
+        are text arrays that together form a reference to the object.
+        These three values can be passed
+        to <function>pg_get_object_address</function> to obtain the internal
+        address of the object.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_object_address</primary>
+        </indexterm>
+        <function>pg_get_object_address</function> ( <parameter>type</parameter> <type>text</type>, <parameter>object_names</parameter> <type>text[]</type>, <parameter>object_args</parameter> <type>text[]</type> )
+        <returnvalue>record</returnvalue>
+        ( <parameter>classid</parameter> <type>oid</type>,
+        <parameter>objid</parameter> <type>oid</type>,
+        <parameter>objsubid</parameter> <type>integer</type> )
+       </para>
+       <para>
+        Returns a row containing enough information to uniquely identify the
+        database object specified by a type code and object name and argument
+        arrays.
+        The returned values are the ones that would be used in system catalogs
+        such as <structname>pg_depend</structname>; they can be passed to
+        other system functions such as <function>pg_describe_object</function>
+        or <function>pg_identify_object</function>.
+        <parameter>classid</parameter> is the OID of the system catalog
+        containing the object;
+        <parameter>objid</parameter> is the OID of the object itself, and
+        <parameter>objsubid</parameter> is the sub-object ID, or zero if none.
+        This function is the inverse
+        of <function>pg_identify_object_as_address</function>.
+        Undefined objects are identified with <literal>NULL</literal> values.
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+  </sect2>
+
+  <sect2 id="functions-info-comment">
+   <title>Comment Information Functions</title>
+
+   <indexterm>
+    <primary>comment</primary>
+    <secondary sortas="database objects">about database objects</secondary>
+   </indexterm>
+
+   <para>
+    The functions shown in <xref linkend="functions-info-comment-table"/>
+    extract comments previously stored with the <xref linkend="sql-comment"/>
+    command.  A null value is returned if no
+    comment could be found for the specified parameters.
+   </para>
+
+   <table id="functions-info-comment-table">
+    <title>Comment Information Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>col_description</primary>
+        </indexterm>
+        <function>col_description</function> ( <parameter>table</parameter> <type>oid</type>, <parameter>column</parameter> <type>integer</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns the comment for a table column, which is specified by the OID
+        of its table and its column number.
+        (<function>obj_description</function> cannot be used for table
+        columns, since columns do not have OIDs of their own.)
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>obj_description</primary>
+        </indexterm>
+        <function>obj_description</function> ( <parameter>object</parameter> <type>oid</type>, <parameter>catalog</parameter> <type>name</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns the comment for a database object specified by its OID and the
+        name of the containing system catalog.  For
+        example, <literal>obj_description(123456, 'pg_class')</literal> would
+        retrieve the comment for the table with OID 123456.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <function>obj_description</function> ( <parameter>object</parameter> <type>oid</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns the comment for a database object specified by its OID alone.
+        This is <emphasis>deprecated</emphasis> since there is no guarantee
+        that OIDs are unique across different system catalogs; therefore, the
+        wrong comment might be returned.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>shobj_description</primary>
+        </indexterm>
+        <function>shobj_description</function> ( <parameter>object</parameter> <type>oid</type>, <parameter>catalog</parameter> <type>name</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns the comment for a shared database object specified by its OID
+        and the name of the containing system catalog.  This is just
+        like <function>obj_description</function> except that it is used for
+        retrieving comments on shared objects (that is, databases, roles, and
+        tablespaces).  Some system catalogs are global to all databases within
+        each cluster, and the descriptions for objects in them are stored
+        globally as well.
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+  </sect2>
+
+  <sect2 id="functions-info-validity">
+   <title>Data Validity Checking Functions</title>
+
+   <para>
+    The functions shown in <xref linkend="functions-info-validity-table"/>
+    can be helpful for checking validity of proposed input data.
+   </para>
+
+   <table id="functions-info-validity-table">
+    <title>Data Validity Checking Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para>
+       <para>
+        Example(s)
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_input_is_valid</primary>
+        </indexterm>
+        <function>pg_input_is_valid</function> (
+          <parameter>string</parameter> <type>text</type>,
+          <parameter>type</parameter> <type>text</type>
+        )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Tests whether the given <parameter>string</parameter> is valid
+        input for the specified data type, returning true or false.
+       </para>
+       <para>
+        This function will only work as desired if the data type's input
+        function has been updated to report invalid input as
+        a <quote>soft</quote> error.  Otherwise, invalid input will abort
+        the transaction, just as if the string had been cast to the type
+        directly.
+        </para>
+        <para>
+         <literal>pg_input_is_valid('42', 'integer')</literal>
+         <returnvalue>t</returnvalue>
+        </para>
+        <para>
+         <literal>pg_input_is_valid('42000000000', 'integer')</literal>
+         <returnvalue>f</returnvalue>
+        </para>
+        <para>
+         <literal>pg_input_is_valid('1234.567', 'numeric(7,4)')</literal>
+         <returnvalue>f</returnvalue>
+       </para></entry>
+      </row>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_input_error_info</primary>
+        </indexterm>
+        <function>pg_input_error_info</function> (
+          <parameter>string</parameter> <type>text</type>,
+          <parameter>type</parameter> <type>text</type>
+        )
+        <returnvalue>record</returnvalue>
+        ( <parameter>message</parameter> <type>text</type>,
+        <parameter>detail</parameter> <type>text</type>,
+        <parameter>hint</parameter> <type>text</type>,
+        <parameter>sql_error_code</parameter> <type>text</type> )
+       </para>
+       <para>
+        Tests whether the given <parameter>string</parameter> is valid
+        input for the specified data type; if not, return the details of
+        the error that would have been thrown.  If the input is valid, the
+        results are NULL.  The inputs are the same as
+        for <function>pg_input_is_valid</function>.
+       </para>
+       <para>
+        This function will only work as desired if the data type's input
+        function has been updated to report invalid input as
+        a <quote>soft</quote> error.  Otherwise, invalid input will abort
+        the transaction, just as if the string had been cast to the type
+        directly.
+       </para>
+       <para>
+        <literal>select * from pg_input_error_info('42000000000', 'integer')</literal>
+        <returnvalue></returnvalue>
+<programlisting>
+                       message                        | detail | hint | sql_error_code
+------------------------------------------------------+--------+------+----------------
+ value "42000000000" is out of range for type integer |        |      | 22003
+</programlisting>
+       </para>
+       <para>
+        <literal>select message, detail from pg_input_error_info('1234.567', 'numeric(7,4)')</literal>
+        <returnvalue></returnvalue>
+<programlisting>
+        message         |                                      detail
+------------------------+----------------------------------&zwsp;-------------------------------------------------
+ numeric field overflow | A field with precision 7, scale 4 must round to an absolute value less than 10^3.
+</programlisting>
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+  </sect2>
+
+  <sect2 id="functions-info-snapshot">
+   <title>Transaction ID and Snapshot Information Functions</title>
+
+   <para>
+    The functions shown in <xref linkend="functions-pg-snapshot"/>
+    provide server transaction information in an exportable form.  The main
+    use of these functions is to determine which transactions were committed
+    between two snapshots.
+   </para>
+
+   <table id="functions-pg-snapshot">
+    <title>Transaction ID and Snapshot Information Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_current_xact_id</primary>
+        </indexterm>
+        <function>pg_current_xact_id</function> ()
+        <returnvalue>xid8</returnvalue>
+       </para>
+       <para>
+        Returns the current transaction's ID.  It will assign a new one if the
+        current transaction does not have one already (because it has not
+        performed any database updates);  see <xref
+        linkend="transaction-id"/> for details.  If executed in a
+        subtransaction, this will return the top-level transaction ID;
+        see <xref linkend="subxacts"/> for details.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_current_xact_id_if_assigned</primary>
+        </indexterm>
+        <function>pg_current_xact_id_if_assigned</function> ()
+        <returnvalue>xid8</returnvalue>
+       </para>
+       <para>
+        Returns the current transaction's ID, or <literal>NULL</literal> if no
+        ID is assigned yet.  (It's best to use this variant if the transaction
+        might otherwise be read-only, to avoid unnecessary consumption of an
+        XID.)
+        If executed in a subtransaction, this will return the top-level
+        transaction ID.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_xact_status</primary>
+        </indexterm>
+        <function>pg_xact_status</function> ( <type>xid8</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Reports the commit status of a recent transaction.
+        The result is one of <literal>in progress</literal>,
+        <literal>committed</literal>, or <literal>aborted</literal>,
+        provided that the transaction is recent enough that the system retains
+        the commit status of that transaction.
+        If it is old enough that no references to the transaction survive in
+        the system and the commit status information has been discarded, the
+        result is <literal>NULL</literal>.
+        Applications might use this function, for example, to determine
+        whether their transaction committed or aborted after the application
+        and database server become disconnected while
+        a <literal>COMMIT</literal> is in progress.
+        Note that prepared transactions are reported as <literal>in
+        progress</literal>; applications must check <link
+        linkend="view-pg-prepared-xacts"><structname>pg_prepared_xacts</structname></link>
+        if they need to determine whether a transaction ID belongs to a
+        prepared transaction.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_current_snapshot</primary>
+        </indexterm>
+        <function>pg_current_snapshot</function> ()
+        <returnvalue>pg_snapshot</returnvalue>
+       </para>
+       <para>
+        Returns a current <firstterm>snapshot</firstterm>, a data structure
+        showing which transaction IDs are now in-progress.
+        Only top-level transaction IDs are included in the snapshot;
+        subtransaction IDs are not shown;  see <xref linkend="subxacts"/>
+        for details.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_snapshot_xip</primary>
+        </indexterm>
+        <function>pg_snapshot_xip</function> ( <type>pg_snapshot</type> )
+        <returnvalue>setof xid8</returnvalue>
+       </para>
+       <para>
+        Returns the set of in-progress transaction IDs contained in a snapshot.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_snapshot_xmax</primary>
+        </indexterm>
+        <function>pg_snapshot_xmax</function> ( <type>pg_snapshot</type> )
+        <returnvalue>xid8</returnvalue>
+       </para>
+       <para>
+        Returns the <structfield>xmax</structfield> of a snapshot.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_snapshot_xmin</primary>
+        </indexterm>
+        <function>pg_snapshot_xmin</function> ( <type>pg_snapshot</type> )
+        <returnvalue>xid8</returnvalue>
+       </para>
+       <para>
+        Returns the <structfield>xmin</structfield> of a snapshot.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_visible_in_snapshot</primary>
+        </indexterm>
+        <function>pg_visible_in_snapshot</function> ( <type>xid8</type>, <type>pg_snapshot</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        Is the given transaction ID <firstterm>visible</firstterm> according
+        to this snapshot (that is, was it completed before the snapshot was
+        taken)?  Note that this function will not give the correct answer for
+        a subtransaction ID (subxid);  see <xref linkend="subxacts"/> for
+        details.
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+   <para>
+    The internal transaction ID type <type>xid</type> is 32 bits wide and
+    wraps around every 4 billion transactions.  However,
+    the functions shown in <xref linkend="functions-pg-snapshot"/> use a
+    64-bit type <type>xid8</type> that does not wrap around during the life
+    of an installation and can be converted to <type>xid</type> by casting if
+    required;  see <xref linkend="transaction-id"/> for details.
+    The data type <type>pg_snapshot</type> stores information about
+    transaction ID visibility at a particular moment in time.  Its components
+    are described in <xref linkend="functions-pg-snapshot-parts"/>.
+    <type>pg_snapshot</type>'s textual representation is
+    <literal><replaceable>xmin</replaceable>:<replaceable>xmax</replaceable>:<replaceable>xip_list</replaceable></literal>.
+    For example <literal>10:20:10,14,15</literal> means
+    <literal>xmin=10, xmax=20, xip_list=10, 14, 15</literal>.
+   </para>
+
+   <table id="functions-pg-snapshot-parts">
+    <title>Snapshot Components</title>
+    <tgroup cols="2">
+     <thead>
+      <row>
+       <entry>Name</entry>
+       <entry>Description</entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry><structfield>xmin</structfield></entry>
+       <entry>
+         Lowest transaction ID that was still active.  All transaction IDs
+         less than <structfield>xmin</structfield> are either committed and visible,
+         or rolled back and dead.
+       </entry>
+      </row>
+
+      <row>
+       <entry><structfield>xmax</structfield></entry>
+       <entry>
+         One past the highest completed transaction ID.  All transaction IDs
+         greater than or equal to <structfield>xmax</structfield> had not yet
+         completed as of the time of the snapshot, and thus are invisible.
+       </entry>
+      </row>
+
+      <row>
+       <entry><structfield>xip_list</structfield></entry>
+       <entry>
+        Transactions in progress at the time of the snapshot.  A transaction
+        ID that is <literal>xmin &lt;= <replaceable>X</replaceable> &lt;
+        xmax</literal> and not in this list was already completed at the time
+        of the snapshot, and thus is either visible or dead according to its
+        commit status.  This list does not include the transaction IDs of
+        subtransactions (subxids).
+       </entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+   <para>
+    In releases of <productname>PostgreSQL</productname> before 13 there was
+    no <type>xid8</type> type, so variants of these functions were provided
+    that used <type>bigint</type> to represent a 64-bit XID, with a
+    correspondingly distinct snapshot data type <type>txid_snapshot</type>.
+    These older functions have <literal>txid</literal> in their names.  They
+    are still supported for backward compatibility, but may be removed from a
+    future release. See <xref linkend="functions-txid-snapshot"/>.
+   </para>
+
+   <table id="functions-txid-snapshot">
+    <title>Deprecated Transaction ID and Snapshot Information Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>age</primary>
+        </indexterm>
+        <function>age</function>  ( <type>xid</type> )
+        <returnvalue>integer</returnvalue>
+       </para>
+       <para>
+        Returns the number of transactions between the supplied
+        transaction id and the current transaction counter.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>mxid_age</primary>
+        </indexterm>
+        <function>mxid_age</function>  ( <type>xid</type> )
+        <returnvalue>integer</returnvalue>
+       </para>
+       <para>
+        Returns the number of multixacts IDs between the supplied
+        multixact ID and the current multixacts counter.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>txid_current</primary>
+        </indexterm>
+        <function>txid_current</function> ()
+        <returnvalue>bigint</returnvalue>
+       </para>
+       <para>
+        See <function>pg_current_xact_id()</function>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>txid_current_if_assigned</primary>
+        </indexterm>
+        <function>txid_current_if_assigned</function> ()
+        <returnvalue>bigint</returnvalue>
+       </para>
+       <para>
+        See <function>pg_current_xact_id_if_assigned()</function>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>txid_current_snapshot</primary>
+        </indexterm>
+        <function>txid_current_snapshot</function> ()
+        <returnvalue>txid_snapshot</returnvalue>
+       </para>
+       <para>
+        See <function>pg_current_snapshot()</function>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>txid_snapshot_xip</primary>
+        </indexterm>
+        <function>txid_snapshot_xip</function> ( <type>txid_snapshot</type> )
+        <returnvalue>setof bigint</returnvalue>
+       </para>
+       <para>
+        See <function>pg_snapshot_xip()</function>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>txid_snapshot_xmax</primary>
+        </indexterm>
+        <function>txid_snapshot_xmax</function> ( <type>txid_snapshot</type> )
+        <returnvalue>bigint</returnvalue>
+       </para>
+       <para>
+        See <function>pg_snapshot_xmax()</function>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>txid_snapshot_xmin</primary>
+        </indexterm>
+        <function>txid_snapshot_xmin</function> ( <type>txid_snapshot</type> )
+        <returnvalue>bigint</returnvalue>
+       </para>
+       <para>
+        See <function>pg_snapshot_xmin()</function>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>txid_visible_in_snapshot</primary>
+        </indexterm>
+        <function>txid_visible_in_snapshot</function> ( <type>bigint</type>, <type>txid_snapshot</type> )
+        <returnvalue>boolean</returnvalue>
+       </para>
+       <para>
+        See <function>pg_visible_in_snapshot()</function>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>txid_status</primary>
+        </indexterm>
+        <function>txid_status</function> ( <type>bigint</type> )
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        See <function>pg_xact_status()</function>.
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+  </sect2>
+
+  <sect2 id="functions-info-commit-timestamp">
+   <title>Committed Transaction Information Functions</title>
+
+   <para>
+    The functions shown in <xref linkend="functions-commit-timestamp"/>
+    provide information about when past transactions were committed.
+    They only provide useful data when the
+    <xref linkend="guc-track-commit-timestamp"/> configuration option is
+    enabled, and only for transactions that were committed after it was
+    enabled.  Commit timestamp information is routinely removed during
+    vacuum.
+   </para>
+
+   <table id="functions-commit-timestamp">
+    <title>Committed Transaction Information Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_xact_commit_timestamp</primary>
+        </indexterm>
+        <function>pg_xact_commit_timestamp</function> ( <type>xid</type> )
+        <returnvalue>timestamp with time zone</returnvalue>
+       </para>
+       <para>
+        Returns the commit timestamp of a transaction.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_xact_commit_timestamp_origin</primary>
+        </indexterm>
+        <function>pg_xact_commit_timestamp_origin</function> ( <type>xid</type> )
+        <returnvalue>record</returnvalue>
+        ( <parameter>timestamp</parameter> <type>timestamp with time zone</type>,
+         <parameter>roident</parameter> <type>oid</type>)
+       </para>
+       <para>
+         Returns the commit timestamp and replication origin of a transaction.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_last_committed_xact</primary>
+        </indexterm>
+        <function>pg_last_committed_xact</function> ()
+        <returnvalue>record</returnvalue>
+        ( <parameter>xid</parameter> <type>xid</type>,
+        <parameter>timestamp</parameter> <type>timestamp with time zone</type>,
+        <parameter>roident</parameter> <type>oid</type> )
+       </para>
+       <para>
+        Returns the transaction ID, commit timestamp and replication origin
+        of the latest committed transaction.
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+  </sect2>
+
+  <sect2 id="functions-info-controldata">
+   <title>Control Data Functions</title>
+
+   <para>
+    The functions shown in <xref linkend="functions-controldata"/>
+    print information initialized during <command>initdb</command>, such
+    as the catalog version. They also show information about write-ahead
+    logging and checkpoint processing. This information is cluster-wide,
+    not specific to any one database. These functions provide most of the same
+    information, from the same source, as the
+    <xref linkend="app-pgcontroldata"/> application.
+   </para>
+
+   <table id="functions-controldata">
+    <title>Control Data Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_control_checkpoint</primary>
+        </indexterm>
+        <function>pg_control_checkpoint</function> ()
+        <returnvalue>record</returnvalue>
+       </para>
+       <para>
+        Returns information about current checkpoint state, as shown in
+        <xref linkend="functions-pg-control-checkpoint"/>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_control_system</primary>
+        </indexterm>
+        <function>pg_control_system</function> ()
+        <returnvalue>record</returnvalue>
+       </para>
+       <para>
+        Returns information about current control file state, as shown in
+        <xref linkend="functions-pg-control-system"/>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_control_init</primary>
+        </indexterm>
+        <function>pg_control_init</function> ()
+        <returnvalue>record</returnvalue>
+       </para>
+       <para>
+        Returns information about cluster initialization state, as shown in
+        <xref linkend="functions-pg-control-init"/>.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_control_recovery</primary>
+        </indexterm>
+        <function>pg_control_recovery</function> ()
+        <returnvalue>record</returnvalue>
+       </para>
+       <para>
+        Returns information about recovery state, as shown in
+        <xref linkend="functions-pg-control-recovery"/>.
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+   <table id="functions-pg-control-checkpoint">
+    <title><function>pg_control_checkpoint</function> Output Columns</title>
+    <tgroup cols="2">
+     <thead>
+      <row>
+       <entry>Column Name</entry>
+       <entry>Data Type</entry>
+      </row>
+     </thead>
+
+     <tbody>
+
+      <row>
+       <entry><structfield>checkpoint_lsn</structfield></entry>
+       <entry><type>pg_lsn</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>redo_lsn</structfield></entry>
+       <entry><type>pg_lsn</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>redo_wal_file</structfield></entry>
+       <entry><type>text</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>timeline_id</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>prev_timeline_id</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>full_page_writes</structfield></entry>
+       <entry><type>boolean</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>next_xid</structfield></entry>
+       <entry><type>text</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>next_oid</structfield></entry>
+       <entry><type>oid</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>next_multixact_id</structfield></entry>
+       <entry><type>xid</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>next_multi_offset</structfield></entry>
+       <entry><type>xid</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>oldest_xid</structfield></entry>
+       <entry><type>xid</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>oldest_xid_dbid</structfield></entry>
+       <entry><type>oid</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>oldest_active_xid</structfield></entry>
+       <entry><type>xid</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>oldest_multi_xid</structfield></entry>
+       <entry><type>xid</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>oldest_multi_dbid</structfield></entry>
+       <entry><type>oid</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>oldest_commit_ts_xid</structfield></entry>
+       <entry><type>xid</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>newest_commit_ts_xid</structfield></entry>
+       <entry><type>xid</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>checkpoint_time</structfield></entry>
+       <entry><type>timestamp with time zone</type></entry>
+      </row>
+
+     </tbody>
+    </tgroup>
+   </table>
+
+   <table id="functions-pg-control-system">
+    <title><function>pg_control_system</function> Output Columns</title>
+    <tgroup cols="2">
+     <thead>
+      <row>
+       <entry>Column Name</entry>
+       <entry>Data Type</entry>
+      </row>
+     </thead>
+
+     <tbody>
+
+      <row>
+       <entry><structfield>pg_control_version</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>catalog_version_no</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>system_identifier</structfield></entry>
+       <entry><type>bigint</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>pg_control_last_modified</structfield></entry>
+       <entry><type>timestamp with time zone</type></entry>
+      </row>
+
+     </tbody>
+    </tgroup>
+   </table>
+
+   <table id="functions-pg-control-init">
+    <title><function>pg_control_init</function> Output Columns</title>
+    <tgroup cols="2">
+     <thead>
+      <row>
+       <entry>Column Name</entry>
+       <entry>Data Type</entry>
+      </row>
+     </thead>
+
+     <tbody>
+
+      <row>
+       <entry><structfield>max_data_alignment</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>database_block_size</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>blocks_per_segment</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>wal_block_size</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>bytes_per_wal_segment</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>max_identifier_length</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>max_index_columns</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>max_toast_chunk_size</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>large_object_chunk_size</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>float8_pass_by_value</structfield></entry>
+       <entry><type>boolean</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>data_page_checksum_version</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+     </tbody>
+    </tgroup>
+   </table>
+
+   <table id="functions-pg-control-recovery">
+    <title><function>pg_control_recovery</function> Output Columns</title>
+    <tgroup cols="2">
+     <thead>
+      <row>
+       <entry>Column Name</entry>
+       <entry>Data Type</entry>
+      </row>
+     </thead>
+
+     <tbody>
+
+      <row>
+       <entry><structfield>min_recovery_end_lsn</structfield></entry>
+       <entry><type>pg_lsn</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>min_recovery_end_timeline</structfield></entry>
+       <entry><type>integer</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>backup_start_lsn</structfield></entry>
+       <entry><type>pg_lsn</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>backup_end_lsn</structfield></entry>
+       <entry><type>pg_lsn</type></entry>
+      </row>
+
+      <row>
+       <entry><structfield>end_of_backup_record_required</structfield></entry>
+       <entry><type>boolean</type></entry>
+      </row>
+
+     </tbody>
+    </tgroup>
+   </table>
+
+  </sect2>
+
+  <sect2 id="functions-info-version">
+   <title>Version Information Functions</title>
+
+   <para>
+    The functions shown in <xref linkend="functions-version"/>
+    print version information.
+   </para>
+
+   <table id="functions-version">
+    <title>Version Information Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>version</primary>
+        </indexterm>
+        <function>version</function> ()
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns a string describing the <productname>PostgreSQL</productname>
+        server's version.  You can also get this information from
+        <xref linkend="guc-server-version"/>, or for a machine-readable
+        version use <xref linkend="guc-server-version-num"/>.  Software
+        developers should use <varname>server_version_num</varname> (available
+        since 8.2) or <xref linkend="libpq-PQserverVersion"/> instead of
+        parsing the text version.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>unicode_version</primary>
+        </indexterm>
+        <function>unicode_version</function> ()
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns a string representing the version of Unicode used by
+        <productname>PostgreSQL</productname>.
+       </para></entry>
+      </row>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>icu_unicode_version</primary>
+        </indexterm>
+        <function>icu_unicode_version</function> ()
+        <returnvalue>text</returnvalue>
+       </para>
+       <para>
+        Returns a string representing the version of Unicode used by ICU, if
+        the server was built with ICU support; otherwise returns
+        <literal>NULL</literal> </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+  </sect2>
+
+  <sect2 id="functions-info-wal-summary">
+   <title>WAL Summarization Information Functions</title>
+
+   <para>
+    The functions shown in <xref linkend="functions-wal-summary"/>
+    print information about the status of WAL summarization.
+    See <xref linkend="guc-summarize-wal" />.
+   </para>
+
+   <table id="functions-wal-summary">
+    <title>WAL Summarization Information Functions</title>
+    <tgroup cols="1">
+     <thead>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        Function
+       </para>
+       <para>
+        Description
+       </para></entry>
+      </row>
+     </thead>
+
+     <tbody>
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_available_wal_summaries</primary>
+        </indexterm>
+        <function>pg_available_wal_summaries</function> ()
+        <returnvalue>setof record</returnvalue>
+        ( <parameter>tli</parameter> <type>bigint</type>,
+        <parameter>start_lsn</parameter> <type>pg_lsn</type>,
+        <parameter>end_lsn</parameter> <type>pg_lsn</type> )
+       </para>
+       <para>
+        Returns information about the WAL summary files present in the
+        data directory, under <literal>pg_wal/summaries</literal>.
+        One row will be returned per WAL summary file. Each file summarizes
+        WAL on the indicated TLI within the indicated LSN range. This function
+        might be useful to determine whether enough WAL summaries are present
+        on the server to take an incremental backup based on some prior
+        backup whose start LSN is known.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_wal_summary_contents</primary>
+        </indexterm>
+        <function>pg_wal_summary_contents</function> ( <parameter>tli</parameter> <type>bigint</type>, <parameter>start_lsn</parameter> <type>pg_lsn</type>, <parameter>end_lsn</parameter> <type>pg_lsn</type> )
+        <returnvalue>setof record</returnvalue>
+        ( <parameter>relfilenode</parameter> <type>oid</type>,
+        <parameter>reltablespace</parameter> <type>oid</type>,
+        <parameter>reldatabase</parameter> <type>oid</type>,
+        <parameter>relforknumber</parameter> <type>smallint</type>,
+        <parameter>relblocknumber</parameter> <type>bigint</type>,
+        <parameter>is_limit_block</parameter> <type>boolean</type> )
+       </para>
+       <para>
+        Returns one information about the contents of a single WAL summary file
+        identified by TLI and starting and ending LSNs. Each row with
+        <literal>is_limit_block</literal> false indicates that the block
+        identified by the remaining output columns was modified by at least
+        one WAL record within the range of records summarized by this file.
+        Each row with <literal>is_limit_block</literal> true indicates either
+        that (a) the relation fork was truncated to the length given by
+        <literal>relblocknumber</literal> within the relevant range of WAL
+        records or (b) that the relation fork was created or dropped within
+        the relevant range of WAL records; in such cases,
+        <literal>relblocknumber</literal> will be zero.
+       </para></entry>
+      </row>
+
+      <row>
+       <entry role="func_table_entry"><para role="func_signature">
+        <indexterm>
+         <primary>pg_get_wal_summarizer_state</primary>
+        </indexterm>
+        <function>pg_get_wal_summarizer_state</function> ()
+        <returnvalue>record</returnvalue>
+        ( <parameter>summarized_tli</parameter> <type>bigint</type>,
+        <parameter>summarized_lsn</parameter> <type>pg_lsn</type>,
+        <parameter>pending_lsn</parameter> <type>pg_lsn</type>,
+        <parameter>summarizer_pid</parameter> <type>int</type> )
+       </para>
+       <para>
+        Returns information about the progress of the WAL summarizer. If the
+        WAL summarizer has never run since the instance was started, then
+        <literal>summarized_tli</literal> and <literal>summarized_lsn</literal>
+        will be <literal>0</literal> and <literal>0/0</literal> respectively;
+        otherwise, they will be the TLI and ending LSN of the last WAL summary
+        file written to disk. If the WAL summarizer is currently running,
+        <literal>pending_lsn</literal> will be the ending LSN of the last
+        record that it has consumed, which must always be greater than or
+        equal to <literal>summarized_lsn</literal>; if the WAL summarizer is
+        not running, it will be equal to <literal>summarized_lsn</literal>.
+        <literal>summarizer_pid</literal> is the PID of the WAL summarizer
+        process, if it is running, and otherwise NULL.
+       </para></entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+
+  </sect2>
+
+  </sect1>
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 8fd550ad..35a2d25b 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -12602,3646 +12602,7 @@ SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n);
 
  </sect1>
 
- <sect1 id="functions-info">
-  <title>System Information Functions and Operators</title>
-
-   <para>
-    The functions described in this section are used to obtain various
-    information about a <productname>PostgreSQL</productname> installation.
-   </para>
-
-  <sect2 id="functions-info-session">
-   <title>Session Information Functions</title>
-
-  <para>
-   <xref linkend="functions-info-session-table"/> shows several
-   functions that extract session and system information.
-  </para>
-
-  <para>
-   In addition to the functions listed in this section, there are a number of
-   functions related to the statistics system that also provide system
-   information. See <xref linkend="monitoring-stats-functions"/> for more
-   information.
-  </para>
-
-   <table id="functions-info-session-table">
-    <title>Session Information Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>current_catalog</primary>
-        </indexterm>
-        <function>current_catalog</function>
-        <returnvalue>name</returnvalue>
-       </para>
-       <para role="func_signature">
-        <indexterm>
-         <primary>current_database</primary>
-        </indexterm>
-        <function>current_database</function> ()
-        <returnvalue>name</returnvalue>
-       </para>
-       <para>
-        Returns the name of the current database.  (Databases are
-        called <quote>catalogs</quote> in the SQL standard,
-        so <function>current_catalog</function> is the standard's
-        spelling.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>current_query</primary>
-        </indexterm>
-        <function>current_query</function> ()
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns the text of the currently executing query, as submitted
-        by the client (which might contain more than one statement).
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>current_role</primary>
-        </indexterm>
-        <function>current_role</function>
-        <returnvalue>name</returnvalue>
-       </para>
-       <para>
-        This is equivalent to <function>current_user</function>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>current_schema</primary>
-        </indexterm>
-        <indexterm>
-         <primary>schema</primary>
-         <secondary>current</secondary>
-        </indexterm>
-        <function>current_schema</function>
-        <returnvalue>name</returnvalue>
-       </para>
-       <para role="func_signature">
-        <function>current_schema</function> ()
-        <returnvalue>name</returnvalue>
-       </para>
-       <para>
-        Returns the name of the schema that is first in the search path (or a
-        null value if the search path is empty).  This is the schema that will
-        be used for any tables or other named objects that are created without
-        specifying a target schema.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>current_schemas</primary>
-        </indexterm>
-        <indexterm>
-         <primary>search path</primary>
-         <secondary>current</secondary>
-        </indexterm>
-        <function>current_schemas</function> ( <parameter>include_implicit</parameter> <type>boolean</type> )
-        <returnvalue>name[]</returnvalue>
-       </para>
-       <para>
-        Returns an array of the names of all schemas presently in the
-        effective search path, in their priority order.  (Items in the current
-        <xref linkend="guc-search-path"/> setting that do not correspond to
-        existing, searchable schemas are omitted.)  If the Boolean argument
-        is <literal>true</literal>, then implicitly-searched system schemas
-        such as <literal>pg_catalog</literal> are included in the result.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>current_user</primary>
-        </indexterm>
-        <indexterm>
-         <primary>user</primary>
-         <secondary>current</secondary>
-        </indexterm>
-        <function>current_user</function>
-        <returnvalue>name</returnvalue>
-       </para>
-       <para>
-        Returns the user name of the current execution context.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>inet_client_addr</primary>
-        </indexterm>
-        <function>inet_client_addr</function> ()
-        <returnvalue>inet</returnvalue>
-       </para>
-       <para>
-        Returns the IP address of the current client,
-        or <literal>NULL</literal> if the current connection is via a
-        Unix-domain socket.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>inet_client_port</primary>
-        </indexterm>
-        <function>inet_client_port</function> ()
-        <returnvalue>integer</returnvalue>
-       </para>
-       <para>
-        Returns the IP port number of the current client,
-        or <literal>NULL</literal> if the current connection is via a
-        Unix-domain socket.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>inet_server_addr</primary>
-        </indexterm>
-        <function>inet_server_addr</function> ()
-        <returnvalue>inet</returnvalue>
-       </para>
-       <para>
-        Returns the IP address on which the server accepted the current
-        connection,
-        or <literal>NULL</literal> if the current connection is via a
-        Unix-domain socket.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>inet_server_port</primary>
-        </indexterm>
-        <function>inet_server_port</function> ()
-        <returnvalue>integer</returnvalue>
-       </para>
-       <para>
-        Returns the IP port number on which the server accepted the current
-        connection,
-        or <literal>NULL</literal> if the current connection is via a
-        Unix-domain socket.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_backend_pid</primary>
-        </indexterm>
-        <function>pg_backend_pid</function> ()
-        <returnvalue>integer</returnvalue>
-       </para>
-       <para>
-        Returns the process ID of the server process attached to the current
-        session.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_blocking_pids</primary>
-        </indexterm>
-        <function>pg_blocking_pids</function> ( <type>integer</type> )
-        <returnvalue>integer[]</returnvalue>
-       </para>
-       <para>
-        Returns an array of the process ID(s) of the sessions that are
-        blocking the server process with the specified process ID from
-        acquiring a lock, or an empty array if there is no such server process
-        or it is not blocked.
-       </para>
-       <para>
-        One server process blocks another if it either holds a lock that
-        conflicts with the blocked process's lock request (hard block), or is
-        waiting for a lock that would conflict with the blocked process's lock
-        request and is ahead of it in the wait queue (soft block).  When using
-        parallel queries the result always lists client-visible process IDs
-        (that is, <function>pg_backend_pid</function> results) even if the
-        actual lock is held or awaited by a child worker process.  As a result
-        of that, there may be duplicated PIDs in the result.  Also note that
-        when a prepared transaction holds a conflicting lock, it will be
-        represented by a zero process ID.
-       </para>
-       <para>
-        Frequent calls to this function could have some impact on database
-        performance, because it needs exclusive access to the lock manager's
-        shared state for a short time.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_conf_load_time</primary>
-        </indexterm>
-        <function>pg_conf_load_time</function> ()
-        <returnvalue>timestamp with time zone</returnvalue>
-       </para>
-       <para>
-        Returns the time when the server configuration files were last loaded.
-        If the current session was alive at the time, this will be the time
-        when the session itself re-read the configuration files (so the
-        reading will vary a little in different sessions).  Otherwise it is
-        the time when the postmaster process re-read the configuration files.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_current_logfile</primary>
-        </indexterm>
-        <indexterm>
-         <primary>Logging</primary>
-         <secondary>pg_current_logfile function</secondary>
-        </indexterm>
-        <indexterm>
-          <primary>current_logfiles</primary>
-          <secondary>and the pg_current_logfile function</secondary>
-        </indexterm>
-        <indexterm>
-         <primary>Logging</primary>
-         <secondary>current_logfiles file and the pg_current_logfile
-         function</secondary>
-        </indexterm>
-        <function>pg_current_logfile</function> ( <optional> <type>text</type> </optional> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns the path name of the log file currently in use by the logging
-        collector.  The path includes the <xref linkend="guc-log-directory"/>
-        directory and the individual log file name.  The result
-        is <literal>NULL</literal> if the logging collector is disabled.
-        When multiple log files exist, each in a different
-        format, <function>pg_current_logfile</function> without an argument
-        returns the path of the file having the first format found in the
-        ordered list: <literal>stderr</literal>,
-        <literal>csvlog</literal>, <literal>jsonlog</literal>.
-        <literal>NULL</literal> is returned if no log file has any of these
-        formats.
-        To request information about a specific log file format, supply
-        either <literal>csvlog</literal>, <literal>jsonlog</literal> or
-        <literal>stderr</literal> as the
-        value of the optional parameter. The result is <literal>NULL</literal>
-        if the log format requested is not configured in
-        <xref linkend="guc-log-destination"/>.
-        The result reflects the contents of
-        the <filename>current_logfiles</filename> file.
-       </para>
-       <para>
-        This function is restricted to superusers and roles with privileges of
-        the <literal>pg_monitor</literal> role by default, but other users can
-        be granted EXECUTE to run the function.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_my_temp_schema</primary>
-        </indexterm>
-        <function>pg_my_temp_schema</function> ()
-        <returnvalue>oid</returnvalue>
-       </para>
-       <para>
-        Returns the OID of the current session's temporary schema, or zero if
-        it has none (because it has not created any temporary tables).
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_is_other_temp_schema</primary>
-        </indexterm>
-        <function>pg_is_other_temp_schema</function> ( <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Returns true if the given OID is the OID of another session's
-        temporary schema.  (This can be useful, for example, to exclude other
-        sessions' temporary tables from a catalog display.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_jit_available</primary>
-        </indexterm>
-        <function>pg_jit_available</function> ()
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Returns true if a <acronym>JIT</acronym> compiler extension is
-        available (see <xref linkend="jit"/>) and the
-        <xref linkend="guc-jit"/> configuration parameter is set to
-        <literal>on</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_listening_channels</primary>
-        </indexterm>
-        <function>pg_listening_channels</function> ()
-        <returnvalue>setof text</returnvalue>
-       </para>
-       <para>
-        Returns the set of names of asynchronous notification channels that
-        the current session is listening to.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_notification_queue_usage</primary>
-        </indexterm>
-        <function>pg_notification_queue_usage</function> ()
-        <returnvalue>double precision</returnvalue>
-       </para>
-       <para>
-        Returns the fraction (0&ndash;1) of the asynchronous notification
-        queue's maximum size that is currently occupied by notifications that
-        are waiting to be processed.
-        See <xref linkend="sql-listen"/> and <xref linkend="sql-notify"/>
-        for more information.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_postmaster_start_time</primary>
-        </indexterm>
-        <function>pg_postmaster_start_time</function> ()
-        <returnvalue>timestamp with time zone</returnvalue>
-       </para>
-       <para>
-        Returns the time when the server started.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_safe_snapshot_blocking_pids</primary>
-        </indexterm>
-        <function>pg_safe_snapshot_blocking_pids</function> ( <type>integer</type> )
-        <returnvalue>integer[]</returnvalue>
-       </para>
-       <para>
-        Returns an array of the process ID(s) of the sessions that are blocking
-        the server process with the specified process ID from acquiring a safe
-        snapshot, or an empty array if there is no such server process or it
-        is not blocked.
-       </para>
-       <para>
-        A session running a <literal>SERIALIZABLE</literal> transaction blocks
-        a <literal>SERIALIZABLE READ ONLY DEFERRABLE</literal> transaction
-        from acquiring a snapshot until the latter determines that it is safe
-        to avoid taking any predicate locks.  See
-        <xref linkend="xact-serializable"/> for more information about
-        serializable and deferrable transactions.
-       </para>
-       <para>
-        Frequent calls to this function could have some impact on database
-        performance, because it needs access to the predicate lock manager's
-        shared state for a short time.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_trigger_depth</primary>
-        </indexterm>
-        <function>pg_trigger_depth</function> ()
-        <returnvalue>integer</returnvalue>
-       </para>
-       <para>
-        Returns the current nesting level
-        of <productname>PostgreSQL</productname> triggers (0 if not called,
-        directly or indirectly, from inside a trigger).
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>session_user</primary>
-        </indexterm>
-        <function>session_user</function>
-        <returnvalue>name</returnvalue>
-       </para>
-       <para>
-        Returns the session user's name.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>system_user</primary>
-        </indexterm>
-        <function>system_user</function>
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns the authentication method and the identity (if any) that the
-        user presented during the authentication cycle before they were
-        assigned a database role. It is represented as
-        <literal>auth_method:identity</literal> or
-        <literal>NULL</literal> if the user has not been authenticated (for
-        example if <link linkend="auth-trust">Trust authentication</link> has
-        been used).
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>user</primary>
-        </indexterm>
-        <function>user</function>
-        <returnvalue>name</returnvalue>
-       </para>
-       <para>
-        This is equivalent to <function>current_user</function>.
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-   <note>
-    <para>
-     <function>current_catalog</function>,
-     <function>current_role</function>,
-     <function>current_schema</function>,
-     <function>current_user</function>,
-     <function>session_user</function>,
-     and <function>user</function> have special syntactic status
-     in <acronym>SQL</acronym>: they must be called without trailing
-     parentheses.  In PostgreSQL, parentheses can optionally be used with
-     <function>current_schema</function>, but not with the others.
-    </para>
-   </note>
-
-   <para>
-    The <function>session_user</function> is normally the user who initiated
-    the current database connection; but superusers can change this setting
-    with <xref linkend="sql-set-session-authorization"/>.
-    The <function>current_user</function> is the user identifier
-    that is applicable for permission checking. Normally it is equal
-    to the session user, but it can be changed with
-    <xref linkend="sql-set-role"/>.
-    It also changes during the execution of
-    functions with the attribute <literal>SECURITY DEFINER</literal>.
-    In Unix parlance, the session user is the <quote>real user</quote> and
-    the current user is the <quote>effective user</quote>.
-    <function>current_role</function> and <function>user</function> are
-    synonyms for <function>current_user</function>.  (The SQL standard draws
-    a distinction between <function>current_role</function>
-    and <function>current_user</function>, but <productname>PostgreSQL</productname>
-    does not, since it unifies users and roles into a single kind of entity.)
-   </para>
-
-  </sect2>
-
-  <sect2 id="functions-info-access">
-   <title>Access Privilege Inquiry Functions</title>
-
-  <indexterm>
-   <primary>privilege</primary>
-   <secondary>querying</secondary>
-  </indexterm>
-
-  <para>
-   <xref linkend="functions-info-access-table"/> lists functions that
-   allow querying object access privileges programmatically.
-   (See <xref linkend="ddl-priv"/> for more information about
-   privileges.)
-   In these functions, the user whose privileges are being inquired about
-   can be specified by name or by OID
-   (<structname>pg_authid</structname>.<structfield>oid</structfield>), or if
-   the name is given as <literal>public</literal> then the privileges of the
-   PUBLIC pseudo-role are checked.  Also, the <parameter>user</parameter>
-   argument can be omitted entirely, in which case
-   the <function>current_user</function> is assumed.
-   The object that is being inquired about can be specified either by name or
-   by OID, too.  When specifying by name, a schema name can be included if
-   relevant.
-   The access privilege of interest is specified by a text string, which must
-   evaluate to one of the appropriate privilege keywords for the object's type
-   (e.g., <literal>SELECT</literal>).  Optionally, <literal>WITH GRANT
-   OPTION</literal> can be added to a privilege type to test whether the
-   privilege is held with grant option. Also, multiple privilege types can be
-   listed separated by commas, in which case the result will be true if any of
-   the listed privileges is held. (Case of the privilege string is not
-   significant, and extra whitespace is allowed between but not within
-   privilege names.)
-   Some examples:
-<programlisting>
-SELECT has_table_privilege('myschema.mytable', 'select');
-SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');
-</programlisting>
-  </para>
-
-   <table id="functions-info-access-table">
-    <title>Access Privilege Inquiry Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_any_column_privilege</primary>
-        </indexterm>
-        <function>has_any_column_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>table</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for any column of table?
-        This succeeds either if the privilege is held for the whole table, or
-        if there is a column-level grant of the privilege for at least one
-        column.
-        Allowable privilege types are
-        <literal>SELECT</literal>, <literal>INSERT</literal>,
-        <literal>UPDATE</literal>, and <literal>REFERENCES</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_column_privilege</primary>
-        </indexterm>
-        <function>has_column_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>table</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>column</parameter> <type>text</type> or <type>smallint</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for the specified table column?
-        This succeeds either if the privilege is held for the whole table, or
-        if there is a column-level grant of the privilege for the column.
-        The column can be specified by name or by attribute number
-        (<structname>pg_attribute</structname>.<structfield>attnum</structfield>).
-        Allowable privilege types are
-        <literal>SELECT</literal>, <literal>INSERT</literal>,
-        <literal>UPDATE</literal>, and <literal>REFERENCES</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_database_privilege</primary>
-        </indexterm>
-        <function>has_database_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>database</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for database?
-        Allowable privilege types are
-        <literal>CREATE</literal>,
-        <literal>CONNECT</literal>,
-        <literal>TEMPORARY</literal>, and
-        <literal>TEMP</literal> (which is equivalent to
-        <literal>TEMPORARY</literal>).
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_foreign_data_wrapper_privilege</primary>
-        </indexterm>
-        <function>has_foreign_data_wrapper_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>fdw</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for foreign-data wrapper?
-        The only allowable privilege type is <literal>USAGE</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_function_privilege</primary>
-        </indexterm>
-        <function>has_function_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>function</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for function?
-        The only allowable privilege type is <literal>EXECUTE</literal>.
-       </para>
-       <para>
-        When specifying a function by name rather than by OID, the allowed
-        input is the same as for the <type>regprocedure</type> data type (see
-        <xref linkend="datatype-oid"/>).
-        An example is:
-<programlisting>
-SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');
-</programlisting>
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_language_privilege</primary>
-        </indexterm>
-        <function>has_language_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>language</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for language?
-        The only allowable privilege type is <literal>USAGE</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_parameter_privilege</primary>
-        </indexterm>
-        <function>has_parameter_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>parameter</parameter> <type>text</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for configuration parameter?
-        The parameter name is case-insensitive.
-        Allowable privilege types are <literal>SET</literal>
-        and <literal>ALTER SYSTEM</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_schema_privilege</primary>
-        </indexterm>
-        <function>has_schema_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>schema</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for schema?
-        Allowable privilege types are
-        <literal>CREATE</literal> and
-        <literal>USAGE</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_sequence_privilege</primary>
-        </indexterm>
-        <function>has_sequence_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>sequence</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for sequence?
-        Allowable privilege types are
-        <literal>USAGE</literal>,
-        <literal>SELECT</literal>, and
-        <literal>UPDATE</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_server_privilege</primary>
-        </indexterm>
-        <function>has_server_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>server</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for foreign server?
-        The only allowable privilege type is <literal>USAGE</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_table_privilege</primary>
-        </indexterm>
-        <function>has_table_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>table</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for table?
-        Allowable privilege types
-        are <literal>SELECT</literal>, <literal>INSERT</literal>,
-        <literal>UPDATE</literal>, <literal>DELETE</literal>,
-        <literal>TRUNCATE</literal>, <literal>REFERENCES</literal>,
-        <literal>TRIGGER</literal>, and <literal>MAINTAIN</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_tablespace_privilege</primary>
-        </indexterm>
-        <function>has_tablespace_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>tablespace</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for tablespace?
-        The only allowable privilege type is <literal>CREATE</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>has_type_privilege</primary>
-        </indexterm>
-        <function>has_type_privilege</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>type</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for data type?
-        The only allowable privilege type is <literal>USAGE</literal>.
-        When specifying a type by name rather than by OID, the allowed input
-        is the same as for the <type>regtype</type> data type (see
-        <xref linkend="datatype-oid"/>).
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_has_role</primary>
-        </indexterm>
-        <function>pg_has_role</function> (
-          <optional> <parameter>user</parameter> <type>name</type> or <type>oid</type>, </optional>
-          <parameter>role</parameter> <type>text</type> or <type>oid</type>,
-          <parameter>privilege</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Does user have privilege for role?
-        Allowable privilege types are
-        <literal>MEMBER</literal>, <literal>USAGE</literal>,
-        and <literal>SET</literal>.
-        <literal>MEMBER</literal> denotes direct or indirect membership in
-        the role without regard to what specific privileges may be conferred.
-        <literal>USAGE</literal> denotes whether the privileges of the role
-        are immediately available without doing <command>SET ROLE</command>,
-        while <literal>SET</literal> denotes whether it is possible to change
-        to the role using the <literal>SET ROLE</literal> command.
-        This function does not allow the special case of
-        setting <parameter>user</parameter> to <literal>public</literal>,
-        because the PUBLIC pseudo-role can never be a member of real roles.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>row_security_active</primary>
-        </indexterm>
-        <function>row_security_active</function> (
-          <parameter>table</parameter> <type>text</type> or <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is row-level security active for the specified table in the context of
-        the current user and current environment?
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-  <para>
-   <xref linkend="functions-aclitem-op-table"/> shows the operators
-   available for the <type>aclitem</type> type, which is the catalog
-   representation of access privileges.  See <xref linkend="ddl-priv"/>
-   for information about how to read access privilege values.
-  </para>
-
-    <table id="functions-aclitem-op-table">
-     <title><type>aclitem</type> Operators</title>
-     <tgroup cols="1">
-      <thead>
-       <row>
-        <entry role="func_table_entry"><para role="func_signature">
-         Operator
-        </para>
-        <para>
-         Description
-        </para>
-        <para>
-         Example(s)
-        </para></entry>
-       </row>
-      </thead>
-
-      <tbody>
-       <row>
-        <entry role="func_table_entry"><para role="func_signature">
-         <indexterm>
-          <primary>aclitemeq</primary>
-         </indexterm>
-         <type>aclitem</type> <literal>=</literal> <type>aclitem</type>
-         <returnvalue>boolean</returnvalue>
-        </para>
-        <para>
-         Are <type>aclitem</type>s equal?  (Notice that
-         type <type>aclitem</type> lacks the usual set of comparison
-         operators; it has only equality.  In turn, <type>aclitem</type>
-         arrays can only be compared for equality.)
-        </para>
-        <para>
-         <literal>'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitem</literal>
-         <returnvalue>f</returnvalue>
-        </para></entry>
-       </row>
-
-       <row>
-        <entry role="func_table_entry"><para role="func_signature">
-         <indexterm>
-          <primary>aclcontains</primary>
-         </indexterm>
-         <type>aclitem[]</type> <literal>@&gt;</literal> <type>aclitem</type>
-         <returnvalue>boolean</returnvalue>
-        </para>
-        <para>
-         Does array contain the specified privileges?  (This is true if there
-         is an array entry that matches the <type>aclitem</type>'s grantee and
-         grantor, and has at least the specified set of privileges.)
-        </para>
-        <para>
-         <literal>'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] @&gt; 'calvin=r*/hobbes'::aclitem</literal>
-         <returnvalue>t</returnvalue>
-        </para></entry>
-       </row>
-
-       <row>
-        <entry role="func_table_entry"><para role="func_signature">
-         <type>aclitem[]</type> <literal>~</literal> <type>aclitem</type>
-         <returnvalue>boolean</returnvalue>
-        </para>
-        <para>
-         This is a deprecated alias for <literal>@&gt;</literal>.
-        </para>
-        <para>
-         <literal>'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*/hobbes'::aclitem</literal>
-         <returnvalue>t</returnvalue>
-        </para></entry>
-       </row>
-      </tbody>
-     </tgroup>
-    </table>
-
-   <para>
-    <xref linkend="functions-aclitem-fn-table"/> shows some additional
-    functions to manage the <type>aclitem</type> type.
-   </para>
-
-   <table id="functions-aclitem-fn-table">
-    <title><type>aclitem</type> Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>acldefault</primary>
-        </indexterm>
-        <function>acldefault</function> (
-          <parameter>type</parameter> <type>"char"</type>,
-          <parameter>ownerId</parameter> <type>oid</type> )
-        <returnvalue>aclitem[]</returnvalue>
-       </para>
-       <para>
-        Constructs an <type>aclitem</type> array holding the default access
-        privileges for an object of type <parameter>type</parameter> belonging
-        to the role with OID <parameter>ownerId</parameter>.  This represents
-        the access privileges that will be assumed when an object's ACL entry
-        is null.  (The default access privileges are described in
-        <xref linkend="ddl-priv"/>.)
-        The <parameter>type</parameter> parameter must be one of
-        'c' for <literal>COLUMN</literal>,
-        'r' for <literal>TABLE</literal> and table-like objects,
-        's' for <literal>SEQUENCE</literal>,
-        'd' for <literal>DATABASE</literal>,
-        'f' for <literal>FUNCTION</literal> or <literal>PROCEDURE</literal>,
-        'l' for <literal>LANGUAGE</literal>,
-        'L' for <literal>LARGE OBJECT</literal>,
-        'n' for <literal>SCHEMA</literal>,
-        'p' for <literal>PARAMETER</literal>,
-        't' for <literal>TABLESPACE</literal>,
-        'F' for <literal>FOREIGN DATA WRAPPER</literal>,
-        'S' for <literal>FOREIGN SERVER</literal>,
-        or
-        'T' for <literal>TYPE</literal> or <literal>DOMAIN</literal>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>aclexplode</primary>
-        </indexterm>
-        <function>aclexplode</function> ( <type>aclitem[]</type> )
-        <returnvalue>setof record</returnvalue>
-        ( <parameter>grantor</parameter> <type>oid</type>,
-        <parameter>grantee</parameter> <type>oid</type>,
-        <parameter>privilege_type</parameter> <type>text</type>,
-        <parameter>is_grantable</parameter> <type>boolean</type> )
-       </para>
-       <para>
-        Returns the <type>aclitem</type> array as a set of rows.
-        If the grantee is the pseudo-role PUBLIC, it is represented by zero in
-        the <parameter>grantee</parameter> column.  Each granted privilege is
-        represented as <literal>SELECT</literal>, <literal>INSERT</literal>,
-        etc (see <xref linkend="privilege-abbrevs-table"/> for a full list).
-        Note that each privilege is broken out as a separate row, so
-        only one keyword appears in the <parameter>privilege_type</parameter>
-        column.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>makeaclitem</primary>
-        </indexterm>
-        <function>makeaclitem</function> (
-          <parameter>grantee</parameter> <type>oid</type>,
-          <parameter>grantor</parameter> <type>oid</type>,
-          <parameter>privileges</parameter> <type>text</type>,
-          <parameter>is_grantable</parameter> <type>boolean</type> )
-        <returnvalue>aclitem</returnvalue>
-       </para>
-       <para>
-        Constructs an <type>aclitem</type> with the given properties.
-        <parameter>privileges</parameter> is a comma-separated list of
-        privilege names such as <literal>SELECT</literal>,
-        <literal>INSERT</literal>, etc, all of which are set in the
-        result.  (Case of the privilege string is not significant, and
-        extra whitespace is allowed between but not within privilege
-        names.)
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-  </sect2>
-
-  <sect2 id="functions-info-schema">
-   <title>Schema Visibility Inquiry Functions</title>
-
-  <para>
-   <xref linkend="functions-info-schema-table"/> shows functions that
-   determine whether a certain object is <firstterm>visible</firstterm> in the
-   current schema search path.
-   For example, a table is said to be visible if its
-   containing schema is in the search path and no table of the same
-   name appears earlier in the search path.  This is equivalent to the
-   statement that the table can be referenced by name without explicit
-   schema qualification.  Thus, to list the names of all visible tables:
-<programlisting>
-SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
-</programlisting>
-   For functions and operators, an object in the search path is said to be
-   visible if there is no object of the same name <emphasis>and argument data
-   type(s)</emphasis> earlier in the path.  For operator classes and families,
-   both the name and the associated index access method are considered.
-  </para>
-
-   <indexterm>
-    <primary>search path</primary>
-    <secondary>object visibility</secondary>
-   </indexterm>
-
-   <table id="functions-info-schema-table">
-    <title>Schema Visibility Inquiry Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_collation_is_visible</primary>
-        </indexterm>
-        <function>pg_collation_is_visible</function> ( <parameter>collation</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is collation visible in search path?
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_conversion_is_visible</primary>
-        </indexterm>
-        <function>pg_conversion_is_visible</function> ( <parameter>conversion</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is conversion visible in search path?
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_function_is_visible</primary>
-        </indexterm>
-        <function>pg_function_is_visible</function> ( <parameter>function</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is function visible in search path?
-        (This also works for procedures and aggregates.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_opclass_is_visible</primary>
-        </indexterm>
-        <function>pg_opclass_is_visible</function> ( <parameter>opclass</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is operator class visible in search path?
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_operator_is_visible</primary>
-        </indexterm>
-        <function>pg_operator_is_visible</function> ( <parameter>operator</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is operator visible in search path?
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_opfamily_is_visible</primary>
-        </indexterm>
-        <function>pg_opfamily_is_visible</function> ( <parameter>opclass</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is operator family visible in search path?
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_statistics_obj_is_visible</primary>
-        </indexterm>
-        <function>pg_statistics_obj_is_visible</function> ( <parameter>stat</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is statistics object visible in search path?
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_table_is_visible</primary>
-        </indexterm>
-        <function>pg_table_is_visible</function> ( <parameter>table</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is table visible in search path?
-        (This works for all types of relations, including views, materialized
-        views, indexes, sequences and foreign tables.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_ts_config_is_visible</primary>
-        </indexterm>
-        <function>pg_ts_config_is_visible</function> ( <parameter>config</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is text search configuration visible in search path?
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_ts_dict_is_visible</primary>
-        </indexterm>
-        <function>pg_ts_dict_is_visible</function> ( <parameter>dict</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is text search dictionary visible in search path?
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_ts_parser_is_visible</primary>
-        </indexterm>
-        <function>pg_ts_parser_is_visible</function> ( <parameter>parser</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is text search parser visible in search path?
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_ts_template_is_visible</primary>
-        </indexterm>
-        <function>pg_ts_template_is_visible</function> ( <parameter>template</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is text search template visible in search path?
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_type_is_visible</primary>
-        </indexterm>
-        <function>pg_type_is_visible</function> ( <parameter>type</parameter> <type>oid</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is type (or domain) visible in search path?
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-   <para>
-    All these functions require object OIDs to identify the object to be
-    checked.  If you want to test an object by name, it is convenient to use
-    the OID alias types (<type>regclass</type>, <type>regtype</type>,
-    <type>regprocedure</type>, <type>regoperator</type>, <type>regconfig</type>,
-    or <type>regdictionary</type>),
-    for example:
-<programlisting>
-SELECT pg_type_is_visible('myschema.widget'::regtype);
-</programlisting>
-    Note that it would not make much sense to test a non-schema-qualified
-    type name in this way &mdash; if the name can be recognized at all, it must be visible.
-   </para>
-
-  </sect2>
-
-  <sect2 id="functions-info-catalog">
-   <title>System Catalog Information Functions</title>
-
-  <para>
-   <xref linkend="functions-info-catalog-table"/> lists functions that
-   extract information from the system catalogs.
-  </para>
-
-   <table id="functions-info-catalog-table">
-    <title>System Catalog Information Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry id="format-type" xreflabel="format_type" role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>format_type</primary>
-        </indexterm>
-        <function>format_type</function> ( <parameter>type</parameter> <type>oid</type>, <parameter>typemod</parameter> <type>integer</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns the SQL name for a data type that is identified by its type
-        OID and possibly a type modifier.  Pass NULL for the type modifier if
-        no specific modifier is known.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_basetype</primary>
-        </indexterm>
-        <function>pg_basetype</function> ( <type>regtype</type> )
-        <returnvalue>regtype</returnvalue>
-       </para>
-       <para>
-        Returns the OID of the base type of a domain identified by its
-        type OID.  If the argument is the OID of a non-domain type,
-        returns the argument as-is.  Returns NULL if the argument is
-        not a valid type OID.  If there's a chain of domain dependencies,
-        it will recurse until finding the base type.
-       </para>
-       <para>
-        Assuming <literal>CREATE DOMAIN mytext AS text</literal>:
-       </para>
-       <para>
-        <literal>pg_basetype('mytext'::regtype)</literal>
-        <returnvalue>text</returnvalue>
-       </para></entry>
-      </row>
-
-      <row>
-       <entry id="pg-char-to-encoding" role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_char_to_encoding</primary>
-        </indexterm>
-        <function>pg_char_to_encoding</function> ( <parameter>encoding</parameter> <type>name</type> )
-        <returnvalue>integer</returnvalue>
-       </para>
-       <para>
-        Converts the supplied encoding name into an integer representing the
-        internal identifier used in some system catalog tables.
-        Returns <literal>-1</literal> if an unknown encoding name is provided.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry id="pg-encoding-to-char" role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_encoding_to_char</primary>
-        </indexterm>
-        <function>pg_encoding_to_char</function> ( <parameter>encoding</parameter> <type>integer</type> )
-        <returnvalue>name</returnvalue>
-       </para>
-       <para>
-        Converts the integer used as the internal identifier of an encoding in some
-        system catalog tables into a human-readable string.
-        Returns an empty string if an invalid encoding number is provided.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_catalog_foreign_keys</primary>
-        </indexterm>
-        <function>pg_get_catalog_foreign_keys</function> ()
-        <returnvalue>setof record</returnvalue>
-        ( <parameter>fktable</parameter> <type>regclass</type>,
-          <parameter>fkcols</parameter> <type>text[]</type>,
-          <parameter>pktable</parameter> <type>regclass</type>,
-          <parameter>pkcols</parameter> <type>text[]</type>,
-          <parameter>is_array</parameter> <type>boolean</type>,
-          <parameter>is_opt</parameter> <type>boolean</type> )
-       </para>
-       <para>
-        Returns a set of records describing the foreign key relationships
-        that exist within the <productname>PostgreSQL</productname> system
-        catalogs.
-        The <parameter>fktable</parameter> column contains the name of the
-        referencing catalog, and the <parameter>fkcols</parameter> column
-        contains the name(s) of the referencing column(s).  Similarly,
-        the <parameter>pktable</parameter> column contains the name of the
-        referenced catalog, and the <parameter>pkcols</parameter> column
-        contains the name(s) of the referenced column(s).
-        If <parameter>is_array</parameter> is true, the last referencing
-        column is an array, each of whose elements should match some entry
-        in the referenced catalog.
-        If <parameter>is_opt</parameter> is true, the referencing column(s)
-        are allowed to contain zeroes instead of a valid reference.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_constraintdef</primary>
-        </indexterm>
-        <function>pg_get_constraintdef</function> ( <parameter>constraint</parameter> <type>oid</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the creating command for a constraint.
-        (This is a decompiled reconstruction, not the original text
-        of the command.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_expr</primary>
-        </indexterm>
-        <function>pg_get_expr</function> ( <parameter>expr</parameter> <type>pg_node_tree</type>, <parameter>relation</parameter> <type>oid</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Decompiles the internal form of an expression stored in the system
-        catalogs, such as the default value for a column.  If the expression
-        might contain Vars, specify the OID of the relation they refer to as
-        the second parameter; if no Vars are expected, passing zero is
-        sufficient.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_functiondef</primary>
-        </indexterm>
-        <function>pg_get_functiondef</function> ( <parameter>func</parameter> <type>oid</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the creating command for a function or procedure.
-        (This is a decompiled reconstruction, not the original text
-        of the command.)
-        The result is a complete <command>CREATE OR REPLACE FUNCTION</command>
-        or <command>CREATE OR REPLACE PROCEDURE</command> statement.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_function_arguments</primary>
-        </indexterm>
-        <function>pg_get_function_arguments</function> ( <parameter>func</parameter> <type>oid</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the argument list of a function or procedure, in the form
-        it would need to appear in within <command>CREATE FUNCTION</command>
-        (including default values).
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_function_identity_arguments</primary>
-        </indexterm>
-        <function>pg_get_function_identity_arguments</function> ( <parameter>func</parameter> <type>oid</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the argument list necessary to identify a function or
-        procedure, in the form it would need to appear in within commands such
-        as <command>ALTER FUNCTION</command>.  This form omits default values.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_function_result</primary>
-        </indexterm>
-        <function>pg_get_function_result</function> ( <parameter>func</parameter> <type>oid</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the <literal>RETURNS</literal> clause of a function, in
-        the form it would need to appear in within <command>CREATE
-        FUNCTION</command>.  Returns <literal>NULL</literal> for a procedure.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_indexdef</primary>
-        </indexterm>
-        <function>pg_get_indexdef</function> ( <parameter>index</parameter> <type>oid</type> <optional>, <parameter>column</parameter> <type>integer</type>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the creating command for an index.
-        (This is a decompiled reconstruction, not the original text
-        of the command.)  If <parameter>column</parameter> is supplied and is
-        not zero, only the definition of that column is reconstructed.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_keywords</primary>
-        </indexterm>
-        <function>pg_get_keywords</function> ()
-        <returnvalue>setof record</returnvalue>
-        ( <parameter>word</parameter> <type>text</type>,
-        <parameter>catcode</parameter> <type>"char"</type>,
-        <parameter>barelabel</parameter> <type>boolean</type>,
-        <parameter>catdesc</parameter> <type>text</type>,
-        <parameter>baredesc</parameter> <type>text</type> )
-       </para>
-       <para>
-        Returns a set of records describing the SQL keywords recognized by the
-        server.  The <parameter>word</parameter> column contains the
-        keyword.  The <parameter>catcode</parameter> column contains a
-        category code: <literal>U</literal> for an unreserved
-        keyword, <literal>C</literal> for a keyword that can be a column
-        name, <literal>T</literal> for a keyword that can be a type or
-        function name, or <literal>R</literal> for a fully reserved keyword.
-        The <parameter>barelabel</parameter> column
-        contains <literal>true</literal> if the keyword can be used as
-        a <quote>bare</quote> column label in <command>SELECT</command> lists,
-        or <literal>false</literal> if it can only be used
-        after <literal>AS</literal>.
-        The <parameter>catdesc</parameter> column contains a
-        possibly-localized string describing the keyword's category.
-        The <parameter>baredesc</parameter> column contains a
-        possibly-localized string describing the keyword's column label status.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_partkeydef</primary>
-        </indexterm>
-        <function>pg_get_partkeydef</function> ( <parameter>table</parameter> <type>oid</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the definition of a partitioned table's partition
-        key, in the form it would have in the <literal>PARTITION
-        BY</literal> clause of <command>CREATE TABLE</command>.
-        (This is a decompiled reconstruction, not the original text
-        of the command.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_ruledef</primary>
-        </indexterm>
-        <function>pg_get_ruledef</function> ( <parameter>rule</parameter> <type>oid</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the creating command for a rule.
-        (This is a decompiled reconstruction, not the original text
-        of the command.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_serial_sequence</primary>
-        </indexterm>
-        <function>pg_get_serial_sequence</function> ( <parameter>table</parameter> <type>text</type>, <parameter>column</parameter> <type>text</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns the name of the sequence associated with a column,
-        or NULL if no sequence is associated with the column.
-        If the column is an identity column, the associated sequence is the
-        sequence internally created for that column.
-        For columns created using one of the serial types
-        (<type>serial</type>, <type>smallserial</type>, <type>bigserial</type>),
-        it is the sequence created for that serial column definition.
-        In the latter case, the association can be modified or removed
-        with <command>ALTER SEQUENCE OWNED BY</command>.
-        (This function probably should have been
-        called <function>pg_get_owned_sequence</function>; its current name
-        reflects the fact that it has historically been used with serial-type
-        columns.)  The first parameter is a table name with optional
-        schema, and the second parameter is a column name.  Because the first
-        parameter potentially contains both schema and table names, it is
-        parsed per usual SQL rules, meaning it is lower-cased by default.
-        The second parameter, being just a column name, is treated literally
-        and so has its case preserved.  The result is suitably formatted
-        for passing to the sequence functions (see
-        <xref linkend="functions-sequence"/>).
-       </para>
-       <para>
-        A typical use is in reading the current value of the sequence for an
-        identity or serial column, for example:
-<programlisting>
-SELECT currval(pg_get_serial_sequence('sometable', 'id'));
-</programlisting>
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_statisticsobjdef</primary>
-        </indexterm>
-        <function>pg_get_statisticsobjdef</function> ( <parameter>statobj</parameter> <type>oid</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the creating command for an extended statistics object.
-        (This is a decompiled reconstruction, not the original text
-        of the command.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_triggerdef</primary>
-        </indexterm>
-<function>pg_get_triggerdef</function> ( <parameter>trigger</parameter> <type>oid</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the creating command for a trigger.
-        (This is a decompiled reconstruction, not the original text
-        of the command.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_userbyid</primary>
-        </indexterm>
-        <function>pg_get_userbyid</function> ( <parameter>role</parameter> <type>oid</type> )
-        <returnvalue>name</returnvalue>
-       </para>
-       <para>
-        Returns a role's name given its OID.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_viewdef</primary>
-        </indexterm>
-        <function>pg_get_viewdef</function> ( <parameter>view</parameter> <type>oid</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the underlying <command>SELECT</command> command for a
-        view or materialized view.  (This is a decompiled reconstruction, not
-        the original text of the command.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <function>pg_get_viewdef</function> ( <parameter>view</parameter> <type>oid</type>, <parameter>wrap_column</parameter> <type>integer</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the underlying <command>SELECT</command> command for a
-        view or materialized view.  (This is a decompiled reconstruction, not
-        the original text of the command.)  In this form of the function,
-        pretty-printing is always enabled, and long lines are wrapped to try
-        to keep them shorter than the specified number of columns.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <function>pg_get_viewdef</function> ( <parameter>view</parameter> <type>text</type> <optional>, <parameter>pretty</parameter> <type>boolean</type> </optional> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reconstructs the underlying <command>SELECT</command> command for a
-        view or materialized view, working from a textual name for the view
-        rather than its OID.  (This is deprecated; use the OID variant
-        instead.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_index_column_has_property</primary>
-        </indexterm>
-        <function>pg_index_column_has_property</function> ( <parameter>index</parameter> <type>regclass</type>, <parameter>column</parameter> <type>integer</type>, <parameter>property</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Tests whether an index column has the named property.
-        Common index column properties are listed in
-        <xref linkend="functions-info-index-column-props"/>.
-        (Note that extension access methods can define additional property
-        names for their indexes.)
-        <literal>NULL</literal> is returned if the property name is not known
-        or does not apply to the particular object, or if the OID or column
-        number does not identify a valid object.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_index_has_property</primary>
-        </indexterm>
-        <function>pg_index_has_property</function> ( <parameter>index</parameter> <type>regclass</type>, <parameter>property</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Tests whether an index has the named property.
-        Common index properties are listed in
-        <xref linkend="functions-info-index-props"/>.
-        (Note that extension access methods can define additional property
-        names for their indexes.)
-        <literal>NULL</literal> is returned if the property name is not known
-        or does not apply to the particular object, or if the OID does not
-        identify a valid object.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_indexam_has_property</primary>
-        </indexterm>
-        <function>pg_indexam_has_property</function> ( <parameter>am</parameter> <type>oid</type>, <parameter>property</parameter> <type>text</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Tests whether an index access method has the named property.
-        Access method properties are listed in
-        <xref linkend="functions-info-indexam-props"/>.
-        <literal>NULL</literal> is returned if the property name is not known
-        or does not apply to the particular object, or if the OID does not
-        identify a valid object.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_options_to_table</primary>
-        </indexterm>
-        <function>pg_options_to_table</function> ( <parameter>options_array</parameter> <type>text[]</type> )
-        <returnvalue>setof record</returnvalue>
-        ( <parameter>option_name</parameter> <type>text</type>,
-        <parameter>option_value</parameter> <type>text</type> )
-       </para>
-       <para>
-        Returns the set of storage options represented by a value from
-        <structname>pg_class</structname>.<structfield>reloptions</structfield> or
-        <structname>pg_attribute</structname>.<structfield>attoptions</structfield>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_settings_get_flags</primary>
-        </indexterm>
-        <function>pg_settings_get_flags</function> ( <parameter>guc</parameter> <type>text</type> )
-        <returnvalue>text[]</returnvalue>
-       </para>
-       <para>
-        Returns an array of the flags associated with the given GUC, or
-        <literal>NULL</literal> if it does not exist. The result is
-        an empty array if the GUC exists but there are no flags to show.
-        Only the most useful flags listed in
-        <xref linkend="functions-pg-settings-flags"/> are exposed.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_tablespace_databases</primary>
-        </indexterm>
-        <function>pg_tablespace_databases</function> ( <parameter>tablespace</parameter> <type>oid</type> )
-        <returnvalue>setof oid</returnvalue>
-       </para>
-       <para>
-        Returns the set of OIDs of databases that have objects stored in the
-        specified tablespace.  If this function returns any rows, the
-        tablespace is not empty and cannot be dropped.  To identify the specific
-        objects populating the tablespace, you will need to connect to the
-        database(s) identified by <function>pg_tablespace_databases</function>
-        and query their <structname>pg_class</structname> catalogs.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_tablespace_location</primary>
-        </indexterm>
-        <function>pg_tablespace_location</function> ( <parameter>tablespace</parameter> <type>oid</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns the file system path that this tablespace is located in.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_typeof</primary>
-        </indexterm>
-        <function>pg_typeof</function> ( <type>"any"</type> )
-        <returnvalue>regtype</returnvalue>
-       </para>
-       <para>
-        Returns the OID of the data type of the value that is passed to it.
-        This can be helpful for troubleshooting or dynamically constructing
-        SQL queries.  The function is declared as
-        returning <type>regtype</type>, which is an OID alias type (see
-        <xref linkend="datatype-oid"/>); this means that it is the same as an
-        OID for comparison purposes but displays as a type name.
-       </para>
-       <para>
-        <literal>pg_typeof(33)</literal>
-        <returnvalue>integer</returnvalue>
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>COLLATION FOR</primary>
-        </indexterm>
-        <function>COLLATION FOR</function> ( <type>"any"</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns the name of the collation of the value that is passed to it.
-        The value is quoted and schema-qualified if necessary.  If no
-        collation was derived for the argument expression,
-        then <literal>NULL</literal> is returned.  If the argument is not of a
-        collatable data type, then an error is raised.
-       </para>
-       <para>
-        <literal>collation for ('foo'::text)</literal>
-        <returnvalue>"default"</returnvalue>
-       </para>
-       <para>
-        <literal>collation for ('foo' COLLATE "de_DE")</literal>
-        <returnvalue>"de_DE"</returnvalue>
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>to_regclass</primary>
-        </indexterm>
-        <function>to_regclass</function> ( <type>text</type> )
-        <returnvalue>regclass</returnvalue>
-       </para>
-       <para>
-        Translates a textual relation name to its OID.  A similar result is
-        obtained by casting the string to type <type>regclass</type> (see
-        <xref linkend="datatype-oid"/>); however, this function will return
-        <literal>NULL</literal> rather than throwing an error if the name is
-        not found.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>to_regcollation</primary>
-        </indexterm>
-        <function>to_regcollation</function> ( <type>text</type> )
-        <returnvalue>regcollation</returnvalue>
-       </para>
-       <para>
-        Translates a textual collation name to its OID.  A similar result is
-        obtained by casting the string to type <type>regcollation</type> (see
-        <xref linkend="datatype-oid"/>); however, this function will return
-        <literal>NULL</literal> rather than throwing an error if the name is
-        not found.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>to_regnamespace</primary>
-        </indexterm>
-        <function>to_regnamespace</function> ( <type>text</type> )
-        <returnvalue>regnamespace</returnvalue>
-       </para>
-       <para>
-        Translates a textual schema name to its OID.  A similar result is
-        obtained by casting the string to type <type>regnamespace</type> (see
-        <xref linkend="datatype-oid"/>); however, this function will return
-        <literal>NULL</literal> rather than throwing an error if the name is
-        not found.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>to_regoper</primary>
-        </indexterm>
-        <function>to_regoper</function> ( <type>text</type> )
-        <returnvalue>regoper</returnvalue>
-       </para>
-       <para>
-        Translates a textual operator name to its OID.  A similar result is
-        obtained by casting the string to type <type>regoper</type> (see
-        <xref linkend="datatype-oid"/>); however, this function will return
-        <literal>NULL</literal> rather than throwing an error if the name is
-        not found or is ambiguous.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>to_regoperator</primary>
-        </indexterm>
-        <function>to_regoperator</function> ( <type>text</type> )
-        <returnvalue>regoperator</returnvalue>
-       </para>
-       <para>
-        Translates a textual operator name (with parameter types) to its OID.  A similar result is
-        obtained by casting the string to type <type>regoperator</type> (see
-        <xref linkend="datatype-oid"/>); however, this function will return
-        <literal>NULL</literal> rather than throwing an error if the name is
-        not found.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>to_regproc</primary>
-        </indexterm>
-        <function>to_regproc</function> ( <type>text</type> )
-        <returnvalue>regproc</returnvalue>
-       </para>
-       <para>
-        Translates a textual function or procedure name to its OID.  A similar result is
-        obtained by casting the string to type <type>regproc</type> (see
-        <xref linkend="datatype-oid"/>); however, this function will return
-        <literal>NULL</literal> rather than throwing an error if the name is
-        not found or is ambiguous.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>to_regprocedure</primary>
-        </indexterm>
-        <function>to_regprocedure</function> ( <type>text</type> )
-        <returnvalue>regprocedure</returnvalue>
-       </para>
-       <para>
-        Translates a textual function or procedure name (with argument types) to its OID.  A similar result is
-        obtained by casting the string to type <type>regprocedure</type> (see
-        <xref linkend="datatype-oid"/>); however, this function will return
-        <literal>NULL</literal> rather than throwing an error if the name is
-        not found.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>to_regrole</primary>
-        </indexterm>
-        <function>to_regrole</function> ( <type>text</type> )
-        <returnvalue>regrole</returnvalue>
-       </para>
-       <para>
-        Translates a textual role name to its OID.  A similar result is
-        obtained by casting the string to type <type>regrole</type> (see
-        <xref linkend="datatype-oid"/>); however, this function will return
-        <literal>NULL</literal> rather than throwing an error if the name is
-        not found.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry id="to-regtype" xreflabel="to_regtype" role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>to_regtype</primary>
-        </indexterm>
-        <function>to_regtype</function> ( <type>text</type> )
-        <returnvalue>regtype</returnvalue>
-       </para>
-       <para>
-        Parses a string of text, extracts a potential type name from it,
-        and translates that name into a type OID.  A syntax error in the
-        string will result in an error; but if the string is a
-        syntactically valid type name that happens not to be found in the
-        catalogs, the result is <literal>NULL</literal>.  A similar result
-        is obtained by casting the string to type <type>regtype</type>
-        (see <xref linkend="datatype-oid"/>), except that that will throw
-        error for name not found.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>to_regtypemod</primary>
-        </indexterm>
-        <function>to_regtypemod</function> ( <type>text</type> )
-        <returnvalue>integer</returnvalue>
-       </para>
-       <para>
-        Parses a string of text, extracts a potential type name from it,
-        and translates its type modifier, if any.  A syntax error in the
-        string will result in an error; but if the string is a
-        syntactically valid type name that happens not to be found in the
-        catalogs, the result is <literal>NULL</literal>.  The result is
-        <literal>-1</literal> if no type modifier is present.
-       </para>
-       <para>
-        <function>to_regtypemod</function> can be combined with
-        <xref linkend="to-regtype"/> to produce appropriate inputs for
-        <xref linkend="format-type"/>, allowing a string representing a
-        type name to be canonicalized.
-       </para>
-       <para>
-        <literal>format_type(to_regtype('varchar(32)'), to_regtypemod('varchar(32)'))</literal>
-        <returnvalue>character varying(32)</returnvalue>
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-  <para>
-   Most of the functions that reconstruct (decompile) database objects
-   have an optional <parameter>pretty</parameter> flag, which
-   if <literal>true</literal> causes the result to
-   be <quote>pretty-printed</quote>.  Pretty-printing suppresses unnecessary
-   parentheses and adds whitespace for legibility.
-   The pretty-printed format is more readable, but the default format
-   is more likely to be interpreted the same way by future versions of
-   <productname>PostgreSQL</productname>; so avoid using pretty-printed output
-   for dump purposes.  Passing <literal>false</literal> for
-   the <parameter>pretty</parameter> parameter yields the same result as
-   omitting the parameter.
-  </para>
-
-  <table id="functions-info-index-column-props">
-   <title>Index Column Properties</title>
-   <tgroup cols="2">
-    <thead>
-     <row><entry>Name</entry><entry>Description</entry></row>
-    </thead>
-    <tbody>
-     <row>
-      <entry><literal>asc</literal></entry>
-      <entry>Does the column sort in ascending order on a forward scan?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>desc</literal></entry>
-      <entry>Does the column sort in descending order on a forward scan?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>nulls_first</literal></entry>
-      <entry>Does the column sort with nulls first on a forward scan?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>nulls_last</literal></entry>
-      <entry>Does the column sort with nulls last on a forward scan?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>orderable</literal></entry>
-      <entry>Does the column possess any defined sort ordering?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>distance_orderable</literal></entry>
-      <entry>Can the column be scanned in order by a <quote>distance</quote>
-      operator, for example <literal>ORDER BY col &lt;-&gt; constant</literal> ?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>returnable</literal></entry>
-      <entry>Can the column value be returned by an index-only scan?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>search_array</literal></entry>
-      <entry>Does the column natively support <literal>col = ANY(array)</literal>
-      searches?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>search_nulls</literal></entry>
-      <entry>Does the column support <literal>IS NULL</literal> and
-      <literal>IS NOT NULL</literal> searches?
-      </entry>
-     </row>
-    </tbody>
-   </tgroup>
-  </table>
-
-  <table id="functions-info-index-props">
-   <title>Index Properties</title>
-   <tgroup cols="2">
-    <thead>
-     <row><entry>Name</entry><entry>Description</entry></row>
-    </thead>
-    <tbody>
-     <row>
-      <entry><literal>clusterable</literal></entry>
-      <entry>Can the index be used in a <literal>CLUSTER</literal> command?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>index_scan</literal></entry>
-      <entry>Does the index support plain (non-bitmap) scans?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>bitmap_scan</literal></entry>
-      <entry>Does the index support bitmap scans?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>backward_scan</literal></entry>
-      <entry>Can the scan direction be changed in mid-scan (to
-             support <literal>FETCH BACKWARD</literal> on a cursor without
-             needing materialization)?
-      </entry>
-     </row>
-    </tbody>
-   </tgroup>
-  </table>
-
-  <table id="functions-info-indexam-props">
-   <title>Index Access Method Properties</title>
-   <tgroup cols="2">
-    <thead>
-     <row><entry>Name</entry><entry>Description</entry></row>
-    </thead>
-    <tbody>
-     <row>
-      <entry><literal>can_order</literal></entry>
-      <entry>Does the access method support <literal>ASC</literal>,
-      <literal>DESC</literal> and related keywords in
-      <literal>CREATE INDEX</literal>?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>can_unique</literal></entry>
-      <entry>Does the access method support unique indexes?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>can_multi_col</literal></entry>
-      <entry>Does the access method support indexes with multiple columns?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>can_exclude</literal></entry>
-      <entry>Does the access method support exclusion constraints?
-      </entry>
-     </row>
-     <row>
-      <entry><literal>can_include</literal></entry>
-      <entry>Does the access method support the <literal>INCLUDE</literal>
-        clause of <literal>CREATE INDEX</literal>?
-      </entry>
-     </row>
-    </tbody>
-   </tgroup>
-  </table>
-
-  <table id="functions-pg-settings-flags">
-   <title>GUC Flags</title>
-   <tgroup cols="2">
-    <thead>
-     <row><entry>Flag</entry><entry>Description</entry></row>
-    </thead>
-    <tbody>
-     <row>
-      <entry><literal>EXPLAIN</literal></entry>
-      <entry>Parameters with this flag are included in
-       <command>EXPLAIN (SETTINGS)</command> commands.
-      </entry>
-     </row>
-     <row>
-      <entry><literal>NO_SHOW_ALL</literal></entry>
-      <entry>Parameters with this flag are excluded from
-       <command>SHOW ALL</command> commands.
-      </entry>
-     </row>
-     <row>
-      <entry><literal>NO_RESET</literal></entry>
-      <entry>Parameters with this flag do not support
-      <command>RESET</command> commands.
-      </entry>
-     </row>
-     <row>
-      <entry><literal>NO_RESET_ALL</literal></entry>
-      <entry>Parameters with this flag are excluded from
-       <command>RESET ALL</command> commands.
-      </entry>
-     </row>
-     <row>
-      <entry><literal>NOT_IN_SAMPLE</literal></entry>
-      <entry>Parameters with this flag are not included in
-       <filename>postgresql.conf</filename> by default.
-      </entry>
-     </row>
-     <row>
-      <entry><literal>RUNTIME_COMPUTED</literal></entry>
-      <entry>Parameters with this flag are runtime-computed ones.
-      </entry>
-     </row>
-    </tbody>
-   </tgroup>
-  </table>
-
-  </sect2>
-
-  <sect2 id="functions-info-object">
-   <title>Object Information and Addressing Functions</title>
-
-  <para>
-   <xref linkend="functions-info-object-table"/> lists functions related to
-   database object identification and addressing.
-  </para>
-
-   <table id="functions-info-object-table">
-    <title>Object Information and Addressing Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_describe_object</primary>
-        </indexterm>
-        <function>pg_describe_object</function> ( <parameter>classid</parameter> <type>oid</type>, <parameter>objid</parameter> <type>oid</type>, <parameter>objsubid</parameter> <type>integer</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns a textual description of a database object identified by
-        catalog OID, object OID, and sub-object ID (such as a column number
-        within a table; the sub-object ID is zero when referring to a whole
-        object).  This description is intended to be human-readable, and might
-        be translated, depending on server configuration.  This is especially
-        useful to determine the identity of an object referenced in the
-        <structname>pg_depend</structname> catalog. This function returns
-        <literal>NULL</literal> values for undefined objects.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_identify_object</primary>
-        </indexterm>
-        <function>pg_identify_object</function> ( <parameter>classid</parameter> <type>oid</type>, <parameter>objid</parameter> <type>oid</type>, <parameter>objsubid</parameter> <type>integer</type> )
-        <returnvalue>record</returnvalue>
-        ( <parameter>type</parameter> <type>text</type>,
-        <parameter>schema</parameter> <type>text</type>,
-        <parameter>name</parameter> <type>text</type>,
-        <parameter>identity</parameter> <type>text</type> )
-       </para>
-       <para>
-        Returns a row containing enough information to uniquely identify the
-        database object specified by catalog OID, object OID and sub-object
-        ID.
-        This information is intended to be machine-readable, and is never
-        translated.
-        <parameter>type</parameter> identifies the type of database object;
-        <parameter>schema</parameter> is the schema name that the object
-        belongs in, or <literal>NULL</literal> for object types that do not
-        belong to schemas;
-        <parameter>name</parameter> is the name of the object, quoted if
-        necessary, if the name (along with schema name, if pertinent) is
-        sufficient to uniquely identify the object,
-        otherwise <literal>NULL</literal>;
-        <parameter>identity</parameter> is the complete object identity, with
-        the precise format depending on object type, and each name within the
-        format being schema-qualified and quoted as necessary. Undefined
-        objects are identified with <literal>NULL</literal> values.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_identify_object_as_address</primary>
-        </indexterm>
-        <function>pg_identify_object_as_address</function> ( <parameter>classid</parameter> <type>oid</type>, <parameter>objid</parameter> <type>oid</type>, <parameter>objsubid</parameter> <type>integer</type> )
-        <returnvalue>record</returnvalue>
-        ( <parameter>type</parameter> <type>text</type>,
-        <parameter>object_names</parameter> <type>text[]</type>,
-        <parameter>object_args</parameter> <type>text[]</type> )
-       </para>
-       <para>
-        Returns a row containing enough information to uniquely identify the
-        database object specified by catalog OID, object OID and sub-object
-        ID.
-        The returned information is independent of the current server, that
-        is, it could be used to identify an identically named object in
-        another server.
-        <parameter>type</parameter> identifies the type of database object;
-        <parameter>object_names</parameter> and
-        <parameter>object_args</parameter>
-        are text arrays that together form a reference to the object.
-        These three values can be passed
-        to <function>pg_get_object_address</function> to obtain the internal
-        address of the object.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_object_address</primary>
-        </indexterm>
-        <function>pg_get_object_address</function> ( <parameter>type</parameter> <type>text</type>, <parameter>object_names</parameter> <type>text[]</type>, <parameter>object_args</parameter> <type>text[]</type> )
-        <returnvalue>record</returnvalue>
-        ( <parameter>classid</parameter> <type>oid</type>,
-        <parameter>objid</parameter> <type>oid</type>,
-        <parameter>objsubid</parameter> <type>integer</type> )
-       </para>
-       <para>
-        Returns a row containing enough information to uniquely identify the
-        database object specified by a type code and object name and argument
-        arrays.
-        The returned values are the ones that would be used in system catalogs
-        such as <structname>pg_depend</structname>; they can be passed to
-        other system functions such as <function>pg_describe_object</function>
-        or <function>pg_identify_object</function>.
-        <parameter>classid</parameter> is the OID of the system catalog
-        containing the object;
-        <parameter>objid</parameter> is the OID of the object itself, and
-        <parameter>objsubid</parameter> is the sub-object ID, or zero if none.
-        This function is the inverse
-        of <function>pg_identify_object_as_address</function>.
-        Undefined objects are identified with <literal>NULL</literal> values.
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-  </sect2>
-
-  <sect2 id="functions-info-comment">
-   <title>Comment Information Functions</title>
-
-   <indexterm>
-    <primary>comment</primary>
-    <secondary sortas="database objects">about database objects</secondary>
-   </indexterm>
-
-   <para>
-    The functions shown in <xref linkend="functions-info-comment-table"/>
-    extract comments previously stored with the <xref linkend="sql-comment"/>
-    command.  A null value is returned if no
-    comment could be found for the specified parameters.
-   </para>
-
-   <table id="functions-info-comment-table">
-    <title>Comment Information Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>col_description</primary>
-        </indexterm>
-        <function>col_description</function> ( <parameter>table</parameter> <type>oid</type>, <parameter>column</parameter> <type>integer</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns the comment for a table column, which is specified by the OID
-        of its table and its column number.
-        (<function>obj_description</function> cannot be used for table
-        columns, since columns do not have OIDs of their own.)
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>obj_description</primary>
-        </indexterm>
-        <function>obj_description</function> ( <parameter>object</parameter> <type>oid</type>, <parameter>catalog</parameter> <type>name</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns the comment for a database object specified by its OID and the
-        name of the containing system catalog.  For
-        example, <literal>obj_description(123456, 'pg_class')</literal> would
-        retrieve the comment for the table with OID 123456.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <function>obj_description</function> ( <parameter>object</parameter> <type>oid</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns the comment for a database object specified by its OID alone.
-        This is <emphasis>deprecated</emphasis> since there is no guarantee
-        that OIDs are unique across different system catalogs; therefore, the
-        wrong comment might be returned.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>shobj_description</primary>
-        </indexterm>
-        <function>shobj_description</function> ( <parameter>object</parameter> <type>oid</type>, <parameter>catalog</parameter> <type>name</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns the comment for a shared database object specified by its OID
-        and the name of the containing system catalog.  This is just
-        like <function>obj_description</function> except that it is used for
-        retrieving comments on shared objects (that is, databases, roles, and
-        tablespaces).  Some system catalogs are global to all databases within
-        each cluster, and the descriptions for objects in them are stored
-        globally as well.
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-  </sect2>
-
-  <sect2 id="functions-info-validity">
-   <title>Data Validity Checking Functions</title>
-
-   <para>
-    The functions shown in <xref linkend="functions-info-validity-table"/>
-    can be helpful for checking validity of proposed input data.
-   </para>
-
-   <table id="functions-info-validity-table">
-    <title>Data Validity Checking Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para>
-       <para>
-        Example(s)
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_input_is_valid</primary>
-        </indexterm>
-        <function>pg_input_is_valid</function> (
-          <parameter>string</parameter> <type>text</type>,
-          <parameter>type</parameter> <type>text</type>
-        )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Tests whether the given <parameter>string</parameter> is valid
-        input for the specified data type, returning true or false.
-       </para>
-       <para>
-        This function will only work as desired if the data type's input
-        function has been updated to report invalid input as
-        a <quote>soft</quote> error.  Otherwise, invalid input will abort
-        the transaction, just as if the string had been cast to the type
-        directly.
-        </para>
-        <para>
-         <literal>pg_input_is_valid('42', 'integer')</literal>
-         <returnvalue>t</returnvalue>
-        </para>
-        <para>
-         <literal>pg_input_is_valid('42000000000', 'integer')</literal>
-         <returnvalue>f</returnvalue>
-        </para>
-        <para>
-         <literal>pg_input_is_valid('1234.567', 'numeric(7,4)')</literal>
-         <returnvalue>f</returnvalue>
-       </para></entry>
-      </row>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_input_error_info</primary>
-        </indexterm>
-        <function>pg_input_error_info</function> (
-          <parameter>string</parameter> <type>text</type>,
-          <parameter>type</parameter> <type>text</type>
-        )
-        <returnvalue>record</returnvalue>
-        ( <parameter>message</parameter> <type>text</type>,
-        <parameter>detail</parameter> <type>text</type>,
-        <parameter>hint</parameter> <type>text</type>,
-        <parameter>sql_error_code</parameter> <type>text</type> )
-       </para>
-       <para>
-        Tests whether the given <parameter>string</parameter> is valid
-        input for the specified data type; if not, return the details of
-        the error that would have been thrown.  If the input is valid, the
-        results are NULL.  The inputs are the same as
-        for <function>pg_input_is_valid</function>.
-       </para>
-       <para>
-        This function will only work as desired if the data type's input
-        function has been updated to report invalid input as
-        a <quote>soft</quote> error.  Otherwise, invalid input will abort
-        the transaction, just as if the string had been cast to the type
-        directly.
-       </para>
-       <para>
-        <literal>select * from pg_input_error_info('42000000000', 'integer')</literal>
-        <returnvalue></returnvalue>
-<programlisting>
-                       message                        | detail | hint | sql_error_code
-------------------------------------------------------+--------+------+----------------
- value "42000000000" is out of range for type integer |        |      | 22003
-</programlisting>
-       </para>
-       <para>
-        <literal>select message, detail from pg_input_error_info('1234.567', 'numeric(7,4)')</literal>
-        <returnvalue></returnvalue>
-<programlisting>
-        message         |                                      detail
-------------------------+----------------------------------&zwsp;-------------------------------------------------
- numeric field overflow | A field with precision 7, scale 4 must round to an absolute value less than 10^3.
-</programlisting>
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-  </sect2>
-
-  <sect2 id="functions-info-snapshot">
-   <title>Transaction ID and Snapshot Information Functions</title>
-
-   <para>
-    The functions shown in <xref linkend="functions-pg-snapshot"/>
-    provide server transaction information in an exportable form.  The main
-    use of these functions is to determine which transactions were committed
-    between two snapshots.
-   </para>
-
-   <table id="functions-pg-snapshot">
-    <title>Transaction ID and Snapshot Information Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_current_xact_id</primary>
-        </indexterm>
-        <function>pg_current_xact_id</function> ()
-        <returnvalue>xid8</returnvalue>
-       </para>
-       <para>
-        Returns the current transaction's ID.  It will assign a new one if the
-        current transaction does not have one already (because it has not
-        performed any database updates);  see <xref
-        linkend="transaction-id"/> for details.  If executed in a
-        subtransaction, this will return the top-level transaction ID;
-        see <xref linkend="subxacts"/> for details.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_current_xact_id_if_assigned</primary>
-        </indexterm>
-        <function>pg_current_xact_id_if_assigned</function> ()
-        <returnvalue>xid8</returnvalue>
-       </para>
-       <para>
-        Returns the current transaction's ID, or <literal>NULL</literal> if no
-        ID is assigned yet.  (It's best to use this variant if the transaction
-        might otherwise be read-only, to avoid unnecessary consumption of an
-        XID.)
-        If executed in a subtransaction, this will return the top-level
-        transaction ID.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_xact_status</primary>
-        </indexterm>
-        <function>pg_xact_status</function> ( <type>xid8</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Reports the commit status of a recent transaction.
-        The result is one of <literal>in progress</literal>,
-        <literal>committed</literal>, or <literal>aborted</literal>,
-        provided that the transaction is recent enough that the system retains
-        the commit status of that transaction.
-        If it is old enough that no references to the transaction survive in
-        the system and the commit status information has been discarded, the
-        result is <literal>NULL</literal>.
-        Applications might use this function, for example, to determine
-        whether their transaction committed or aborted after the application
-        and database server become disconnected while
-        a <literal>COMMIT</literal> is in progress.
-        Note that prepared transactions are reported as <literal>in
-        progress</literal>; applications must check <link
-        linkend="view-pg-prepared-xacts"><structname>pg_prepared_xacts</structname></link>
-        if they need to determine whether a transaction ID belongs to a
-        prepared transaction.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_current_snapshot</primary>
-        </indexterm>
-        <function>pg_current_snapshot</function> ()
-        <returnvalue>pg_snapshot</returnvalue>
-       </para>
-       <para>
-        Returns a current <firstterm>snapshot</firstterm>, a data structure
-        showing which transaction IDs are now in-progress.
-        Only top-level transaction IDs are included in the snapshot;
-        subtransaction IDs are not shown;  see <xref linkend="subxacts"/>
-        for details.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_snapshot_xip</primary>
-        </indexterm>
-        <function>pg_snapshot_xip</function> ( <type>pg_snapshot</type> )
-        <returnvalue>setof xid8</returnvalue>
-       </para>
-       <para>
-        Returns the set of in-progress transaction IDs contained in a snapshot.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_snapshot_xmax</primary>
-        </indexterm>
-        <function>pg_snapshot_xmax</function> ( <type>pg_snapshot</type> )
-        <returnvalue>xid8</returnvalue>
-       </para>
-       <para>
-        Returns the <structfield>xmax</structfield> of a snapshot.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_snapshot_xmin</primary>
-        </indexterm>
-        <function>pg_snapshot_xmin</function> ( <type>pg_snapshot</type> )
-        <returnvalue>xid8</returnvalue>
-       </para>
-       <para>
-        Returns the <structfield>xmin</structfield> of a snapshot.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_visible_in_snapshot</primary>
-        </indexterm>
-        <function>pg_visible_in_snapshot</function> ( <type>xid8</type>, <type>pg_snapshot</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        Is the given transaction ID <firstterm>visible</firstterm> according
-        to this snapshot (that is, was it completed before the snapshot was
-        taken)?  Note that this function will not give the correct answer for
-        a subtransaction ID (subxid);  see <xref linkend="subxacts"/> for
-        details.
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-   <para>
-    The internal transaction ID type <type>xid</type> is 32 bits wide and
-    wraps around every 4 billion transactions.  However,
-    the functions shown in <xref linkend="functions-pg-snapshot"/> use a
-    64-bit type <type>xid8</type> that does not wrap around during the life
-    of an installation and can be converted to <type>xid</type> by casting if
-    required;  see <xref linkend="transaction-id"/> for details.
-    The data type <type>pg_snapshot</type> stores information about
-    transaction ID visibility at a particular moment in time.  Its components
-    are described in <xref linkend="functions-pg-snapshot-parts"/>.
-    <type>pg_snapshot</type>'s textual representation is
-    <literal><replaceable>xmin</replaceable>:<replaceable>xmax</replaceable>:<replaceable>xip_list</replaceable></literal>.
-    For example <literal>10:20:10,14,15</literal> means
-    <literal>xmin=10, xmax=20, xip_list=10, 14, 15</literal>.
-   </para>
-
-   <table id="functions-pg-snapshot-parts">
-    <title>Snapshot Components</title>
-    <tgroup cols="2">
-     <thead>
-      <row>
-       <entry>Name</entry>
-       <entry>Description</entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry><structfield>xmin</structfield></entry>
-       <entry>
-         Lowest transaction ID that was still active.  All transaction IDs
-         less than <structfield>xmin</structfield> are either committed and visible,
-         or rolled back and dead.
-       </entry>
-      </row>
-
-      <row>
-       <entry><structfield>xmax</structfield></entry>
-       <entry>
-         One past the highest completed transaction ID.  All transaction IDs
-         greater than or equal to <structfield>xmax</structfield> had not yet
-         completed as of the time of the snapshot, and thus are invisible.
-       </entry>
-      </row>
-
-      <row>
-       <entry><structfield>xip_list</structfield></entry>
-       <entry>
-        Transactions in progress at the time of the snapshot.  A transaction
-        ID that is <literal>xmin &lt;= <replaceable>X</replaceable> &lt;
-        xmax</literal> and not in this list was already completed at the time
-        of the snapshot, and thus is either visible or dead according to its
-        commit status.  This list does not include the transaction IDs of
-        subtransactions (subxids).
-       </entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-   <para>
-    In releases of <productname>PostgreSQL</productname> before 13 there was
-    no <type>xid8</type> type, so variants of these functions were provided
-    that used <type>bigint</type> to represent a 64-bit XID, with a
-    correspondingly distinct snapshot data type <type>txid_snapshot</type>.
-    These older functions have <literal>txid</literal> in their names.  They
-    are still supported for backward compatibility, but may be removed from a
-    future release. See <xref linkend="functions-txid-snapshot"/>.
-   </para>
-
-   <table id="functions-txid-snapshot">
-    <title>Deprecated Transaction ID and Snapshot Information Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>age</primary>
-        </indexterm>
-        <function>age</function>  ( <type>xid</type> )
-        <returnvalue>integer</returnvalue>
-       </para>
-       <para>
-        Returns the number of transactions between the supplied
-        transaction id and the current transaction counter.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>mxid_age</primary>
-        </indexterm>
-        <function>mxid_age</function>  ( <type>xid</type> )
-        <returnvalue>integer</returnvalue>
-       </para>
-       <para>
-        Returns the number of multixacts IDs between the supplied
-        multixact ID and the current multixacts counter.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>txid_current</primary>
-        </indexterm>
-        <function>txid_current</function> ()
-        <returnvalue>bigint</returnvalue>
-       </para>
-       <para>
-        See <function>pg_current_xact_id()</function>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>txid_current_if_assigned</primary>
-        </indexterm>
-        <function>txid_current_if_assigned</function> ()
-        <returnvalue>bigint</returnvalue>
-       </para>
-       <para>
-        See <function>pg_current_xact_id_if_assigned()</function>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>txid_current_snapshot</primary>
-        </indexterm>
-        <function>txid_current_snapshot</function> ()
-        <returnvalue>txid_snapshot</returnvalue>
-       </para>
-       <para>
-        See <function>pg_current_snapshot()</function>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>txid_snapshot_xip</primary>
-        </indexterm>
-        <function>txid_snapshot_xip</function> ( <type>txid_snapshot</type> )
-        <returnvalue>setof bigint</returnvalue>
-       </para>
-       <para>
-        See <function>pg_snapshot_xip()</function>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>txid_snapshot_xmax</primary>
-        </indexterm>
-        <function>txid_snapshot_xmax</function> ( <type>txid_snapshot</type> )
-        <returnvalue>bigint</returnvalue>
-       </para>
-       <para>
-        See <function>pg_snapshot_xmax()</function>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>txid_snapshot_xmin</primary>
-        </indexterm>
-        <function>txid_snapshot_xmin</function> ( <type>txid_snapshot</type> )
-        <returnvalue>bigint</returnvalue>
-       </para>
-       <para>
-        See <function>pg_snapshot_xmin()</function>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>txid_visible_in_snapshot</primary>
-        </indexterm>
-        <function>txid_visible_in_snapshot</function> ( <type>bigint</type>, <type>txid_snapshot</type> )
-        <returnvalue>boolean</returnvalue>
-       </para>
-       <para>
-        See <function>pg_visible_in_snapshot()</function>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>txid_status</primary>
-        </indexterm>
-        <function>txid_status</function> ( <type>bigint</type> )
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        See <function>pg_xact_status()</function>.
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-  </sect2>
-
-  <sect2 id="functions-info-commit-timestamp">
-   <title>Committed Transaction Information Functions</title>
-
-   <para>
-    The functions shown in <xref linkend="functions-commit-timestamp"/>
-    provide information about when past transactions were committed.
-    They only provide useful data when the
-    <xref linkend="guc-track-commit-timestamp"/> configuration option is
-    enabled, and only for transactions that were committed after it was
-    enabled.  Commit timestamp information is routinely removed during
-    vacuum.
-   </para>
-
-   <table id="functions-commit-timestamp">
-    <title>Committed Transaction Information Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_xact_commit_timestamp</primary>
-        </indexterm>
-        <function>pg_xact_commit_timestamp</function> ( <type>xid</type> )
-        <returnvalue>timestamp with time zone</returnvalue>
-       </para>
-       <para>
-        Returns the commit timestamp of a transaction.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_xact_commit_timestamp_origin</primary>
-        </indexterm>
-        <function>pg_xact_commit_timestamp_origin</function> ( <type>xid</type> )
-        <returnvalue>record</returnvalue>
-        ( <parameter>timestamp</parameter> <type>timestamp with time zone</type>,
-         <parameter>roident</parameter> <type>oid</type>)
-       </para>
-       <para>
-         Returns the commit timestamp and replication origin of a transaction.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_last_committed_xact</primary>
-        </indexterm>
-        <function>pg_last_committed_xact</function> ()
-        <returnvalue>record</returnvalue>
-        ( <parameter>xid</parameter> <type>xid</type>,
-        <parameter>timestamp</parameter> <type>timestamp with time zone</type>,
-        <parameter>roident</parameter> <type>oid</type> )
-       </para>
-       <para>
-        Returns the transaction ID, commit timestamp and replication origin
-        of the latest committed transaction.
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-  </sect2>
-
-  <sect2 id="functions-info-controldata">
-   <title>Control Data Functions</title>
-
-   <para>
-    The functions shown in <xref linkend="functions-controldata"/>
-    print information initialized during <command>initdb</command>, such
-    as the catalog version. They also show information about write-ahead
-    logging and checkpoint processing. This information is cluster-wide,
-    not specific to any one database. These functions provide most of the same
-    information, from the same source, as the
-    <xref linkend="app-pgcontroldata"/> application.
-   </para>
-
-   <table id="functions-controldata">
-    <title>Control Data Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_control_checkpoint</primary>
-        </indexterm>
-        <function>pg_control_checkpoint</function> ()
-        <returnvalue>record</returnvalue>
-       </para>
-       <para>
-        Returns information about current checkpoint state, as shown in
-        <xref linkend="functions-pg-control-checkpoint"/>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_control_system</primary>
-        </indexterm>
-        <function>pg_control_system</function> ()
-        <returnvalue>record</returnvalue>
-       </para>
-       <para>
-        Returns information about current control file state, as shown in
-        <xref linkend="functions-pg-control-system"/>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_control_init</primary>
-        </indexterm>
-        <function>pg_control_init</function> ()
-        <returnvalue>record</returnvalue>
-       </para>
-       <para>
-        Returns information about cluster initialization state, as shown in
-        <xref linkend="functions-pg-control-init"/>.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_control_recovery</primary>
-        </indexterm>
-        <function>pg_control_recovery</function> ()
-        <returnvalue>record</returnvalue>
-       </para>
-       <para>
-        Returns information about recovery state, as shown in
-        <xref linkend="functions-pg-control-recovery"/>.
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-   <table id="functions-pg-control-checkpoint">
-    <title><function>pg_control_checkpoint</function> Output Columns</title>
-    <tgroup cols="2">
-     <thead>
-      <row>
-       <entry>Column Name</entry>
-       <entry>Data Type</entry>
-      </row>
-     </thead>
-
-     <tbody>
-
-      <row>
-       <entry><structfield>checkpoint_lsn</structfield></entry>
-       <entry><type>pg_lsn</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>redo_lsn</structfield></entry>
-       <entry><type>pg_lsn</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>redo_wal_file</structfield></entry>
-       <entry><type>text</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>timeline_id</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>prev_timeline_id</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>full_page_writes</structfield></entry>
-       <entry><type>boolean</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>next_xid</structfield></entry>
-       <entry><type>text</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>next_oid</structfield></entry>
-       <entry><type>oid</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>next_multixact_id</structfield></entry>
-       <entry><type>xid</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>next_multi_offset</structfield></entry>
-       <entry><type>xid</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>oldest_xid</structfield></entry>
-       <entry><type>xid</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>oldest_xid_dbid</structfield></entry>
-       <entry><type>oid</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>oldest_active_xid</structfield></entry>
-       <entry><type>xid</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>oldest_multi_xid</structfield></entry>
-       <entry><type>xid</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>oldest_multi_dbid</structfield></entry>
-       <entry><type>oid</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>oldest_commit_ts_xid</structfield></entry>
-       <entry><type>xid</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>newest_commit_ts_xid</structfield></entry>
-       <entry><type>xid</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>checkpoint_time</structfield></entry>
-       <entry><type>timestamp with time zone</type></entry>
-      </row>
-
-     </tbody>
-    </tgroup>
-   </table>
-
-   <table id="functions-pg-control-system">
-    <title><function>pg_control_system</function> Output Columns</title>
-    <tgroup cols="2">
-     <thead>
-      <row>
-       <entry>Column Name</entry>
-       <entry>Data Type</entry>
-      </row>
-     </thead>
-
-     <tbody>
-
-      <row>
-       <entry><structfield>pg_control_version</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>catalog_version_no</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>system_identifier</structfield></entry>
-       <entry><type>bigint</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>pg_control_last_modified</structfield></entry>
-       <entry><type>timestamp with time zone</type></entry>
-      </row>
-
-     </tbody>
-    </tgroup>
-   </table>
-
-   <table id="functions-pg-control-init">
-    <title><function>pg_control_init</function> Output Columns</title>
-    <tgroup cols="2">
-     <thead>
-      <row>
-       <entry>Column Name</entry>
-       <entry>Data Type</entry>
-      </row>
-     </thead>
-
-     <tbody>
-
-      <row>
-       <entry><structfield>max_data_alignment</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>database_block_size</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>blocks_per_segment</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>wal_block_size</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>bytes_per_wal_segment</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>max_identifier_length</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>max_index_columns</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>max_toast_chunk_size</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>large_object_chunk_size</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>float8_pass_by_value</structfield></entry>
-       <entry><type>boolean</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>data_page_checksum_version</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-     </tbody>
-    </tgroup>
-   </table>
-
-   <table id="functions-pg-control-recovery">
-    <title><function>pg_control_recovery</function> Output Columns</title>
-    <tgroup cols="2">
-     <thead>
-      <row>
-       <entry>Column Name</entry>
-       <entry>Data Type</entry>
-      </row>
-     </thead>
-
-     <tbody>
-
-      <row>
-       <entry><structfield>min_recovery_end_lsn</structfield></entry>
-       <entry><type>pg_lsn</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>min_recovery_end_timeline</structfield></entry>
-       <entry><type>integer</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>backup_start_lsn</structfield></entry>
-       <entry><type>pg_lsn</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>backup_end_lsn</structfield></entry>
-       <entry><type>pg_lsn</type></entry>
-      </row>
-
-      <row>
-       <entry><structfield>end_of_backup_record_required</structfield></entry>
-       <entry><type>boolean</type></entry>
-      </row>
-
-     </tbody>
-    </tgroup>
-   </table>
-
-  </sect2>
-
-  <sect2 id="functions-info-version">
-   <title>Version Information Functions</title>
-
-   <para>
-    The functions shown in <xref linkend="functions-version"/>
-    print version information.
-   </para>
-
-   <table id="functions-version">
-    <title>Version Information Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>version</primary>
-        </indexterm>
-        <function>version</function> ()
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns a string describing the <productname>PostgreSQL</productname>
-        server's version.  You can also get this information from
-        <xref linkend="guc-server-version"/>, or for a machine-readable
-        version use <xref linkend="guc-server-version-num"/>.  Software
-        developers should use <varname>server_version_num</varname> (available
-        since 8.2) or <xref linkend="libpq-PQserverVersion"/> instead of
-        parsing the text version.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>unicode_version</primary>
-        </indexterm>
-        <function>unicode_version</function> ()
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns a string representing the version of Unicode used by
-        <productname>PostgreSQL</productname>.
-       </para></entry>
-      </row>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>icu_unicode_version</primary>
-        </indexterm>
-        <function>icu_unicode_version</function> ()
-        <returnvalue>text</returnvalue>
-       </para>
-       <para>
-        Returns a string representing the version of Unicode used by ICU, if
-        the server was built with ICU support; otherwise returns
-        <literal>NULL</literal> </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-  </sect2>
-
-  <sect2 id="functions-info-wal-summary">
-   <title>WAL Summarization Information Functions</title>
-
-   <para>
-    The functions shown in <xref linkend="functions-wal-summary"/>
-    print information about the status of WAL summarization.
-    See <xref linkend="guc-summarize-wal" />.
-   </para>
-
-   <table id="functions-wal-summary">
-    <title>WAL Summarization Information Functions</title>
-    <tgroup cols="1">
-     <thead>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        Function
-       </para>
-       <para>
-        Description
-       </para></entry>
-      </row>
-     </thead>
-
-     <tbody>
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_available_wal_summaries</primary>
-        </indexterm>
-        <function>pg_available_wal_summaries</function> ()
-        <returnvalue>setof record</returnvalue>
-        ( <parameter>tli</parameter> <type>bigint</type>,
-        <parameter>start_lsn</parameter> <type>pg_lsn</type>,
-        <parameter>end_lsn</parameter> <type>pg_lsn</type> )
-       </para>
-       <para>
-        Returns information about the WAL summary files present in the
-        data directory, under <literal>pg_wal/summaries</literal>.
-        One row will be returned per WAL summary file. Each file summarizes
-        WAL on the indicated TLI within the indicated LSN range. This function
-        might be useful to determine whether enough WAL summaries are present
-        on the server to take an incremental backup based on some prior
-        backup whose start LSN is known.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_wal_summary_contents</primary>
-        </indexterm>
-        <function>pg_wal_summary_contents</function> ( <parameter>tli</parameter> <type>bigint</type>, <parameter>start_lsn</parameter> <type>pg_lsn</type>, <parameter>end_lsn</parameter> <type>pg_lsn</type> )
-        <returnvalue>setof record</returnvalue>
-        ( <parameter>relfilenode</parameter> <type>oid</type>,
-        <parameter>reltablespace</parameter> <type>oid</type>,
-        <parameter>reldatabase</parameter> <type>oid</type>,
-        <parameter>relforknumber</parameter> <type>smallint</type>,
-        <parameter>relblocknumber</parameter> <type>bigint</type>,
-        <parameter>is_limit_block</parameter> <type>boolean</type> )
-       </para>
-       <para>
-        Returns one information about the contents of a single WAL summary file
-        identified by TLI and starting and ending LSNs. Each row with
-        <literal>is_limit_block</literal> false indicates that the block
-        identified by the remaining output columns was modified by at least
-        one WAL record within the range of records summarized by this file.
-        Each row with <literal>is_limit_block</literal> true indicates either
-        that (a) the relation fork was truncated to the length given by
-        <literal>relblocknumber</literal> within the relevant range of WAL
-        records or (b) that the relation fork was created or dropped within
-        the relevant range of WAL records; in such cases,
-        <literal>relblocknumber</literal> will be zero.
-       </para></entry>
-      </row>
-
-      <row>
-       <entry role="func_table_entry"><para role="func_signature">
-        <indexterm>
-         <primary>pg_get_wal_summarizer_state</primary>
-        </indexterm>
-        <function>pg_get_wal_summarizer_state</function> ()
-        <returnvalue>record</returnvalue>
-        ( <parameter>summarized_tli</parameter> <type>bigint</type>,
-        <parameter>summarized_lsn</parameter> <type>pg_lsn</type>,
-        <parameter>pending_lsn</parameter> <type>pg_lsn</type>,
-        <parameter>summarizer_pid</parameter> <type>int</type> )
-       </para>
-       <para>
-        Returns information about the progress of the WAL summarizer. If the
-        WAL summarizer has never run since the instance was started, then
-        <literal>summarized_tli</literal> and <literal>summarized_lsn</literal>
-        will be <literal>0</literal> and <literal>0/0</literal> respectively;
-        otherwise, they will be the TLI and ending LSN of the last WAL summary
-        file written to disk. If the WAL summarizer is currently running,
-        <literal>pending_lsn</literal> will be the ending LSN of the last
-        record that it has consumed, which must always be greater than or
-        equal to <literal>summarized_lsn</literal>; if the WAL summarizer is
-        not running, it will be equal to <literal>summarized_lsn</literal>.
-        <literal>summarizer_pid</literal> is the PID of the WAL summarizer
-        process, if it is running, and otherwise NULL.
-       </para></entry>
-      </row>
-     </tbody>
-    </tgroup>
-   </table>
-
-  </sect2>
-
-  </sect1>
+&func-info;
 
   <sect1 id="functions-admin">
    <title>System Administration Functions</title>
-- 
2.34.1