<para>
If the column is an identity column, then the increment of the internal
sequence, else null.
</para></entry>
</row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>identity_maximum</structfield> <type>character_data</type>
</para>
<para>
If the column is an identity column, then the maximum value of the
internal sequence, else null.
</para></entry>
</row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>identity_minimum</structfield> <type>character_data</type>
</para>
<para>
If the column is an identity column, then the minimum value of the
internal sequence, else null.
</para></entry>
</row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>identity_cycle</structfield> <type>yes_or_no</type>
</para>
<para>
If the column is an identity column, then <literal>YES</literal> if the
internal sequence cycles or <literal>NO</literal> if it does not;
otherwise null.
</para></entry>
</row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>is_generated</structfield> <type>character_data</type>
</para>
<para>
If the column is a generated column, then <literal>ALWAYS</literal>,
else <literal>NEVER</literal>.
</para></entry>
</row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>generation_expression</structfield> <type>character_data</type>
</para>
<para>
If the column is a generated column, then the generation expression,
else null.
</para></entry>
</row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>is_updatable</structfield> <type>yes_or_no</type>
</para>
<para>
<literal>YES</literal> if the column is updatable,
<literal>NO</literal> if not (Columns in base tables are always
updatable, columns in views not necessarily)
</para></entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Since data types can be defined in a variety of ways in SQL, and
<productname>PostgreSQL</productname> contains additional ways to
define data types, their representation in the information schema
can be somewhat difficult. The column <literal>data_type</literal>
is supposed to identify the underlying built-in type of the column.
In <productname>PostgreSQL</productname>, this means that the type
is defined in the system catalog schema
<literal>pg_catalog</literal>. This column might be useful if the
application can handle the well-known built-in types specially (for
example, format the numeric types differently or use the data in
the precision columns). The columns <literal>udt_name</literal>,
<literal>udt_schema</literal>, and <literal>udt_catalog</literal>
always identify the underlying data type of the column, even if the
column is based on a domain. (Since
<productname>PostgreSQL</productname> treats built-in types like
user-defined types, built-in types appear here as well. This is an
extension of the SQL standard.) These columns should be used if an
application wants to process data differently according to the
type, because in that case it wouldn't matter if the column is
really based on a domain. If the column is based on a domain, the
identity of the domain is stored in the columns
<literal>domain_name</literal>, <literal>domain_schema</literal>,
and <literal>domain_catalog</literal>. If you want to pair up
columns with their associated data types and treat domains as
separate types, you could write <literal>coalesce(domain_name,
udt_name)</literal>, etc.
</para>
</sect1>