<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 DECLARE SECTION;
char str[50];
EXEC SQL END DECLARE SECTION;
</programlisting>
Note that you have to take care of the length yourself. If you
use this host variable as the target variable of a query which
returns a string with more than 49 characters, a buffer overflow
occurs.
</para>
<para>
The other way is using the <type>VARCHAR</type> type, which is a
special type provided by ECPG. The definition on an array of
type <type>VARCHAR</type> is converted into a
named <type>struct</type> for every variable. A declaration like:
<programlisting>
VARCHAR var[180];
</programlisting>
is converted into:
<programlisting>
struct varchar_var { int len; char arr[180]; } var;
</programlisting>
The member <structfield>arr</structfield> hosts the string
including a terminating zero byte. Thus, to store a string in
a <type>VARCHAR</type> host variable, the host variable has to be
declared with the length including the zero byte terminator. The
member <structfield>len</structfield> holds the length of the
string stored in the <structfield>arr</structfield> without the
terminating zero byte. When a host variable is used as input for
a query, if <literal>strlen(arr)</literal>
and <structfield>len</structfield> are different, the shorter one
is used.
</para>
<para>
<type>VARCHAR</type> can be written in upper or lower case, but
not in mixed case.
</para>
<para>
<type>char</type> and <type>VARCHAR</type> host variables can
also hold values of other SQL types, which will be stored in
their string forms.
</para>
</sect3>
<sect3 id="ecpg-special-types">
<title>Accessing Special Data Types</title>
<para>
ECPG contains some special types that help you to interact easily
with some special data types from the PostgreSQL server. In
particular, it has implemented support for the
<type>numeric</type>, <type>decimal</type>, <type>date</type>, <type>timestamp</type>,
and <type>interval</type> types. These data types cannot usefully be
mapped to primitive host variable types (such
as <type>int</type>, <type>long long int</type>,
or <type>char[]</type>), because they have a complex internal
structure. Applications deal with these types by declaring host
variables in special types and accessing them using functions in
the pgtypes library. The pgtypes library, described in detail
in <xref linkend="ecpg-pgtypes"/> contains basic functions to deal
with those types, such that you do not need to send a query to
the SQL server just for adding an interval to a time stamp for
example.
</para>
<para>
The follow subsections describe these special data types. For
more details about pgtypes library functions,
see <xref linkend="ecpg-pgtypes"/>.
</para>
<sect4 id="ecpg-special-types-timestamp-date">
<title>timestamp,