types, such
as <type>timestamp</type> and <type>numeric</type> can only be
accessed through special library functions; see
<xref linkend="ecpg-special-types"/>.
</para>
<para>
<xref linkend="ecpg-datatype-hostvars-table"/> shows which PostgreSQL
data types correspond to which C data types. When you wish to
send or receive a value of a given PostgreSQL data type, you
should declare a C variable of the corresponding C data type in
the declare section.
</para>
<table id="ecpg-datatype-hostvars-table">
<title>Mapping Between PostgreSQL Data Types and C Variable Types</title>
<tgroup cols="2">
<thead>
<row>
<entry>PostgreSQL data type</entry>
<entry>Host variable type</entry>
</row>
</thead>
<tbody>
<row>
<entry><type>smallint</type></entry>
<entry><type>short</type></entry>
</row>
<row>
<entry><type>integer</type></entry>
<entry><type>int</type></entry>
</row>
<row>
<entry><type>bigint</type></entry>
<entry><type>long long int</type></entry>
</row>
<row>
<entry><type>decimal</type></entry>
<entry><type>decimal</type><footnote id="ecpg-datatype-table-fn"><para>This type can only be accessed through special library functions; see <xref linkend="ecpg-special-types"/>.</para></footnote></entry>
</row>
<row>
<entry><type>numeric</type></entry>
<entry><type>numeric</type><footnoteref linkend="ecpg-datatype-table-fn"/></entry>
</row>
<row>
<entry><type>real</type></entry>
<entry><type>float</type></entry>
</row>
<row>
<entry><type>double precision</type></entry>
<entry><type>double</type></entry>
</row>
<row>
<entry><type>smallserial</type></entry>
<entry><type>short</type></entry>
</row>
<row>
<entry><type>serial</type></entry>
<entry><type>int</type></entry>
</row>
<row>
<entry><type>bigserial</type></entry>
<entry><type>long long int</type></entry>
</row>
<row>
<entry><type>oid</type></entry>
<entry><type>unsigned int</type></entry>
</row>
<row>
<entry><type>character(<replaceable>n</replaceable>)</type>, <type>varchar(<replaceable>n</replaceable>)</type>, <type>text</type></entry>
<entry><type>char[<replaceable>n</replaceable>+1]</type>, <type>VARCHAR[<replaceable>n</replaceable>+1]</type></entry>
</row>
<row>
<entry><type>name</type></entry>
<entry><type>char[NAMEDATALEN]</type></entry>
</row>
<row>
<entry><type>timestamp</type></entry>
<entry><type>timestamp</type><footnoteref linkend="ecpg-datatype-table-fn"/></entry>
</row>
<row>
<entry><type>interval</type></entry>
<entry><type>interval</type><footnoteref linkend="ecpg-datatype-table-fn"/></entry>
</row>
<row>
<entry><type>date</type></entry>
<entry><type>date</type><footnoteref linkend="ecpg-datatype-table-fn"/></entry>
</row>
<row>
<entry><type>boolean</type></entry>
<entry><type>bool</type><footnote><para>declared in <filename>ecpglib.h</filename> if not native</para></footnote></entry>
</row>
<row>
<entry><type>bytea</type></entry>
<entry><type>char *</type>, <type>bytea[<replaceable>n</replaceable>]</type></entry>
</row>
</tbody>
</tgroup>
</table>
<sect3 id="ecpg-char">
<title>Handling Character Strings</title>
<para>
To handle SQL character string data types, such
as <type>varchar</type> and <type>text</type>, there are two
possible ways to declare the host variables.
</para>
<para>
One way is using <type>char[]</type>, an array
of <type>char</type>, which is the most common way to handle
character data in C.
<programlisting>
EXEC SQL BEGIN