[WIP] RE: DECLARE STATEMENT setting up a connection in ECPG
I'm looking forward to seeing your patch.
I created a patch.
I marked [WIP] to the title because some documentation is lacked and format needs some fixing.
I'm going to post this patch to the January CF.
But it's my first time to send a patch so please excuse me if there's something you feel bad with.
Regards,
Ideriha Takeshi
Show quoted text
-----Original Message-----
From: pgsql-hackers-owner@postgresql.org
[mailto:pgsql-hackers-owner@postgresql.org] On Behalf Of Michael Meskes
Sent: Tuesday, November 22, 2016 2:57 AM
To: Ideriha, Takeshi <ideriha.takeshi@jp.fujitsu.com>
Cc: pgsql-hackers@postgresql.org
Subject: Re: [HACKERS] DECLARE STATEMENT setting up a connection in ECPGI wanted to say that in order to use the connection pointed by the
DECLARE STATEMENT some functions like ECPGdo() would be modified or
new function would be added under the directory ecpglib/.This modification or new function will be used to get the connection
by statement_name.Ah, now I understand. Thank you for your explanation.
I'm looking forward to seeing your patch.
Michael
--
Michael Meskes
Michael at Fam-Meskes dot De, Michael at Meskes dot (De|Com|Net|Org) Meskes
at (Debian|Postgresql) dot Org
Jabber: michael at xmpp dot meskes dot org VfL Borussia! Força Barça! SF 49ers!
Use Debian GNU/Linux, PostgreSQL--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Attachments:
Hi Ideriha-san,
I created a patch.
Thank you. Would it be possible for you to re-create the patch without
the white-space changes?
I marked [WIP] to the title because some documentation is lacked and
format needs some fixing.
I noticed that the docs say the statement is a PostgreSQL addon.
However, I think other databases do have the same statement, or don't
they?
Michael
--
Michael Meskes
Michael at Fam-Meskes dot De, Michael at Meskes dot (De|Com|Net|Org)
Meskes at (Debian|Postgresql) dot Org
Jabber: michael at xmpp dot meskes dot org
VfL Borussia! Força Barça! SF 49ers! Use Debian GNU/Linux, PostgreSQL
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Hi
Thank you for looking over my patch.
Thank you. Would it be possible for you to re-create the patch without the
white-space changes?
I'm sorry for adding redundant white-spaces.
Attached is a correct version.
I noticed that the docs say the statement is a PostgreSQL addon.
However, I think other databases do have the same statement, or don't they?
Yes, other databases such as Oracle and DB2 also have the same statement.
I fixed docs and mentioned the above databases in the compatibility section.
But I'm not sure whether I should mention the other databases explicitly
because the other command docs don't mention Oracle or so explicitly in compatibility section
as long as I read.
Regards,
Ideriha, Takeshi
Show quoted text
-----Original Message-----
From: Michael Meskes [mailto:meskes@postgresql.org]
Sent: Sunday, January 1, 2017 7:18 PM
To: Ideriha, Takeshi <ideriha.takeshi@jp.fujitsu.com>
Cc: pgsql-hackers@postgresql.org
Subject: Re: [WIP] RE: [HACKERS] DECLARE STATEMENT setting up a connection in
ECPGHi Ideriha-san,
I created a patch.
Thank you. Would it be possible for you to re-create the patch without the
white-space changes?I marked [WIP] to the title because some documentation is lacked and
format needs some fixing.I noticed that the docs say the statement is a PostgreSQL addon.
However, I think other databases do have the same statement, or don't they?Michael
--
Michael Meskes
Michael at Fam-Meskes dot De, Michael at Meskes dot (De|Com|Net|Org) Meskes
at (Debian|Postgresql) dot Org
Jabber: michael at xmpp dot meskes dot org VfL Borussia! Força Barça! SF 49ers!
Use Debian GNU/Linux, PostgreSQL
Attachments:
001_declareStatement_v2.patchapplication/octet-stream; name=001_declareStatement_v2.patchDownload
diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml
index b8021cb..f882d83 100644
--- a/doc/src/sgml/ecpg.sgml
+++ b/doc/src/sgml/ecpg.sgml
@@ -6683,6 +6683,107 @@ EXEC SQL DECLARE cur1 CURSOR FOR stmt1;
</refsect1>
</refentry>
+ <refentry id="ecpg-sql-declare-statement">
+ <refnamediv>
+ <refname>DECLARE STATEMENT</refname>
+ <refpurpose>declares SQL statement identifier associated with connection</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+<synopsis>
+EXEC SQL [ AT connection_name ] DECLARE <replaceable class="PARAMETER">statement_name</replaceable> STATEMENT
+</synopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>Description</title>
+
+ <para>
+ <command>DECLARE STATEMENT</command> declares SQL statement identifier.
+ SQL statement identifier is associated with connection.
+ </para>
+
+ <para>
+ <command>DELARE CURSOR</command> with a SQL statement identifier can be written before PREPARE.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Parameters</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><replaceable class="PARAMETER">connection_name</replaceable></term>
+ <listitem>
+ <para>
+ A database connection name established by the <command>CONNECT</command> command.
+ </para>
+ <para>
+ If AT clause is omitted, an SQL statement identifier is associated with the DEFAULT connection.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <variablelist>
+ <varlistentry>
+ <term><replaceable class="PARAMETER">statement_name</replaceable></term>
+ <listitem>
+ <para>
+ The name of a SQL statement identifier, either as an SQL identifier or a host variable.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>Notes</title>
+
+ <para>
+ An SQL statement with a SQL statement identifier must use a same connection
+ as the connection that the SQL statement identifier is associated with.
+ </para>
+
+ <para>
+ AT clause cannot be used with the SQL statement which have been identified by <command>DECLARE STATEMENT</command>
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Examples</title>
+
+<programlisting>
+EXEC SQL CONNECT TO postgres AS con1;
+EXEC SQL AT con1 DECLARE sql_stmt STATEMENT;
+EXEC SQL DECLARE cursor_name CURSOR FOR sql_stmt;
+EXEC SQL PREPARE sql_stmt FROM :dyn_string;
+EXEC SQL OPEN cursor_name;
+EXEC SQL FETCH cursor_name INTO :column1;
+EXEC SQL CLOSE cursor_name;
+</programlisting>
+ </refsect1>
+
+ <refsect1>
+ <title>Compatibility</title>
+
+ <para>
+ <command>DECLARE STATEMENT</command> is a PostgreSQL extension of the SQL standard,
+ but can be used in Oracle and DB2.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>See Also</title>
+
+ <simplelist type="inline">
+ <member><xref linkend="ecpg-sql-connect"></member>
+ <member><xref linkend="ecpg-sql-declare"></member>
+ <member><xref linkend="ecpg-sql-open"></member>
+ </simplelist>
+ </refsect1>
+ </refentry>
+
<refentry id="ecpg-sql-describe">
<refnamediv>
<refname>DESCRIBE</refname>
diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile
index fbb1407..132e53a 100644
--- a/src/interfaces/ecpg/ecpglib/Makefile
+++ b/src/interfaces/ecpg/ecpglib/Makefile
@@ -26,7 +26,7 @@ override CFLAGS += $(PTHREAD_CFLAGS)
LIBS := $(filter-out -lpgport, $(LIBS))
OBJS= execute.o typename.o descriptor.o sqlda.o data.o error.o prepare.o memory.o \
- connect.o misc.o path.o pgstrcasecmp.o \
+ connect.o misc.o path.o pgstrcasecmp.o cursor.o \
$(filter snprintf.o strlcpy.o win32setlocale.o isinf.o, $(LIBOBJS)) $(WIN32RES)
# thread.c is needed only for non-WIN32 implementation of path.c
diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c
index c90f13d..ddbc08c 100644
--- a/src/interfaces/ecpg/ecpglib/connect.c
+++ b/src/interfaces/ecpg/ecpglib/connect.c
@@ -340,6 +340,8 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
return false;
}
+ memset(this, 0, sizeof(struct connection));
+
if (dbname != NULL)
{
/* get the detail information from dbname */
@@ -684,12 +686,15 @@ ECPGdisconnect(int lineno, const char *connection_name)
if (strcmp(connection_name, "ALL") == 0)
{
+ struct connection *f = NULL;
+
ecpg_init_sqlca(sqlca);
for (con = all_connections; con;)
{
- struct connection *f = con;
+ f = con;
con = con->next;
+ ecpg_release_declared_statement(f->name);
ecpg_finish(f);
}
}
@@ -705,7 +710,10 @@ ECPGdisconnect(int lineno, const char *connection_name)
return (false);
}
else
+ {
+ ecpg_release_declared_statement(connection_name);
ecpg_finish(con);
+ }
}
#ifdef ENABLE_THREAD_SAFETY
diff --git a/src/interfaces/ecpg/ecpglib/cursor.c b/src/interfaces/ecpg/ecpglib/cursor.c
new file mode 100644
index 0000000..2188827
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/cursor.c
@@ -0,0 +1,265 @@
+/* src/interfaces/ecpg/ecpglib/cursor.c */
+
+#define POSTGRES_ECPG_INTERNAL
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <locale.h>
+#include <string.h>
+
+#include "ecpgtype.h"
+#include "ecpglib.h"
+#include "ecpgerrno.h"
+#include "extern.h"
+#include "sqlca.h"
+
+static void add_cursor(const int, const char *, const char *);
+static void remove_cursor(const char *, struct connection *);
+static bool find_cursor(const char *, const struct connection *);
+
+/***
+ * Function: Handle the EXEC SQL OPEN cursor statement:
+ * Input:
+ * cursor_name --- cursor name
+ * prepared_name --- prepared name
+ * others --- keep same as the parameters in ECPGdo() function
+ **/
+bool
+ECPGopen(const char *cursor_name,const char *prepared_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return (false);
+ }
+
+ /****
+ * If the declared name is referred by the PREPARE statement then the
+ * prepared_name is same as declared name
+ * */
+ real_connection_name = ecpg_get_con_name_by_declared_name(prepared_name);
+ if(real_connection_name)
+ {
+ /* Add the cursor name into the declared node */
+ ecpg_update_declare_statement(prepared_name, cursor_name, lineno);
+ }
+ else
+ {
+ /****
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ * */
+ real_connection_name = connection_name;
+ }
+
+
+ /* Add the cursor into the connection */
+ add_cursor(lineno, cursor_name, real_connection_name);
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return (status);
+}
+
+
+/***
+ * Function: Handle the EXEC SQL FETCH/MOVE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ **/
+bool
+ECPGfetch(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return (false);
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if(real_connection_name == NULL)
+ {
+ /****
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ * */
+ real_connection_name = connection_name;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return (status);
+}
+
+
+/***
+ * Function: Handle the EXEC SQL CLOSE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ **/
+bool
+ECPGclose(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+ struct connection *con = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return (false);
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if(real_connection_name == NULL)
+ {
+ /****
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ * */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+
+ /* check the existence of the cursor in the connection */
+ if(false == find_cursor(cursor_name, con))
+ {
+ ecpg_raise(lineno, ECPG_INVALID_CURSOR, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ remove_cursor(cursor_name, con);
+
+ return (status);
+}
+
+/***
+ * Function: Add a cursor into the connection
+ */
+static void
+add_cursor(const int lineno, const char *cursor_name, const char *connection_name)
+{
+ struct connection *con;
+ struct cursor_statement *new = NULL;
+
+ if(!cursor_name)
+ return ;
+
+ con = ecpg_get_connection(connection_name);
+ if (!con)
+ {
+ return;
+ }
+
+ if(find_cursor(cursor_name, con))
+ {
+ /* Should never goto here, because ECPG has checked the duplication of
+ * the cursor in pre-compile stage.
+ */
+ return;
+ }
+
+ /* allocate a node to store the new cursor */
+ new = (struct cursor_statement *)ecpg_alloc(sizeof(struct cursor_statement), lineno);
+ if(new)
+ {
+ new->name = ecpg_strdup(cursor_name, lineno);
+ new->next = con->cursor_stmts;
+ con->cursor_stmts = new;
+ }
+}
+
+/***
+ * Function: Remove the cursor from the connection
+ */
+static void
+remove_cursor(const char *cursor_name, struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+ struct cursor_statement *prev = NULL;
+
+ if(!connection || !cursor_name)
+ return ;
+
+ cur = connection->cursor_stmts;
+ while(cur)
+ {
+ if(strcmp(cur->name, cursor_name) == 0)
+ {
+ if(!prev)
+ {
+ connection->cursor_stmts = cur->next;
+ }
+ else
+ {
+ prev->next = cur->next;
+ }
+
+ ecpg_free(cur->name);
+ ecpg_free(cur);
+
+ break;
+ }
+ prev = cur;
+ cur = cur->next;
+ }
+}
+
+/***
+ * Function: Find whether the cursor is existence in the connection or not
+ * Return: true ---Found
+ * false --- Not found
+ */
+static bool
+find_cursor(const char *cursor_name, const struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+
+ if(!connection || !cursor_name)
+ return false;
+
+ for(cur = connection->cursor_stmts; cur != NULL; cur = cur->next)
+ {
+ if(strcmp(cur->name, cursor_name) == 0)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c
index 15fd7a0..a1665c8 100644
--- a/src/interfaces/ecpg/ecpglib/descriptor.c
+++ b/src/interfaces/ecpg/ecpglib/descriptor.c
@@ -818,6 +818,7 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
struct prepared_statement *prep;
PGresult *res;
va_list args;
+ const char *real_connection_name = NULL;
/* DESCRIBE INPUT is not yet supported */
if (input)
@@ -826,13 +827,21 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
return ret;
}
- con = ecpg_get_connection(connection_name);
- if (!con)
+ real_connection_name = ecpg_get_con_name_by_declared_name(stmt_name);
+ if (real_connection_name == NULL)
{
- ecpg_raise(line, ECPG_NO_CONN, ECPG_SQLSTATE_CONNECTION_DOES_NOT_EXIST,
- connection_name ? connection_name : ecpg_gettext("NULL"));
- return ret;
+ /***
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ * */
+ real_connection_name = connection_name;
+
}
+
+ con = ecpg_get_connection(real_connection_name);
+ if (!ecpg_init(con, real_connection_name, line))
+ return false;
+
prep = ecpg_find_prepared_statement(stmt_name, con, NULL);
if (!prep)
{
diff --git a/src/interfaces/ecpg/ecpglib/error.c b/src/interfaces/ecpg/ecpglib/error.c
index 656b2c4..11a1a7c 100644
--- a/src/interfaces/ecpg/ecpglib/error.c
+++ b/src/interfaces/ecpg/ecpglib/error.c
@@ -200,6 +200,13 @@ ecpg_raise(int line, int code, const char *sqlstate, const char *str)
ecpg_gettext("could not connect to database \"%s\" on line %d"), str, line);
break;
+ case ECPG_INVALID_CURSOR:
+ snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
+ /*------
+ translator: this string will be truncated at 149 characters expanded. */
+ ecpg_gettext("The cursor is invalid on line %d"),line);
+ break;
+
default:
snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
/*------
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index a3ae92e..b7646fd 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -2032,9 +2032,31 @@ ECPGdo(const int lineno, const int compat, const int force_indicator, const char
{
va_list args;
bool ret;
+ const char *real_connection_name = NULL;
+
+ real_connection_name = connection_name;
+
+ if (!query) {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return (false);
+ }
+
+ /* Handle the EXEC SQL EXECUTE... statement */
+ if(ECPGst_execute == st)
+ {
+ real_connection_name = ecpg_get_con_name_by_declared_name(query);
+ if(real_connection_name == NULL)
+ {
+ /****
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ * */
+ real_connection_name = connection_name;
+ }
+ }
va_start(args, query);
- ret = ecpg_do(lineno, compat, force_indicator, connection_name,
+ ret = ecpg_do(lineno, compat, force_indicator, real_connection_name,
questionmarks, st, query, args);
va_end(args);
diff --git a/src/interfaces/ecpg/ecpglib/exports.txt b/src/interfaces/ecpg/ecpglib/exports.txt
index 69e9617..f39212c 100644
--- a/src/interfaces/ecpg/ecpglib/exports.txt
+++ b/src/interfaces/ecpg/ecpglib/exports.txt
@@ -25,7 +25,11 @@ ECPGsetconn 22
ECPGstatus 23
ECPGtrans 24
sqlprint 25
-ECPGget_PGconn 26
-ECPGtransactionStatus 27
-ECPGset_var 28
-ECPGget_var 29
+ECPGget_PGconn 26
+ECPGtransactionStatus 27
+ECPGset_var 28
+ECPGget_var 29
+ECPGdeclare 30
+ECPGopen 31
+ECPGfetch 32
+ECPGclose 33
diff --git a/src/interfaces/ecpg/ecpglib/extern.h b/src/interfaces/ecpg/ecpglib/extern.h
index c3082be..20bea1d 100644
--- a/src/interfaces/ecpg/ecpglib/extern.h
+++ b/src/interfaces/ecpg/ecpglib/extern.h
@@ -66,6 +66,15 @@ struct statement
PGresult *results;
};
+/* structure to store declared statements */
+struct declared_statement
+{
+ char *name; /* declare name */
+ char *connection_name;
+ char *cursor_name;
+ struct declared_statement *next;
+};
+
/* structure to store prepared statements for a connection */
struct prepared_statement
{
@@ -75,6 +84,12 @@ struct prepared_statement
struct prepared_statement *next;
};
+struct cursor_statement
+{
+ char *name; /*cursor name*/
+ struct cursor_statement *next;
+};
+
/* structure to store connections */
struct connection
{
@@ -83,6 +98,7 @@ struct connection
bool autocommit;
struct ECPGtype_information_cache *cache_head;
struct prepared_statement *prep_stmts;
+ struct cursor_statement *cursor_stmts;
struct connection *next;
};
@@ -165,6 +181,11 @@ struct descriptor *ecpg_find_desc(int line, const char *name);
struct prepared_statement *ecpg_find_prepared_statement(const char *,
struct connection *, struct prepared_statement **);
+void ecpg_update_declare_statement(const char *, const char *, const int);
+char *ecpg_get_con_name_by_declared_name(const char *);
+const char *ecpg_get_con_name_by_cursor_name(const char *);
+void ecpg_release_declared_statement(const char *);
+
bool ecpg_store_result(const PGresult *results, int act_field,
const struct statement * stmt, struct variable * var);
bool ecpg_store_input(const int, const bool, const struct variable *, char **, bool);
@@ -220,4 +241,4 @@ void ecpg_set_native_sqlda(int, struct sqlda_struct **, const PGresult *, int,
#define ECPG_SQLSTATE_ECPG_INTERNAL_ERROR "YE000"
#define ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY "YE001"
-#endif /* _ECPG_LIB_EXTERN_H */
+#endif /* _ECPG_LIB_EXTERN_H */
diff --git a/src/interfaces/ecpg/ecpglib/prepare.c b/src/interfaces/ecpg/ecpglib/prepare.c
index 983b242..530883f 100644
--- a/src/interfaces/ecpg/ecpglib/prepare.c
+++ b/src/interfaces/ecpg/ecpglib/prepare.c
@@ -26,9 +26,11 @@ static int nextStmtID = 1;
static const int stmtCacheNBuckets = 2039; /* # buckets - a prime # */
static const int stmtCacheEntPerBucket = 8; /* # entries/bucket */
static stmtCacheEntry stmtCacheEntries[16384] = {{0, {0}, 0, 0, 0}};
+static struct declared_statement *g_declared_list;
static bool deallocate_one(int lineno, enum COMPAT_MODE c, struct connection * con,
struct prepared_statement * prev, struct prepared_statement * this);
+static struct declared_statement *ecpg_find_declared_statement(const char *);
static bool
isvarchar(unsigned char c)
@@ -117,6 +119,7 @@ prepare_common(int lineno, struct connection * con, const char *name, const char
ecpg_free(this);
return false;
}
+ memset(stmt,0,sizeof(struct statement));
/* create statement */
stmt->lineno = lineno;
@@ -163,11 +166,22 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
(void) questionmarks; /* quiet the compiler */
- con = ecpg_get_connection(connection_name);
- if (!ecpg_init(con, connection_name, lineno))
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /****
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ * */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+ if (!ecpg_init(con, real_connection_name, lineno))
return false;
/* check if we already have prepared this statement */
@@ -255,9 +269,19 @@ ECPGdeallocate(int lineno, int c, const char *connection_name, const char *name)
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
- con = ecpg_get_connection(connection_name);
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /****
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ * */
+ real_connection_name = connection_name;
+ }
+ con = ecpg_get_connection(real_connection_name);
if (!ecpg_init(con, connection_name, lineno))
return false;
@@ -305,8 +329,21 @@ ecpg_prepared(const char *name, struct connection * con)
char *
ECPGprepared_statement(const char *connection_name, const char *name, int lineno)
{
+ const char *real_connection_name = NULL;
+
(void) lineno; /* keep the compiler quiet */
- return ecpg_prepared(name, ecpg_get_connection(connection_name));
+
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /****
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ * */
+ real_connection_name = connection_name;
+ }
+
+ return ecpg_prepared(name, ecpg_get_connection(real_connection_name));
}
/*
@@ -324,7 +361,7 @@ HashStmt(const char *ecpgQuery)
stmtLeng = strlen(ecpgQuery);
hashLeng = 50; /* use 1st 50 characters of statement */
- if (hashLeng > stmtLeng) /* if the statement isn't that long */
+ if (hashLeng > stmtLeng) /* if the statement isn't that long */
hashLeng = stmtLeng; /* use its actual length */
hashVal = 0;
@@ -337,7 +374,7 @@ HashStmt(const char *ecpgQuery)
}
bucketNo = hashVal % stmtCacheNBuckets;
- bucketNo += 1; /* don't use bucket # 0 */
+ bucketNo += 1; /* don't use bucket # 0 */
return (bucketNo * stmtCacheEntPerBucket);
}
@@ -367,7 +404,7 @@ SearchStmtCache(const char *ecpgQuery)
++entNo; /* incr entry # */
}
-/* if entry wasn't found - set entry # to zero */
+/* if entry wasn't found - set entry # to zero */
if (entIx >= stmtCacheEntPerBucket)
entNo = 0;
@@ -388,7 +425,7 @@ ecpg_freeStmtCacheEntry(int lineno, int compat, int entNo) /* entry # to free *
*prev;
entry = &stmtCacheEntries[entNo];
- if (!entry->stmtID[0]) /* return if the entry isn't in use */
+ if (!entry->stmtID[0]) /* return if the entry isn't in use */
return (0);
con = ecpg_get_connection(entry->connection);
@@ -513,3 +550,215 @@ ecpg_auto_prepare(int lineno, const char *connection_name, const int compat, cha
return (true);
}
+
+/***
+ * Function: handle the EXEC SQL DECLARE STATEMENT
+ * Input: connection_name -- connection name
+ * name -- declare name
+ */
+bool
+ECPGdeclare(int lineno, const char *connection_name, const char *name)
+{
+ struct connection *con = NULL;
+ struct declared_statement *p = NULL;
+
+ if(name == NULL)
+ {
+ /* Should never go to here because ECPG pre-compiler will check it */
+ return false;
+ }
+
+ if(connection_name == NULL)
+ {
+ /***
+ * Going to here means without using AT clause in the DECLARE STATEMENT
+ * We don't allocate a node to store the declared name because the
+ * DECLARE STATEMENT without using AT clause will be ignored.
+ */
+ return true;
+ }
+
+ con = ecpg_get_connection(connection_name);
+ if (!ecpg_init(con, connection_name, lineno))
+ return false;
+
+ if(ecpg_find_declared_statement(name))
+ {
+ /* Should not go to here because the pre-compiler has check the duplicate name */
+ return false;
+ }
+
+ /* allocate a declared_statement as a new node */
+ p = (struct declared_statement *) ecpg_alloc(sizeof(struct declared_statement), lineno);
+ if (!p)
+ {
+ return false;
+ }
+
+ memset(p,0,sizeof(struct declared_statement));
+
+ ecpg_log("ECPGdeclare on line %d: declared name %s on connection: \"%s\"\n", lineno, name, connection_name);
+
+ p->name = ecpg_strdup(name, lineno);
+ p->connection_name = ecpg_strdup(connection_name, lineno);
+
+ /* Add the new node into the g_declared_list */
+ if(g_declared_list != NULL)
+ {
+ p->next = g_declared_list;
+ g_declared_list = p;
+ }
+ else
+ {
+ g_declared_list = p;
+ }
+
+ return true;
+}
+
+/***
+ * Function: Find a declare node by declared name
+ * Input: name -- declared name
+ * Return: Found -- The pointer points to the declared node
+ * Not found -- NULL
+ */
+static struct declared_statement *
+ecpg_find_declared_statement(const char *name)
+{
+ struct declared_statement *p;
+
+ if(name == NULL)
+ {
+ return NULL;
+ }
+
+ p = g_declared_list;
+ while(p)
+ {
+ if (strcmp(p->name, name) == 0)
+ {
+ return p;
+ }
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/***
+ * Function: Build the relationship between the declared name and cursor name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * cursor_name -- cursor name declared in the DECLARE/OPEN CURSOR statement
+ */
+void
+ecpg_update_declare_statement(const char *declared_name, const char *cursor_name, const int lineno)
+{
+ struct declared_statement *p = NULL;
+
+ if(!declared_name || !cursor_name)
+ {
+ return;
+ }
+
+ /* Find the declare node by declared name */
+ p = ecpg_find_declared_statement(declared_name);
+ if(p)
+ {
+ p->cursor_name = ecpg_strdup(cursor_name,lineno);
+ }
+}
+
+/***
+ * Function: Find and return the connection name referred by the declared name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+char *
+ecpg_get_con_name_by_declared_name(const char *declared_name)
+{
+ struct declared_statement *p;
+
+ p = ecpg_find_declared_statement(declared_name);
+ if(p)
+ {
+ return p->connection_name;
+ }
+
+ return NULL;
+}
+
+/***
+ * Function: Find the declared name referred by the cursor, then return the
+ * connection name used by the declared name.
+ * Input: cursor_name -- the cursor name
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+const char *
+ecpg_get_con_name_by_cursor_name(const char *cursor_name)
+{
+ struct declared_statement *p;
+
+ if(cursor_name == NULL)
+ {
+ return NULL;
+ }
+
+ p = g_declared_list;
+ while(p)
+ {
+ /* Search the cursor name in the declare list */
+ if(p->cursor_name && (strcmp(p->cursor_name, cursor_name) == 0))
+ {
+ return p->connection_name;
+ }
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/***
+ * Function: Release the declare node from the g_declared_list which refer the connection_name
+ * Input: connection_name -- connection name
+ */
+void
+ecpg_release_declared_statement(const char *connection_name)
+{
+ struct declared_statement *cur = NULL;
+ struct declared_statement *prev = NULL;
+
+ if(connection_name == NULL)
+ {
+ return;
+ }
+
+ cur = g_declared_list;
+ while(cur)
+ {
+ if (strcmp(cur->connection_name, connection_name) == 0)
+ {
+ /* If find then release the declare node from the list */
+ if(prev)
+ {
+ prev->next = cur->next;
+ }
+ else
+ {
+ g_declared_list = cur->next;
+ }
+
+ ecpg_log("ecpg_release_declared_statement: declared name %s is released\n", cur->name);
+
+ ecpg_free(cur->name);
+ ecpg_free(cur->connection_name);
+ ecpg_free(cur->cursor_name);
+ ecpg_free(cur);
+
+ /*One connection can be used by multiple declared name, so no break here */
+ }
+ prev = cur;
+ cur = cur->next;
+ }
+}
diff --git a/src/interfaces/ecpg/include/ecpgerrno.h b/src/interfaces/ecpg/include/ecpgerrno.h
index 36b15b7..fae9440 100644
--- a/src/interfaces/ecpg/include/ecpgerrno.h
+++ b/src/interfaces/ecpg/include/ecpgerrno.h
@@ -44,6 +44,7 @@
#define ECPG_UNKNOWN_DESCRIPTOR_ITEM -242
#define ECPG_VAR_NOT_NUMERIC -243
#define ECPG_VAR_NOT_CHAR -244
+#define ECPG_INVALID_CURSOR -245
/* finally the backend error messages, they start at 400 */
#define ECPG_PGSQL -400
diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h
index c32df6c..8c91212 100644
--- a/src/interfaces/ecpg/include/ecpglib.h
+++ b/src/interfaces/ecpg/include/ecpglib.h
@@ -55,6 +55,10 @@ bool ECPGdisconnect(int, const char *);
bool ECPGprepare(int, const char *, const bool, const char *, const char *);
bool ECPGdeallocate(int, int, const char *, const char *);
bool ECPGdeallocate_all(int, int, const char *);
+bool ECPGdeclare(int, const char *, const char *);
+bool ECPGopen(const char*, const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGfetch(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGclose(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
char *ECPGprepared_statement(const char *, const char *, int);
PGconn *ECPGget_PGconn(const char *);
PGTransactionStatusType ECPGtransactionStatus(const char *);
diff --git a/src/interfaces/ecpg/include/ecpgtype.h b/src/interfaces/ecpg/include/ecpgtype.h
index 7cc47e9..2c3f348 100644
--- a/src/interfaces/ecpg/include/ecpgtype.h
+++ b/src/interfaces/ecpg/include/ecpgtype.h
@@ -99,8 +99,15 @@ enum ECPG_statement_type
ECPGst_prepnormal
};
+enum ECPG_cursor_statement_type
+{
+ ECPGcst_declare,
+ ECPGcst_open,
+ ECPGcst_fetch,
+ ECPGcst_close
+};
#ifdef __cplusplus
}
#endif
-#endif /* _ECPGTYPE_H */
+#endif /* _ECPGTYPE_H */
diff --git a/src/interfaces/ecpg/preproc/ecpg.addons b/src/interfaces/ecpg/preproc/ecpg.addons
index ca3efad..bfc18ab 100644
--- a/src/interfaces/ecpg/preproc/ecpg.addons
+++ b/src/interfaces/ecpg/preproc/ecpg.addons
@@ -15,7 +15,7 @@ ECPG: stmtClosePortalStmt block
}
}
- output_statement($1, 0, ECPGst_normal);
+ $1 = $1;
}
ECPG: stmtDeallocateStmt block
{
@@ -25,7 +25,11 @@ ECPG: stmtDeclareCursorStmt block
{ output_simple_statement($1); }
ECPG: stmtDiscardStmt block
ECPG: stmtFetchStmt block
- { output_statement($1, 1, ECPGst_normal); }
+ {
+ /* g_cursor_name is set in the fetch_args block and freed in the output_cursor_statement */
+ output_cursor_statement(ECPGcst_fetch, g_cursor_name, NULL, $1, 1, ECPGst_normal);
+ g_cursor_name = NULL;
+ }
ECPG: stmtDeleteStmt block
ECPG: stmtInsertStmt block
ECPG: stmtSelectStmt block
@@ -63,6 +67,10 @@ ECPG: stmtViewStmt rule
whenever_action(2);
free($1);
}
+ | ECPGDeclareStmt
+ {
+ output_declare_statement($1);
+ }
| ECPGCursorStmt
{
output_simple_statement($1);
@@ -132,7 +140,14 @@ ECPG: stmtViewStmt rule
if ((ptr = add_additional_variables($1, true)) != NULL)
{
connection = ptr->connection ? mm_strdup(ptr->connection) : NULL;
- output_statement(mm_strdup(ptr->command), 0, ECPGst_normal);
+ if(ptr->prepared_name)
+ {
+ output_cursor_statement(ECPGcst_open, $1, mm_strdup(ptr->prepared_name), mm_strdup(ptr->command), 0, ECPGst_normal);
+ }
+ else
+ {
+ output_cursor_statement(ECPGcst_open, $1, NULL, mm_strdup(ptr->command), 0, ECPGst_normal);
+ }
ptr->opened = true;
}
}
@@ -204,6 +219,7 @@ ECPG: var_valueNumericOnly addon
}
ECPG: fetch_argscursor_name addon
add_additional_variables($1, false);
+ g_cursor_name = mm_strdup($1);
if ($1[0] == ':')
{
free($1);
@@ -211,6 +227,7 @@ ECPG: fetch_argscursor_name addon
}
ECPG: fetch_argsfrom_incursor_name addon
add_additional_variables($2, false);
+ g_cursor_name = mm_strdup($2);
if ($2[0] == ':')
{
free($2);
@@ -222,6 +239,7 @@ ECPG: fetch_argsFIRST_Popt_from_incursor_name addon
ECPG: fetch_argsLAST_Popt_from_incursor_name addon
ECPG: fetch_argsALLopt_from_incursor_name addon
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
if ($3[0] == ':')
{
free($3);
@@ -229,6 +247,7 @@ ECPG: fetch_argsALLopt_from_incursor_name addon
}
ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
if ($3[0] == ':')
{
free($3);
@@ -242,6 +261,7 @@ ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDALLopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDALLopt_from_incursor_name addon
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
if ($4[0] == ':')
{
free($4);
@@ -252,6 +272,7 @@ ECPG: fetch_argsRELATIVE_PSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDSignedIconstopt_from_incursor_name addon
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
if ($4[0] == ':')
{
free($4);
@@ -304,6 +325,7 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
}
this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ memset(this, 0 ,sizeof(struct cursor));
this->next = cur;
this->name = $2;
@@ -336,8 +358,31 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
}
ECPG: ClosePortalStmtCLOSEcursor_name block
{
+ char *stmt = NULL;
+ char *cursor_name = NULL;
char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : $2;
- $$ = cat2_str(mm_strdup("close"), cursor_marker);
+
+ cursor_name = mm_strdup($2);
+
+ stmt = cat2_str(mm_strdup("close"), cursor_marker);
+
+ if (INFORMIX_MODE)
+ {
+ if (pg_strcasecmp(stmt+strlen("close "), "database") == 0)
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE statement");
+
+ fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");");
+ whenever_action(2);
+ free(stmt);
+ break;
+ }
+ }
+
+ output_cursor_statement(ECPGcst_close, cursor_name, NULL, stmt, 0, ECPGst_normal);
+
+ $$ = EMPTY;
}
ECPG: opt_hold block
{
@@ -394,14 +439,14 @@ ECPG: AexprConstNULL_P rule
| civar { $$ = $1; }
| civarind { $$ = $1; }
ECPG: ColIdcol_name_keyword rule
- | ECPGKeywords { $$ = $1; }
- | ECPGCKeywords { $$ = $1; }
- | CHAR_P { $$ = mm_strdup("char"); }
- | VALUES { $$ = mm_strdup("values"); }
+ | ECPGKeywords { $$ = $1; }
+ | ECPGCKeywords { $$ = $1; }
+ | CHAR_P { $$ = mm_strdup("char"); }
+ | VALUES { $$ = mm_strdup("values"); }
ECPG: type_function_nametype_func_name_keyword rule
- | ECPGKeywords { $$ = $1; }
- | ECPGTypeName { $$ = $1; }
- | ECPGCKeywords { $$ = $1; }
+ | ECPGKeywords { $$ = $1; }
+ | ECPGTypeName { $$ = $1; }
+ | ECPGCKeywords { $$ = $1; }
ECPG: VariableShowStmtSHOWALL block
{
mmerror(PARSE_ERROR, ET_ERROR, "SHOW ALL is not implemented");
@@ -416,48 +461,56 @@ ECPG: FetchStmtMOVEfetch_args rule
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("fetch forward"), cursor_marker);
}
| FETCH FORWARD from_in cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("fetch forward from"), cursor_marker);
}
| FETCH BACKWARD cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("fetch backward"), cursor_marker);
}
| FETCH BACKWARD from_in cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("fetch backward from"), cursor_marker);
}
| MOVE FORWARD cursor_name
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("move forward"), cursor_marker);
}
| MOVE FORWARD from_in cursor_name
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("move forward from"), cursor_marker);
}
| MOVE BACKWARD cursor_name
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("move backward"), cursor_marker);
}
| MOVE BACKWARD from_in cursor_name
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("move backward from"), cursor_marker);
}
ECPG: limit_clauseLIMITselect_limit_value','select_offset_value block
diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c
index fa80bb2..0fc4932 100644
--- a/src/interfaces/ecpg/preproc/ecpg.c
+++ b/src/interfaces/ecpg/preproc/ecpg.c
@@ -28,6 +28,7 @@ struct _include_path *include_paths = NULL;
struct cursor *cur = NULL;
struct typedefs *types = NULL;
struct _defines *defines = NULL;
+struct declared_name_st *g_declared_list = NULL;
static void
help(const char *progname)
@@ -111,6 +112,54 @@ add_preprocessor_define(char *define)
defines->next = pd;
}
+static void
+free_argument(struct arguments *arg)
+{
+ if(arg == NULL)
+ {
+ return;
+ }
+
+ free_argument(arg->next);
+
+ /*
+ * Don't free variables in it because the original codes don't free it either
+ * variables are static structures instead of allocating
+ */
+ free(arg);
+}
+
+static void
+free_cursor(struct cursor *c)
+{
+ if(c == NULL)
+ {
+ return;
+ }
+
+ free_cursor(c->next);
+ free_argument(c->argsinsert);
+ free_argument(c->argsresult);
+
+ free(c->name);
+ free(c->function);
+ free(c->command);
+ free(c->prepared_name);
+ free(c);
+}
+
+static void
+free_declared_stmt(struct declared_name_st *st)
+{
+ if(st == NULL)
+ {
+ return;
+ }
+
+ free_declared_stmt(st->next);
+ free(st);
+}
+
#define ECPG_GETOPT_LONG_REGRESSION 1
int
main(int argc, char *const argv[])
@@ -343,29 +392,18 @@ main(int argc, char *const argv[])
struct typedefs *typeptr;
/* remove old cursor definitions if any are still there */
- for (ptr = cur; ptr != NULL;)
+ if(cur)
{
- struct cursor *this = ptr;
- struct arguments *l1,
- *l2;
-
- free(ptr->command);
- free(ptr->connection);
- free(ptr->name);
- for (l1 = ptr->argsinsert; l1; l1 = l2)
- {
- l2 = l1->next;
- free(l1);
- }
- for (l1 = ptr->argsresult; l1; l1 = l2)
- {
- l2 = l1->next;
- free(l1);
- }
- ptr = ptr->next;
- free(this);
+ free_cursor(cur);
+ cur = NULL;
+ }
+
+ /* remove old declared statements if any are still there */
+ if(g_declared_list)
+ {
+ free_declared_stmt(g_declared_list);
+ g_declared_list = NULL;
}
- cur = NULL;
/* remove non-pertinent old defines as well */
while (defines && !defines->pertinent)
@@ -479,6 +517,18 @@ main(int argc, char *const argv[])
free(input_filename);
}
+
+ if(g_declared_list)
+ {
+ free_declared_stmt(g_declared_list);
+ g_declared_list = NULL;
+ }
+
+ if(cur)
+ {
+ free_cursor(cur);
+ cur = NULL;
+ }
}
return ret_value;
}
diff --git a/src/interfaces/ecpg/preproc/ecpg.header b/src/interfaces/ecpg/preproc/ecpg.header
index 672f0b4..bda7214 100644
--- a/src/interfaces/ecpg/preproc/ecpg.header
+++ b/src/interfaces/ecpg/preproc/ecpg.header
@@ -38,6 +38,7 @@ char *current_function;
int ecpg_internal_var = 0;
char *connection = NULL;
char *input_filename = NULL;
+char *g_cursor_name = NULL;
static int FoundInto = 0;
static int initializer = 0;
diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer
index 31e765c..49f7fa6 100644
--- a/src/interfaces/ecpg/preproc/ecpg.trailer
+++ b/src/interfaces/ecpg/preproc/ecpg.trailer
@@ -284,6 +284,38 @@ prepared_name: name
;
/*
+ * Declare Statement
+ */
+ECPGDeclareStmt: DECLARE prepared_name STATEMENT
+ {
+ struct declared_name_st *ptr = NULL;
+
+ /* Check whether the declared name has been defined or not */
+ for (ptr = g_declared_list; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp($2, ptr->name) == 0)
+ {
+ /* re-definition is a bug */
+ mmerror(PARSE_ERROR, ET_ERROR, "declared name %s is already defined", ptr->name);
+ }
+ }
+
+ /* Add a new declared name into the g_declared_list */
+ ptr = NULL;
+ ptr = (struct declared_name_st *) mm_alloc(sizeof(struct declared_name_st));
+ if(ptr)
+ {
+ /* initial definition */
+ ptr->name = $2;
+ ptr->next = g_declared_list;
+ g_declared_list = ptr;
+ }
+
+ $$ = mm_strdup($2);
+ }
+;
+
+/*
* Declare a prepared cursor. The syntax is different from the standard
* declare statement, so we create a new rule.
*/
@@ -309,6 +341,7 @@ ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared
}
this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ memset(this, 0 ,sizeof(struct cursor));
/* initial definition */
this->next = cur;
@@ -318,6 +351,7 @@ ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared
this->command = cat_str(6, mm_strdup("declare"), cursor_marker, $3, mm_strdup("cursor"), $5, mm_strdup("for $1"));
this->argsresult = NULL;
this->argsresult_oos = NULL;
+ this->prepared_name = $7;
thisquery->type = &ecpg_query;
thisquery->brace_level = 0;
diff --git a/src/interfaces/ecpg/preproc/ecpg.type b/src/interfaces/ecpg/preproc/ecpg.type
index ac6aa00..978be84 100644
--- a/src/interfaces/ecpg/preproc/ecpg.type
+++ b/src/interfaces/ecpg/preproc/ecpg.type
@@ -9,6 +9,7 @@
%type <str> ECPGDeallocateDescr
%type <str> ECPGDeclaration
%type <str> ECPGDeclare
+%type <str> ECPGDeclareStmt
%type <str> ECPGDescribe
%type <str> ECPGDisconnect
%type <str> ECPGExecuteImmediateStmt
diff --git a/src/interfaces/ecpg/preproc/extern.h b/src/interfaces/ecpg/preproc/extern.h
index 0ce3a6e..dcfdc06 100644
--- a/src/interfaces/ecpg/preproc/extern.h
+++ b/src/interfaces/ecpg/preproc/extern.h
@@ -50,6 +50,7 @@ extern struct _include_path *include_paths;
extern struct cursor *cur;
extern struct typedefs *types;
extern struct _defines *defines;
+extern struct declared_name_st *g_declared_list;
extern struct ECPGtype ecpg_no_indicator;
extern struct variable no_indicator;
extern struct arguments *argsinsert;
@@ -72,6 +73,8 @@ extern void output_statement(char *, int, enum ECPG_statement_type);
extern void output_prepare_statement(char *, char *);
extern void output_deallocate_prepare_statement(char *);
extern void output_simple_statement(char *);
+extern void output_declare_statement(char *);
+extern void output_cursor_statement(int , char *, char *, char *, int , enum ECPG_statement_type);
extern char *hashline_number(void);
extern int base_yyparse(void);
extern int base_yylex(void);
diff --git a/src/interfaces/ecpg/preproc/output.c b/src/interfaces/ecpg/preproc/output.c
index 59d5d30..083458b 100644
--- a/src/interfaces/ecpg/preproc/output.c
+++ b/src/interfaces/ecpg/preproc/output.c
@@ -5,6 +5,7 @@
#include "extern.h"
static void output_escaped_str(char *cmd, bool quoted);
+static void output_cursor_name(char *str);
void
output_line_number(void)
@@ -195,7 +196,16 @@ static void
output_escaped_str(char *str, bool quoted)
{
int i = 0;
- int len = strlen(str);
+ int len = 0;
+
+ if(str == NULL)
+ {
+ fputs("NULL", base_yyout);
+
+ return;
+ }
+
+ len = strlen(str);
if (quoted && str[0] == '"' && str[len - 1] == '"') /* do not escape quotes
* at beginning and end
@@ -244,3 +254,150 @@ output_escaped_str(char *str, bool quoted)
if (quoted && str[0] == '"' && str[len] == '"')
fputs("\"", base_yyout);
}
+
+/****
+ * This is a tool function used by the output_cursor_statement function to print
+ * cursor name after the string such as "ECPGopen(","ECPGfetch(","ECPGclose(".
+ * */
+static void
+output_cursor_name(char *str)
+{
+ int i = 0;
+ int len = 0;
+
+ if(str == NULL)
+ {
+ fputs("NULL",base_yyout);
+
+ return;
+ }
+
+ len = strlen(str);
+ fputs("\"", base_yyout);
+ if (str[0] == '\"' && str[len - 1] == '\"')
+ {
+ i = 1;
+ len--;
+ fputs("\\\"", base_yyout);
+
+ /* output this char by char as we have to filter " and \n */
+ for (; i < len; i++)
+ {
+ if (str[i] == '"')
+ fputs("\\\"", base_yyout);
+ else if (str[i] == '\n')
+ fputs("\\\n", base_yyout);
+ else if (str[i] == '\\')
+ {
+ int j = i;
+
+ /*
+ * check whether this is a continuation line if it is, do not
+ * output anything because newlines are escaped anyway
+ */
+
+ /* accept blanks after the '\' as some other compilers do too */
+ do
+ {
+ j++;
+ } while (str[j] == ' ' || str[j] == '\t');
+
+ if ((str[j] != '\n') && (str[j] != '\r' || str[j + 1] != '\n')) /* not followed by a
+ * newline */
+ fputs("\\\\",base_yyout);
+ }
+ else if (str[i] == '\r' && str[i + 1] == '\n')
+ {
+ fputs("\\\r\n", base_yyout);
+ i++;
+ }
+ else
+ fputc(str[i], base_yyout);
+ }
+
+ fputs("\\\"", base_yyout);
+ }
+ else
+ {
+ fputs(str, base_yyout);
+ }
+ fputs("\"", base_yyout);
+}
+
+/***
+ * Translate the EXEC SQL DECLARE STATEMENT into ECPGdeclare function
+ */
+void
+output_declare_statement(char *name)
+{
+ /* connection is set in "at:" token in ecpg.trailer file */
+ fprintf(base_yyout, "{ ECPGdeclare(__LINE__, %s, ", connection ? connection : "NULL");
+ output_escaped_str(name, true);
+ fputs(");", base_yyout);
+
+ whenever_action(2);
+ free(name);
+ if (connection != NULL)
+ free(connection);
+}
+
+/***
+ * Translate the EXEC SQL CURSOR STATEMENT such as OPEN/FETCH/CLOSE cursor into
+ * ECPGopen/ECPGfetch/ECPGclose function
+ */
+void
+output_cursor_statement(int cursor_stmt, char *cursor_name, char *prepared_name, char *stmt, int whenever_mode, enum ECPG_statement_type st)
+{
+ switch(cursor_stmt)
+ {
+ case ECPGcst_open:
+ fprintf(base_yyout, "{ ECPGopen(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout,", ");
+ output_escaped_str(prepared_name, true);
+ fprintf(base_yyout,", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ case ECPGcst_fetch:
+ fprintf(base_yyout, "{ ECPGfetch(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout,", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ case ECPGcst_close:
+ fprintf(base_yyout, "{ ECPGclose(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout,", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ }
+
+ if (st == ECPGst_execute || st == ECPGst_exec_immediate)
+ {
+ fprintf(base_yyout, "%s, %s, ", ecpg_statement_type_name[st], stmt);
+ }
+ else
+ {
+ if (st == ECPGst_prepnormal && auto_prepare)
+ fputs("ECPGst_prepnormal, \"", base_yyout);
+ else
+ fputs("ECPGst_normal, \"", base_yyout);
+
+ output_escaped_str(stmt, false);
+ fputs("\", ", base_yyout);
+ }
+
+ /* dump variables to C file */
+ dump_variables(argsinsert, 1);
+ fputs("ECPGt_EOIT, ", base_yyout);
+ dump_variables(argsresult, 1);
+ fputs("ECPGt_EORT);", base_yyout);
+ reset_variables();
+
+ whenever_action(whenever_mode | 2);
+ free(cursor_name);
+ free(prepared_name);
+ free(stmt);
+ if (connection != NULL)
+ free(connection);
+}
diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h
index cd0d1da..82db1fc 100644
--- a/src/interfaces/ecpg/preproc/type.h
+++ b/src/interfaces/ecpg/preproc/type.h
@@ -129,6 +129,7 @@ struct cursor
char *command;
char *connection;
bool opened;
+ char *prepared_name;
struct arguments *argsinsert;
struct arguments *argsinsert_oos;
struct arguments *argsresult;
@@ -136,6 +137,13 @@ struct cursor
struct cursor *next;
};
+/* structure to store declared name */
+struct declared_name_st
+{
+ char *name; /* declare name */
+ struct declared_name_st *next;
+};
+
struct typedefs
{
char *name;
diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile
index 28f02fe..53a50c3 100644
--- a/src/interfaces/ecpg/test/Makefile
+++ b/src/interfaces/ecpg/test/Makefile
@@ -75,7 +75,7 @@ $(remaining_files_build): $(abs_builddir)/%: $(srcdir)/%
endif
# Common options for tests. Also pick up anything passed in EXTRA_REGRESS_OPTS
-REGRESS_OPTS = --dbname=ecpg1_regression,ecpg2_regression --create-role=regress_ecpg_user1,regress_ecpg_user2 $(EXTRA_REGRESS_OPTS)
+REGRESS_OPTS = --dbname=ecpg1_regression,ecpg2_regression,ecpg3_regression --create-role=regress_ecpg_user1,regress_ecpg_user2 $(EXTRA_REGRESS_OPTS)
check: all
$(with_temp_install) ./pg_regress $(REGRESS_OPTS) --temp-instance=./tmp_check $(TEMP_CONF) --bindir= $(pg_regress_locale_flags) $(THREAD) --schedule=$(srcdir)/ecpg_schedule
diff --git a/src/interfaces/ecpg/test/ecpg_schedule b/src/interfaces/ecpg/test/ecpg_schedule
index c3ec125..5f7fe5b 100644
--- a/src/interfaces/ecpg/test/ecpg_schedule
+++ b/src/interfaces/ecpg/test/ecpg_schedule
@@ -48,6 +48,7 @@ test: sql/quote
test: sql/show
test: sql/insupd
test: sql/parser
+test: sql/declare
test: thread/thread
test: thread/thread_implicit
test: thread/prep
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
index 1f316fb..b4a7c44 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
@@ -241,7 +241,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
+ { ECPGopen("mycur1", "st_id1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 101 "sqlda.pgc"
@@ -258,7 +258,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
+ { ECPGfetch("mycur1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 109 "sqlda.pgc"
@@ -279,7 +279,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
#line 118 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -316,7 +316,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
+ { ECPGopen("mycur2", "st_id2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 138 "sqlda.pgc"
@@ -333,7 +333,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch from mycur2", ECPGt_EOIT,
+ { ECPGfetch("mycur2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch from mycur2", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 146 "sqlda.pgc"
@@ -354,7 +354,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
#line 155 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c b/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
index 9934947..48b9197 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
@@ -158,7 +158,7 @@ if (sqlca.sqlcode < 0) dosqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch forward c", ECPGt_EOIT,
+ { ECPGfetch("c", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch forward c", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_decimal,&(j),(long)1,(long)1,sizeof(decimal),
@@ -244,7 +244,7 @@ if (sqlca.sqlcode < 0) dosqlprint ( );}
static void openit(void)
{
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare c cursor for select * from test where i <= $1 ",
+ { ECPGopen("c", NULL, __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare c cursor for select * from test where i <= $1 ",
ECPGt_int,&(*( int *)(ECPGget_var( 0))),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 95 "test_informix.pgc"
diff --git a/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c b/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
index a56513a..ffa5687 100644
--- a/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
+++ b/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
@@ -82,7 +82,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
/* declare cur cursor for select id , d , d from nantest1 */
#line 33 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
#line 34 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -90,7 +90,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_double,&(d),(long)1,(long)1,sizeof(double),
@@ -130,14 +130,14 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
#line 46 "nan_test.pgc"
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 48 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
#line 48 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
#line 50 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -145,7 +145,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_double,&(d),(long)1,(long)1,sizeof(double),
@@ -164,7 +164,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
if (isnan(d))
printf("%d NaN '%s'\n", id, val);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 61 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -221,7 +221,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
/* declare cur1 cursor for select id , d , d from nantest2 */
#line 75 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for select id , d , d from nantest2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur1", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for select id , d , d from nantest2", ECPGt_EOIT, ECPGt_EORT);
#line 76 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -229,7 +229,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur1", ECPGt_EOIT,
+ { ECPGfetch("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur1", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_numeric,&(num),(long)1,(long)0,sizeof(numeric),
@@ -245,7 +245,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
break;
printf("%d %s '%s'\n", id, (num->sign == NUMERIC_NAN ? "NaN" : "not NaN"), val);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
#line 84 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
diff --git a/src/interfaces/ecpg/test/expected/preproc-autoprep.c b/src/interfaces/ecpg/test/expected/preproc-autoprep.c
index 10ede3e..e3abb29 100644
--- a/src/interfaces/ecpg/test/expected/preproc-autoprep.c
+++ b/src/interfaces/ecpg/test/expected/preproc-autoprep.c
@@ -133,7 +133,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 35 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select Item1 from T", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select Item1 from T", ECPGt_EOIT, ECPGt_EORT);
#line 37 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -143,7 +143,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 37 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 39 "autoprep.pgc"
@@ -156,7 +156,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("i = %d\n", i);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
#line 42 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -180,7 +180,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 46 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for $1",
+ { ECPGopen("cur1", "stmt1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 48 "autoprep.pgc"
@@ -199,7 +199,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
i = 0;
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur1", ECPGt_EOIT,
+ { ECPGfetch("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur1", ECPGt_EOIT,
ECPGt_int,&(item1),(long)1,(long)1,sizeof(int),
ECPGt_int,&(ind1),(long)1,(long)1,sizeof(int), ECPGt_EORT);
#line 55 "autoprep.pgc"
@@ -217,7 +217,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
i++;
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
#line 60 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
diff --git a/src/interfaces/ecpg/test/expected/preproc-cursor.c b/src/interfaces/ecpg/test/expected/preproc-cursor.c
index f7da753..ad86a56 100644
--- a/src/interfaces/ecpg/test/expected/preproc-cursor.c
+++ b/src/interfaces/ecpg/test/expected/preproc-cursor.c
@@ -187,7 +187,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
+ { ECPGopen(":curname1", NULL, __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 67 "cursor.pgc"
@@ -197,7 +197,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward from $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -212,7 +212,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -227,7 +227,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -243,7 +243,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
@@ -260,7 +260,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move in");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 in $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 in $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 87 "cursor.pgc"
@@ -270,7 +270,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -286,7 +286,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
@@ -303,7 +303,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 99 "cursor.pgc"
@@ -323,7 +323,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
+ { ECPGopen(":curname2", NULL, __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -337,7 +337,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -352,7 +352,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -367,7 +367,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -383,7 +383,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
@@ -400,7 +400,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -414,7 +414,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -430,7 +430,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
@@ -447,7 +447,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 140 "cursor.pgc"
@@ -483,7 +483,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname3", "st_id1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test1", "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -493,7 +493,7 @@ if (sqlca.sqlcode < 0) exit (1);}
if (sqlca.sqlcode < 0) exit (1);}
#line 153 "cursor.pgc"
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname5", "st_id1", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test2", "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -505,7 +505,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname5", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "fetch $0",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -520,7 +520,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -535,7 +535,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -551,7 +551,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
@@ -568,7 +568,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 174 "cursor.pgc"
@@ -578,7 +578,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -594,7 +594,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
@@ -611,7 +611,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 186 "cursor.pgc"
@@ -619,7 +619,7 @@ if (sqlca.sqlcode < 0) exit (1);}
if (sqlca.sqlcode < 0) exit (1);}
#line 186 "cursor.pgc"
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname5", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 187 "cursor.pgc"
@@ -663,7 +663,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname4", "st_id2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test1", "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -675,7 +675,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -690,7 +690,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -705,7 +705,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -721,7 +721,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
@@ -738,7 +738,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 226 "cursor.pgc"
@@ -748,7 +748,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -764,7 +764,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
@@ -781,7 +781,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 238 "cursor.pgc"
diff --git a/src/interfaces/ecpg/test/expected/preproc-outofscope.c b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
index 348e843..23ce610 100644
--- a/src/interfaces/ecpg/test/expected/preproc-outofscope.c
+++ b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
@@ -201,7 +201,7 @@ get_var1(MYTYPE **myvar0, MYNULLTYPE **mynullvar0)
static void
open_cur1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur cursor for select * from a1", ECPGt_EOIT,
+ { ECPGopen("mycur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur cursor for select * from a1", ECPGt_EOIT,
ECPGt_int,&((*( MYTYPE *)(ECPGget_var( 0)) ).id),(long)1,(long)1,sizeof( struct mytype ),
ECPGt_int,&((*( MYNULLTYPE *)(ECPGget_var( 1)) ).id),(long)1,(long)1,sizeof( struct mynulltype ),
ECPGt_char,&((*( MYTYPE *)(ECPGget_var( 0)) ).t),(long)64,(long)1,sizeof( struct mytype ),
@@ -225,7 +225,7 @@ if (sqlca.sqlcode < 0) exit (1);}
static void
get_record1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch mycur", ECPGt_EOIT,
+ { ECPGfetch("mycur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch mycur", ECPGt_EOIT,
ECPGt_int,&((*( MYTYPE *)(ECPGget_var( 0)) ).id),(long)1,(long)1,sizeof( struct mytype ),
ECPGt_int,&((*( MYNULLTYPE *)(ECPGget_var( 1)) ).id),(long)1,(long)1,sizeof( struct mynulltype ),
ECPGt_char,&((*( MYTYPE *)(ECPGget_var( 0)) ).t),(long)64,(long)1,sizeof( struct mytype ),
@@ -249,7 +249,7 @@ if (sqlca.sqlcode < 0) exit (1);}
static void
close_cur1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur", ECPGt_EOIT, ECPGt_EORT);
#line 58 "outofscope.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/preproc-variable.c b/src/interfaces/ecpg/test/expected/preproc-variable.c
index 7fd03ba..722c02e 100644
--- a/src/interfaces/ecpg/test/expected/preproc-variable.c
+++ b/src/interfaces/ecpg/test/expected/preproc-variable.c
@@ -190,7 +190,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select name , born , age , married , children from family", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select name , born , age , married , children from family", ECPGt_EOIT, ECPGt_EORT);
#line 63 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -206,7 +206,7 @@ if (sqlca.sqlcode < 0) exit (1);}
memset(i, 0, sizeof(ind_personal));
while (1) {
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT,
ECPGt_varchar,&(p->name),(long)BUFFERSIZ,(long)-1,sizeof( struct birthinfo ),
ECPGt_int,&(i->ind_name),(long)1,(long)-1,sizeof( struct birthinfo ),
ECPGt_long,&(p->birth.born),(long)1,(long)1,sizeof( struct birthinfo ),
@@ -241,7 +241,7 @@ if (sqlca.sqlcode < 0) exit (1);}
}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 89 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/sql-binary.c b/src/interfaces/ecpg/test/expected/sql-binary.c
index b91ab7b..ce64de5 100644
--- a/src/interfaces/ecpg/test/expected/sql-binary.c
+++ b/src/interfaces/ecpg/test/expected/sql-binary.c
@@ -111,12 +111,12 @@ main (void)
/* declare C cursor for select name , accs , byte from empl where idnum = $1 */
#line 58 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select name , accs , byte from empl where idnum = $1 ",
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select name , accs , byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 59 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
@@ -133,7 +133,7 @@ main (void)
printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);}
#line 69 "binary.pgc"
@@ -142,12 +142,12 @@ main (void)
/* declare B binary cursor for select name , accs , byte from empl where idnum = $1 */
#line 72 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare B binary cursor for select name , accs , byte from empl where idnum = $1 ",
+ { ECPGopen("B", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare B binary cursor for select name , accs , byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 73 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch B", ECPGt_EOIT,
+ { ECPGfetch("B", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch B", ECPGt_EOIT,
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
@@ -162,7 +162,7 @@ main (void)
exit (sqlca.sqlcode);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close B", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("B", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close B", ECPGt_EOIT, ECPGt_EORT);}
#line 81 "binary.pgc"
@@ -176,12 +176,12 @@ main (void)
/* declare A binary cursor for select byte from empl where idnum = $1 */
#line 89 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare A binary cursor for select byte from empl where idnum = $1 ",
+ { ECPGopen("A", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare A binary cursor for select byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 90 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch A", ECPGt_EOIT,
+ { ECPGfetch("A", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch A", ECPGt_EOIT,
ECPGt_char,&(pointer),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
#line 91 "binary.pgc"
@@ -192,7 +192,7 @@ main (void)
exit (sqlca.sqlcode);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close A", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("A", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close A", ECPGt_EOIT, ECPGt_EORT);}
#line 98 "binary.pgc"
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.c b/src/interfaces/ecpg/test/expected/sql-declare.c
new file mode 100644
index 0000000..2a7ea0d
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.c
@@ -0,0 +1,2592 @@
+/* Processed by ecpg (regression mode) */
+/* These include files are added by the preprocessor */
+#include <ecpglib.h>
+#include <ecpgerrno.h>
+#include <sqlca.h>
+/* End of automatic include section */
+#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
+
+#line 1 "declare.pgc"
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* exec sql whenever sqlerror sqlprint ; */
+#line 5 "declare.pgc"
+
+
+
+#line 1 "sqlca.h"
+#ifndef POSTGRES_SQLCA_H
+#define POSTGRES_SQLCA_H
+
+#ifndef PGDLLIMPORT
+#if defined(WIN32) || defined(__CYGWIN__)
+#define PGDLLIMPORT __declspec (dllimport)
+#else
+#define PGDLLIMPORT
+#endif /* __CYGWIN__ */
+#endif /* PGDLLIMPORT */
+
+#define SQLERRMC_LEN 150
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+struct sqlca_t
+{
+ char sqlcaid[8];
+ long sqlabc;
+ long sqlcode;
+ struct
+ {
+ int sqlerrml;
+ char sqlerrmc[SQLERRMC_LEN];
+ } sqlerrm;
+ char sqlerrp[8];
+ long sqlerrd[6];
+ /* Element 0: empty */
+ /* 1: OID of processed tuple if applicable */
+ /* 2: number of rows processed */
+ /* after an INSERT, UPDATE or */
+ /* DELETE statement */
+ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ char sqlwarn[8];
+ /* Element 0: set to 'W' if at least one other is 'W' */
+ /* 1: if 'W' at least one character string */
+ /* value was truncated when it was */
+ /* stored into a host variable. */
+
+ /*
+ * 2: if 'W' a (hopefully) non-fatal notice occurred
+ */ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ /* 6: empty */
+ /* 7: empty */
+
+ char sqlstate[5];
+};
+
+struct sqlca_t *ECPGget_sqlca(void);
+
+#ifndef POSTGRES_ECPG_INTERNAL
+#define sqlca (*ECPGget_sqlca())
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#line 7 "declare.pgc"
+
+
+#line 1 "regression.h"
+
+
+
+
+
+
+#line 8 "declare.pgc"
+
+
+#define OUT_ARRAY_SZIE 20
+#define TEST_CASE_NUM 29
+#define COLUMN_NUM 3
+#define FIELD_NAME_LEN 30
+
+void declare_test(char * tc_name);
+int createTable(void);
+void dropTable(void);
+void reCreateTable(void);
+void truncateTable(void);
+void commitTable(void);
+void reset(void);
+int initValues(void);
+void releaseValues(void);
+void printResultF123(char *tc_name, int loop);
+void printResultIndF123(char *tc_name, int loop);
+int startManualTest(char *in);
+int startAutoTest(void);
+void printFieldName(char *);
+
+/* exec sql begin declare section */
+
+ //input variables
+
+
+
+
+ //output variables
+
+
+
+
+
+
+
+
+
+
+#line 33 "declare.pgc"
+ int in_f1 = 1 ;
+
+#line 34 "declare.pgc"
+ double in_f2 = 10 ;
+
+#line 35 "declare.pgc"
+ char in_f3 [ 20 ] = { "one" } ;
+
+#line 38 "declare.pgc"
+ int f1 [ OUT_ARRAY_SZIE ] ;
+
+#line 39 "declare.pgc"
+ int f2 [ OUT_ARRAY_SZIE ] ;
+
+#line 40 "declare.pgc"
+ char f3 [ OUT_ARRAY_SZIE ] [ 20 ] ;
+
+#line 42 "declare.pgc"
+ char field_name [ COLUMN_NUM ] [ FIELD_NAME_LEN ] ;
+
+#line 45 "declare.pgc"
+ int ind_f1 [ OUT_ARRAY_SZIE ] , ind_f2 [ OUT_ARRAY_SZIE ] , ind_f3 [ OUT_ARRAY_SZIE ] ;
+/* exec sql end declare section */
+#line 47 "declare.pgc"
+
+
+int
+main (int argc, char *argv[])
+{
+ setlocale(LC_ALL, "C");
+
+ ECPGdebug(1, stderr);
+
+ /* connect to database */
+ { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , "con1", 0);
+#line 57 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 57 "declare.pgc"
+
+ { ECPGconnect(__LINE__, 0, "ecpg2_regression" , NULL, NULL , "con2", 0);
+#line 58 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 58 "declare.pgc"
+
+ { ECPGconnect(__LINE__, 0, "ecpg3_regression" , NULL, NULL , "con3", 0);
+#line 59 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 59 "declare.pgc"
+
+
+ if(initValues())
+ {
+ printf("Error: initValues return error!\n");
+
+ releaseValues();
+ return -1;
+ }
+
+ if(argc == 2) //start manual test
+ {
+ printf("Start manual test! \n");
+ startManualTest(argv[1]);
+ }
+ else //start auto test
+ {
+ startAutoTest();
+ }
+
+ { ECPGdisconnect(__LINE__, "con1");
+#line 79 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 79 "declare.pgc"
+
+
+ { ECPGdisconnect(__LINE__, "ALL");
+#line 81 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 81 "declare.pgc"
+
+
+ releaseValues();
+
+ return (0);
+}
+
+int startManualTest(char *in)
+{
+ if(!strcmp(in,"cr"))
+ {
+ createTable();
+ }
+ else if(!strcmp(in,"dr"))
+ {
+ dropTable();
+ }
+ else if(!strcmp(in,"re"))
+ {
+ reCreateTable();
+ }
+ else if(!strcmp(in,"help"))
+ {
+ printf("====Supporting the following parameters====\n");
+ printf("1. cr -- create tables\n");
+ printf("2. dr -- drop tables\n");
+ printf("3. re -- drop tables and create tables\n");
+ printf("4. testcaseX where X is a digit form 1 to %d\n",TEST_CASE_NUM);
+ printf("If you don't give any parameter, the program will start the test from the testcase1 to testcase%d automatically\n",TEST_CASE_NUM);
+ }
+ else
+ {
+ declare_test(in);
+ }
+
+ commitTable();
+
+ return 0;
+}
+
+int startAutoTest()
+{
+ int i;
+ char tc_name[20];
+
+ dropTable();
+
+ if(createTable())
+ {
+ printf("Error: createTable return error!\n");
+ return -1;
+ }
+
+ for(i=1;i<=TEST_CASE_NUM;i++)
+ {
+ sprintf(tc_name,"testcase%d",i);
+ declare_test(tc_name);
+ }
+
+ dropTable();
+
+ return 0;
+}
+
+
+/*
+ * default connection: con3
+ * Non-default connection: con1, con2
+ *
+ * testcase1. using DECLARE STATEMENT, let CURSOR statement precede PREPARE statement
+ * ---test result: ok
+ * testcase2. without using DECLARE STATEMENT, let CURSOR statement precede PREPARE statement
+ * ---test result: ok
+ *
+ * testcase3. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase4. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase5. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase6. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase7. using DECLARE STATEMENT at con1, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase8. using DECLARE STATEMENT at con1, using DESCRIBE statement at con2
+ * ---test result: ok
+ *
+ * testcase9. using DECLARE STATEMENT at con3, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase10. using DECLARE STATEMENT at con3, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase11. using DECLARE STATEMENT at con3, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase12. using DECLARE STATEMENT at con3, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase13. using DECLARE STATEMENT at con3, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase14. using DECLARE STATEMENT at con3, using DESCRIBE statement at con2
+ * ---test result: ok
+ *
+ * testcase15. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase16. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase17. using DECLARE STATEMENT without using AT clause, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase18. using DECLARE STATEMENT without using AT clause, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase19. using DECLARE STATEMENT without using AT clause, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase20. using DECLARE STATEMENT without using AT clause, using DESCRIBE statement at con2
+ * ---test result: ok
+
+ * testcase21. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ * testcase22. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ * testcase23. using DECLARE STATEMENT at con1, using DESCRIBE statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ *
+ * testcase24. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * using host variable as declared name
+ * ---test result:
+ *
+ * testcase25. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ * testcase26. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ * testcase27. using DECLARE STATEMENT at con1, using PREPARE and DESCRIBE statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ *
+ * testcase28. Using host variable as cursor name in the DECLARE/OPEN CURSOR statement,
+ * using the content in the host variable as the cursor name in the CLOSE CURSOR statement
+ * This is nothing with DECLARE STATEMENT feature, this case just verify a bug that cursor name can be closed by using
+ * content of host variable while the cursor name is declared/opened by using the host variable.
+ * ---test result: ok
+ *
+ * testcase29. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement without using AT clause
+ * one cursor is set to "open" and "close" twice.
+ * Check the declared name can be referred by the cursor at the second time correctly
+ * ---test result: ok
+ */
+void declare_test(char * tc_name)
+{
+ /* exec sql begin declare section */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 229 "declare.pgc"
+ int i ;
+
+#line 231 "declare.pgc"
+ char * selectString = "SELECT f1,f2,f3 FROM source where f1<4" ;
+
+#line 232 "declare.pgc"
+ char * selectTb1 = "SELECT * FROM tb1" ;
+
+#line 234 "declare.pgc"
+ char * stmt_4 = "str_stmt_4" ;
+
+#line 235 "declare.pgc"
+ char * stmt_6 = "str_stmt_6" ;
+
+#line 236 "declare.pgc"
+ char * stmt_8 = "str_stmt_8" ;
+
+#line 238 "declare.pgc"
+ char * cur_6 = "str_cur_6" ;
+
+#line 240 "declare.pgc"
+ char * desc_8 = "str_desc_8" ;
+/* exec sql end declare section */
+#line 242 "declare.pgc"
+
+
+ if(!strcmp(tc_name,"testcase1"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_1");
+#line 248 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 248 "declare.pgc"
+
+ /* declare cur_1 cursor for $1 */
+#line 249 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_1", selectString);
+#line 250 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 250 "declare.pgc"
+
+ { ECPGopen("cur_1", "stmt_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_1 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 251 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 251 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 253 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_1", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 257 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 257 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 257 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_1", ECPGt_EOIT, ECPGt_EORT);
+#line 261 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 261 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_1");
+#line 262 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 262 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase2"))
+ {
+ reset();
+
+ /* declare cur_2 cursor for $1 */
+#line 270 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_2", selectString);
+#line 271 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 271 "declare.pgc"
+
+ { ECPGopen("cur_2", "stmt_2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_2 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 272 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 272 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 274 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_2", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 278 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 278 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 278 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_2", ECPGt_EOIT, ECPGt_EORT);
+#line 282 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 282 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_2");
+#line 283 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 283 "declare.pgc"
+
+
+ /* exec sql whenever not found continue ; */
+#line 285 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase3"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_3");
+#line 293 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 293 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_3", selectString);
+#line 294 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 294 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "stmt_3", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 295 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 295 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_3");
+#line 297 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 297 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase4"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_4");
+#line 305 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 305 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_4", selectString);
+#line 306 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 306 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, "stmt_4", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 307 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 307 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_4");
+#line 309 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 309 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", stmt_4);
+#line 315 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 315 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, stmt_4, selectString);
+#line 316 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 316 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, stmt_4, ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 317 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 317 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, stmt_4);
+#line 319 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 319 "declare.pgc"
+
+
+ printResultF123(NULL,3);
+ }
+ else if(!strcmp(tc_name,"testcase5"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_5");
+#line 327 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 327 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_5", selectString);
+#line 328 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 328 "declare.pgc"
+
+ /* declare cur_5 cursor for $1 */
+#line 329 "declare.pgc"
+
+ { ECPGopen("cur_5", "stmt_5", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_5 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_5", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 330 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 330 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 332 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_5", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_5", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 336 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 336 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 336 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_5", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_5", ECPGt_EOIT, ECPGt_EORT);
+#line 340 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 340 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_5");
+#line 341 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 341 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase6"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_6");
+#line 349 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 349 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_6", selectString);
+#line 350 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 350 "declare.pgc"
+
+ /* declare cur_6 cursor for $1 */
+#line 351 "declare.pgc"
+
+ { ECPGopen("cur_6", "stmt_6", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare cur_6 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_6", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 352 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 352 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 354 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_6", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch cur_6", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 358 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 358 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 358 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_6", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close cur_6", ECPGt_EOIT, ECPGt_EORT);
+#line 362 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 362 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_6");
+#line 363 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 363 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 364 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", stmt_6);
+#line 370 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 370 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, stmt_6, selectString);
+#line 371 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 371 "declare.pgc"
+
+ ECPGset_var( 0, &( cur_6 ), __LINE__);\
+ /* declare $0 cursor for $1 */
+#line 372 "declare.pgc"
+
+ { ECPGopen(":cur_6", stmt_6, __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare $0 cursor for $1",
+ ECPGt_char,&(cur_6),(long)0,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char_variable,(ECPGprepared_statement("con2", stmt_6, __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 373 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 373 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 375 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch(":cur_6", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch $0",
+ ECPGt_char,&(cur_6),(long)0,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 379 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 379 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 379 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose(":cur_6", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close $0",
+ ECPGt_char,&(cur_6),(long)0,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 383 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 383 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", stmt_6);
+#line 384 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 384 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 385 "declare.pgc"
+
+
+ printResultF123(NULL,3);
+ }
+ else if(!strcmp(tc_name,"testcase7"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_7");
+#line 393 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 393 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_7");
+#line 395 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 395 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_7", selectTb1);
+#line 396 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 396 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, NULL, "stmt_7",
+ ECPGt_descriptor, "desc_7", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 397 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_7", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 401 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 401 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_7");
+#line 404 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 404 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_7");
+#line 405 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 405 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase8"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_8");
+#line 413 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 413 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_8");
+#line 415 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 415 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_8", selectTb1);
+#line 416 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 416 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", "stmt_8",
+ ECPGt_descriptor, "desc_8", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 417 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_8", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 421 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 421 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_8");
+#line 424 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 424 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_8");
+#line 425 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 425 "declare.pgc"
+
+
+ printFieldName(tc_name);
+
+
+ reset();
+
+ ECPGallocate_desc(__LINE__, (desc_8));
+#line 432 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 432 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con1", stmt_8);
+#line 434 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 434 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, stmt_8, selectTb1);
+#line 435 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 435 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", stmt_8,
+ ECPGt_descriptor, (desc_8), 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 436 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, (desc_8), i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 440 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 440 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, (desc_8));
+#line 443 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 443 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", stmt_8);
+#line 444 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 444 "declare.pgc"
+
+
+ printFieldName(NULL);
+ }
+ else if(!strcmp(tc_name,"testcase9"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_9");
+#line 452 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 452 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_9", selectString);
+#line 453 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 453 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "stmt_9", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 454 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 454 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_9");
+#line 456 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 456 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase10"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_10");
+#line 464 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 464 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_10", selectString);
+#line 465 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 465 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, "stmt_10", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 466 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 466 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_10");
+#line 468 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 468 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase11"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_11");
+#line 476 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 476 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_11", selectString);
+#line 477 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 477 "declare.pgc"
+
+ /* declare cur_11 cursor for $1 */
+#line 478 "declare.pgc"
+
+ { ECPGopen("cur_11", "stmt_11", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_11 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_11", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 479 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 479 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 481 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_11", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_11", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 485 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 485 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 485 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_11", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_11", ECPGt_EOIT, ECPGt_EORT);
+#line 489 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 489 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_11");
+#line 490 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 490 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase12"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_12");
+#line 498 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 498 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_12", selectString);
+#line 499 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 499 "declare.pgc"
+
+ /* declare cur_12 cursor for $1 */
+#line 500 "declare.pgc"
+
+ { ECPGopen("cur_12", "stmt_12", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare cur_12 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_12", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 501 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 501 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 503 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_12", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch cur_12", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 507 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 507 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 507 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_12", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close cur_12", ECPGt_EOIT, ECPGt_EORT);
+#line 511 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 511 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_12");
+#line 512 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 512 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 513 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase13"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_13");
+#line 521 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 521 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_13");
+#line 523 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 523 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_13", selectTb1);
+#line 524 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 524 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, NULL, "stmt_13",
+ ECPGt_descriptor, "desc_13", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 525 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_13", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 529 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 529 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_13");
+#line 532 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 532 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_13");
+#line 533 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 533 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase14"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_14");
+#line 541 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 541 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_14");
+#line 543 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 543 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_14", selectTb1);
+#line 544 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 544 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", "stmt_14",
+ ECPGt_descriptor, "desc_14", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 545 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_14", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 549 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 549 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_14");
+#line 552 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 552 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_14");
+#line 553 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 553 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase15"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_15");
+#line 561 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 561 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_15", selectString);
+#line 562 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 562 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "stmt_15", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 563 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 563 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_15");
+#line 565 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 565 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase16"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_16");
+#line 573 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 573 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_16", selectString);
+#line 574 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 574 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, "stmt_16", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 575 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 575 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_16");
+#line 577 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 577 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase17"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_17");
+#line 585 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 585 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_17", selectString);
+#line 586 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 586 "declare.pgc"
+
+ /* declare cur_17 cursor for $1 */
+#line 587 "declare.pgc"
+
+ { ECPGopen("cur_17", "stmt_17", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_17 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_17", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 588 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 588 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 590 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_17", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_17", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 594 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 594 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 594 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_17", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_17", ECPGt_EOIT, ECPGt_EORT);
+#line 598 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 598 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_17");
+#line 599 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 599 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase18"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_18");
+#line 607 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 607 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_18", selectString);
+#line 608 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 608 "declare.pgc"
+
+ /* declare cur_18 cursor for $1 */
+#line 609 "declare.pgc"
+
+ { ECPGopen("cur_18", "stmt_18", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare cur_18 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_18", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 610 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 610 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 612 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_18", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch cur_18", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 616 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 616 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 616 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_18", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close cur_18", ECPGt_EOIT, ECPGt_EORT);
+#line 620 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 620 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_18");
+#line 621 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 621 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 622 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase19"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_19");
+#line 630 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 630 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_19");
+#line 632 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 632 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_19", selectTb1);
+#line 633 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 633 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, NULL, "stmt_19",
+ ECPGt_descriptor, "desc_19", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 634 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_19", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 638 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 638 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_19");
+#line 641 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 641 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_19");
+#line 642 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 642 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase20"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_20");
+#line 650 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 650 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_20");
+#line 652 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 652 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_20", selectTb1);
+#line 653 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 653 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", "stmt_20",
+ ECPGt_descriptor, "desc_20", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 654 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_20", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 658 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 658 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_20");
+#line 661 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 661 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_20");
+#line 662 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 662 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase21"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_21");
+#line 670 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 670 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_21", selectString);
+#line 671 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 671 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, "stmt_21", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 672 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 672 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_21");
+#line 674 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 674 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase22"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_22");
+#line 682 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 682 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_22", selectString);
+#line 683 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 683 "declare.pgc"
+
+ /* declare \"cur_22\" cursor for $1 */
+#line 684 "declare.pgc"
+
+ { ECPGopen("\"cur_22\"", "stmt_22", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare \"cur_22\" cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_22", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 685 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 685 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 687 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("\"cur_22\"", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch \"cur_22\"", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 691 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 691 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 691 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("\"cur_22\"", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close \"cur_22\"", ECPGt_EOIT, ECPGt_EORT);
+#line 695 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 695 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_22");
+#line 696 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 696 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 697 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase23"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_23");
+#line 705 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 705 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_23");
+#line 707 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 707 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_23", selectTb1);
+#line 708 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 708 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", "stmt_23",
+ ECPGt_descriptor, "desc_23", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 709 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_23", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 713 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 713 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_23");
+#line 716 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 716 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_23");
+#line 717 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 717 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase24"))
+ {
+ /* exec sql begin declare section */
+
+
+#line 724 "declare.pgc"
+ char * char_stmt_24 = "strSTMT24" ;
+/* exec sql end declare section */
+#line 725 "declare.pgc"
+
+
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", char_stmt_24);
+#line 729 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 729 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, char_stmt_24, selectString);
+#line 730 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 730 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, char_stmt_24, ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 731 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 731 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, char_stmt_24);
+#line 733 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 733 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase25"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_25");
+#line 741 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 741 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "pre_stmt_25", selectString);
+#line 742 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 742 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, "pre_stmt_25", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 743 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 743 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "pre_stmt_25");
+#line 745 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 745 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase26"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_26");
+#line 753 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 753 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "pre_stmt_26", selectString);
+#line 754 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 754 "declare.pgc"
+
+ /* declare cur_26 cursor for $1 */
+#line 755 "declare.pgc"
+
+ { ECPGopen("cur_26", "pre_stmt_26", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare cur_26 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "pre_stmt_26", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 756 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 756 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 758 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_26", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch cur_26", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 762 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 762 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 762 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_26", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close cur_26", ECPGt_EOIT, ECPGt_EORT);
+#line 766 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 766 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "pre_stmt_26");
+#line 767 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 767 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 768 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase27"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_27");
+#line 776 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 776 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_27");
+#line 778 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 778 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "pre_stmt_27", selectTb1);
+#line 779 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 779 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", "pre_stmt_27",
+ ECPGt_descriptor, "desc_27", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 780 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_27", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 784 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 784 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_27");
+#line 787 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 787 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "pre_stmt_27");
+#line 788 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 788 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase28"))
+ {
+ /* exec sql begin declare section */
+
+
+#line 795 "declare.pgc"
+ char * cur_28 = "str_cur_28" ;
+/* exec sql end declare section */
+#line 796 "declare.pgc"
+
+
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_28");
+#line 800 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 800 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_28", selectString);
+#line 801 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 801 "declare.pgc"
+
+ ECPGset_var( 1, &( cur_28 ), __LINE__);\
+ /* declare $0 cursor for $1 */
+#line 802 "declare.pgc"
+
+ { ECPGopen(":cur_28", "stmt_28", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare $0 cursor for $1",
+ ECPGt_char,&(cur_28),(long)0,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_28", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 803 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 803 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 805 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch(":cur_28", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch $0",
+ ECPGt_char,&(cur_28),(long)0,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 809 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 809 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 809 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("str_cur_28", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close str_cur_28", ECPGt_EOIT, ECPGt_EORT);
+#line 813 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 813 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_28");
+#line 814 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 814 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 815 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+
+ }
+ else if(!strcmp(tc_name,"testcase29"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_29");
+#line 824 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 824 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_29", selectString);
+#line 825 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 825 "declare.pgc"
+
+ /* declare cur_29 cursor for $1 */
+#line 826 "declare.pgc"
+
+
+ { ECPGopen("cur_29", "stmt_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_29 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_29", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 828 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 828 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 830 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_29", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 834 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 834 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 834 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_29", ECPGt_EOIT, ECPGt_EORT);
+#line 838 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 838 "declare.pgc"
+
+ printResultF123(tc_name,3);
+
+ reset();
+ /* Open and fetch cursor again */
+ { ECPGopen("cur_29", "stmt_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_29 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_29", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 843 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 843 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_29", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 847 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 847 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 847 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_29", ECPGt_EOIT, ECPGt_EORT);
+#line 851 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 851 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_29");
+#line 852 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 852 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 853 "declare.pgc"
+
+
+ printResultF123(NULL,3);
+ }
+ else
+ {
+ /* exec sql whenever not found continue ; */
+#line 859 "declare.pgc"
+
+ printf("Sorry, there isn't this testcase: %s!\n",tc_name);
+ }
+}
+
+
+/*
+ * success -- 0
+ * failed -- -1
+ */
+int createTable()
+{
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 871 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 871 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 872 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 872 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 873 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 873 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "create table tb1 ( con1_f1 integer , con1_f2 integer , con1_f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 875 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 875 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "create table tb1 ( con2_f1 integer , con2_f2 integer , con2_f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 876 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 876 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "create table tb1 ( con3_f1 integer , con3_f2 integer , con3_f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 877 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 877 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 879 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 879 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 880 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 880 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 881 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 881 "declare.pgc"
+
+
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 885 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 885 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 886 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 886 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 3 , 30 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 887 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 887 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 889 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 889 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 890 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 890 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 3 , 30 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 891 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 891 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con3' )", ECPGt_EOIT, ECPGt_EORT);
+#line 893 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 893 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con3' )", ECPGt_EOIT, ECPGt_EORT);
+#line 894 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 894 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "insert into source values ( 3 , 30 , 'db on con3' )", ECPGt_EOIT, ECPGt_EORT);
+#line 895 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 895 "declare.pgc"
+
+
+ commitTable();
+
+ return 0;
+}
+
+/*
+ * success -- 0
+ * failed -- -1
+ */
+void dropTable()
+{
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 908 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 908 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 909 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 909 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 910 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 910 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "drop table if exists target", ECPGt_EOIT, ECPGt_EORT);
+#line 912 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 912 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "drop table if exists target", ECPGt_EOIT, ECPGt_EORT);
+#line 913 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 913 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "drop table if exists target", ECPGt_EOIT, ECPGt_EORT);
+#line 914 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 914 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "drop table if exists tb1", ECPGt_EOIT, ECPGt_EORT);
+#line 916 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 916 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "drop table if exists tb1", ECPGt_EOIT, ECPGt_EORT);
+#line 917 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 917 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "drop table if exists tb1", ECPGt_EOIT, ECPGt_EORT);
+#line 918 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 918 "declare.pgc"
+
+
+ commitTable();
+}
+
+void reCreateTable()
+{
+ dropTable();
+ createTable();
+}
+
+void truncateTable()
+{
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "truncate table target", ECPGt_EOIT, ECPGt_EORT);
+#line 931 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 931 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "truncate table target", ECPGt_EOIT, ECPGt_EORT);
+#line 932 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 932 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "truncate table target", ECPGt_EOIT, ECPGt_EORT);
+#line 933 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 933 "declare.pgc"
+
+
+ commitTable();
+}
+
+void commitTable()
+{
+ { ECPGtrans(__LINE__, "con1", "commit");
+#line 940 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 940 "declare.pgc"
+
+ { ECPGtrans(__LINE__, "con2", "commit");
+#line 941 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 941 "declare.pgc"
+
+ { ECPGtrans(__LINE__, "con3", "commit");
+#line 942 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 942 "declare.pgc"
+
+}
+
+/*
+ * reset all the output variables
+ */
+void reset()
+{
+ int i;
+
+ truncateTable();
+
+ memset(f1,0,sizeof(f1));
+ memset(f2,0,sizeof(f2));
+ memset(f3,0,sizeof(f3));
+
+ for(i=0; i<COLUMN_NUM; i++)
+ {
+ memset(field_name[i],0, FIELD_NAME_LEN);
+ }
+}
+
+int initValues()
+{
+ return 0;
+}
+
+void releaseValues()
+{
+}
+
+void printResultF123(char *tc_name, int loop)
+{
+ int i;
+
+ if(loop>OUT_ARRAY_SZIE)
+ {
+ loop = OUT_ARRAY_SZIE;
+ }
+
+ if(tc_name)
+ {
+ printf("****%s test results:****\n",tc_name);
+ }
+
+ for (i = 0; i < loop; i++)
+ printf("f1=%d, f2=%d, f3=%s\n", f1[i], f2[i], f3[i]);
+
+ printf("\n");
+}
+
+void printResultIndF123(char *tc_name, int loop)
+{
+ int i;
+
+ if(loop>OUT_ARRAY_SZIE)
+ {
+ loop = OUT_ARRAY_SZIE;
+ }
+
+ if(tc_name)
+ {
+ printf("****%s indicator results:****\n",tc_name);
+ }
+
+ for (i = 0; i < loop; i++)
+ printf("ind_f1=%d, ind_f2=%d, ind_f3=%d\n", ind_f1[i], ind_f2[i], ind_f3[i]);
+
+ printf("\n");
+}
+
+void printFieldName(char *tc_name)
+{
+ int i;
+
+ if(tc_name)
+ {
+ printf("****%s test results:****\n",tc_name);
+ }
+
+ for (i = 0; i < COLUMN_NUM; i++)
+ {
+ printf("field[%d]'s name = %s\n", i, field_name[i]);
+ }
+
+ printf("\n");
+}
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stderr b/src/interfaces/ecpg/test/expected/sql-declare.stderr
new file mode 100644
index 0000000..beeb8ea
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.stderr
@@ -0,0 +1,2393 @@
+[NO_PID]: ECPGdebug: set to 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg1_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg2_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg3_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 908: query: drop table if exists source; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 908: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 908: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 909: query: drop table if exists source; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 909: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 909: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 910: query: drop table if exists source; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 910: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 910: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 912: query: drop table if exists target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 912: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 912: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 913: query: drop table if exists target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 913: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 913: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 914: query: drop table if exists target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 914: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 914: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 916: query: drop table if exists tb1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 916: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 916: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 917: query: drop table if exists tb1; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 917: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 917: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 918: query: drop table if exists tb1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 918: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 918: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 871: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 871: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 871: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 872: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 872: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 872: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 873: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 873: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 873: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 875: query: create table tb1 ( con1_f1 integer , con1_f2 integer , con1_f3 varchar ( 20 ) ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 875: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 875: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 876: query: create table tb1 ( con2_f1 integer , con2_f2 integer , con2_f3 varchar ( 20 ) ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 876: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 876: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 877: query: create table tb1 ( con3_f1 integer , con3_f2 integer , con3_f3 varchar ( 20 ) ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 877: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 877: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 879: query: create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 879: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 879: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 880: query: create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 880: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 880: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 881: query: create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 881: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 881: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 885: query: insert into source values ( 1 , 10 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 885: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 885: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 886: query: insert into source values ( 2 , 20 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 886: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 886: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 887: query: insert into source values ( 3 , 30 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 887: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 887: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 889: query: insert into source values ( 1 , 10 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 889: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 889: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 890: query: insert into source values ( 2 , 20 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 890: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 890: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 891: query: insert into source values ( 3 , 30 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 891: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 891: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 893: query: insert into source values ( 1 , 10 , 'db on con3' ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 893: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 893: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 894: query: insert into source values ( 2 , 20 , 'db on con3' ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 894: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 894: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 895: query: insert into source values ( 3 , 30 , 'db on con3' ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 895: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 895: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 250: name stmt_1; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 251: query: declare cur_1 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 251: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 251: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: query: fetch cur_1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 257: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: query: fetch cur_1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 257: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: query: fetch cur_1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 257: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: query: fetch cur_1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 257: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 257: no data found on line 257
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 261: query: close cur_1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 261: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 261: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 262: name stmt_1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 271: name stmt_2; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 272: query: declare cur_2 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 272: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 272: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: query: fetch cur_2; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 278: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: query: fetch cur_2; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 278: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: query: fetch cur_2; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 278: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: query: fetch cur_2; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 278: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 278: no data found on line 278
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 282: query: close cur_2; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 282: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 282: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 283: name stmt_2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 293: declared name stmt_3 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 294: name stmt_3; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 295: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 295: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 295: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 297: name stmt_3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 305: declared name stmt_4 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 306: name stmt_4; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 307: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 307: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 307: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 309: name stmt_4
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 315: declared name str_stmt_4 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 316: name str_stmt_4; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 317: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 317: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 317: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 319: name str_stmt_4
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 327: declared name stmt_5 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 328: name stmt_5; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 330: query: declare cur_5 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 330: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 330: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: query: fetch cur_5; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 336: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: query: fetch cur_5; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 336: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: query: fetch cur_5; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 336: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: query: fetch cur_5; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 336: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 336: no data found on line 336
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 340: query: close cur_5; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 340: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 340: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 341: name stmt_5
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 349: declared name stmt_6 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 350: name stmt_6; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 352: query: declare cur_6 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 352: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 352: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: query: fetch cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 358: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: query: fetch cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 358: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: query: fetch cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 358: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: query: fetch cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 358: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 358: no data found on line 358
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 362: query: close cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 362: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 362: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 363: name stmt_6
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 370: declared name str_stmt_6 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 371: name str_stmt_6; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 373: query: declare str_cur_6 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 373: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 373: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: query: fetch str_cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 379: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: query: fetch str_cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 379: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: query: fetch str_cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 379: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: query: fetch str_cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 379: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 379: no data found on line 379
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 383: query: close str_cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 383: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 383: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 384: name str_stmt_6
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 395: declared name stmt_7 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 396: name stmt_7; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 405: name stmt_7
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 415: declared name stmt_8 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 416: name stmt_8; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 425: name stmt_8
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 434: declared name str_stmt_8 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 435: name str_stmt_8; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 444: name str_stmt_8
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 452: declared name stmt_9 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 453: name stmt_9; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 454: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 454: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 454: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 456: name stmt_9
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 464: declared name stmt_10 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 465: name stmt_10; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 466: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 466: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 466: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 468: name stmt_10
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 476: declared name stmt_11 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 477: name stmt_11; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 479: query: declare cur_11 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 479: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 479: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: query: fetch cur_11; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 485: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: query: fetch cur_11; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 485: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: query: fetch cur_11; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 485: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: query: fetch cur_11; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 485: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 485: no data found on line 485
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 489: query: close cur_11; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 489: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 489: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 490: name stmt_11
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 498: declared name stmt_12 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 499: name stmt_12; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 501: query: declare cur_12 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 501: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 501: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: query: fetch cur_12; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 507: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: query: fetch cur_12; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 507: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: query: fetch cur_12; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 507: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: query: fetch cur_12; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 507: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 507: no data found on line 507
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 511: query: close cur_12; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 511: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 511: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 512: name stmt_12
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 523: declared name stmt_13 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 524: name stmt_13; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 533: name stmt_13
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 543: declared name stmt_14 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 544: name stmt_14; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 553: name stmt_14
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 562: name stmt_15; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 563: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 563: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 563: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 565: name stmt_15
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 574: name stmt_16; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 575: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 575: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 575: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 577: name stmt_16
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 586: name stmt_17; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 588: query: declare cur_17 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 588: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 588: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: query: fetch cur_17; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 594: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: query: fetch cur_17; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 594: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: query: fetch cur_17; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 594: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: query: fetch cur_17; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 594: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 594: no data found on line 594
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 598: query: close cur_17; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 598: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 598: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 599: name stmt_17
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 608: name stmt_18; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 610: query: declare cur_18 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 610: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 610: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: query: fetch cur_18; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 616: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: query: fetch cur_18; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 616: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: query: fetch cur_18; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 616: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: query: fetch cur_18; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 616: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 616: no data found on line 616
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 620: query: close cur_18; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 620: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 620: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 621: name stmt_18
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 633: name stmt_19; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 642: name stmt_19
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 653: name stmt_20; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 662: name stmt_20
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 670: declared name stmt_21 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 671: name stmt_21; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 672: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 672: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 672: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 674: name stmt_21
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 682: declared name stmt_22 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 683: name stmt_22; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 685: query: declare "cur_22" cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 685: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 685: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: query: fetch "cur_22"; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 691: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: query: fetch "cur_22"; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 691: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: query: fetch "cur_22"; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 691: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: query: fetch "cur_22"; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 691: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 691: no data found on line 691
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 695: query: close "cur_22"; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 695: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 695: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 696: name stmt_22
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 707: declared name stmt_23 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 708: name stmt_23; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 717: name stmt_23
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 729: declared name strSTMT24 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 730: name strSTMT24; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 731: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 731: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 731: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 733: name strSTMT24
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 741: declared name stmt_25 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 742: name pre_stmt_25; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 743: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 743: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 743: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 745: name pre_stmt_25
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 753: declared name stmt_26 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 754: name pre_stmt_26; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 756: query: declare cur_26 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 756: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 756: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: query: fetch cur_26; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 762: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: query: fetch cur_26; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 762: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: query: fetch cur_26; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 762: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: query: fetch cur_26; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 762: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 762: no data found on line 762
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 766: query: close cur_26; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 766: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 766: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 767: name pre_stmt_26
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 778: declared name stmt_27 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 779: name pre_stmt_27; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 788: name pre_stmt_27
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 800: declared name stmt_28 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 801: name stmt_28; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 803: query: declare str_cur_28 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 803: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 803: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: query: fetch str_cur_28; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 809: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: query: fetch str_cur_28; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 809: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: query: fetch str_cur_28; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 809: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: query: fetch str_cur_28; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 809: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 809: no data found on line 809
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: raising sqlcode -245 on line 813: The cursor is invalid on line 813
+[NO_PID]: sqlca: code: -245, state: YE000
+SQL error: The cursor is invalid on line 813
+[NO_PID]: deallocate_one on line 814: name stmt_28
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 824: declared name stmt_29 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 825: name stmt_29; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 828: query: declare cur_29 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 828: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 828: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 834: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 834: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 834: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 834: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 834: no data found on line 834
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 838: query: close cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 838: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 838: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 843: query: declare cur_29 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 843: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 843: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 847: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 847: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 847: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 847: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 847: no data found on line 847
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 851: query: close cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 851: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 851: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 852: name stmt_29
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 908: query: drop table if exists source; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 908: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 908: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 909: query: drop table if exists source; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 909: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 909: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 910: query: drop table if exists source; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 910: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 910: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 912: query: drop table if exists target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 912: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 912: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 913: query: drop table if exists target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 913: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 913: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 914: query: drop table if exists target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 914: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 914: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 916: query: drop table if exists tb1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 916: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 916: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 917: query: drop table if exists tb1; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 917: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 917: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 918: query: drop table if exists tb1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 918: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 918: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_29 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_28 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_27 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_26 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_25 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name strSTMT24 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_23 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_22 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_21 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name str_stmt_8 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_8 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_7 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name str_stmt_6 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_6 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_5 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name str_stmt_4 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_4 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_3 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con1 closed
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_14 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_13 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_12 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_11 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_10 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_9 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con3 closed
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con2 closed
+[NO_PID]: sqlca: code: 0, state: 00000
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stdout b/src/interfaces/ecpg/test/expected/sql-declare.stdout
new file mode 100644
index 0000000..2ffe1d7
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.stdout
@@ -0,0 +1,161 @@
+****testcase1 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase2 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase3 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase4 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase5 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase6 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase7 test results:****
+field[0]'s name = con1_f1
+field[1]'s name = con1_f2
+field[2]'s name = con1_f3
+
+****testcase8 test results:****
+field[0]'s name = con1_f1
+field[1]'s name = con1_f2
+field[2]'s name = con1_f3
+
+field[0]'s name = con1_f1
+field[1]'s name = con1_f2
+field[2]'s name = con1_f3
+
+****testcase9 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase10 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase11 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase12 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase13 test results:****
+field[0]'s name = con3_f1
+field[1]'s name = con3_f2
+field[2]'s name = con3_f3
+
+****testcase14 test results:****
+field[0]'s name = con3_f1
+field[1]'s name = con3_f2
+field[2]'s name = con3_f3
+
+****testcase15 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase16 test results:****
+f1=1, f2=10, f3=db on con2
+f1=2, f2=20, f3=db on con2
+f1=3, f2=30, f3=db on con2
+
+****testcase17 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase18 test results:****
+f1=1, f2=10, f3=db on con2
+f1=2, f2=20, f3=db on con2
+f1=3, f2=30, f3=db on con2
+
+****testcase19 test results:****
+field[0]'s name = con3_f1
+field[1]'s name = con3_f2
+field[2]'s name = con3_f3
+
+****testcase20 test results:****
+field[0]'s name = con2_f1
+field[1]'s name = con2_f2
+field[2]'s name = con2_f3
+
+****testcase21 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase22 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase23 test results:****
+field[0]'s name = con1_f1
+field[1]'s name = con1_f2
+field[2]'s name = con1_f3
+
+****testcase24 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase25 test results:****
+f1=1, f2=10, f3=db on con2
+f1=2, f2=20, f3=db on con2
+f1=3, f2=30, f3=db on con2
+
+****testcase26 test results:****
+f1=1, f2=10, f3=db on con2
+f1=2, f2=20, f3=db on con2
+f1=3, f2=30, f3=db on con2
+
+****testcase27 test results:****
+field[0]'s name = con2_f1
+field[1]'s name = con2_f2
+field[2]'s name = con2_f3
+
+****testcase28 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase29 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
diff --git a/src/interfaces/ecpg/test/expected/sql-desc.c b/src/interfaces/ecpg/test/expected/sql-desc.c
index bdd12a5..bcfe1bd 100644
--- a/src/interfaces/ecpg/test/expected/sql-desc.c
+++ b/src/interfaces/ecpg/test/expected/sql-desc.c
@@ -249,7 +249,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* declare c1 cursor for $1 */
#line 58 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c1 cursor for $1",
+ { ECPGopen("c1", "foo2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "foo2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_descriptor, "indesc", 1L, 1L, 1L,
@@ -260,7 +260,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 59 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c1", ECPGt_EOIT,
+ { ECPGfetch("c1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c1", ECPGt_EOIT,
ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int),
ECPGt_int,&(ind1),(long)1,(long)1,sizeof(int),
ECPGt_char,(val2output),(long)sizeof("AAA"),(long)1,(sizeof("AAA"))*sizeof(char),
@@ -273,7 +273,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("val1=%d (ind1: %d) val2=%s (ind2: %d)\n",
val1output, ind1, val2output, ind2);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("c1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c1", ECPGt_EOIT, ECPGt_EORT);
#line 65 "desc.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -299,7 +299,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* declare c2 cursor for $1 */
#line 70 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c2 cursor for $1",
+ { ECPGopen("c2", "foo3", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "foo3", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_descriptor, "indesc", 1L, 1L, 1L,
@@ -310,7 +310,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 71 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c2", ECPGt_EOIT,
+ { ECPGfetch("c2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c2", ECPGt_EOIT,
ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(val2output),(long)sizeof("AAA"),(long)1,(sizeof("AAA"))*sizeof(char),
@@ -322,7 +322,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("val1=%d val2=%s\n", val1output, val2i ? "null" : val2output);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("c2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c2", ECPGt_EOIT, ECPGt_EORT);
#line 76 "desc.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-dyntest.c b/src/interfaces/ecpg/test/expected/sql-dyntest.c
index 2cbc196..dff22aa 100644
--- a/src/interfaces/ecpg/test/expected/sql-dyntest.c
+++ b/src/interfaces/ecpg/test/expected/sql-dyntest.c
@@ -261,7 +261,7 @@ if (sqlca.sqlcode < 0) error ( );}
#line 58 "dyntest.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare MYCURS cursor for $1",
+ { ECPGopen("MYCURS", "myquery", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare MYCURS cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "myquery", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 60 "dyntest.pgc"
@@ -272,7 +272,7 @@ if (sqlca.sqlcode < 0) error ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in MYCURS", ECPGt_EOIT,
+ { ECPGfetch("MYCURS", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in MYCURS", ECPGt_EOIT,
ECPGt_descriptor, "MYDESC", 1L, 1L, 1L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 64 "dyntest.pgc"
@@ -468,7 +468,7 @@ if (sqlca.sqlcode < 0) error ( );}
}
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close MYCURS", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("MYCURS", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close MYCURS", ECPGt_EOIT, ECPGt_EORT);
#line 194 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
diff --git a/src/interfaces/ecpg/test/expected/sql-execute.c b/src/interfaces/ecpg/test/expected/sql-execute.c
index aee3c1b..c511349 100644
--- a/src/interfaces/ecpg/test/expected/sql-execute.c
+++ b/src/interfaces/ecpg/test/expected/sql-execute.c
@@ -140,7 +140,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 50 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR cursor for $1",
+ { ECPGopen("CUR", "f", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 52 "execute.pgc"
@@ -148,7 +148,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 52 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
+ { ECPGfetch("CUR", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -180,7 +180,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
#line 66 "execute.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -205,7 +205,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 72 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR2 cursor for $1",
+ { ECPGopen("CUR2", "f", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
@@ -215,7 +215,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 74 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in CUR2", ECPGt_EOIT,
+ { ECPGfetch("CUR2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in CUR2", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -247,7 +247,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR2", ECPGt_EOIT, ECPGt_EORT);
#line 88 "execute.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-fetch.c b/src/interfaces/ecpg/test/expected/sql-fetch.c
index b547b25..e6beaf5 100644
--- a/src/interfaces/ecpg/test/expected/sql-fetch.c
+++ b/src/interfaces/ecpg/test/expected/sql-fetch.c
@@ -99,7 +99,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 26 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from My_Table", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from My_Table", ECPGt_EOIT, ECPGt_EORT);
#line 28 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -113,7 +113,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 30 "fetch.pgc"
while (1) {
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(str),(long)25,(long)1,(25)*sizeof(char),
@@ -135,7 +135,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* exec sql whenever not found continue ; */
#line 36 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "move backward 2 in C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "move backward 2 in C", ECPGt_EOIT, ECPGt_EORT);
#line 37 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -145,7 +145,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 37 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch $0 in C",
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch $0 in C",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
@@ -162,7 +162,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("%d: %s\n", i, str);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
#line 42 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -176,7 +176,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 44 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare D cursor for select * from My_Table where Item1 = $1",
+ { ECPGopen("D", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare D cursor for select * from My_Table where Item1 = $1",
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 46 "fetch.pgc"
@@ -192,7 +192,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 48 "fetch.pgc"
while (1) {
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in D", ECPGt_EOIT,
+ { ECPGfetch("D", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in D", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(str),(long)25,(long)1,(25)*sizeof(char),
@@ -210,7 +210,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("%d: %s\n", i, str);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close D", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("D", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close D", ECPGt_EOIT, ECPGt_EORT);
#line 53 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
diff --git a/src/interfaces/ecpg/test/expected/sql-oldexec.c b/src/interfaces/ecpg/test/expected/sql-oldexec.c
index 5b74dda..2e398c2 100644
--- a/src/interfaces/ecpg/test/expected/sql-oldexec.c
+++ b/src/interfaces/ecpg/test/expected/sql-oldexec.c
@@ -141,7 +141,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 51 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR cursor for $1",
+ { ECPGopen("CUR", "f", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 53 "oldexec.pgc"
@@ -149,7 +149,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 53 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
+ { ECPGfetch("CUR", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -171,7 +171,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
#line 65 "oldexec.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -190,7 +190,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 70 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR3 cursor for $1",
+ { ECPGopen("CUR3", "f", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR3 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
@@ -200,7 +200,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 72 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch in CUR3", ECPGt_EOIT,
+ { ECPGfetch("CUR3", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch in CUR3", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -222,7 +222,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR3", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR3", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR3", ECPGt_EOIT, ECPGt_EORT);
#line 84 "oldexec.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-quote.c b/src/interfaces/ecpg/test/expected/sql-quote.c
index 0a3b77c..ec03612 100644
--- a/src/interfaces/ecpg/test/expected/sql-quote.c
+++ b/src/interfaces/ecpg/test/expected/sql-quote.c
@@ -162,7 +162,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 43 "quote.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
#line 45 "quote.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -178,7 +178,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
while (true)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(var),(long)25,(long)1,(25)*sizeof(char),
diff --git a/src/interfaces/ecpg/test/expected/sql-sqlda.c b/src/interfaces/ecpg/test/expected/sql-sqlda.c
index b470b04..6bfcbe2 100644
--- a/src/interfaces/ecpg/test/expected/sql-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/sql-sqlda.c
@@ -251,7 +251,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
+ { ECPGopen("mycur1", "st_id1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 103 "sqlda.pgc"
@@ -268,7 +268,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
+ { ECPGfetch("mycur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 111 "sqlda.pgc"
@@ -289,7 +289,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
#line 120 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -324,7 +324,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
+ { ECPGopen("mycur2", "st_id2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 138 "sqlda.pgc"
@@ -334,7 +334,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch all from mycur2", ECPGt_EOIT,
+ { ECPGfetch("mycur2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch all from mycur2", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 141 "sqlda.pgc"
@@ -357,7 +357,7 @@ if (sqlca.sqlcode < 0) exit (1);}
}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
#line 157 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/regression.h b/src/interfaces/ecpg/test/regression.h
index 4aa13b6..aa6421d 100644
--- a/src/interfaces/ecpg/test/regression.h
+++ b/src/interfaces/ecpg/test/regression.h
@@ -1,5 +1,5 @@
exec sql define REGRESSDB1 ecpg1_regression;
exec sql define REGRESSDB2 ecpg2_regression;
-
+exec sql define REGRESSDB3 ecpg3_regression;
exec sql define REGRESSUSER1 regress_ecpg_user1;
exec sql define REGRESSUSER2 regress_ecpg_user2;
diff --git a/src/interfaces/ecpg/test/sql/Makefile b/src/interfaces/ecpg/test/sql/Makefile
index 6bc67e9..d313464 100644
--- a/src/interfaces/ecpg/test/sql/Makefile
+++ b/src/interfaces/ecpg/test/sql/Makefile
@@ -22,7 +22,8 @@ TESTS = array array.c \
parser parser.c \
quote quote.c \
show show.c \
- insupd insupd.c
+ insupd insupd.c \
+ declare declare.c
all: $(TESTS)
diff --git a/src/interfaces/ecpg/test/sql/declare.pgc b/src/interfaces/ecpg/test/sql/declare.pgc
new file mode 100644
index 0000000..d3bfb55
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/declare.pgc
@@ -0,0 +1,1028 @@
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+exec sql whenever sqlerror sqlprint;
+
+exec sql include sqlca;
+exec sql include ../regression;
+
+#define OUT_ARRAY_SZIE 20
+#define TEST_CASE_NUM 29
+#define COLUMN_NUM 3
+#define FIELD_NAME_LEN 30
+
+void declare_test(char * tc_name);
+int createTable(void);
+void dropTable(void);
+void reCreateTable(void);
+void truncateTable(void);
+void commitTable(void);
+void reset(void);
+int initValues(void);
+void releaseValues(void);
+void printResultF123(char *tc_name, int loop);
+void printResultIndF123(char *tc_name, int loop);
+int startManualTest(char *in);
+int startAutoTest(void);
+void printFieldName(char *);
+
+EXEC SQL BEGIN DECLARE SECTION;
+
+ //input variables
+ int in_f1 = 1 ;
+ double in_f2 = 10;
+ char in_f3[20] = {"one"};
+
+ //output variables
+ int f1[OUT_ARRAY_SZIE];
+ int f2[OUT_ARRAY_SZIE];
+ char f3[OUT_ARRAY_SZIE][20];
+
+ char field_name[COLUMN_NUM][FIELD_NAME_LEN];
+
+
+ int ind_f1[OUT_ARRAY_SZIE],ind_f2[OUT_ARRAY_SZIE],ind_f3[OUT_ARRAY_SZIE];
+
+EXEC SQL END DECLARE SECTION;
+
+int
+main (int argc, char *argv[])
+{
+ setlocale(LC_ALL, "C");
+
+ ECPGdebug(1, stderr);
+
+ /* connect to database */
+ EXEC SQL CONNECT TO REGRESSDB1 AS con1;
+ EXEC SQL CONNECT TO REGRESSDB2 AS con2;
+ EXEC SQL CONNECT TO REGRESSDB3 as con3;
+
+ if(initValues())
+ {
+ printf("Error: initValues return error!\n");
+
+ releaseValues();
+ return -1;
+ }
+
+ if(argc == 2) //start manual test
+ {
+ printf("Start manual test! \n");
+ startManualTest(argv[1]);
+ }
+ else //start auto test
+ {
+ startAutoTest();
+ }
+
+ EXEC SQL DISCONNECT con1;
+
+ EXEC SQL DISCONNECT ALL;
+
+ releaseValues();
+
+ return (0);
+}
+
+int startManualTest(char *in)
+{
+ if(!strcmp(in,"cr"))
+ {
+ createTable();
+ }
+ else if(!strcmp(in,"dr"))
+ {
+ dropTable();
+ }
+ else if(!strcmp(in,"re"))
+ {
+ reCreateTable();
+ }
+ else if(!strcmp(in,"help"))
+ {
+ printf("====Supporting the following parameters====\n");
+ printf("1. cr -- create tables\n");
+ printf("2. dr -- drop tables\n");
+ printf("3. re -- drop tables and create tables\n");
+ printf("4. testcaseX where X is a digit form 1 to %d\n",TEST_CASE_NUM);
+ printf("If you don't give any parameter, the program will start the test from the testcase1 to testcase%d automatically\n",TEST_CASE_NUM);
+ }
+ else
+ {
+ declare_test(in);
+ }
+
+ commitTable();
+
+ return 0;
+}
+
+int startAutoTest()
+{
+ int i;
+ char tc_name[20];
+
+ dropTable();
+
+ if(createTable())
+ {
+ printf("Error: createTable return error!\n");
+ return -1;
+ }
+
+ for(i=1;i<=TEST_CASE_NUM;i++)
+ {
+ sprintf(tc_name,"testcase%d",i);
+ declare_test(tc_name);
+ }
+
+ dropTable();
+
+ return 0;
+}
+
+
+/*
+ * default connection: con3
+ * Non-default connection: con1, con2
+ *
+ * testcase1. using DECLARE STATEMENT, let CURSOR statement precede PREPARE statement
+ * ---test result: ok
+ * testcase2. without using DECLARE STATEMENT, let CURSOR statement precede PREPARE statement
+ * ---test result: ok
+ *
+ * testcase3. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase4. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase5. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase6. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase7. using DECLARE STATEMENT at con1, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase8. using DECLARE STATEMENT at con1, using DESCRIBE statement at con2
+ * ---test result: ok
+ *
+ * testcase9. using DECLARE STATEMENT at con3, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase10. using DECLARE STATEMENT at con3, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase11. using DECLARE STATEMENT at con3, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase12. using DECLARE STATEMENT at con3, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase13. using DECLARE STATEMENT at con3, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase14. using DECLARE STATEMENT at con3, using DESCRIBE statement at con2
+ * ---test result: ok
+ *
+ * testcase15. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase16. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase17. using DECLARE STATEMENT without using AT clause, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase18. using DECLARE STATEMENT without using AT clause, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase19. using DECLARE STATEMENT without using AT clause, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase20. using DECLARE STATEMENT without using AT clause, using DESCRIBE statement at con2
+ * ---test result: ok
+
+ * testcase21. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ * testcase22. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ * testcase23. using DECLARE STATEMENT at con1, using DESCRIBE statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ *
+ * testcase24. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * using host variable as declared name
+ * ---test result:
+ *
+ * testcase25. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ * testcase26. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ * testcase27. using DECLARE STATEMENT at con1, using PREPARE and DESCRIBE statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ *
+ * testcase28. Using host variable as cursor name in the DECLARE/OPEN CURSOR statement,
+ * using the content in the host variable as the cursor name in the CLOSE CURSOR statement
+ * This is nothing with DECLARE STATEMENT feature, this case just verify a bug that cursor name can be closed by using
+ * content of host variable while the cursor name is declared/opened by using the host variable.
+ * ---test result: ok
+ *
+ * testcase29. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement without using AT clause
+ * one cursor is set to "open" and "close" twice.
+ * Check the declared name can be referred by the cursor at the second time correctly
+ * ---test result: ok
+ */
+void declare_test(char * tc_name)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int i;
+
+ char *selectString = "SELECT f1,f2,f3 FROM source where f1<4";
+ char *selectTb1 = "SELECT * FROM tb1";
+
+ char *stmt_4 = "str_stmt_4";
+ char *stmt_6 = "str_stmt_6";
+ char *stmt_8 = "str_stmt_8";
+
+ char *cur_6 = "str_cur_6";
+
+ char *desc_8 = "str_desc_8";
+
+ EXEC SQL END DECLARE SECTION;
+
+ if(!strcmp(tc_name,"testcase1"))
+ {
+ reset();
+
+ EXEC SQL DECLARE stmt_1 STATEMENT;
+ EXEC SQL DECLARE cur_1 CURSOR FOR stmt_1;
+ EXEC SQL PREPARE stmt_1 FROM :selectString;
+ EXEC SQL OPEN cur_1;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_1 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_1;
+ EXEC SQL DEALLOCATE PREPARE stmt_1;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase2"))
+ {
+ reset();
+
+ EXEC SQL DECLARE cur_2 CURSOR FOR stmt_2;
+ EXEC SQL PREPARE stmt_2 FROM :selectString;
+ EXEC SQL OPEN cur_2;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_2 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_2;
+ EXEC SQL DEALLOCATE PREPARE stmt_2;
+
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase3"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_3 STATEMENT;
+ EXEC SQL PREPARE stmt_3 FROM :selectString;
+ EXEC SQL EXECUTE stmt_3 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE stmt_3;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase4"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_4 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_4 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE stmt_4 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE stmt_4;
+
+ printResultF123(tc_name,3);
+
+ reset();
+
+ EXEC SQL AT con1 DECLARE :stmt_4 STATEMENT;
+ EXEC SQL AT con2 PREPARE :stmt_4 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE :stmt_4 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE :stmt_4;
+
+ printResultF123(NULL,3);
+ }
+ else if(!strcmp(tc_name,"testcase5"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_5 STATEMENT;
+ EXEC SQL PREPARE stmt_5 FROM :selectString;
+ EXEC SQL DECLARE cur_5 CURSOR FOR stmt_5;
+ EXEC SQL OPEN cur_5;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_5 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_5;
+ EXEC SQL DEALLOCATE PREPARE stmt_5;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase6"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_6 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_6 FROM :selectString;
+ EXEC SQL AT con2 DECLARE cur_6 CURSOR FOR stmt_6;
+ EXEC SQL AT con2 OPEN cur_6;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH cur_6 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE cur_6;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_6;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+
+ reset();
+
+ EXEC SQL AT con1 DECLARE :stmt_6 STATEMENT;
+ EXEC SQL AT con2 PREPARE :stmt_6 FROM :selectString;
+ EXEC SQL AT con2 DECLARE :cur_6 CURSOR FOR :stmt_6;
+ EXEC SQL AT con2 OPEN :cur_6;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH :cur_6 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE :cur_6;
+ EXEC SQL AT con2 DEALLOCATE PREPARE :stmt_6;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(NULL,3);
+ }
+ else if(!strcmp(tc_name,"testcase7"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_7;
+
+ EXEC SQL AT con1 DECLARE stmt_7 STATEMENT;
+ EXEC SQL PREPARE stmt_7 FROM :selectTb1;
+ EXEC SQL DESCRIBE stmt_7 into SQL DESCRIPTOR desc_7;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_7 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_7;
+ EXEC SQL DEALLOCATE PREPARE stmt_7;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase8"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_8;
+
+ EXEC SQL AT con1 DECLARE stmt_8 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_8 FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE stmt_8 into SQL DESCRIPTOR desc_8;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_8 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_8;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_8;
+
+ printFieldName(tc_name);
+
+
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR :desc_8;
+
+ EXEC SQL AT con1 DECLARE :stmt_8 STATEMENT;
+ EXEC SQL AT con2 PREPARE :stmt_8 FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE :stmt_8 into SQL DESCRIPTOR :desc_8;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR :desc_8 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR :desc_8;
+ EXEC SQL AT con2 DEALLOCATE PREPARE :stmt_8;
+
+ printFieldName(NULL);
+ }
+ else if(!strcmp(tc_name,"testcase9"))
+ {
+ reset();
+
+ EXEC SQL AT con3 DECLARE stmt_9 STATEMENT;
+ EXEC SQL PREPARE stmt_9 FROM :selectString;
+ EXEC SQL EXECUTE stmt_9 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE stmt_9;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase10"))
+ {
+ reset();
+
+ EXEC SQL AT con3 DECLARE stmt_10 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_10 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE stmt_10 INTO :f1,:f2,:f3;
+
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_10;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase11"))
+ {
+ reset();
+
+ EXEC SQL AT con3 DECLARE stmt_11 STATEMENT;
+ EXEC SQL PREPARE stmt_11 FROM :selectString;
+ EXEC SQL DECLARE cur_11 CURSOR FOR stmt_11;
+ EXEC SQL OPEN cur_11;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_11 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_11;
+ EXEC SQL DEALLOCATE PREPARE stmt_11;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase12"))
+ {
+ reset();
+
+ EXEC SQL AT con3 DECLARE stmt_12 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_12 FROM :selectString;
+ EXEC SQL AT con2 DECLARE cur_12 CURSOR FOR stmt_12;
+ EXEC SQL AT con2 OPEN cur_12;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH cur_12 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE cur_12;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_12;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase13"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_13;
+
+ EXEC SQL AT con3 DECLARE stmt_13 STATEMENT;
+ EXEC SQL PREPARE stmt_13 FROM :selectTb1;
+ EXEC SQL DESCRIBE stmt_13 into SQL DESCRIPTOR desc_13;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_13 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_13;
+ EXEC SQL DEALLOCATE PREPARE stmt_13;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase14"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_14;
+
+ EXEC SQL AT con3 DECLARE stmt_14 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_14 FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE stmt_14 into SQL DESCRIPTOR desc_14;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_14 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_14;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_14;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase15"))
+ {
+ reset();
+
+ EXEC SQL DECLARE stmt_15 STATEMENT;
+ EXEC SQL PREPARE stmt_15 FROM :selectString;
+ EXEC SQL EXECUTE stmt_15 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE stmt_15;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase16"))
+ {
+ reset();
+
+ EXEC SQL DECLARE stmt_16 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_16 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE stmt_16 INTO :f1,:f2,:f3;
+
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_16;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase17"))
+ {
+ reset();
+
+ EXEC SQL DECLARE stmt_17 STATEMENT;
+ EXEC SQL PREPARE stmt_17 FROM :selectString;
+ EXEC SQL DECLARE cur_17 CURSOR FOR stmt_17;
+ EXEC SQL OPEN cur_17;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_17 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_17;
+ EXEC SQL DEALLOCATE PREPARE stmt_17;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase18"))
+ {
+ reset();
+
+ EXEC SQL DECLARE stmt_18 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_18 FROM :selectString;
+ EXEC SQL AT con2 DECLARE cur_18 CURSOR FOR stmt_18;
+ EXEC SQL AT con2 OPEN cur_18;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH cur_18 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE cur_18;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_18;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase19"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_19;
+
+ EXEC SQL DECLARE stmt_19 STATEMENT;
+ EXEC SQL PREPARE stmt_19 FROM :selectTb1;
+ EXEC SQL DESCRIBE stmt_19 into SQL DESCRIPTOR desc_19;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_19 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_19;
+ EXEC SQL DEALLOCATE PREPARE stmt_19;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase20"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_20;
+
+ EXEC SQL DECLARE stmt_20 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_20 FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE stmt_20 into SQL DESCRIPTOR desc_20;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_20 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_20;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_20;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase21"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE "stmt_21" STATEMENT;
+ EXEC SQL AT con2 PREPARE "stmt_21" FROM :selectString;
+ EXEC SQL AT con2 EXECUTE "stmt_21" INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE "stmt_21";
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase22"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE "stmt_22" STATEMENT;
+ EXEC SQL AT con2 PREPARE "stmt_22" FROM :selectString;
+ EXEC SQL AT con2 DECLARE "cur_22" CURSOR FOR "stmt_22";
+ EXEC SQL AT con2 OPEN "cur_22";
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH "cur_22" INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE "cur_22";
+ EXEC SQL AT con2 DEALLOCATE PREPARE "stmt_22";
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase23"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_23;
+
+ EXEC SQL AT con1 DECLARE "stmt_23" STATEMENT;
+ EXEC SQL AT con2 PREPARE "stmt_23" FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE "stmt_23" into SQL DESCRIPTOR desc_23;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_23 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_23;
+ EXEC SQL AT con2 DEALLOCATE PREPARE "stmt_23";
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase24"))
+ {
+ EXEC SQL BEGIN DECLARE SECTION;
+ char *char_stmt_24 = "strSTMT24";
+ EXEC SQL END DECLARE SECTION;
+
+ reset();
+
+ EXEC SQL AT con1 DECLARE :char_stmt_24 STATEMENT;
+ EXEC SQL AT con2 PREPARE :char_stmt_24 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE :char_stmt_24 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE :char_stmt_24;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase25"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_25 STATEMENT;
+ EXEC SQL AT con2 PREPARE pre_stmt_25 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE pre_stmt_25 INTO :f1,:f2,:f3;
+
+ EXEC SQL AT con2 DEALLOCATE PREPARE pre_stmt_25;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase26"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_26 STATEMENT;
+ EXEC SQL AT con2 PREPARE pre_stmt_26 FROM :selectString;
+ EXEC SQL AT con2 DECLARE cur_26 CURSOR FOR pre_stmt_26;
+ EXEC SQL AT con2 OPEN cur_26;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH cur_26 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE cur_26;
+ EXEC SQL AT con2 DEALLOCATE PREPARE pre_stmt_26;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase27"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_27;
+
+ EXEC SQL AT con1 DECLARE stmt_27 STATEMENT;
+ EXEC SQL AT con2 PREPARE pre_stmt_27 FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE pre_stmt_27 into SQL DESCRIPTOR desc_27;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_27 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_27;
+ EXEC SQL AT con2 DEALLOCATE PREPARE pre_stmt_27;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase28"))
+ {
+ EXEC SQL BEGIN DECLARE SECTION;
+ char *cur_28 = "str_cur_28";
+ EXEC SQL END DECLARE SECTION;
+
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_28 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_28 FROM :selectString;
+ EXEC SQL AT con2 DECLARE :cur_28 CURSOR FOR stmt_28;
+ EXEC SQL AT con2 OPEN :cur_28;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH :cur_28 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE str_cur_28;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_28;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+
+ }
+ else if(!strcmp(tc_name,"testcase29"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_29 STATEMENT;
+ EXEC SQL PREPARE stmt_29 FROM :selectString;
+ EXEC SQL DECLARE cur_29 CURSOR FOR stmt_29;
+
+ EXEC SQL OPEN cur_29;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_29 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_29;
+ printResultF123(tc_name,3);
+
+ reset();
+ /* Open and fetch cursor again */
+ EXEC SQL OPEN cur_29;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_29 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_29;
+ EXEC SQL DEALLOCATE PREPARE stmt_29;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(NULL,3);
+ }
+ else
+ {
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+ printf("Sorry, there isn't this testcase: %s!\n",tc_name);
+ }
+}
+
+
+/*
+ * success -- 0
+ * failed -- -1
+ */
+int createTable()
+{
+ EXEC SQL AT con1 CREATE TABLE source (f1 integer, f2 integer, f3 varchar(20));
+ EXEC SQL AT con2 CREATE TABLE source (f1 integer, f2 integer, f3 varchar(20));
+ EXEC SQL AT con3 CREATE TABLE source (f1 integer, f2 integer, f3 varchar(20));
+
+ EXEC SQL AT con1 CREATE TABLE tb1 (con1_f1 integer, con1_f2 integer, con1_f3 varchar(20));
+ EXEC SQL AT con2 CREATE TABLE tb1 (con2_f1 integer, con2_f2 integer, con2_f3 varchar(20));
+ EXEC SQL AT con3 CREATE TABLE tb1 (con3_f1 integer, con3_f2 integer, con3_f3 varchar(20));
+
+ EXEC SQL AT con1 CREATE TABLE target (f1 integer, f2 integer, f3 varchar(20));
+ EXEC SQL AT con2 CREATE TABLE target (f1 integer, f2 integer, f3 varchar(20));
+ EXEC SQL AT con3 CREATE TABLE target (f1 integer, f2 integer, f3 varchar(20));
+
+
+
+ EXEC SQL AT con1 INSERT INTO source VALUES(1,10,'db on con1');
+ EXEC SQL AT con1 INSERT INTO source VALUES(2,20,'db on con1');
+ EXEC SQL AT con1 INSERT INTO source VALUES(3,30,'db on con1');
+
+ EXEC SQL AT con2 INSERT INTO source VALUES(1,10,'db on con2');
+ EXEC SQL AT con2 INSERT INTO source VALUES(2,20,'db on con2');
+ EXEC SQL AT con2 INSERT INTO source VALUES(3,30,'db on con2');
+
+ EXEC SQL AT con3 INSERT INTO source VALUES(1,10,'db on con3');
+ EXEC SQL AT con3 INSERT INTO source VALUES(2,20,'db on con3');
+ EXEC SQL AT con3 INSERT INTO source VALUES(3,30,'db on con3');
+
+ commitTable();
+
+ return 0;
+}
+
+/*
+ * success -- 0
+ * failed -- -1
+ */
+void dropTable()
+{
+ EXEC SQL AT con1 DROP TABLE IF EXISTS source;
+ EXEC SQL AT con2 DROP TABLE IF EXISTS source;
+ EXEC SQL AT con3 DROP TABLE IF EXISTS source;
+
+ EXEC SQL AT con1 DROP TABLE IF EXISTS target;
+ EXEC SQL AT con2 DROP TABLE IF EXISTS target;
+ EXEC SQL AT con3 DROP TABLE IF EXISTS target;
+
+ EXEC SQL AT con1 DROP TABLE IF EXISTS tb1;
+ EXEC SQL AT con2 DROP TABLE IF EXISTS tb1;
+ EXEC SQL AT con3 DROP TABLE IF EXISTS tb1;
+
+ commitTable();
+}
+
+void reCreateTable()
+{
+ dropTable();
+ createTable();
+}
+
+void truncateTable()
+{
+ EXEC SQL AT con1 TRUNCATE TABLE target;
+ EXEC SQL AT con2 TRUNCATE TABLE target;
+ EXEC SQL AT con3 TRUNCATE TABLE target;
+
+ commitTable();
+}
+
+void commitTable()
+{
+ EXEC SQL AT con1 COMMIT;
+ EXEC SQL AT con2 COMMIT;
+ EXEC SQL AT con3 COMMIT;
+}
+
+/*
+ * reset all the output variables
+ */
+void reset()
+{
+ int i;
+
+ truncateTable();
+
+ memset(f1,0,sizeof(f1));
+ memset(f2,0,sizeof(f2));
+ memset(f3,0,sizeof(f3));
+
+ for(i=0; i<COLUMN_NUM; i++)
+ {
+ memset(field_name[i],0, FIELD_NAME_LEN);
+ }
+}
+
+int initValues()
+{
+ return 0;
+}
+
+void releaseValues()
+{
+}
+
+void printResultF123(char *tc_name, int loop)
+{
+ int i;
+
+ if(loop>OUT_ARRAY_SZIE)
+ {
+ loop = OUT_ARRAY_SZIE;
+ }
+
+ if(tc_name)
+ {
+ printf("****%s test results:****\n",tc_name);
+ }
+
+ for (i = 0; i < loop; i++)
+ printf("f1=%d, f2=%d, f3=%s\n", f1[i], f2[i], f3[i]);
+
+ printf("\n");
+}
+
+void printResultIndF123(char *tc_name, int loop)
+{
+ int i;
+
+ if(loop>OUT_ARRAY_SZIE)
+ {
+ loop = OUT_ARRAY_SZIE;
+ }
+
+ if(tc_name)
+ {
+ printf("****%s indicator results:****\n",tc_name);
+ }
+
+ for (i = 0; i < loop; i++)
+ printf("ind_f1=%d, ind_f2=%d, ind_f3=%d\n", ind_f1[i], ind_f2[i], ind_f3[i]);
+
+ printf("\n");
+}
+
+void printFieldName(char *tc_name)
+{
+ int i;
+
+ if(tc_name)
+ {
+ printf("****%s test results:****\n",tc_name);
+ }
+
+ for (i = 0; i < COLUMN_NUM; i++)
+ {
+ printf("field[%d]'s name = %s\n", i, field_name[i]);
+ }
+
+ printf("\n");
+}
On Fri, Jan 6, 2017 at 6:10 PM, Ideriha, Takeshi
<ideriha.takeshi@jp.fujitsu.com> wrote:
Hi
Thank you for looking over my patch.Thank you. Would it be possible for you to re-create the patch without the
white-space changes?I'm sorry for adding redundant white-spaces.
Attached is a correct version.I noticed that the docs say the statement is a PostgreSQL addon.
However, I think other databases do have the same statement, or don't they?Yes, other databases such as Oracle and DB2 also have the same statement.
I fixed docs and mentioned the above databases in the compatibility section.But I'm not sure whether I should mention the other databases explicitly
because the other command docs don't mention Oracle or so explicitly in compatibility section
as long as I read.
Idehira-san, this is a very intrusive patch... It really needs a
specific reviewer to begin with, but really it would be nice if you
could review someone else's patch, with a difficulty rather equivalent
to what we have here.
By the way, I have been able to crash your patch when running the
regression tests:
(lldb) bt
* thread #1: tid = 0x0000, 0x00007fff89a828b0
libsystem_platform.dylib`_platform_strcmp + 176, stop reason = signal
SIGSTOP
* frame #0: 0x00007fff89a828b0 libsystem_platform.dylib`_platform_strcmp + 176
frame #1: 0x000000010c835bc3
libecpg.6.dylib`ecpg_release_declared_statement(connection_name="con3")
+ 83 at prepare.c:740
frame #2: 0x000000010c838103
libecpg.6.dylib`ECPGdisconnect(lineno=81, connection_name="ALL") + 179
at connect.c:697
frame #3: 0x000000010c811922 declare`main(argc=1,
argv=0x00007fff533ee320) + 434 at declare.pgc:81
frame #4: 0x00007fff932345ad libdyld.dylib`start + 1
You also need to add in src/interfaces/ecpg/test/sql/.gitignore new
entries related to the files you are adding and that get generated.
--
Michael
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Idehira-san, this is a very intrusive patch... It really needs a specific
reviewer to begin with, but really it would be nice if you could review someone
else's patch, with a difficulty rather equivalent to what we have here.
Michael, thank you for taking a look at my patch and giving me an advice.
And sorry that I didn't follow a procedure of developing postgresql.
I think I should have sent a system design idea or small patch first and made it bigger and bigger step by step
instead of dumping a huge patch suddenly.
Yeah, I'm going to reviewing hackers' patches.
By the way, I have been able to crash your patch when running the regression
tests:
Thank you for checking and I'm going to handle this.
Regards,
Ideriha Takeshi
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Hi,
I'm sorry but I think I don't have time to work on this patch in this CF.
I've gotten busy for another work.
So I moved this patch to next CF with "waiting on author" status.
Regards,
Ideriha Takeshi
-----Original Message-----
From: Ideriha, Takeshi
Sent: Friday, January 20, 2017 6:12 PM
To: 'Michael Paquier' <michael.paquier@gmail.com>
Cc: Michael Meskes <meskes@postgresql.org>; pgsql-hackers@postgresql.org
Subject: RE: [WIP] RE: [HACKERS] DECLARE STATEMENT setting up a connection in
ECPGIdehira-san, this is a very intrusive patch... It really needs a
specific reviewer to begin with, but really it would be nice if you
could review someone else's patch, with a difficulty rather equivalent towhat we have here.
Michael, thank you for taking a look at my patch and giving me an advice.
And sorry that I didn't follow a procedure of developing postgresql.
I think I should have sent a system design idea or small patch first and made
it bigger and bigger step by step instead of dumping a huge patch suddenly.Yeah, I'm going to reviewing hackers' patches.
By the way, I have been able to crash your patch when running the
regression
tests:Thank you for checking and I'm going to handle this.
Regards,
Ideriha Takeshi
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Wed, Jan 25, 2017 at 2:58 PM, Ideriha, Takeshi
<ideriha.takeshi@jp.fujitsu.com> wrote:
Hi,
I'm sorry but I think I don't have time to work on this patch in this CF.
I've gotten busy for another work.So I moved this patch to next CF with "waiting on author" status.
Thanks for doing so, that's a time-saver for me!
--
Michael
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Hi
By the way, I have been able to crash your patch when running the regression
tests:
(lldb) bt
* thread #1: tid = 0x0000, 0x00007fff89a828b0
libsystem_platform.dylib`_platform_strcmp + 176, stop reason = signal SIGSTOP
* frame #0: 0x00007fff89a828b0 libsystem_platform.dylib`_platform_strcmp +
176
frame #1: 0x000000010c835bc3
libecpg.6.dylib`ecpg_release_declared_statement(connection_name="con3")
+ 83 at prepare.c:740
frame #2: 0x000000010c838103
libecpg.6.dylib`ECPGdisconnect(lineno=81, connection_name="ALL") + 179 at
connect.c:697
frame #3: 0x000000010c811922 declare`main(argc=1,
argv=0x00007fff533ee320) + 434 at declare.pgc:81
frame #4: 0x00007fff932345ad libdyld.dylib`start + 1
You also need to add in src/interfaces/ecpg/test/sql/.gitignore new entries
related to the files you are adding and that get generated.
Thank you very much for your test. I fixed this memory leak bug, and fixed .gitignore.
I also fixed some code style to fit coding conventions,
and splited my patch into 4 parts to improve readability:
* 001_declareStmt_preproc_v3.patch
* 002_declareStmt_ecpglib_v3.patch
* 003_declareStmt_doc_v3.patch
* 004_declareStmt_test_v3.patch
Here is a short summary:
[001_declareStmt_preproc_v3.patch]
This enables ecpg to pre-process "DECLARE prepared_name STATEMENT".
prepared_name is buffered to g_declared_list to check duplication of prepared_name.
After pre-processed, "DECLARE STATEMENT" is translated to ECPGdeclare().
And CUSRSOR STAETEMENT such as OPEN/FETCH/CLOSE cursor is translated into ECPGopen()/ECPGfetch()/ECPGclose().
These new function is defined at 002_declareStmt_ecpglib_v3.patch.
[002_declareStmt_ecpglib_v3.patch]
This patch mainly implements ECPGdeclare(), ECPGopen(), ECPGfetch(), ECPGclose().
ECPGdeclare() links the declared name and connection name.
Handling CURSOR things are originally done by ECPGdo().
But in order to handle connection linked to declared name,
the functions such as ECPGopen(), ECPGfetch()and ECPGclose() are introduced and these functions wraps ecpg_do().
[003_declareStmt_doc_v3.patch]
Docs. I wrote the DECLARE STATEMENT itself.
And added another example to ecpg-set-connection.
[004_declareStmt_test_v3.patch]
Regression test and answers.
I made them but I'm thinking these include too much test cases, don't they?
So I'm planning to make it smaller.
regards,
Ideriha Takeshi
Attachments:
001_declareStmt_preproc_v3.patchapplication/octet-stream; name=001_declareStmt_preproc_v3.patchDownload
diff --git a/src/interfaces/ecpg/preproc/ecpg.addons b/src/interfaces/ecpg/preproc/ecpg.addons
index ca3efad..982ce78 100644
--- a/src/interfaces/ecpg/preproc/ecpg.addons
+++ b/src/interfaces/ecpg/preproc/ecpg.addons
@@ -15,7 +15,7 @@ ECPG: stmtClosePortalStmt block
}
}
- output_statement($1, 0, ECPGst_normal);
+ $1 = $1;
}
ECPG: stmtDeallocateStmt block
{
@@ -25,7 +25,11 @@ ECPG: stmtDeclareCursorStmt block
{ output_simple_statement($1); }
ECPG: stmtDiscardStmt block
ECPG: stmtFetchStmt block
- { output_statement($1, 1, ECPGst_normal); }
+ {
+ /* g_cursor_name is set in the fetch_args block and freed in the output_cursor_statement */
+ output_cursor_statement(ECPGcst_fetch, g_cursor_name, NULL, $1, 1, ECPGst_normal);
+ g_cursor_name = NULL;
+ }
ECPG: stmtDeleteStmt block
ECPG: stmtInsertStmt block
ECPG: stmtSelectStmt block
@@ -63,6 +67,10 @@ ECPG: stmtViewStmt rule
whenever_action(2);
free($1);
}
+ | ECPGDeclareStmt
+ {
+ output_declare_statement($1);
+ }
| ECPGCursorStmt
{
output_simple_statement($1);
@@ -132,7 +140,14 @@ ECPG: stmtViewStmt rule
if ((ptr = add_additional_variables($1, true)) != NULL)
{
connection = ptr->connection ? mm_strdup(ptr->connection) : NULL;
- output_statement(mm_strdup(ptr->command), 0, ECPGst_normal);
+ if (ptr->prepared_name)
+ {
+ output_cursor_statement(ECPGcst_open, $1, mm_strdup(ptr->prepared_name), mm_strdup(ptr->command), 0, ECPGst_normal);
+ }
+ else
+ {
+ output_cursor_statement(ECPGcst_open, $1, NULL, mm_strdup(ptr->command), 0, ECPGst_normal);
+ }
ptr->opened = true;
}
}
@@ -204,6 +219,7 @@ ECPG: var_valueNumericOnly addon
}
ECPG: fetch_argscursor_name addon
add_additional_variables($1, false);
+ g_cursor_name = mm_strdup($1);
if ($1[0] == ':')
{
free($1);
@@ -211,6 +227,7 @@ ECPG: fetch_argscursor_name addon
}
ECPG: fetch_argsfrom_incursor_name addon
add_additional_variables($2, false);
+ g_cursor_name = mm_strdup($2);
if ($2[0] == ':')
{
free($2);
@@ -222,6 +239,7 @@ ECPG: fetch_argsFIRST_Popt_from_incursor_name addon
ECPG: fetch_argsLAST_Popt_from_incursor_name addon
ECPG: fetch_argsALLopt_from_incursor_name addon
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
if ($3[0] == ':')
{
free($3);
@@ -229,6 +247,7 @@ ECPG: fetch_argsALLopt_from_incursor_name addon
}
ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
if ($3[0] == ':')
{
free($3);
@@ -242,6 +261,7 @@ ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDALLopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDALLopt_from_incursor_name addon
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
if ($4[0] == ':')
{
free($4);
@@ -252,6 +272,7 @@ ECPG: fetch_argsRELATIVE_PSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDSignedIconstopt_from_incursor_name addon
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
if ($4[0] == ':')
{
free($4);
@@ -304,6 +325,7 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
}
this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ memset(this, 0 ,sizeof(struct cursor));
this->next = cur;
this->name = $2;
@@ -336,8 +358,31 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
}
ECPG: ClosePortalStmtCLOSEcursor_name block
{
+ char *stmt = NULL;
+ char *cursor_name = NULL;
char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : $2;
- $$ = cat2_str(mm_strdup("close"), cursor_marker);
+
+ cursor_name = mm_strdup($2);
+
+ stmt = cat2_str(mm_strdup("close"), cursor_marker);
+
+ if (INFORMIX_MODE)
+ {
+ if (pg_strcasecmp(stmt+strlen("close "), "database") == 0)
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE statement");
+
+ fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");");
+ whenever_action(2);
+ free(stmt);
+ break;
+ }
+ }
+
+ output_cursor_statement(ECPGcst_close, cursor_name, NULL, stmt, 0, ECPGst_normal);
+
+ $$ = EMPTY;
}
ECPG: opt_hold block
{
@@ -416,48 +461,56 @@ ECPG: FetchStmtMOVEfetch_args rule
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("fetch forward"), cursor_marker);
}
| FETCH FORWARD from_in cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("fetch forward from"), cursor_marker);
}
| FETCH BACKWARD cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("fetch backward"), cursor_marker);
}
| FETCH BACKWARD from_in cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("fetch backward from"), cursor_marker);
}
| MOVE FORWARD cursor_name
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("move forward"), cursor_marker);
}
| MOVE FORWARD from_in cursor_name
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("move forward from"), cursor_marker);
}
| MOVE BACKWARD cursor_name
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("move backward"), cursor_marker);
}
| MOVE BACKWARD from_in cursor_name
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("move backward from"), cursor_marker);
}
ECPG: limit_clauseLIMITselect_limit_value','select_offset_value block
diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c
index fa80bb2..2bda505 100644
--- a/src/interfaces/ecpg/preproc/ecpg.c
+++ b/src/interfaces/ecpg/preproc/ecpg.c
@@ -28,6 +28,7 @@ struct _include_path *include_paths = NULL;
struct cursor *cur = NULL;
struct typedefs *types = NULL;
struct _defines *defines = NULL;
+struct declared_name_st *g_declared_list = NULL;
static void
help(const char *progname)
@@ -111,6 +112,48 @@ add_preprocessor_define(char *define)
defines->next = pd;
}
+static void
+free_argument(struct arguments *arg)
+{
+ if (arg == NULL)
+ return;
+
+ free_argument(arg->next);
+
+ /*
+ * Don't free variables in it because the original codes don't free it either
+ * variables are static structures instead of allocating
+ */
+ free(arg);
+}
+
+static void
+free_cursor(struct cursor *c)
+{
+ if (c == NULL)
+ return;
+
+ free_cursor(c->next);
+ free_argument(c->argsinsert);
+ free_argument(c->argsresult);
+
+ free(c->name);
+ free(c->function);
+ free(c->command);
+ free(c->prepared_name);
+ free(c);
+}
+
+static void
+free_declared_stmt(struct declared_name_st *st)
+{
+ if (st == NULL)
+ return;
+
+ free_declared_stmt(st->next);
+ free(st);
+}
+
#define ECPG_GETOPT_LONG_REGRESSION 1
int
main(int argc, char *const argv[])
@@ -343,29 +386,18 @@ main(int argc, char *const argv[])
struct typedefs *typeptr;
/* remove old cursor definitions if any are still there */
- for (ptr = cur; ptr != NULL;)
+ if (cur)
{
- struct cursor *this = ptr;
- struct arguments *l1,
- *l2;
-
- free(ptr->command);
- free(ptr->connection);
- free(ptr->name);
- for (l1 = ptr->argsinsert; l1; l1 = l2)
- {
- l2 = l1->next;
- free(l1);
- }
- for (l1 = ptr->argsresult; l1; l1 = l2)
- {
- l2 = l1->next;
- free(l1);
- }
- ptr = ptr->next;
- free(this);
+ free_cursor(cur);
+ cur = NULL;
+ }
+
+ /* remove old declared statements if any are still there */
+ if (g_declared_list)
+ {
+ free_declared_stmt(g_declared_list);
+ g_declared_list = NULL;
}
- cur = NULL;
/* remove non-pertinent old defines as well */
while (defines && !defines->pertinent)
@@ -479,6 +511,18 @@ main(int argc, char *const argv[])
free(input_filename);
}
+
+ if(g_declared_list)
+ {
+ free_declared_stmt(g_declared_list);
+ g_declared_list = NULL;
+ }
+
+ if(cur)
+ {
+ free_cursor(cur);
+ cur = NULL;
+ }
}
return ret_value;
}
diff --git a/src/interfaces/ecpg/preproc/ecpg.header b/src/interfaces/ecpg/preproc/ecpg.header
index 2562366..0cebf56 100644
--- a/src/interfaces/ecpg/preproc/ecpg.header
+++ b/src/interfaces/ecpg/preproc/ecpg.header
@@ -38,6 +38,7 @@ char *current_function;
int ecpg_internal_var = 0;
char *connection = NULL;
char *input_filename = NULL;
+char *g_cursor_name = NULL;
static int FoundInto = 0;
static int initializer = 0;
diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer
index 1c10879..af15b88 100644
--- a/src/interfaces/ecpg/preproc/ecpg.trailer
+++ b/src/interfaces/ecpg/preproc/ecpg.trailer
@@ -284,6 +284,38 @@ prepared_name: name
;
/*
+ * Declare Statement
+ */
+ECPGDeclareStmt: DECLARE prepared_name STATEMENT
+ {
+ struct declared_name_st *ptr = NULL;
+
+ /* Check whether the declared name has been defined or not */
+ for (ptr = g_declared_list; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp($2, ptr->name) == 0)
+ {
+ /* re-definition is a bug */
+ mmerror(PARSE_ERROR, ET_ERROR, "declared name %s is already defined", ptr->name);
+ }
+ }
+
+ /* Add a new declared name into the g_declared_list */
+ ptr = NULL;
+ ptr = (struct declared_name_st *) mm_alloc(sizeof(struct declared_name_st));
+ if (ptr)
+ {
+ /* initial definition */
+ ptr->name = $2;
+ ptr->next = g_declared_list;
+ g_declared_list = ptr;
+ }
+
+ $$ = mm_strdup($2);
+ }
+;
+
+/*
* Declare a prepared cursor. The syntax is different from the standard
* declare statement, so we create a new rule.
*/
@@ -309,6 +341,7 @@ ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared
}
this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ memset(this, 0 ,sizeof(struct cursor));
/* initial definition */
this->next = cur;
@@ -318,6 +351,7 @@ ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared
this->command = cat_str(6, mm_strdup("declare"), cursor_marker, $3, mm_strdup("cursor"), $5, mm_strdup("for $1"));
this->argsresult = NULL;
this->argsresult_oos = NULL;
+ this->prepared_name = $7;
thisquery->type = &ecpg_query;
thisquery->brace_level = 0;
diff --git a/src/interfaces/ecpg/preproc/ecpg.type b/src/interfaces/ecpg/preproc/ecpg.type
index ac6aa00..978be84 100644
--- a/src/interfaces/ecpg/preproc/ecpg.type
+++ b/src/interfaces/ecpg/preproc/ecpg.type
@@ -9,6 +9,7 @@
%type <str> ECPGDeallocateDescr
%type <str> ECPGDeclaration
%type <str> ECPGDeclare
+%type <str> ECPGDeclareStmt
%type <str> ECPGDescribe
%type <str> ECPGDisconnect
%type <str> ECPGExecuteImmediateStmt
diff --git a/src/interfaces/ecpg/preproc/extern.h b/src/interfaces/ecpg/preproc/extern.h
index 0ce3a6e..dcfdc06 100644
--- a/src/interfaces/ecpg/preproc/extern.h
+++ b/src/interfaces/ecpg/preproc/extern.h
@@ -50,6 +50,7 @@ extern struct _include_path *include_paths;
extern struct cursor *cur;
extern struct typedefs *types;
extern struct _defines *defines;
+extern struct declared_name_st *g_declared_list;
extern struct ECPGtype ecpg_no_indicator;
extern struct variable no_indicator;
extern struct arguments *argsinsert;
@@ -72,6 +73,8 @@ extern void output_statement(char *, int, enum ECPG_statement_type);
extern void output_prepare_statement(char *, char *);
extern void output_deallocate_prepare_statement(char *);
extern void output_simple_statement(char *);
+extern void output_declare_statement(char *);
+extern void output_cursor_statement(int , char *, char *, char *, int , enum ECPG_statement_type);
extern char *hashline_number(void);
extern int base_yyparse(void);
extern int base_yylex(void);
diff --git a/src/interfaces/ecpg/preproc/output.c b/src/interfaces/ecpg/preproc/output.c
index 59d5d30..65e94b8 100644
--- a/src/interfaces/ecpg/preproc/output.c
+++ b/src/interfaces/ecpg/preproc/output.c
@@ -5,6 +5,7 @@
#include "extern.h"
static void output_escaped_str(char *cmd, bool quoted);
+static void output_cursor_name(char *str);
void
output_line_number(void)
@@ -195,7 +196,16 @@ static void
output_escaped_str(char *str, bool quoted)
{
int i = 0;
- int len = strlen(str);
+ int len = 0;
+
+ if (str == NULL)
+ {
+ fputs("NULL", base_yyout);
+
+ return;
+ }
+
+ len = strlen(str);
if (quoted && str[0] == '"' && str[len - 1] == '"') /* do not escape quotes
* at beginning and end
@@ -244,3 +254,147 @@ output_escaped_str(char *str, bool quoted)
if (quoted && str[0] == '"' && str[len] == '"')
fputs("\"", base_yyout);
}
+
+/*
+ * This is a tool function used by the output_cursor_statement function to print
+ * cursor name after the string such as "ECPGopen(","ECPGfetch(","ECPGclose(".
+ */
+static void
+output_cursor_name(char *str)
+{
+ int i = 0;
+ int len = 0;
+
+ if (str == NULL)
+ {
+ fputs("NULL", base_yyout);
+
+ return;
+ }
+
+ len = strlen(str);
+ fputs("\"", base_yyout);
+ if (str[0] == '\"' && str[len - 1] == '\"')
+ {
+ i = 1;
+ len--;
+ fputs("\\\"", base_yyout);
+
+ /* output this char by char as we have to filter " and \n */
+ for (; i < len; i++)
+ {
+ if (str[i] == '"')
+ fputs("\\\"", base_yyout);
+ else if (str[i] == '\n')
+ fputs("\\\n", base_yyout);
+ else if (str[i] == '\\')
+ {
+ int j = i;
+
+ /*
+ * check whether this is a continuation line if it is, do not
+ * output anything because newlines are escaped anyway
+ */
+
+ /* accept blanks after the '\' as some other compilers do too */
+ do
+ {
+ j++;
+ } while (str[j] == ' ' || str[j] == '\t');
+
+ if ((str[j] != '\n') && (str[j] != '\r' || str[j + 1] != '\n')) /* not followed by a
+ * newline */
+ fputs("\\\\",base_yyout);
+ }
+ else if (str[i] == '\r' && str[i + 1] == '\n')
+ {
+ fputs("\\\r\n", base_yyout);
+ i++;
+ }
+ else
+ fputc(str[i], base_yyout);
+ }
+
+ fputs("\\\"", base_yyout);
+ }
+ else
+ fputs(str, base_yyout);
+
+ fputs("\"", base_yyout);
+}
+
+/*
+ * Translate the EXEC SQL DECLARE STATEMENT into ECPGdeclare function
+ */
+void
+output_declare_statement(char *name)
+{
+ /* connection is set in "at:" token in ecpg.trailer file */
+ fprintf(base_yyout, "{ ECPGdeclare(__LINE__, %s, ", connection ? connection : "NULL");
+ output_escaped_str(name, true);
+ fputs(");", base_yyout);
+
+ whenever_action(2);
+ free(name);
+ if (connection != NULL)
+ free(connection);
+}
+
+/*
+ * Translate the EXEC SQL CURSOR STATEMENT such as OPEN/FETCH/CLOSE cursor into
+ * ECPGopen/ECPGfetch/ECPGclose function
+ */
+void
+output_cursor_statement(int cursor_stmt, char *cursor_name, char *prepared_name, char *stmt, int whenever_mode, enum ECPG_statement_type st)
+{
+ switch(cursor_stmt)
+ {
+ case ECPGcst_open:
+ fprintf(base_yyout, "{ ECPGopen(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", ");
+ output_escaped_str(prepared_name, true);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ case ECPGcst_fetch:
+ fprintf(base_yyout, "{ ECPGfetch(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ case ECPGcst_close:
+ fprintf(base_yyout, "{ ECPGclose(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ }
+
+ if (st == ECPGst_execute || st == ECPGst_exec_immediate)
+ fprintf(base_yyout, "%s, %s, ", ecpg_statement_type_name[st], stmt);
+ else
+ {
+ if (st == ECPGst_prepnormal && auto_prepare)
+ fputs("ECPGst_prepnormal, \"", base_yyout);
+ else
+ fputs("ECPGst_normal, \"", base_yyout);
+
+ output_escaped_str(stmt, false);
+ fputs("\", ", base_yyout);
+ }
+
+ /* dump variables to C file */
+ dump_variables(argsinsert, 1);
+ fputs("ECPGt_EOIT, ", base_yyout);
+ dump_variables(argsresult, 1);
+ fputs("ECPGt_EORT);", base_yyout);
+ reset_variables();
+
+ whenever_action(whenever_mode | 2);
+ free(cursor_name);
+ free(prepared_name);
+ free(stmt);
+ if (connection != NULL)
+ free(connection);
+}
\ No newline at end of file
diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h
index cd0d1da..1b6ddfb 100644
--- a/src/interfaces/ecpg/preproc/type.h
+++ b/src/interfaces/ecpg/preproc/type.h
@@ -129,6 +129,7 @@ struct cursor
char *command;
char *connection;
bool opened;
+ char *prepared_name;
struct arguments *argsinsert;
struct arguments *argsinsert_oos;
struct arguments *argsresult;
@@ -136,6 +137,13 @@ struct cursor
struct cursor *next;
};
+/* structure to store declared name */
+struct declared_name_st
+{
+ char *name; /* declared name */
+ struct declared_name_st *next;
+};
+
struct typedefs
{
char *name;
002_declareStmt_ecpglib_v3.patchapplication/octet-stream; name=002_declareStmt_ecpglib_v3.patchDownload
diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile
index fbb1407..132e53a 100644
--- a/src/interfaces/ecpg/ecpglib/Makefile
+++ b/src/interfaces/ecpg/ecpglib/Makefile
@@ -26,7 +26,7 @@ override CFLAGS += $(PTHREAD_CFLAGS)
LIBS := $(filter-out -lpgport, $(LIBS))
OBJS= execute.o typename.o descriptor.o sqlda.o data.o error.o prepare.o memory.o \
- connect.o misc.o path.o pgstrcasecmp.o \
+ connect.o misc.o path.o pgstrcasecmp.o cursor.o \
$(filter snprintf.o strlcpy.o win32setlocale.o isinf.o, $(LIBOBJS)) $(WIN32RES)
# thread.c is needed only for non-WIN32 implementation of path.c
diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c
index c90f13d..ddbc08c 100644
--- a/src/interfaces/ecpg/ecpglib/connect.c
+++ b/src/interfaces/ecpg/ecpglib/connect.c
@@ -340,6 +340,8 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
return false;
}
+ memset(this, 0, sizeof(struct connection));
+
if (dbname != NULL)
{
/* get the detail information from dbname */
@@ -684,12 +686,15 @@ ECPGdisconnect(int lineno, const char *connection_name)
if (strcmp(connection_name, "ALL") == 0)
{
+ struct connection *f = NULL;
+
ecpg_init_sqlca(sqlca);
for (con = all_connections; con;)
{
- struct connection *f = con;
+ f = con;
con = con->next;
+ ecpg_release_declared_statement(f->name);
ecpg_finish(f);
}
}
@@ -705,7 +710,10 @@ ECPGdisconnect(int lineno, const char *connection_name)
return (false);
}
else
+ {
+ ecpg_release_declared_statement(connection_name);
ecpg_finish(con);
+ }
}
#ifdef ENABLE_THREAD_SAFETY
diff --git a/src/interfaces/ecpg/ecpglib/cursor.c b/src/interfaces/ecpg/ecpglib/cursor.c
new file mode 100644
index 0000000..4391ec3
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/cursor.c
@@ -0,0 +1,260 @@
+/* src/interfaces/ecpg/ecpglib/cursor.c */
+
+#define POSTGRES_ECPG_INTERNAL
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <locale.h>
+#include <string.h>
+
+#include "ecpgtype.h"
+#include "ecpglib.h"
+#include "ecpgerrno.h"
+#include "extern.h"
+#include "sqlca.h"
+
+static void add_cursor(const int, const char *, const char *);
+static void remove_cursor(const char *, struct connection *);
+static bool find_cursor(const char *, const struct connection *);
+
+/*
+ * Function: Handle the EXEC SQL OPEN cursor statement:
+ * Input:
+ * cursor_name --- cursor name
+ * prepared_name --- prepared name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGopen(const char *cursor_name,const char *prepared_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ /*
+ * If the declared name is referred by the PREPARE statement then the
+ * prepared_name is same as declared name
+ */
+ real_connection_name = ecpg_get_con_name_by_declared_name(prepared_name);
+ if (real_connection_name)
+ {
+ /* Add the cursor name into the declared node */
+ ecpg_update_declare_statement(prepared_name, cursor_name, lineno);
+ }
+ else
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+
+ /* Add the cursor into the connection */
+ add_cursor(lineno, cursor_name, real_connection_name);
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return status;
+}
+
+
+/*
+ * Function: Handle the EXEC SQL FETCH/MOVE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGfetch(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return (false);
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return status;
+}
+
+
+/*
+ * Function: Handle the EXEC SQL CLOSE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGclose(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+ struct connection *con = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+
+ /* check the existence of the cursor in the connection */
+ if (false == find_cursor(cursor_name, con))
+ {
+ ecpg_raise(lineno, ECPG_INVALID_CURSOR, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ remove_cursor(cursor_name, con);
+
+ return status;
+}
+
+/*
+ * Function: Add a cursor into the connection
+ */
+static void
+add_cursor(const int lineno, const char *cursor_name, const char *connection_name)
+{
+ struct connection *con;
+ struct cursor_statement *new = NULL;
+
+ if (!cursor_name)
+ return ;
+
+ con = ecpg_get_connection(connection_name);
+ if (!con)
+ {
+ return;
+ }
+
+ if (find_cursor(cursor_name, con))
+ {
+ /*
+ * Should never goto here, because ECPG has checked the duplication of
+ * the cursor in pre-compile stage.
+ */
+ return;
+ }
+
+ /* allocate a node to store the new cursor */
+ new = (struct cursor_statement *)ecpg_alloc(sizeof(struct cursor_statement), lineno);
+ if (new)
+ {
+ new->name = ecpg_strdup(cursor_name, lineno);
+ new->next = con->cursor_stmts;
+ con->cursor_stmts = new;
+ }
+}
+
+/*
+ * Function: Remove the cursor from the connection
+ */
+static void
+remove_cursor(const char *cursor_name, struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+ struct cursor_statement *prev = NULL;
+
+ if (!connection || !cursor_name)
+ return ;
+
+ cur = connection->cursor_stmts;
+ while (cur)
+ {
+ if (strcmp(cur->name, cursor_name) == 0)
+ {
+ if (!prev)
+ connection->cursor_stmts = cur->next;
+ else
+ prev->next = cur->next;
+
+ ecpg_free(cur->name);
+ ecpg_free(cur);
+
+ break;
+ }
+ prev = cur;
+ cur = cur->next;
+ }
+}
+
+/*
+ * Function: Find whether the cursor exists in the connection or not
+ * Return: true ---Found
+ * false --- Not found
+ */
+static bool
+find_cursor(const char *cursor_name, const struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+
+ if (!connection || !cursor_name)
+ return false;
+
+ for (cur = connection->cursor_stmts; cur != NULL; cur = cur->next)
+ {
+ if (strcmp(cur->name, cursor_name) == 0)
+ return true;
+ }
+
+ return false;
+}
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c
index 15fd7a0..858be01 100644
--- a/src/interfaces/ecpg/ecpglib/descriptor.c
+++ b/src/interfaces/ecpg/ecpglib/descriptor.c
@@ -818,6 +818,7 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
struct prepared_statement *prep;
PGresult *res;
va_list args;
+ const char *real_connection_name = NULL;
/* DESCRIBE INPUT is not yet supported */
if (input)
@@ -826,13 +827,20 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
return ret;
}
- con = ecpg_get_connection(connection_name);
- if (!con)
+ real_connection_name = ecpg_get_con_name_by_declared_name(stmt_name);
+ if (real_connection_name == NULL)
{
- ecpg_raise(line, ECPG_NO_CONN, ECPG_SQLSTATE_CONNECTION_DOES_NOT_EXIST,
- connection_name ? connection_name : ecpg_gettext("NULL"));
- return ret;
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
}
+
+ con = ecpg_get_connection(real_connection_name);
+ if (!ecpg_init(con, real_connection_name, line))
+ return false;
+
prep = ecpg_find_prepared_statement(stmt_name, con, NULL);
if (!prep)
{
diff --git a/src/interfaces/ecpg/ecpglib/error.c b/src/interfaces/ecpg/ecpglib/error.c
index 656b2c4..11a1a7c 100644
--- a/src/interfaces/ecpg/ecpglib/error.c
+++ b/src/interfaces/ecpg/ecpglib/error.c
@@ -200,6 +200,13 @@ ecpg_raise(int line, int code, const char *sqlstate, const char *str)
ecpg_gettext("could not connect to database \"%s\" on line %d"), str, line);
break;
+ case ECPG_INVALID_CURSOR:
+ snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
+ /*------
+ translator: this string will be truncated at 149 characters expanded. */
+ ecpg_gettext("The cursor is invalid on line %d"),line);
+ break;
+
default:
snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
/*------
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index d5a463d..1a50307 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -2032,9 +2032,32 @@ ECPGdo(const int lineno, const int compat, const int force_indicator, const char
{
va_list args;
bool ret;
+ const char *real_connection_name = NULL;
+
+ real_connection_name = connection_name;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ /* Handle the EXEC SQL EXECUTE... statement */
+ if(ECPGst_execute == st)
+ {
+ real_connection_name = ecpg_get_con_name_by_declared_name(query);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+ }
va_start(args, query);
- ret = ecpg_do(lineno, compat, force_indicator, connection_name,
+ ret = ecpg_do(lineno, compat, force_indicator, real_connection_name,
questionmarks, st, query, args);
va_end(args);
diff --git a/src/interfaces/ecpg/ecpglib/exports.txt b/src/interfaces/ecpg/ecpglib/exports.txt
index 69e9617..08fa1bb 100644
--- a/src/interfaces/ecpg/ecpglib/exports.txt
+++ b/src/interfaces/ecpg/ecpglib/exports.txt
@@ -29,3 +29,7 @@ ECPGget_PGconn 26
ECPGtransactionStatus 27
ECPGset_var 28
ECPGget_var 29
+ECPGdeclare 30
+ECPGopen 31
+ECPGfetch 32
+ECPGclose 33
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/extern.h b/src/interfaces/ecpg/ecpglib/extern.h
index c3082be..13d978c 100644
--- a/src/interfaces/ecpg/ecpglib/extern.h
+++ b/src/interfaces/ecpg/ecpglib/extern.h
@@ -66,6 +66,15 @@ struct statement
PGresult *results;
};
+/* structure to store declared statements */
+struct declared_statement
+{
+ char *name; /* declared name */
+ char *connection_name;
+ char *cursor_name;
+ struct declared_statement *next;
+};
+
/* structure to store prepared statements for a connection */
struct prepared_statement
{
@@ -75,6 +84,12 @@ struct prepared_statement
struct prepared_statement *next;
};
+struct cursor_statement
+{
+ char *name; /*cursor name*/
+ struct cursor_statement *next;
+};
+
/* structure to store connections */
struct connection
{
@@ -83,6 +98,7 @@ struct connection
bool autocommit;
struct ECPGtype_information_cache *cache_head;
struct prepared_statement *prep_stmts;
+ struct cursor_statement *cursor_stmts;
struct connection *next;
};
@@ -165,6 +181,11 @@ struct descriptor *ecpg_find_desc(int line, const char *name);
struct prepared_statement *ecpg_find_prepared_statement(const char *,
struct connection *, struct prepared_statement **);
+void ecpg_update_declare_statement(const char *, const char *, const int);
+char *ecpg_get_con_name_by_declared_name(const char *);
+const char *ecpg_get_con_name_by_cursor_name(const char *);
+void ecpg_release_declared_statement(const char *);
+
bool ecpg_store_result(const PGresult *results, int act_field,
const struct statement * stmt, struct variable * var);
bool ecpg_store_input(const int, const bool, const struct variable *, char **, bool);
@@ -220,4 +241,4 @@ void ecpg_set_native_sqlda(int, struct sqlda_struct **, const PGresult *, int,
#define ECPG_SQLSTATE_ECPG_INTERNAL_ERROR "YE000"
#define ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY "YE001"
-#endif /* _ECPG_LIB_EXTERN_H */
+#endif /* _ECPG_LIB_EXTERN_H */
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/prepare.c b/src/interfaces/ecpg/ecpglib/prepare.c
index 983b242..0a939cd 100644
--- a/src/interfaces/ecpg/ecpglib/prepare.c
+++ b/src/interfaces/ecpg/ecpglib/prepare.c
@@ -26,9 +26,11 @@ static int nextStmtID = 1;
static const int stmtCacheNBuckets = 2039; /* # buckets - a prime # */
static const int stmtCacheEntPerBucket = 8; /* # entries/bucket */
static stmtCacheEntry stmtCacheEntries[16384] = {{0, {0}, 0, 0, 0}};
+static struct declared_statement *g_declared_list;
static bool deallocate_one(int lineno, enum COMPAT_MODE c, struct connection * con,
struct prepared_statement * prev, struct prepared_statement * this);
+static struct declared_statement *ecpg_find_declared_statement(const char *);
static bool
isvarchar(unsigned char c)
@@ -117,6 +119,7 @@ prepare_common(int lineno, struct connection * con, const char *name, const char
ecpg_free(this);
return false;
}
+ memset(stmt, 0, sizeof(struct statement));
/* create statement */
stmt->lineno = lineno;
@@ -163,11 +166,22 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
(void) questionmarks; /* quiet the compiler */
- con = ecpg_get_connection(connection_name);
- if (!ecpg_init(con, connection_name, lineno))
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+ if (!ecpg_init(con, real_connection_name, lineno))
return false;
/* check if we already have prepared this statement */
@@ -255,9 +269,19 @@ ECPGdeallocate(int lineno, int c, const char *connection_name, const char *name)
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
- con = ecpg_get_connection(connection_name);
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+ con = ecpg_get_connection(real_connection_name);
if (!ecpg_init(con, connection_name, lineno))
return false;
@@ -305,8 +329,21 @@ ecpg_prepared(const char *name, struct connection * con)
char *
ECPGprepared_statement(const char *connection_name, const char *name, int lineno)
{
+ const char *real_connection_name = NULL;
+
(void) lineno; /* keep the compiler quiet */
- return ecpg_prepared(name, ecpg_get_connection(connection_name));
+
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ return ecpg_prepared(name, ecpg_get_connection(real_connection_name));
}
/*
@@ -513,3 +550,196 @@ ecpg_auto_prepare(int lineno, const char *connection_name, const int compat, cha
return (true);
}
+
+/*
+ * handle the EXEC SQL DECLARE STATEMENT
+ * Input: connection_name -- connection name
+ * name -- declared name
+ */
+bool
+ECPGdeclare(int lineno, const char *connection_name, const char *name)
+{
+ struct connection *con = NULL;
+ struct declared_statement *p = NULL;
+
+ if(name == NULL)
+ {
+ /* Should never go to here because ECPG pre-compiler will check it */
+ return false;
+ }
+
+ if(connection_name == NULL)
+ {
+ /*
+ * Going to here means not using AT clause in the DECLARE STATEMENT
+ * We don't allocate a node to store the declared name because the
+ * DECLARE STATEMENT without using AT clause will be ignored.
+ */
+ return true;
+ }
+
+ con = ecpg_get_connection(connection_name);
+ if (!ecpg_init(con, connection_name, lineno))
+ return false;
+
+ if(ecpg_find_declared_statement(name))
+ {
+ /* Should not go to here because the pre-compiler has check the duplicate name */
+ return false;
+ }
+
+ /* allocate a declared_statement as a new node */
+ p = (struct declared_statement *) ecpg_alloc(sizeof(struct declared_statement), lineno);
+ if (!p)
+ return false;
+
+ memset(p, 0, sizeof(struct declared_statement));
+
+ ecpg_log("ECPGdeclare on line %d: declared name %s on connection: \"%s\"\n", lineno, name, connection_name);
+
+ p->name = ecpg_strdup(name, lineno);
+ p->connection_name = ecpg_strdup(connection_name, lineno);
+
+ /* Add the new node into the g_declared_list */
+ if(g_declared_list != NULL)
+ {
+ p->next = g_declared_list;
+ g_declared_list = p;
+ }
+ else
+ g_declared_list = p;
+
+ return true;
+}
+
+/*
+ * Find a declared node by declared name
+ * Input: name -- declared name
+ * Return: Found -- The pointer points to the declared node
+ * Not found -- NULL
+ */
+static struct declared_statement *
+ecpg_find_declared_statement(const char *name)
+{
+ struct declared_statement *p;
+
+ if(name == NULL)
+ return NULL;
+
+ p = g_declared_list;
+ while(p)
+ {
+ if (strcmp(p->name, name) == 0)
+ return p;
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/*
+ * Build the relationship between the declared name and cursor name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * cursor_name -- cursor name declared in the DECLARE/OPEN CURSOR statement
+ */
+void
+ecpg_update_declare_statement(const char *declared_name, const char *cursor_name, const int lineno)
+{
+ struct declared_statement *p = NULL;
+
+ if(!declared_name || !cursor_name)
+ return;
+
+ /* Find the declared node by declared name */
+ p = ecpg_find_declared_statement(declared_name);
+ if(p)
+ p->cursor_name = ecpg_strdup(cursor_name,lineno);
+}
+
+/*
+ * Find and return the connection name referred by the declared name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+char *
+ecpg_get_con_name_by_declared_name(const char *declared_name)
+{
+ struct declared_statement *p;
+
+ p = ecpg_find_declared_statement(declared_name);
+ if(p)
+ return p->connection_name;
+
+ return NULL;
+}
+
+/*
+ * Find the declared name referred by the cursor,
+ * then return the connection name used by the declared name.
+ * Input: cursor_name -- the cursor name
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+const char *
+ecpg_get_con_name_by_cursor_name(const char *cursor_name)
+{
+ struct declared_statement *p;
+
+ if(cursor_name == NULL)
+ return NULL;
+
+ p = g_declared_list;
+ while(p)
+ {
+ /* Search the cursor name in the declared list */
+ if(p->cursor_name && (strcmp(p->cursor_name, cursor_name) == 0))
+ return p->connection_name;
+
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/*
+ * Release the declare node from the g_declared_list which refers the connection_name
+ * Input: connection_name -- connection name
+ */
+void
+ecpg_release_declared_statement(const char *connection_name)
+{
+ struct declared_statement *cur = NULL;
+ struct declared_statement *prev = NULL;
+ struct declared_statement *next = NULL;
+
+ if(connection_name == NULL)
+ return;
+
+ cur = g_declared_list;
+ while(cur)
+ {
+ next = cur->next;
+ if (strcmp(cur->connection_name, connection_name) == 0)
+ {
+ /* If find then release the declared node from the list */
+ if(prev)
+ prev->next = next;
+ else
+ g_declared_list = next;
+
+ ecpg_log("ecpg_release_declared_statement: declared name %s is released\n", cur->name);
+
+ ecpg_free(cur->name);
+ ecpg_free(cur->connection_name);
+ ecpg_free(cur->cursor_name);
+ ecpg_free(cur);
+
+ /* One connection can be used by multiple declared name, so no break here */
+ }
+ else
+ prev = cur;
+
+ cur = next;
+ }
+}
\ No newline at end of file
diff --git a/src/interfaces/ecpg/include/ecpgerrno.h b/src/interfaces/ecpg/include/ecpgerrno.h
index 36b15b7..fae9440 100644
--- a/src/interfaces/ecpg/include/ecpgerrno.h
+++ b/src/interfaces/ecpg/include/ecpgerrno.h
@@ -44,6 +44,7 @@
#define ECPG_UNKNOWN_DESCRIPTOR_ITEM -242
#define ECPG_VAR_NOT_NUMERIC -243
#define ECPG_VAR_NOT_CHAR -244
+#define ECPG_INVALID_CURSOR -245
/* finally the backend error messages, they start at 400 */
#define ECPG_PGSQL -400
diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h
index c32df6c..8c91212 100644
--- a/src/interfaces/ecpg/include/ecpglib.h
+++ b/src/interfaces/ecpg/include/ecpglib.h
@@ -55,6 +55,10 @@ bool ECPGdisconnect(int, const char *);
bool ECPGprepare(int, const char *, const bool, const char *, const char *);
bool ECPGdeallocate(int, int, const char *, const char *);
bool ECPGdeallocate_all(int, int, const char *);
+bool ECPGdeclare(int, const char *, const char *);
+bool ECPGopen(const char*, const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGfetch(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGclose(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
char *ECPGprepared_statement(const char *, const char *, int);
PGconn *ECPGget_PGconn(const char *);
PGTransactionStatusType ECPGtransactionStatus(const char *);
diff --git a/src/interfaces/ecpg/include/ecpgtype.h b/src/interfaces/ecpg/include/ecpgtype.h
index 7cc47e9..2c3f348 100644
--- a/src/interfaces/ecpg/include/ecpgtype.h
+++ b/src/interfaces/ecpg/include/ecpgtype.h
@@ -99,8 +99,15 @@ enum ECPG_statement_type
ECPGst_prepnormal
};
+enum ECPG_cursor_statement_type
+{
+ ECPGcst_declare,
+ ECPGcst_open,
+ ECPGcst_fetch,
+ ECPGcst_close
+};
#ifdef __cplusplus
}
#endif
-#endif /* _ECPGTYPE_H */
+#endif /* _ECPGTYPE_H */
003_declareStmt_doc_v3.patchapplication/octet-stream; name=003_declareStmt_doc_v3.patchDownload
diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml
index b8021cb..1c104b0 100644
--- a/doc/src/sgml/ecpg.sgml
+++ b/doc/src/sgml/ecpg.sgml
@@ -224,7 +224,7 @@ EXEC SQL CONNECT TO :target USER :user USING :passwd;
SQL statements in embedded SQL programs are by default executed on
the current connection, that is, the most recently opened one. If
an application needs to manage multiple connections, then there are
- two ways to handle this.
+ three ways to handle this.
</para>
<para>
@@ -296,6 +296,17 @@ current=testdb2 (should be testdb2)
current=testdb1 (should be testdb1)
</screen>
</para>
+
+ <para>
+ The third option is to declare a sql identifier linked to
+ the connection, for example:
+<programlisting>
+EXEC SQL AT <replaceable>connection-name</replaceable> DECLARE <replaceable>statement-name</replaceable> STATEMENT;
+EXEC SQL PREPARE <replaceable>statement-name</replaceable> FROM :<replaceable>dyn-string</replaceable>;
+</programlisting>
+ Once you link a sql identifier to a connection, you execute a dynamic SQL
+ without AT clause.
+ </para>
</sect2>
<sect2 id="ecpg-disconnect">
@@ -6683,6 +6694,107 @@ EXEC SQL DECLARE cur1 CURSOR FOR stmt1;
</refsect1>
</refentry>
+ <refentry id="ecpg-sql-declare-statement">
+ <refnamediv>
+ <refname>DECLARE STATEMENT</refname>
+ <refpurpose>declares SQL statement identifier associated with connection</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+<synopsis>
+EXEC SQL [ AT connection_name ] DECLARE <replaceable class="PARAMETER">statement_name</replaceable> STATEMENT
+</synopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>Description</title>
+
+ <para>
+ <command>DECLARE STATEMENT</command> declares SQL statement identifier.
+ SQL statement identifier is associated with connection.
+ </para>
+
+ <para>
+ <command>DELARE CURSOR</command> with a SQL statement identifier can be written before PREPARE.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Parameters</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><replaceable class="PARAMETER">connection_name</replaceable></term>
+ <listitem>
+ <para>
+ A database connection name established by the <command>CONNECT</command> command.
+ </para>
+ <para>
+ If AT clause is omitted, an SQL statement identifier is associated with the DEFAULT connection.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <variablelist>
+ <varlistentry>
+ <term><replaceable class="PARAMETER">statement_name</replaceable></term>
+ <listitem>
+ <para>
+ The name of a SQL statement identifier, either as an SQL identifier or a host variable.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>Notes</title>
+
+ <para>
+ An SQL statement with a SQL statement identifier must use a same connection
+ as the connection that the SQL statement identifier is associated with.
+ </para>
+
+ <para>
+ AT clause cannot be used with the SQL statement which have been identified by <command>DECLARE STATEMENT</command>
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Examples</title>
+
+<programlisting>
+EXEC SQL CONNECT TO postgres AS con1;
+EXEC SQL AT con1 DECLARE sql_stmt STATEMENT;
+EXEC SQL DECLARE cursor_name CURSOR FOR sql_stmt;
+EXEC SQL PREPARE sql_stmt FROM :dyn_string;
+EXEC SQL OPEN cursor_name;
+EXEC SQL FETCH cursor_name INTO :column1;
+EXEC SQL CLOSE cursor_name;
+</programlisting>
+ </refsect1>
+
+ <refsect1>
+ <title>Compatibility</title>
+
+ <para>
+ <command>DECLARE STATEMENT</command> is a PostgreSQL extension of the SQL standard,
+ but can be used in Oracle and DB2.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>See Also</title>
+
+ <simplelist type="inline">
+ <member><xref linkend="ecpg-sql-connect"></member>
+ <member><xref linkend="ecpg-sql-declare"></member>
+ <member><xref linkend="ecpg-sql-open"></member>
+ </simplelist>
+ </refsect1>
+ </refentry>
+
<refentry id="ecpg-sql-describe">
<refnamediv>
<refname>DESCRIBE</refname>
004_declareStmt_test_v3.patchapplication/octet-stream; name=004_declareStmt_test_v3.patchDownload
diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile
index 28f02fe..53a50c3 100644
--- a/src/interfaces/ecpg/test/Makefile
+++ b/src/interfaces/ecpg/test/Makefile
@@ -75,7 +75,7 @@ $(remaining_files_build): $(abs_builddir)/%: $(srcdir)/%
endif
# Common options for tests. Also pick up anything passed in EXTRA_REGRESS_OPTS
-REGRESS_OPTS = --dbname=ecpg1_regression,ecpg2_regression --create-role=regress_ecpg_user1,regress_ecpg_user2 $(EXTRA_REGRESS_OPTS)
+REGRESS_OPTS = --dbname=ecpg1_regression,ecpg2_regression,ecpg3_regression --create-role=regress_ecpg_user1,regress_ecpg_user2 $(EXTRA_REGRESS_OPTS)
check: all
$(with_temp_install) ./pg_regress $(REGRESS_OPTS) --temp-instance=./tmp_check $(TEMP_CONF) --bindir= $(pg_regress_locale_flags) $(THREAD) --schedule=$(srcdir)/ecpg_schedule
diff --git a/src/interfaces/ecpg/test/ecpg_schedule b/src/interfaces/ecpg/test/ecpg_schedule
index c3ec125..5f7fe5b 100644
--- a/src/interfaces/ecpg/test/ecpg_schedule
+++ b/src/interfaces/ecpg/test/ecpg_schedule
@@ -48,6 +48,7 @@ test: sql/quote
test: sql/show
test: sql/insupd
test: sql/parser
+test: sql/declare
test: thread/thread
test: thread/thread_implicit
test: thread/prep
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
index 1f316fb..b4a7c44 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
@@ -241,7 +241,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
+ { ECPGopen("mycur1", "st_id1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 101 "sqlda.pgc"
@@ -258,7 +258,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
+ { ECPGfetch("mycur1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 109 "sqlda.pgc"
@@ -279,7 +279,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
#line 118 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -316,7 +316,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
+ { ECPGopen("mycur2", "st_id2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 138 "sqlda.pgc"
@@ -333,7 +333,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch from mycur2", ECPGt_EOIT,
+ { ECPGfetch("mycur2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch from mycur2", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 146 "sqlda.pgc"
@@ -354,7 +354,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
#line 155 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c b/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
index 9934947..48b9197 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
@@ -158,7 +158,7 @@ if (sqlca.sqlcode < 0) dosqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch forward c", ECPGt_EOIT,
+ { ECPGfetch("c", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch forward c", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_decimal,&(j),(long)1,(long)1,sizeof(decimal),
@@ -244,7 +244,7 @@ if (sqlca.sqlcode < 0) dosqlprint ( );}
static void openit(void)
{
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare c cursor for select * from test where i <= $1 ",
+ { ECPGopen("c", NULL, __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare c cursor for select * from test where i <= $1 ",
ECPGt_int,&(*( int *)(ECPGget_var( 0))),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 95 "test_informix.pgc"
diff --git a/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c b/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
index a56513a..ffa5687 100644
--- a/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
+++ b/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
@@ -82,7 +82,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
/* declare cur cursor for select id , d , d from nantest1 */
#line 33 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
#line 34 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -90,7 +90,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_double,&(d),(long)1,(long)1,sizeof(double),
@@ -130,14 +130,14 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
#line 46 "nan_test.pgc"
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 48 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
#line 48 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
#line 50 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -145,7 +145,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_double,&(d),(long)1,(long)1,sizeof(double),
@@ -164,7 +164,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
if (isnan(d))
printf("%d NaN '%s'\n", id, val);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 61 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -221,7 +221,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
/* declare cur1 cursor for select id , d , d from nantest2 */
#line 75 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for select id , d , d from nantest2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur1", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for select id , d , d from nantest2", ECPGt_EOIT, ECPGt_EORT);
#line 76 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -229,7 +229,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur1", ECPGt_EOIT,
+ { ECPGfetch("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur1", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_numeric,&(num),(long)1,(long)0,sizeof(numeric),
@@ -245,7 +245,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
break;
printf("%d %s '%s'\n", id, (num->sign == NUMERIC_NAN ? "NaN" : "not NaN"), val);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
#line 84 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
diff --git a/src/interfaces/ecpg/test/expected/preproc-autoprep.c b/src/interfaces/ecpg/test/expected/preproc-autoprep.c
index 10ede3e..e3abb29 100644
--- a/src/interfaces/ecpg/test/expected/preproc-autoprep.c
+++ b/src/interfaces/ecpg/test/expected/preproc-autoprep.c
@@ -133,7 +133,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 35 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select Item1 from T", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select Item1 from T", ECPGt_EOIT, ECPGt_EORT);
#line 37 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -143,7 +143,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 37 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 39 "autoprep.pgc"
@@ -156,7 +156,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("i = %d\n", i);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
#line 42 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -180,7 +180,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 46 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for $1",
+ { ECPGopen("cur1", "stmt1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 48 "autoprep.pgc"
@@ -199,7 +199,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
i = 0;
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur1", ECPGt_EOIT,
+ { ECPGfetch("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur1", ECPGt_EOIT,
ECPGt_int,&(item1),(long)1,(long)1,sizeof(int),
ECPGt_int,&(ind1),(long)1,(long)1,sizeof(int), ECPGt_EORT);
#line 55 "autoprep.pgc"
@@ -217,7 +217,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
i++;
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
#line 60 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
diff --git a/src/interfaces/ecpg/test/expected/preproc-cursor.c b/src/interfaces/ecpg/test/expected/preproc-cursor.c
index f7da753..ad86a56 100644
--- a/src/interfaces/ecpg/test/expected/preproc-cursor.c
+++ b/src/interfaces/ecpg/test/expected/preproc-cursor.c
@@ -187,7 +187,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
+ { ECPGopen(":curname1", NULL, __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 67 "cursor.pgc"
@@ -197,7 +197,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward from $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -212,7 +212,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -227,7 +227,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -243,7 +243,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
@@ -260,7 +260,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move in");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 in $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 in $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 87 "cursor.pgc"
@@ -270,7 +270,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -286,7 +286,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
@@ -303,7 +303,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 99 "cursor.pgc"
@@ -323,7 +323,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
+ { ECPGopen(":curname2", NULL, __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -337,7 +337,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -352,7 +352,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -367,7 +367,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -383,7 +383,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
@@ -400,7 +400,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -414,7 +414,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -430,7 +430,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
@@ -447,7 +447,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 140 "cursor.pgc"
@@ -483,7 +483,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname3", "st_id1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test1", "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -493,7 +493,7 @@ if (sqlca.sqlcode < 0) exit (1);}
if (sqlca.sqlcode < 0) exit (1);}
#line 153 "cursor.pgc"
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname5", "st_id1", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test2", "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -505,7 +505,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname5", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "fetch $0",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -520,7 +520,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -535,7 +535,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -551,7 +551,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
@@ -568,7 +568,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 174 "cursor.pgc"
@@ -578,7 +578,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -594,7 +594,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
@@ -611,7 +611,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 186 "cursor.pgc"
@@ -619,7 +619,7 @@ if (sqlca.sqlcode < 0) exit (1);}
if (sqlca.sqlcode < 0) exit (1);}
#line 186 "cursor.pgc"
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname5", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 187 "cursor.pgc"
@@ -663,7 +663,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname4", "st_id2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test1", "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -675,7 +675,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -690,7 +690,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -705,7 +705,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -721,7 +721,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
@@ -738,7 +738,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 226 "cursor.pgc"
@@ -748,7 +748,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -764,7 +764,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
@@ -781,7 +781,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 238 "cursor.pgc"
diff --git a/src/interfaces/ecpg/test/expected/preproc-outofscope.c b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
index 348e843..23ce610 100644
--- a/src/interfaces/ecpg/test/expected/preproc-outofscope.c
+++ b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
@@ -201,7 +201,7 @@ get_var1(MYTYPE **myvar0, MYNULLTYPE **mynullvar0)
static void
open_cur1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur cursor for select * from a1", ECPGt_EOIT,
+ { ECPGopen("mycur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur cursor for select * from a1", ECPGt_EOIT,
ECPGt_int,&((*( MYTYPE *)(ECPGget_var( 0)) ).id),(long)1,(long)1,sizeof( struct mytype ),
ECPGt_int,&((*( MYNULLTYPE *)(ECPGget_var( 1)) ).id),(long)1,(long)1,sizeof( struct mynulltype ),
ECPGt_char,&((*( MYTYPE *)(ECPGget_var( 0)) ).t),(long)64,(long)1,sizeof( struct mytype ),
@@ -225,7 +225,7 @@ if (sqlca.sqlcode < 0) exit (1);}
static void
get_record1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch mycur", ECPGt_EOIT,
+ { ECPGfetch("mycur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch mycur", ECPGt_EOIT,
ECPGt_int,&((*( MYTYPE *)(ECPGget_var( 0)) ).id),(long)1,(long)1,sizeof( struct mytype ),
ECPGt_int,&((*( MYNULLTYPE *)(ECPGget_var( 1)) ).id),(long)1,(long)1,sizeof( struct mynulltype ),
ECPGt_char,&((*( MYTYPE *)(ECPGget_var( 0)) ).t),(long)64,(long)1,sizeof( struct mytype ),
@@ -249,7 +249,7 @@ if (sqlca.sqlcode < 0) exit (1);}
static void
close_cur1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur", ECPGt_EOIT, ECPGt_EORT);
#line 58 "outofscope.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/preproc-variable.c b/src/interfaces/ecpg/test/expected/preproc-variable.c
index 7fd03ba..722c02e 100644
--- a/src/interfaces/ecpg/test/expected/preproc-variable.c
+++ b/src/interfaces/ecpg/test/expected/preproc-variable.c
@@ -190,7 +190,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select name , born , age , married , children from family", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select name , born , age , married , children from family", ECPGt_EOIT, ECPGt_EORT);
#line 63 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -206,7 +206,7 @@ if (sqlca.sqlcode < 0) exit (1);}
memset(i, 0, sizeof(ind_personal));
while (1) {
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT,
ECPGt_varchar,&(p->name),(long)BUFFERSIZ,(long)-1,sizeof( struct birthinfo ),
ECPGt_int,&(i->ind_name),(long)1,(long)-1,sizeof( struct birthinfo ),
ECPGt_long,&(p->birth.born),(long)1,(long)1,sizeof( struct birthinfo ),
@@ -241,7 +241,7 @@ if (sqlca.sqlcode < 0) exit (1);}
}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 89 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/sql-binary.c b/src/interfaces/ecpg/test/expected/sql-binary.c
index b91ab7b..ce64de5 100644
--- a/src/interfaces/ecpg/test/expected/sql-binary.c
+++ b/src/interfaces/ecpg/test/expected/sql-binary.c
@@ -111,12 +111,12 @@ main (void)
/* declare C cursor for select name , accs , byte from empl where idnum = $1 */
#line 58 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select name , accs , byte from empl where idnum = $1 ",
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select name , accs , byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 59 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
@@ -133,7 +133,7 @@ main (void)
printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);}
#line 69 "binary.pgc"
@@ -142,12 +142,12 @@ main (void)
/* declare B binary cursor for select name , accs , byte from empl where idnum = $1 */
#line 72 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare B binary cursor for select name , accs , byte from empl where idnum = $1 ",
+ { ECPGopen("B", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare B binary cursor for select name , accs , byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 73 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch B", ECPGt_EOIT,
+ { ECPGfetch("B", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch B", ECPGt_EOIT,
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
@@ -162,7 +162,7 @@ main (void)
exit (sqlca.sqlcode);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close B", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("B", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close B", ECPGt_EOIT, ECPGt_EORT);}
#line 81 "binary.pgc"
@@ -176,12 +176,12 @@ main (void)
/* declare A binary cursor for select byte from empl where idnum = $1 */
#line 89 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare A binary cursor for select byte from empl where idnum = $1 ",
+ { ECPGopen("A", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare A binary cursor for select byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 90 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch A", ECPGt_EOIT,
+ { ECPGfetch("A", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch A", ECPGt_EOIT,
ECPGt_char,&(pointer),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
#line 91 "binary.pgc"
@@ -192,7 +192,7 @@ main (void)
exit (sqlca.sqlcode);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close A", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("A", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close A", ECPGt_EOIT, ECPGt_EORT);}
#line 98 "binary.pgc"
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.c b/src/interfaces/ecpg/test/expected/sql-declare.c
new file mode 100644
index 0000000..2a7ea0d
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.c
@@ -0,0 +1,2592 @@
+/* Processed by ecpg (regression mode) */
+/* These include files are added by the preprocessor */
+#include <ecpglib.h>
+#include <ecpgerrno.h>
+#include <sqlca.h>
+/* End of automatic include section */
+#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
+
+#line 1 "declare.pgc"
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* exec sql whenever sqlerror sqlprint ; */
+#line 5 "declare.pgc"
+
+
+
+#line 1 "sqlca.h"
+#ifndef POSTGRES_SQLCA_H
+#define POSTGRES_SQLCA_H
+
+#ifndef PGDLLIMPORT
+#if defined(WIN32) || defined(__CYGWIN__)
+#define PGDLLIMPORT __declspec (dllimport)
+#else
+#define PGDLLIMPORT
+#endif /* __CYGWIN__ */
+#endif /* PGDLLIMPORT */
+
+#define SQLERRMC_LEN 150
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+struct sqlca_t
+{
+ char sqlcaid[8];
+ long sqlabc;
+ long sqlcode;
+ struct
+ {
+ int sqlerrml;
+ char sqlerrmc[SQLERRMC_LEN];
+ } sqlerrm;
+ char sqlerrp[8];
+ long sqlerrd[6];
+ /* Element 0: empty */
+ /* 1: OID of processed tuple if applicable */
+ /* 2: number of rows processed */
+ /* after an INSERT, UPDATE or */
+ /* DELETE statement */
+ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ char sqlwarn[8];
+ /* Element 0: set to 'W' if at least one other is 'W' */
+ /* 1: if 'W' at least one character string */
+ /* value was truncated when it was */
+ /* stored into a host variable. */
+
+ /*
+ * 2: if 'W' a (hopefully) non-fatal notice occurred
+ */ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ /* 6: empty */
+ /* 7: empty */
+
+ char sqlstate[5];
+};
+
+struct sqlca_t *ECPGget_sqlca(void);
+
+#ifndef POSTGRES_ECPG_INTERNAL
+#define sqlca (*ECPGget_sqlca())
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#line 7 "declare.pgc"
+
+
+#line 1 "regression.h"
+
+
+
+
+
+
+#line 8 "declare.pgc"
+
+
+#define OUT_ARRAY_SZIE 20
+#define TEST_CASE_NUM 29
+#define COLUMN_NUM 3
+#define FIELD_NAME_LEN 30
+
+void declare_test(char * tc_name);
+int createTable(void);
+void dropTable(void);
+void reCreateTable(void);
+void truncateTable(void);
+void commitTable(void);
+void reset(void);
+int initValues(void);
+void releaseValues(void);
+void printResultF123(char *tc_name, int loop);
+void printResultIndF123(char *tc_name, int loop);
+int startManualTest(char *in);
+int startAutoTest(void);
+void printFieldName(char *);
+
+/* exec sql begin declare section */
+
+ //input variables
+
+
+
+
+ //output variables
+
+
+
+
+
+
+
+
+
+
+#line 33 "declare.pgc"
+ int in_f1 = 1 ;
+
+#line 34 "declare.pgc"
+ double in_f2 = 10 ;
+
+#line 35 "declare.pgc"
+ char in_f3 [ 20 ] = { "one" } ;
+
+#line 38 "declare.pgc"
+ int f1 [ OUT_ARRAY_SZIE ] ;
+
+#line 39 "declare.pgc"
+ int f2 [ OUT_ARRAY_SZIE ] ;
+
+#line 40 "declare.pgc"
+ char f3 [ OUT_ARRAY_SZIE ] [ 20 ] ;
+
+#line 42 "declare.pgc"
+ char field_name [ COLUMN_NUM ] [ FIELD_NAME_LEN ] ;
+
+#line 45 "declare.pgc"
+ int ind_f1 [ OUT_ARRAY_SZIE ] , ind_f2 [ OUT_ARRAY_SZIE ] , ind_f3 [ OUT_ARRAY_SZIE ] ;
+/* exec sql end declare section */
+#line 47 "declare.pgc"
+
+
+int
+main (int argc, char *argv[])
+{
+ setlocale(LC_ALL, "C");
+
+ ECPGdebug(1, stderr);
+
+ /* connect to database */
+ { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , "con1", 0);
+#line 57 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 57 "declare.pgc"
+
+ { ECPGconnect(__LINE__, 0, "ecpg2_regression" , NULL, NULL , "con2", 0);
+#line 58 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 58 "declare.pgc"
+
+ { ECPGconnect(__LINE__, 0, "ecpg3_regression" , NULL, NULL , "con3", 0);
+#line 59 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 59 "declare.pgc"
+
+
+ if(initValues())
+ {
+ printf("Error: initValues return error!\n");
+
+ releaseValues();
+ return -1;
+ }
+
+ if(argc == 2) //start manual test
+ {
+ printf("Start manual test! \n");
+ startManualTest(argv[1]);
+ }
+ else //start auto test
+ {
+ startAutoTest();
+ }
+
+ { ECPGdisconnect(__LINE__, "con1");
+#line 79 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 79 "declare.pgc"
+
+
+ { ECPGdisconnect(__LINE__, "ALL");
+#line 81 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 81 "declare.pgc"
+
+
+ releaseValues();
+
+ return (0);
+}
+
+int startManualTest(char *in)
+{
+ if(!strcmp(in,"cr"))
+ {
+ createTable();
+ }
+ else if(!strcmp(in,"dr"))
+ {
+ dropTable();
+ }
+ else if(!strcmp(in,"re"))
+ {
+ reCreateTable();
+ }
+ else if(!strcmp(in,"help"))
+ {
+ printf("====Supporting the following parameters====\n");
+ printf("1. cr -- create tables\n");
+ printf("2. dr -- drop tables\n");
+ printf("3. re -- drop tables and create tables\n");
+ printf("4. testcaseX where X is a digit form 1 to %d\n",TEST_CASE_NUM);
+ printf("If you don't give any parameter, the program will start the test from the testcase1 to testcase%d automatically\n",TEST_CASE_NUM);
+ }
+ else
+ {
+ declare_test(in);
+ }
+
+ commitTable();
+
+ return 0;
+}
+
+int startAutoTest()
+{
+ int i;
+ char tc_name[20];
+
+ dropTable();
+
+ if(createTable())
+ {
+ printf("Error: createTable return error!\n");
+ return -1;
+ }
+
+ for(i=1;i<=TEST_CASE_NUM;i++)
+ {
+ sprintf(tc_name,"testcase%d",i);
+ declare_test(tc_name);
+ }
+
+ dropTable();
+
+ return 0;
+}
+
+
+/*
+ * default connection: con3
+ * Non-default connection: con1, con2
+ *
+ * testcase1. using DECLARE STATEMENT, let CURSOR statement precede PREPARE statement
+ * ---test result: ok
+ * testcase2. without using DECLARE STATEMENT, let CURSOR statement precede PREPARE statement
+ * ---test result: ok
+ *
+ * testcase3. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase4. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase5. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase6. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase7. using DECLARE STATEMENT at con1, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase8. using DECLARE STATEMENT at con1, using DESCRIBE statement at con2
+ * ---test result: ok
+ *
+ * testcase9. using DECLARE STATEMENT at con3, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase10. using DECLARE STATEMENT at con3, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase11. using DECLARE STATEMENT at con3, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase12. using DECLARE STATEMENT at con3, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase13. using DECLARE STATEMENT at con3, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase14. using DECLARE STATEMENT at con3, using DESCRIBE statement at con2
+ * ---test result: ok
+ *
+ * testcase15. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase16. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase17. using DECLARE STATEMENT without using AT clause, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase18. using DECLARE STATEMENT without using AT clause, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase19. using DECLARE STATEMENT without using AT clause, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase20. using DECLARE STATEMENT without using AT clause, using DESCRIBE statement at con2
+ * ---test result: ok
+
+ * testcase21. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ * testcase22. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ * testcase23. using DECLARE STATEMENT at con1, using DESCRIBE statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ *
+ * testcase24. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * using host variable as declared name
+ * ---test result:
+ *
+ * testcase25. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ * testcase26. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ * testcase27. using DECLARE STATEMENT at con1, using PREPARE and DESCRIBE statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ *
+ * testcase28. Using host variable as cursor name in the DECLARE/OPEN CURSOR statement,
+ * using the content in the host variable as the cursor name in the CLOSE CURSOR statement
+ * This is nothing with DECLARE STATEMENT feature, this case just verify a bug that cursor name can be closed by using
+ * content of host variable while the cursor name is declared/opened by using the host variable.
+ * ---test result: ok
+ *
+ * testcase29. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement without using AT clause
+ * one cursor is set to "open" and "close" twice.
+ * Check the declared name can be referred by the cursor at the second time correctly
+ * ---test result: ok
+ */
+void declare_test(char * tc_name)
+{
+ /* exec sql begin declare section */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#line 229 "declare.pgc"
+ int i ;
+
+#line 231 "declare.pgc"
+ char * selectString = "SELECT f1,f2,f3 FROM source where f1<4" ;
+
+#line 232 "declare.pgc"
+ char * selectTb1 = "SELECT * FROM tb1" ;
+
+#line 234 "declare.pgc"
+ char * stmt_4 = "str_stmt_4" ;
+
+#line 235 "declare.pgc"
+ char * stmt_6 = "str_stmt_6" ;
+
+#line 236 "declare.pgc"
+ char * stmt_8 = "str_stmt_8" ;
+
+#line 238 "declare.pgc"
+ char * cur_6 = "str_cur_6" ;
+
+#line 240 "declare.pgc"
+ char * desc_8 = "str_desc_8" ;
+/* exec sql end declare section */
+#line 242 "declare.pgc"
+
+
+ if(!strcmp(tc_name,"testcase1"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_1");
+#line 248 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 248 "declare.pgc"
+
+ /* declare cur_1 cursor for $1 */
+#line 249 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_1", selectString);
+#line 250 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 250 "declare.pgc"
+
+ { ECPGopen("cur_1", "stmt_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_1 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 251 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 251 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 253 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_1", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 257 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 257 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 257 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_1", ECPGt_EOIT, ECPGt_EORT);
+#line 261 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 261 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_1");
+#line 262 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 262 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase2"))
+ {
+ reset();
+
+ /* declare cur_2 cursor for $1 */
+#line 270 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_2", selectString);
+#line 271 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 271 "declare.pgc"
+
+ { ECPGopen("cur_2", "stmt_2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_2 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 272 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 272 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 274 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_2", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 278 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 278 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 278 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_2", ECPGt_EOIT, ECPGt_EORT);
+#line 282 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 282 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_2");
+#line 283 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 283 "declare.pgc"
+
+
+ /* exec sql whenever not found continue ; */
+#line 285 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase3"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_3");
+#line 293 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 293 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_3", selectString);
+#line 294 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 294 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "stmt_3", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 295 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 295 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_3");
+#line 297 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 297 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase4"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_4");
+#line 305 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 305 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_4", selectString);
+#line 306 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 306 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, "stmt_4", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 307 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 307 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_4");
+#line 309 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 309 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", stmt_4);
+#line 315 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 315 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, stmt_4, selectString);
+#line 316 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 316 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, stmt_4, ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 317 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 317 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, stmt_4);
+#line 319 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 319 "declare.pgc"
+
+
+ printResultF123(NULL,3);
+ }
+ else if(!strcmp(tc_name,"testcase5"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_5");
+#line 327 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 327 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_5", selectString);
+#line 328 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 328 "declare.pgc"
+
+ /* declare cur_5 cursor for $1 */
+#line 329 "declare.pgc"
+
+ { ECPGopen("cur_5", "stmt_5", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_5 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_5", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 330 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 330 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 332 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_5", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_5", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 336 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 336 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 336 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_5", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_5", ECPGt_EOIT, ECPGt_EORT);
+#line 340 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 340 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_5");
+#line 341 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 341 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase6"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_6");
+#line 349 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 349 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_6", selectString);
+#line 350 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 350 "declare.pgc"
+
+ /* declare cur_6 cursor for $1 */
+#line 351 "declare.pgc"
+
+ { ECPGopen("cur_6", "stmt_6", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare cur_6 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_6", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 352 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 352 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 354 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_6", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch cur_6", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 358 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 358 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 358 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_6", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close cur_6", ECPGt_EOIT, ECPGt_EORT);
+#line 362 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 362 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_6");
+#line 363 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 363 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 364 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", stmt_6);
+#line 370 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 370 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, stmt_6, selectString);
+#line 371 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 371 "declare.pgc"
+
+ ECPGset_var( 0, &( cur_6 ), __LINE__);\
+ /* declare $0 cursor for $1 */
+#line 372 "declare.pgc"
+
+ { ECPGopen(":cur_6", stmt_6, __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare $0 cursor for $1",
+ ECPGt_char,&(cur_6),(long)0,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char_variable,(ECPGprepared_statement("con2", stmt_6, __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 373 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 373 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 375 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch(":cur_6", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch $0",
+ ECPGt_char,&(cur_6),(long)0,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 379 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 379 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 379 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose(":cur_6", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close $0",
+ ECPGt_char,&(cur_6),(long)0,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 383 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 383 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", stmt_6);
+#line 384 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 384 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 385 "declare.pgc"
+
+
+ printResultF123(NULL,3);
+ }
+ else if(!strcmp(tc_name,"testcase7"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_7");
+#line 393 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 393 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_7");
+#line 395 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 395 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_7", selectTb1);
+#line 396 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 396 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, NULL, "stmt_7",
+ ECPGt_descriptor, "desc_7", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 397 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_7", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 401 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 401 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_7");
+#line 404 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 404 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_7");
+#line 405 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 405 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase8"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_8");
+#line 413 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 413 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_8");
+#line 415 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 415 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_8", selectTb1);
+#line 416 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 416 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", "stmt_8",
+ ECPGt_descriptor, "desc_8", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 417 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_8", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 421 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 421 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_8");
+#line 424 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 424 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_8");
+#line 425 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 425 "declare.pgc"
+
+
+ printFieldName(tc_name);
+
+
+ reset();
+
+ ECPGallocate_desc(__LINE__, (desc_8));
+#line 432 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 432 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con1", stmt_8);
+#line 434 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 434 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, stmt_8, selectTb1);
+#line 435 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 435 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", stmt_8,
+ ECPGt_descriptor, (desc_8), 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 436 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, (desc_8), i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 440 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 440 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, (desc_8));
+#line 443 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 443 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", stmt_8);
+#line 444 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 444 "declare.pgc"
+
+
+ printFieldName(NULL);
+ }
+ else if(!strcmp(tc_name,"testcase9"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_9");
+#line 452 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 452 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_9", selectString);
+#line 453 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 453 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "stmt_9", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 454 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 454 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_9");
+#line 456 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 456 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase10"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_10");
+#line 464 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 464 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_10", selectString);
+#line 465 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 465 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, "stmt_10", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 466 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 466 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_10");
+#line 468 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 468 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase11"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_11");
+#line 476 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 476 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_11", selectString);
+#line 477 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 477 "declare.pgc"
+
+ /* declare cur_11 cursor for $1 */
+#line 478 "declare.pgc"
+
+ { ECPGopen("cur_11", "stmt_11", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_11 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_11", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 479 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 479 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 481 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_11", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_11", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 485 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 485 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 485 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_11", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_11", ECPGt_EOIT, ECPGt_EORT);
+#line 489 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 489 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_11");
+#line 490 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 490 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase12"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_12");
+#line 498 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 498 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_12", selectString);
+#line 499 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 499 "declare.pgc"
+
+ /* declare cur_12 cursor for $1 */
+#line 500 "declare.pgc"
+
+ { ECPGopen("cur_12", "stmt_12", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare cur_12 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_12", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 501 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 501 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 503 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_12", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch cur_12", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 507 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 507 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 507 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_12", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close cur_12", ECPGt_EOIT, ECPGt_EORT);
+#line 511 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 511 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_12");
+#line 512 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 512 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 513 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase13"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_13");
+#line 521 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 521 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_13");
+#line 523 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 523 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_13", selectTb1);
+#line 524 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 524 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, NULL, "stmt_13",
+ ECPGt_descriptor, "desc_13", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 525 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_13", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 529 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 529 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_13");
+#line 532 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 532 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_13");
+#line 533 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 533 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase14"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_14");
+#line 541 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 541 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con3", "stmt_14");
+#line 543 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 543 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_14", selectTb1);
+#line 544 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 544 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", "stmt_14",
+ ECPGt_descriptor, "desc_14", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 545 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_14", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 549 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 549 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_14");
+#line 552 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 552 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_14");
+#line 553 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 553 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase15"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_15");
+#line 561 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 561 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_15", selectString);
+#line 562 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 562 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "stmt_15", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 563 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 563 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_15");
+#line 565 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 565 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase16"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_16");
+#line 573 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 573 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_16", selectString);
+#line 574 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 574 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, "stmt_16", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 575 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 575 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_16");
+#line 577 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 577 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase17"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_17");
+#line 585 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 585 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_17", selectString);
+#line 586 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 586 "declare.pgc"
+
+ /* declare cur_17 cursor for $1 */
+#line 587 "declare.pgc"
+
+ { ECPGopen("cur_17", "stmt_17", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_17 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_17", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 588 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 588 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 590 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_17", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_17", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 594 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 594 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 594 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_17", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_17", ECPGt_EOIT, ECPGt_EORT);
+#line 598 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 598 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_17");
+#line 599 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 599 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase18"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_18");
+#line 607 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 607 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_18", selectString);
+#line 608 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 608 "declare.pgc"
+
+ /* declare cur_18 cursor for $1 */
+#line 609 "declare.pgc"
+
+ { ECPGopen("cur_18", "stmt_18", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare cur_18 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_18", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 610 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 610 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 612 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_18", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch cur_18", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 616 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 616 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 616 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_18", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close cur_18", ECPGt_EOIT, ECPGt_EORT);
+#line 620 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 620 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_18");
+#line 621 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 621 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 622 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase19"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_19");
+#line 630 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 630 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_19");
+#line 632 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 632 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_19", selectTb1);
+#line 633 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 633 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, NULL, "stmt_19",
+ ECPGt_descriptor, "desc_19", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 634 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_19", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 638 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 638 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_19");
+#line 641 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 641 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_19");
+#line 642 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 642 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase20"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_20");
+#line 650 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 650 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_20");
+#line 652 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 652 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_20", selectTb1);
+#line 653 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 653 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", "stmt_20",
+ ECPGt_descriptor, "desc_20", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 654 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_20", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 658 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 658 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_20");
+#line 661 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 661 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_20");
+#line 662 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 662 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase21"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_21");
+#line 670 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 670 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_21", selectString);
+#line 671 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 671 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, "stmt_21", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 672 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 672 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_21");
+#line 674 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 674 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase22"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_22");
+#line 682 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 682 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_22", selectString);
+#line 683 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 683 "declare.pgc"
+
+ /* declare \"cur_22\" cursor for $1 */
+#line 684 "declare.pgc"
+
+ { ECPGopen("\"cur_22\"", "stmt_22", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare \"cur_22\" cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_22", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 685 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 685 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 687 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("\"cur_22\"", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch \"cur_22\"", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 691 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 691 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 691 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("\"cur_22\"", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close \"cur_22\"", ECPGt_EOIT, ECPGt_EORT);
+#line 695 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 695 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_22");
+#line 696 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 696 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 697 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase23"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_23");
+#line 705 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 705 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_23");
+#line 707 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 707 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_23", selectTb1);
+#line 708 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 708 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", "stmt_23",
+ ECPGt_descriptor, "desc_23", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 709 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_23", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 713 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 713 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_23");
+#line 716 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 716 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_23");
+#line 717 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 717 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase24"))
+ {
+ /* exec sql begin declare section */
+
+
+#line 724 "declare.pgc"
+ char * char_stmt_24 = "strSTMT24" ;
+/* exec sql end declare section */
+#line 725 "declare.pgc"
+
+
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", char_stmt_24);
+#line 729 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 729 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, char_stmt_24, selectString);
+#line 730 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 730 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, char_stmt_24, ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 731 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 731 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, char_stmt_24);
+#line 733 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 733 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase25"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_25");
+#line 741 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 741 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "pre_stmt_25", selectString);
+#line 742 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 742 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, "pre_stmt_25", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)OUT_ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)OUT_ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 743 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 743 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "pre_stmt_25");
+#line 745 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 745 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase26"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_26");
+#line 753 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 753 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "pre_stmt_26", selectString);
+#line 754 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 754 "declare.pgc"
+
+ /* declare cur_26 cursor for $1 */
+#line 755 "declare.pgc"
+
+ { ECPGopen("cur_26", "pre_stmt_26", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare cur_26 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "pre_stmt_26", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 756 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 756 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 758 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_26", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch cur_26", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 762 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 762 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 762 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_26", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close cur_26", ECPGt_EOIT, ECPGt_EORT);
+#line 766 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 766 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "pre_stmt_26");
+#line 767 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 767 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 768 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase27"))
+ {
+ reset();
+
+ ECPGallocate_desc(__LINE__, "desc_27");
+#line 776 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 776 "declare.pgc"
+
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_27");
+#line 778 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 778 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "pre_stmt_27", selectTb1);
+#line 779 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 779 "declare.pgc"
+
+ { ECPGdescribe(__LINE__, 0, 0, "con2", "pre_stmt_27",
+ ECPGt_descriptor, "desc_27", 1L, 1L, 1L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
+#line 780 "declare.pgc"
+
+
+ for(i=1; i<4; i++)
+ {
+ { ECPGget_desc(__LINE__, "desc_27", i,ECPGd_name,
+ ECPGt_char,(field_name[i-1]),(long)FIELD_NAME_LEN,(long)1,(FIELD_NAME_LEN)*sizeof(char), ECPGd_EODT);
+
+#line 784 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 784 "declare.pgc"
+
+ }
+
+ ECPGdeallocate_desc(__LINE__, "desc_27");
+#line 787 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();
+#line 787 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "pre_stmt_27");
+#line 788 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 788 "declare.pgc"
+
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase28"))
+ {
+ /* exec sql begin declare section */
+
+
+#line 795 "declare.pgc"
+ char * cur_28 = "str_cur_28" ;
+/* exec sql end declare section */
+#line 796 "declare.pgc"
+
+
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_28");
+#line 800 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 800 "declare.pgc"
+
+ { ECPGprepare(__LINE__, "con2", 0, "stmt_28", selectString);
+#line 801 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 801 "declare.pgc"
+
+ ECPGset_var( 1, &( cur_28 ), __LINE__);\
+ /* declare $0 cursor for $1 */
+#line 802 "declare.pgc"
+
+ { ECPGopen(":cur_28", "stmt_28", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare $0 cursor for $1",
+ ECPGt_char,&(cur_28),(long)0,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_28", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 803 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 803 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 805 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch(":cur_28", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch $0",
+ ECPGt_char,&(cur_28),(long)0,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 809 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 809 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 809 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("str_cur_28", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close str_cur_28", ECPGt_EOIT, ECPGt_EORT);
+#line 813 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 813 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, "con2", "stmt_28");
+#line 814 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 814 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 815 "declare.pgc"
+
+
+ printResultF123(tc_name,3);
+
+ }
+ else if(!strcmp(tc_name,"testcase29"))
+ {
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_29");
+#line 824 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 824 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_29", selectString);
+#line 825 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 825 "declare.pgc"
+
+ /* declare cur_29 cursor for $1 */
+#line 826 "declare.pgc"
+
+
+ { ECPGopen("cur_29", "stmt_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_29 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_29", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 828 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 828 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 830 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_29", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 834 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 834 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 834 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_29", ECPGt_EOIT, ECPGt_EORT);
+#line 838 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 838 "declare.pgc"
+
+ printResultF123(tc_name,3);
+
+ reset();
+ /* Open and fetch cursor again */
+ { ECPGopen("cur_29", "stmt_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_29 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_29", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 843 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 843 "declare.pgc"
+
+ i = 0;
+ while(1)
+ {
+ { ECPGfetch("cur_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_29", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 847 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 847 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 847 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_29", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_29", ECPGt_EOIT, ECPGt_EORT);
+#line 851 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 851 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_29");
+#line 852 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 852 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 853 "declare.pgc"
+
+
+ printResultF123(NULL,3);
+ }
+ else
+ {
+ /* exec sql whenever not found continue ; */
+#line 859 "declare.pgc"
+
+ printf("Sorry, there isn't this testcase: %s!\n",tc_name);
+ }
+}
+
+
+/*
+ * success -- 0
+ * failed -- -1
+ */
+int createTable()
+{
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 871 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 871 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 872 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 872 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 873 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 873 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "create table tb1 ( con1_f1 integer , con1_f2 integer , con1_f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 875 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 875 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "create table tb1 ( con2_f1 integer , con2_f2 integer , con2_f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 876 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 876 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "create table tb1 ( con3_f1 integer , con3_f2 integer , con3_f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 877 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 877 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 879 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 879 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 880 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 880 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 881 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 881 "declare.pgc"
+
+
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 885 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 885 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 886 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 886 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 3 , 30 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 887 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 887 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 889 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 889 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 890 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 890 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 3 , 30 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 891 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 891 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con3' )", ECPGt_EOIT, ECPGt_EORT);
+#line 893 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 893 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con3' )", ECPGt_EOIT, ECPGt_EORT);
+#line 894 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 894 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "insert into source values ( 3 , 30 , 'db on con3' )", ECPGt_EOIT, ECPGt_EORT);
+#line 895 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 895 "declare.pgc"
+
+
+ commitTable();
+
+ return 0;
+}
+
+/*
+ * success -- 0
+ * failed -- -1
+ */
+void dropTable()
+{
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 908 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 908 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 909 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 909 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 910 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 910 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "drop table if exists target", ECPGt_EOIT, ECPGt_EORT);
+#line 912 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 912 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "drop table if exists target", ECPGt_EOIT, ECPGt_EORT);
+#line 913 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 913 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "drop table if exists target", ECPGt_EOIT, ECPGt_EORT);
+#line 914 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 914 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "drop table if exists tb1", ECPGt_EOIT, ECPGt_EORT);
+#line 916 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 916 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "drop table if exists tb1", ECPGt_EOIT, ECPGt_EORT);
+#line 917 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 917 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "drop table if exists tb1", ECPGt_EOIT, ECPGt_EORT);
+#line 918 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 918 "declare.pgc"
+
+
+ commitTable();
+}
+
+void reCreateTable()
+{
+ dropTable();
+ createTable();
+}
+
+void truncateTable()
+{
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "truncate table target", ECPGt_EOIT, ECPGt_EORT);
+#line 931 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 931 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "truncate table target", ECPGt_EOIT, ECPGt_EORT);
+#line 932 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 932 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con3", 0, ECPGst_normal, "truncate table target", ECPGt_EOIT, ECPGt_EORT);
+#line 933 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 933 "declare.pgc"
+
+
+ commitTable();
+}
+
+void commitTable()
+{
+ { ECPGtrans(__LINE__, "con1", "commit");
+#line 940 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 940 "declare.pgc"
+
+ { ECPGtrans(__LINE__, "con2", "commit");
+#line 941 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 941 "declare.pgc"
+
+ { ECPGtrans(__LINE__, "con3", "commit");
+#line 942 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 942 "declare.pgc"
+
+}
+
+/*
+ * reset all the output variables
+ */
+void reset()
+{
+ int i;
+
+ truncateTable();
+
+ memset(f1,0,sizeof(f1));
+ memset(f2,0,sizeof(f2));
+ memset(f3,0,sizeof(f3));
+
+ for(i=0; i<COLUMN_NUM; i++)
+ {
+ memset(field_name[i],0, FIELD_NAME_LEN);
+ }
+}
+
+int initValues()
+{
+ return 0;
+}
+
+void releaseValues()
+{
+}
+
+void printResultF123(char *tc_name, int loop)
+{
+ int i;
+
+ if(loop>OUT_ARRAY_SZIE)
+ {
+ loop = OUT_ARRAY_SZIE;
+ }
+
+ if(tc_name)
+ {
+ printf("****%s test results:****\n",tc_name);
+ }
+
+ for (i = 0; i < loop; i++)
+ printf("f1=%d, f2=%d, f3=%s\n", f1[i], f2[i], f3[i]);
+
+ printf("\n");
+}
+
+void printResultIndF123(char *tc_name, int loop)
+{
+ int i;
+
+ if(loop>OUT_ARRAY_SZIE)
+ {
+ loop = OUT_ARRAY_SZIE;
+ }
+
+ if(tc_name)
+ {
+ printf("****%s indicator results:****\n",tc_name);
+ }
+
+ for (i = 0; i < loop; i++)
+ printf("ind_f1=%d, ind_f2=%d, ind_f3=%d\n", ind_f1[i], ind_f2[i], ind_f3[i]);
+
+ printf("\n");
+}
+
+void printFieldName(char *tc_name)
+{
+ int i;
+
+ if(tc_name)
+ {
+ printf("****%s test results:****\n",tc_name);
+ }
+
+ for (i = 0; i < COLUMN_NUM; i++)
+ {
+ printf("field[%d]'s name = %s\n", i, field_name[i]);
+ }
+
+ printf("\n");
+}
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stderr b/src/interfaces/ecpg/test/expected/sql-declare.stderr
new file mode 100644
index 0000000..beeb8ea
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.stderr
@@ -0,0 +1,2393 @@
+[NO_PID]: ECPGdebug: set to 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg1_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg2_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg3_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 908: query: drop table if exists source; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 908: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 908: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 909: query: drop table if exists source; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 909: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 909: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 910: query: drop table if exists source; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 910: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 910: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 912: query: drop table if exists target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 912: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 912: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 913: query: drop table if exists target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 913: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 913: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 914: query: drop table if exists target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 914: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 914: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 916: query: drop table if exists tb1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 916: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 916: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 917: query: drop table if exists tb1; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 917: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 917: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 918: query: drop table if exists tb1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 918: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 918: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 871: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 871: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 871: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 872: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 872: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 872: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 873: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 873: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 873: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 875: query: create table tb1 ( con1_f1 integer , con1_f2 integer , con1_f3 varchar ( 20 ) ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 875: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 875: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 876: query: create table tb1 ( con2_f1 integer , con2_f2 integer , con2_f3 varchar ( 20 ) ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 876: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 876: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 877: query: create table tb1 ( con3_f1 integer , con3_f2 integer , con3_f3 varchar ( 20 ) ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 877: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 877: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 879: query: create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 879: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 879: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 880: query: create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 880: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 880: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 881: query: create table target ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 881: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 881: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 885: query: insert into source values ( 1 , 10 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 885: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 885: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 886: query: insert into source values ( 2 , 20 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 886: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 886: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 887: query: insert into source values ( 3 , 30 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 887: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 887: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 889: query: insert into source values ( 1 , 10 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 889: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 889: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 890: query: insert into source values ( 2 , 20 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 890: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 890: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 891: query: insert into source values ( 3 , 30 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 891: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 891: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 893: query: insert into source values ( 1 , 10 , 'db on con3' ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 893: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 893: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 894: query: insert into source values ( 2 , 20 , 'db on con3' ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 894: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 894: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 895: query: insert into source values ( 3 , 30 , 'db on con3' ); with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 895: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 895: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 250: name stmt_1; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 251: query: declare cur_1 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 251: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 251: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: query: fetch cur_1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 257: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: query: fetch cur_1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 257: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: query: fetch cur_1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 257: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 257: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: query: fetch cur_1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 257: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 257: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 257: no data found on line 257
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 261: query: close cur_1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 261: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 261: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 262: name stmt_1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 271: name stmt_2; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 272: query: declare cur_2 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 272: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 272: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: query: fetch cur_2; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 278: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: query: fetch cur_2; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 278: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: query: fetch cur_2; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 278: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 278: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: query: fetch cur_2; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 278: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 278: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 278: no data found on line 278
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 282: query: close cur_2; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 282: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 282: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 283: name stmt_2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 293: declared name stmt_3 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 294: name stmt_3; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 295: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 295: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 295: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 295: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 297: name stmt_3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 305: declared name stmt_4 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 306: name stmt_4; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 307: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 307: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 307: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 307: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 309: name stmt_4
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 315: declared name str_stmt_4 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 316: name str_stmt_4; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 317: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 317: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 317: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 317: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 319: name str_stmt_4
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 327: declared name stmt_5 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 328: name stmt_5; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 330: query: declare cur_5 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 330: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 330: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: query: fetch cur_5; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 336: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: query: fetch cur_5; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 336: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: query: fetch cur_5; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 336: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 336: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: query: fetch cur_5; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 336: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 336: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 336: no data found on line 336
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 340: query: close cur_5; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 340: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 340: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 341: name stmt_5
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 349: declared name stmt_6 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 350: name stmt_6; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 352: query: declare cur_6 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 352: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 352: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: query: fetch cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 358: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: query: fetch cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 358: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: query: fetch cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 358: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 358: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: query: fetch cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 358: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 358: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 358: no data found on line 358
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 362: query: close cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 362: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 362: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 363: name stmt_6
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 370: declared name str_stmt_6 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 371: name str_stmt_6; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 373: query: declare str_cur_6 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 373: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 373: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: query: fetch str_cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 379: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: query: fetch str_cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 379: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: query: fetch str_cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 379: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 379: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: query: fetch str_cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 379: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 379: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 379: no data found on line 379
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 383: query: close str_cur_6; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 383: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 383: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 384: name str_stmt_6
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 395: declared name stmt_7 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 396: name stmt_7; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 405: name stmt_7
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 415: declared name stmt_8 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 416: name stmt_8; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 425: name stmt_8
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 434: declared name str_stmt_8 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 435: name str_stmt_8; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 444: name str_stmt_8
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 452: declared name stmt_9 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 453: name stmt_9; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 454: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 454: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 454: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 454: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 456: name stmt_9
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 464: declared name stmt_10 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 465: name stmt_10; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 466: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 466: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 466: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 466: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 468: name stmt_10
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 476: declared name stmt_11 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 477: name stmt_11; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 479: query: declare cur_11 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 479: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 479: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: query: fetch cur_11; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 485: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: query: fetch cur_11; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 485: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: query: fetch cur_11; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 485: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 485: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: query: fetch cur_11; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 485: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 485: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 485: no data found on line 485
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 489: query: close cur_11; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 489: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 489: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 490: name stmt_11
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 498: declared name stmt_12 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 499: name stmt_12; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 501: query: declare cur_12 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 501: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 501: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: query: fetch cur_12; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 507: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: query: fetch cur_12; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 507: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: query: fetch cur_12; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 507: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 507: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: query: fetch cur_12; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 507: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 507: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 507: no data found on line 507
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 511: query: close cur_12; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 511: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 511: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 512: name stmt_12
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 523: declared name stmt_13 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 524: name stmt_13; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 533: name stmt_13
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 543: declared name stmt_14 on connection: "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 544: name stmt_14; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 553: name stmt_14
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 562: name stmt_15; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 563: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 563: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 563: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 563: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 565: name stmt_15
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 574: name stmt_16; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 575: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 575: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 575: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 575: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 577: name stmt_16
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 586: name stmt_17; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 588: query: declare cur_17 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 588: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 588: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: query: fetch cur_17; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 594: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: query: fetch cur_17; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 594: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: query: fetch cur_17; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 594: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 594: RESULT: db on con3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: query: fetch cur_17; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 594: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 594: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 594: no data found on line 594
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 598: query: close cur_17; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 598: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 598: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 599: name stmt_17
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 608: name stmt_18; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 610: query: declare cur_18 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 610: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 610: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: query: fetch cur_18; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 616: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: query: fetch cur_18; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 616: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: query: fetch cur_18; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 616: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 616: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: query: fetch cur_18; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 616: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 616: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 616: no data found on line 616
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 620: query: close cur_18; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 620: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 620: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 621: name stmt_18
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 633: name stmt_19; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con3_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 642: name stmt_19
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 653: name stmt_20; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 662: name stmt_20
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 670: declared name stmt_21 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 671: name stmt_21; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 672: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 672: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 672: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 672: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 674: name stmt_21
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 682: declared name stmt_22 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 683: name stmt_22; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 685: query: declare "cur_22" cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 685: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 685: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: query: fetch "cur_22"; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 691: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: query: fetch "cur_22"; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 691: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: query: fetch "cur_22"; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 691: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 691: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: query: fetch "cur_22"; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 691: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 691: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 691: no data found on line 691
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 695: query: close "cur_22"; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 695: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 695: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 696: name stmt_22
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 707: declared name stmt_23 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 708: name stmt_23; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con1_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 717: name stmt_23
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 729: declared name strSTMT24 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 730: name strSTMT24; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 731: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 731: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 731: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 731: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 733: name strSTMT24
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 741: declared name stmt_25 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 742: name pre_stmt_25; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 743: query: SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 743: using PQexecPrepared for "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 743: correctly got 3 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 743: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 745: name pre_stmt_25
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 753: declared name stmt_26 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 754: name pre_stmt_26; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 756: query: declare cur_26 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 756: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 756: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: query: fetch cur_26; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 762: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: query: fetch cur_26; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 762: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: query: fetch cur_26; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 762: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 762: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: query: fetch cur_26; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 762: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 762: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 762: no data found on line 762
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 766: query: close cur_26; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 766: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 766: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 767: name pre_stmt_26
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 778: declared name stmt_27 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 779: name pre_stmt_27; query: "SELECT * FROM tb1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: reading items for tuple 3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGget_desc: NAME = con2_f3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 788: name pre_stmt_27
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 800: declared name stmt_28 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 801: name stmt_28; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 803: query: declare str_cur_28 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 803: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 803: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: query: fetch str_cur_28; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 809: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: query: fetch str_cur_28; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 809: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: query: fetch str_cur_28; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 809: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 809: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: query: fetch str_cur_28; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 809: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 809: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 809: no data found on line 809
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: raising sqlcode -245 on line 813: The cursor is invalid on line 813
+[NO_PID]: sqlca: code: -245, state: YE000
+SQL error: The cursor is invalid on line 813
+[NO_PID]: deallocate_one on line 814: name stmt_28
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 824: declared name stmt_29 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 825: name stmt_29; query: "SELECT f1,f2,f3 FROM source where f1<4"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 828: query: declare cur_29 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 828: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 828: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 834: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 834: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 834: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 834: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 834: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 834: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 834: no data found on line 834
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 838: query: close cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 838: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 838: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: query: truncate table target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 931: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 931: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: query: truncate table target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 932: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 932: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: query: truncate table target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 933: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 933: OK: TRUNCATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 843: query: declare cur_29 cursor for SELECT f1,f2,f3 FROM source where f1<4; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 843: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 843: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 847: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 847: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 847: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: 30 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 847: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: query: fetch cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 847: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 847: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 847: no data found on line 847
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 851: query: close cur_29; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 851: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 851: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 852: name stmt_29
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 908: query: drop table if exists source; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 908: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 908: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 909: query: drop table if exists source; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 909: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 909: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 910: query: drop table if exists source; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 910: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 910: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 912: query: drop table if exists target; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 912: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 912: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 913: query: drop table if exists target; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 913: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 913: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 914: query: drop table if exists target; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 914: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 914: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 916: query: drop table if exists tb1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 916: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 916: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 917: query: drop table if exists tb1; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 917: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 917: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 918: query: drop table if exists tb1; with 0 parameter(s) on connection con3
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 918: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 918: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 940: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 941: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 942: action "commit"; connection "con3"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_29 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_28 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_27 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_26 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_25 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name strSTMT24 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_23 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_22 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_21 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name str_stmt_8 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_8 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_7 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name str_stmt_6 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_6 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_5 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name str_stmt_4 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_4 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_3 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con1 closed
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_14 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_13 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_12 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_11 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_10 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_9 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con3 closed
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con2 closed
+[NO_PID]: sqlca: code: 0, state: 00000
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stdout b/src/interfaces/ecpg/test/expected/sql-declare.stdout
new file mode 100644
index 0000000..2ffe1d7
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.stdout
@@ -0,0 +1,161 @@
+****testcase1 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase2 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase3 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase4 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase5 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase6 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase7 test results:****
+field[0]'s name = con1_f1
+field[1]'s name = con1_f2
+field[2]'s name = con1_f3
+
+****testcase8 test results:****
+field[0]'s name = con1_f1
+field[1]'s name = con1_f2
+field[2]'s name = con1_f3
+
+field[0]'s name = con1_f1
+field[1]'s name = con1_f2
+field[2]'s name = con1_f3
+
+****testcase9 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase10 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase11 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase12 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase13 test results:****
+field[0]'s name = con3_f1
+field[1]'s name = con3_f2
+field[2]'s name = con3_f3
+
+****testcase14 test results:****
+field[0]'s name = con3_f1
+field[1]'s name = con3_f2
+field[2]'s name = con3_f3
+
+****testcase15 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase16 test results:****
+f1=1, f2=10, f3=db on con2
+f1=2, f2=20, f3=db on con2
+f1=3, f2=30, f3=db on con2
+
+****testcase17 test results:****
+f1=1, f2=10, f3=db on con3
+f1=2, f2=20, f3=db on con3
+f1=3, f2=30, f3=db on con3
+
+****testcase18 test results:****
+f1=1, f2=10, f3=db on con2
+f1=2, f2=20, f3=db on con2
+f1=3, f2=30, f3=db on con2
+
+****testcase19 test results:****
+field[0]'s name = con3_f1
+field[1]'s name = con3_f2
+field[2]'s name = con3_f3
+
+****testcase20 test results:****
+field[0]'s name = con2_f1
+field[1]'s name = con2_f2
+field[2]'s name = con2_f3
+
+****testcase21 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase22 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase23 test results:****
+field[0]'s name = con1_f1
+field[1]'s name = con1_f2
+field[2]'s name = con1_f3
+
+****testcase24 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase25 test results:****
+f1=1, f2=10, f3=db on con2
+f1=2, f2=20, f3=db on con2
+f1=3, f2=30, f3=db on con2
+
+****testcase26 test results:****
+f1=1, f2=10, f3=db on con2
+f1=2, f2=20, f3=db on con2
+f1=3, f2=30, f3=db on con2
+
+****testcase27 test results:****
+field[0]'s name = con2_f1
+field[1]'s name = con2_f2
+field[2]'s name = con2_f3
+
+****testcase28 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+****testcase29 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+f1=3, f2=30, f3=db on con1
+
diff --git a/src/interfaces/ecpg/test/expected/sql-desc.c b/src/interfaces/ecpg/test/expected/sql-desc.c
index bdd12a5..bcfe1bd 100644
--- a/src/interfaces/ecpg/test/expected/sql-desc.c
+++ b/src/interfaces/ecpg/test/expected/sql-desc.c
@@ -249,7 +249,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* declare c1 cursor for $1 */
#line 58 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c1 cursor for $1",
+ { ECPGopen("c1", "foo2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "foo2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_descriptor, "indesc", 1L, 1L, 1L,
@@ -260,7 +260,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 59 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c1", ECPGt_EOIT,
+ { ECPGfetch("c1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c1", ECPGt_EOIT,
ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int),
ECPGt_int,&(ind1),(long)1,(long)1,sizeof(int),
ECPGt_char,(val2output),(long)sizeof("AAA"),(long)1,(sizeof("AAA"))*sizeof(char),
@@ -273,7 +273,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("val1=%d (ind1: %d) val2=%s (ind2: %d)\n",
val1output, ind1, val2output, ind2);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("c1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c1", ECPGt_EOIT, ECPGt_EORT);
#line 65 "desc.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -299,7 +299,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* declare c2 cursor for $1 */
#line 70 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c2 cursor for $1",
+ { ECPGopen("c2", "foo3", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "foo3", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_descriptor, "indesc", 1L, 1L, 1L,
@@ -310,7 +310,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 71 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c2", ECPGt_EOIT,
+ { ECPGfetch("c2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c2", ECPGt_EOIT,
ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(val2output),(long)sizeof("AAA"),(long)1,(sizeof("AAA"))*sizeof(char),
@@ -322,7 +322,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("val1=%d val2=%s\n", val1output, val2i ? "null" : val2output);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("c2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c2", ECPGt_EOIT, ECPGt_EORT);
#line 76 "desc.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-dyntest.c b/src/interfaces/ecpg/test/expected/sql-dyntest.c
index 2cbc196..dff22aa 100644
--- a/src/interfaces/ecpg/test/expected/sql-dyntest.c
+++ b/src/interfaces/ecpg/test/expected/sql-dyntest.c
@@ -261,7 +261,7 @@ if (sqlca.sqlcode < 0) error ( );}
#line 58 "dyntest.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare MYCURS cursor for $1",
+ { ECPGopen("MYCURS", "myquery", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare MYCURS cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "myquery", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 60 "dyntest.pgc"
@@ -272,7 +272,7 @@ if (sqlca.sqlcode < 0) error ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in MYCURS", ECPGt_EOIT,
+ { ECPGfetch("MYCURS", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in MYCURS", ECPGt_EOIT,
ECPGt_descriptor, "MYDESC", 1L, 1L, 1L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 64 "dyntest.pgc"
@@ -468,7 +468,7 @@ if (sqlca.sqlcode < 0) error ( );}
}
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close MYCURS", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("MYCURS", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close MYCURS", ECPGt_EOIT, ECPGt_EORT);
#line 194 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
diff --git a/src/interfaces/ecpg/test/expected/sql-execute.c b/src/interfaces/ecpg/test/expected/sql-execute.c
index aee3c1b..c511349 100644
--- a/src/interfaces/ecpg/test/expected/sql-execute.c
+++ b/src/interfaces/ecpg/test/expected/sql-execute.c
@@ -140,7 +140,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 50 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR cursor for $1",
+ { ECPGopen("CUR", "f", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 52 "execute.pgc"
@@ -148,7 +148,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 52 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
+ { ECPGfetch("CUR", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -180,7 +180,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
#line 66 "execute.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -205,7 +205,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 72 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR2 cursor for $1",
+ { ECPGopen("CUR2", "f", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
@@ -215,7 +215,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 74 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in CUR2", ECPGt_EOIT,
+ { ECPGfetch("CUR2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in CUR2", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -247,7 +247,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR2", ECPGt_EOIT, ECPGt_EORT);
#line 88 "execute.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-fetch.c b/src/interfaces/ecpg/test/expected/sql-fetch.c
index b547b25..e6beaf5 100644
--- a/src/interfaces/ecpg/test/expected/sql-fetch.c
+++ b/src/interfaces/ecpg/test/expected/sql-fetch.c
@@ -99,7 +99,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 26 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from My_Table", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from My_Table", ECPGt_EOIT, ECPGt_EORT);
#line 28 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -113,7 +113,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 30 "fetch.pgc"
while (1) {
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(str),(long)25,(long)1,(25)*sizeof(char),
@@ -135,7 +135,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* exec sql whenever not found continue ; */
#line 36 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "move backward 2 in C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "move backward 2 in C", ECPGt_EOIT, ECPGt_EORT);
#line 37 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -145,7 +145,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 37 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch $0 in C",
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch $0 in C",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
@@ -162,7 +162,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("%d: %s\n", i, str);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
#line 42 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -176,7 +176,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 44 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare D cursor for select * from My_Table where Item1 = $1",
+ { ECPGopen("D", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare D cursor for select * from My_Table where Item1 = $1",
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 46 "fetch.pgc"
@@ -192,7 +192,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 48 "fetch.pgc"
while (1) {
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in D", ECPGt_EOIT,
+ { ECPGfetch("D", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in D", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(str),(long)25,(long)1,(25)*sizeof(char),
@@ -210,7 +210,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("%d: %s\n", i, str);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close D", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("D", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close D", ECPGt_EOIT, ECPGt_EORT);
#line 53 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
diff --git a/src/interfaces/ecpg/test/expected/sql-oldexec.c b/src/interfaces/ecpg/test/expected/sql-oldexec.c
index 5b74dda..2e398c2 100644
--- a/src/interfaces/ecpg/test/expected/sql-oldexec.c
+++ b/src/interfaces/ecpg/test/expected/sql-oldexec.c
@@ -141,7 +141,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 51 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR cursor for $1",
+ { ECPGopen("CUR", "f", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 53 "oldexec.pgc"
@@ -149,7 +149,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 53 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
+ { ECPGfetch("CUR", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -171,7 +171,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
#line 65 "oldexec.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -190,7 +190,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 70 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR3 cursor for $1",
+ { ECPGopen("CUR3", "f", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR3 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
@@ -200,7 +200,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 72 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch in CUR3", ECPGt_EOIT,
+ { ECPGfetch("CUR3", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch in CUR3", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -222,7 +222,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR3", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR3", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR3", ECPGt_EOIT, ECPGt_EORT);
#line 84 "oldexec.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-quote.c b/src/interfaces/ecpg/test/expected/sql-quote.c
index 0a3b77c..ec03612 100644
--- a/src/interfaces/ecpg/test/expected/sql-quote.c
+++ b/src/interfaces/ecpg/test/expected/sql-quote.c
@@ -162,7 +162,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 43 "quote.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
#line 45 "quote.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -178,7 +178,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
while (true)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(var),(long)25,(long)1,(25)*sizeof(char),
diff --git a/src/interfaces/ecpg/test/expected/sql-sqlda.c b/src/interfaces/ecpg/test/expected/sql-sqlda.c
index b470b04..6bfcbe2 100644
--- a/src/interfaces/ecpg/test/expected/sql-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/sql-sqlda.c
@@ -251,7 +251,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
+ { ECPGopen("mycur1", "st_id1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 103 "sqlda.pgc"
@@ -268,7 +268,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
+ { ECPGfetch("mycur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 111 "sqlda.pgc"
@@ -289,7 +289,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
#line 120 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -324,7 +324,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
+ { ECPGopen("mycur2", "st_id2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 138 "sqlda.pgc"
@@ -334,7 +334,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch all from mycur2", ECPGt_EOIT,
+ { ECPGfetch("mycur2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch all from mycur2", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 141 "sqlda.pgc"
@@ -357,7 +357,7 @@ if (sqlca.sqlcode < 0) exit (1);}
}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
#line 157 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/regression.h b/src/interfaces/ecpg/test/regression.h
index 4aa13b6..aa6421d 100644
--- a/src/interfaces/ecpg/test/regression.h
+++ b/src/interfaces/ecpg/test/regression.h
@@ -1,5 +1,5 @@
exec sql define REGRESSDB1 ecpg1_regression;
exec sql define REGRESSDB2 ecpg2_regression;
-
+exec sql define REGRESSDB3 ecpg3_regression;
exec sql define REGRESSUSER1 regress_ecpg_user1;
exec sql define REGRESSUSER2 regress_ecpg_user2;
diff --git a/src/interfaces/ecpg/test/sql/.gitignore b/src/interfaces/ecpg/test/sql/.gitignore
index cd6f342..83bc47e 100644
--- a/src/interfaces/ecpg/test/sql/.gitignore
+++ b/src/interfaces/ecpg/test/sql/.gitignore
@@ -6,6 +6,8 @@
/code100.c
/copystdout
/copystdout.c
+/declare
+/declare.c
/define
/define.c
/desc
diff --git a/src/interfaces/ecpg/test/sql/Makefile b/src/interfaces/ecpg/test/sql/Makefile
index 6bc67e9..d313464 100644
--- a/src/interfaces/ecpg/test/sql/Makefile
+++ b/src/interfaces/ecpg/test/sql/Makefile
@@ -22,7 +22,8 @@ TESTS = array array.c \
parser parser.c \
quote quote.c \
show show.c \
- insupd insupd.c
+ insupd insupd.c \
+ declare declare.c
all: $(TESTS)
diff --git a/src/interfaces/ecpg/test/sql/declare.pgc b/src/interfaces/ecpg/test/sql/declare.pgc
new file mode 100644
index 0000000..d3bfb55
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/declare.pgc
@@ -0,0 +1,1028 @@
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+exec sql whenever sqlerror sqlprint;
+
+exec sql include sqlca;
+exec sql include ../regression;
+
+#define OUT_ARRAY_SZIE 20
+#define TEST_CASE_NUM 29
+#define COLUMN_NUM 3
+#define FIELD_NAME_LEN 30
+
+void declare_test(char * tc_name);
+int createTable(void);
+void dropTable(void);
+void reCreateTable(void);
+void truncateTable(void);
+void commitTable(void);
+void reset(void);
+int initValues(void);
+void releaseValues(void);
+void printResultF123(char *tc_name, int loop);
+void printResultIndF123(char *tc_name, int loop);
+int startManualTest(char *in);
+int startAutoTest(void);
+void printFieldName(char *);
+
+EXEC SQL BEGIN DECLARE SECTION;
+
+ //input variables
+ int in_f1 = 1 ;
+ double in_f2 = 10;
+ char in_f3[20] = {"one"};
+
+ //output variables
+ int f1[OUT_ARRAY_SZIE];
+ int f2[OUT_ARRAY_SZIE];
+ char f3[OUT_ARRAY_SZIE][20];
+
+ char field_name[COLUMN_NUM][FIELD_NAME_LEN];
+
+
+ int ind_f1[OUT_ARRAY_SZIE],ind_f2[OUT_ARRAY_SZIE],ind_f3[OUT_ARRAY_SZIE];
+
+EXEC SQL END DECLARE SECTION;
+
+int
+main (int argc, char *argv[])
+{
+ setlocale(LC_ALL, "C");
+
+ ECPGdebug(1, stderr);
+
+ /* connect to database */
+ EXEC SQL CONNECT TO REGRESSDB1 AS con1;
+ EXEC SQL CONNECT TO REGRESSDB2 AS con2;
+ EXEC SQL CONNECT TO REGRESSDB3 as con3;
+
+ if(initValues())
+ {
+ printf("Error: initValues return error!\n");
+
+ releaseValues();
+ return -1;
+ }
+
+ if(argc == 2) //start manual test
+ {
+ printf("Start manual test! \n");
+ startManualTest(argv[1]);
+ }
+ else //start auto test
+ {
+ startAutoTest();
+ }
+
+ EXEC SQL DISCONNECT con1;
+
+ EXEC SQL DISCONNECT ALL;
+
+ releaseValues();
+
+ return (0);
+}
+
+int startManualTest(char *in)
+{
+ if(!strcmp(in,"cr"))
+ {
+ createTable();
+ }
+ else if(!strcmp(in,"dr"))
+ {
+ dropTable();
+ }
+ else if(!strcmp(in,"re"))
+ {
+ reCreateTable();
+ }
+ else if(!strcmp(in,"help"))
+ {
+ printf("====Supporting the following parameters====\n");
+ printf("1. cr -- create tables\n");
+ printf("2. dr -- drop tables\n");
+ printf("3. re -- drop tables and create tables\n");
+ printf("4. testcaseX where X is a digit form 1 to %d\n",TEST_CASE_NUM);
+ printf("If you don't give any parameter, the program will start the test from the testcase1 to testcase%d automatically\n",TEST_CASE_NUM);
+ }
+ else
+ {
+ declare_test(in);
+ }
+
+ commitTable();
+
+ return 0;
+}
+
+int startAutoTest()
+{
+ int i;
+ char tc_name[20];
+
+ dropTable();
+
+ if(createTable())
+ {
+ printf("Error: createTable return error!\n");
+ return -1;
+ }
+
+ for(i=1;i<=TEST_CASE_NUM;i++)
+ {
+ sprintf(tc_name,"testcase%d",i);
+ declare_test(tc_name);
+ }
+
+ dropTable();
+
+ return 0;
+}
+
+
+/*
+ * default connection: con3
+ * Non-default connection: con1, con2
+ *
+ * testcase1. using DECLARE STATEMENT, let CURSOR statement precede PREPARE statement
+ * ---test result: ok
+ * testcase2. without using DECLARE STATEMENT, let CURSOR statement precede PREPARE statement
+ * ---test result: ok
+ *
+ * testcase3. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase4. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase5. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase6. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase7. using DECLARE STATEMENT at con1, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase8. using DECLARE STATEMENT at con1, using DESCRIBE statement at con2
+ * ---test result: ok
+ *
+ * testcase9. using DECLARE STATEMENT at con3, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase10. using DECLARE STATEMENT at con3, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase11. using DECLARE STATEMENT at con3, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase12. using DECLARE STATEMENT at con3, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase13. using DECLARE STATEMENT at con3, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase14. using DECLARE STATEMENT at con3, using DESCRIBE statement at con2
+ * ---test result: ok
+ *
+ * testcase15. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement without using AT clause
+ * ---test result: ok
+ * testcase16. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement at con2
+ * ---test result: ok
+ * testcase17. using DECLARE STATEMENT without using AT clause, using PREPARE and CURSOR statement without using AT clause
+ * ---test result: ok
+ * testcase18. using DECLARE STATEMENT without using AT clause, using PREPARE and CURSOR statement at con2
+ * ---test result: ok
+ * testcase19. using DECLARE STATEMENT without using AT clause, using DESCRIBE statement without using AT clause
+ * ---test result: ok
+ * testcase20. using DECLARE STATEMENT without using AT clause, using DESCRIBE statement at con2
+ * ---test result: ok
+
+ * testcase21. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ * testcase22. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ * testcase23. using DECLARE STATEMENT at con1, using DESCRIBE statement at con2
+ * using quoted string as declared name
+ * ---test result: ok
+ *
+ * testcase24. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2
+ * using host variable as declared name
+ * ---test result:
+ *
+ * testcase25. using DECLARE STATEMENT at con1, using PREPARE and EXECUTE statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ * testcase26. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ * testcase27. using DECLARE STATEMENT at con1, using PREPARE and DESCRIBE statement at con2 and without referring the DECLARE statement
+ * ---test result: ok
+ *
+ * testcase28. Using host variable as cursor name in the DECLARE/OPEN CURSOR statement,
+ * using the content in the host variable as the cursor name in the CLOSE CURSOR statement
+ * This is nothing with DECLARE STATEMENT feature, this case just verify a bug that cursor name can be closed by using
+ * content of host variable while the cursor name is declared/opened by using the host variable.
+ * ---test result: ok
+ *
+ * testcase29. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement without using AT clause
+ * one cursor is set to "open" and "close" twice.
+ * Check the declared name can be referred by the cursor at the second time correctly
+ * ---test result: ok
+ */
+void declare_test(char * tc_name)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int i;
+
+ char *selectString = "SELECT f1,f2,f3 FROM source where f1<4";
+ char *selectTb1 = "SELECT * FROM tb1";
+
+ char *stmt_4 = "str_stmt_4";
+ char *stmt_6 = "str_stmt_6";
+ char *stmt_8 = "str_stmt_8";
+
+ char *cur_6 = "str_cur_6";
+
+ char *desc_8 = "str_desc_8";
+
+ EXEC SQL END DECLARE SECTION;
+
+ if(!strcmp(tc_name,"testcase1"))
+ {
+ reset();
+
+ EXEC SQL DECLARE stmt_1 STATEMENT;
+ EXEC SQL DECLARE cur_1 CURSOR FOR stmt_1;
+ EXEC SQL PREPARE stmt_1 FROM :selectString;
+ EXEC SQL OPEN cur_1;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_1 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_1;
+ EXEC SQL DEALLOCATE PREPARE stmt_1;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase2"))
+ {
+ reset();
+
+ EXEC SQL DECLARE cur_2 CURSOR FOR stmt_2;
+ EXEC SQL PREPARE stmt_2 FROM :selectString;
+ EXEC SQL OPEN cur_2;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_2 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_2;
+ EXEC SQL DEALLOCATE PREPARE stmt_2;
+
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase3"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_3 STATEMENT;
+ EXEC SQL PREPARE stmt_3 FROM :selectString;
+ EXEC SQL EXECUTE stmt_3 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE stmt_3;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase4"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_4 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_4 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE stmt_4 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE stmt_4;
+
+ printResultF123(tc_name,3);
+
+ reset();
+
+ EXEC SQL AT con1 DECLARE :stmt_4 STATEMENT;
+ EXEC SQL AT con2 PREPARE :stmt_4 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE :stmt_4 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE :stmt_4;
+
+ printResultF123(NULL,3);
+ }
+ else if(!strcmp(tc_name,"testcase5"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_5 STATEMENT;
+ EXEC SQL PREPARE stmt_5 FROM :selectString;
+ EXEC SQL DECLARE cur_5 CURSOR FOR stmt_5;
+ EXEC SQL OPEN cur_5;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_5 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_5;
+ EXEC SQL DEALLOCATE PREPARE stmt_5;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase6"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_6 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_6 FROM :selectString;
+ EXEC SQL AT con2 DECLARE cur_6 CURSOR FOR stmt_6;
+ EXEC SQL AT con2 OPEN cur_6;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH cur_6 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE cur_6;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_6;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+
+ reset();
+
+ EXEC SQL AT con1 DECLARE :stmt_6 STATEMENT;
+ EXEC SQL AT con2 PREPARE :stmt_6 FROM :selectString;
+ EXEC SQL AT con2 DECLARE :cur_6 CURSOR FOR :stmt_6;
+ EXEC SQL AT con2 OPEN :cur_6;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH :cur_6 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE :cur_6;
+ EXEC SQL AT con2 DEALLOCATE PREPARE :stmt_6;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(NULL,3);
+ }
+ else if(!strcmp(tc_name,"testcase7"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_7;
+
+ EXEC SQL AT con1 DECLARE stmt_7 STATEMENT;
+ EXEC SQL PREPARE stmt_7 FROM :selectTb1;
+ EXEC SQL DESCRIBE stmt_7 into SQL DESCRIPTOR desc_7;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_7 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_7;
+ EXEC SQL DEALLOCATE PREPARE stmt_7;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase8"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_8;
+
+ EXEC SQL AT con1 DECLARE stmt_8 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_8 FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE stmt_8 into SQL DESCRIPTOR desc_8;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_8 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_8;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_8;
+
+ printFieldName(tc_name);
+
+
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR :desc_8;
+
+ EXEC SQL AT con1 DECLARE :stmt_8 STATEMENT;
+ EXEC SQL AT con2 PREPARE :stmt_8 FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE :stmt_8 into SQL DESCRIPTOR :desc_8;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR :desc_8 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR :desc_8;
+ EXEC SQL AT con2 DEALLOCATE PREPARE :stmt_8;
+
+ printFieldName(NULL);
+ }
+ else if(!strcmp(tc_name,"testcase9"))
+ {
+ reset();
+
+ EXEC SQL AT con3 DECLARE stmt_9 STATEMENT;
+ EXEC SQL PREPARE stmt_9 FROM :selectString;
+ EXEC SQL EXECUTE stmt_9 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE stmt_9;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase10"))
+ {
+ reset();
+
+ EXEC SQL AT con3 DECLARE stmt_10 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_10 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE stmt_10 INTO :f1,:f2,:f3;
+
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_10;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase11"))
+ {
+ reset();
+
+ EXEC SQL AT con3 DECLARE stmt_11 STATEMENT;
+ EXEC SQL PREPARE stmt_11 FROM :selectString;
+ EXEC SQL DECLARE cur_11 CURSOR FOR stmt_11;
+ EXEC SQL OPEN cur_11;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_11 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_11;
+ EXEC SQL DEALLOCATE PREPARE stmt_11;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase12"))
+ {
+ reset();
+
+ EXEC SQL AT con3 DECLARE stmt_12 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_12 FROM :selectString;
+ EXEC SQL AT con2 DECLARE cur_12 CURSOR FOR stmt_12;
+ EXEC SQL AT con2 OPEN cur_12;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH cur_12 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE cur_12;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_12;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase13"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_13;
+
+ EXEC SQL AT con3 DECLARE stmt_13 STATEMENT;
+ EXEC SQL PREPARE stmt_13 FROM :selectTb1;
+ EXEC SQL DESCRIBE stmt_13 into SQL DESCRIPTOR desc_13;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_13 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_13;
+ EXEC SQL DEALLOCATE PREPARE stmt_13;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase14"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_14;
+
+ EXEC SQL AT con3 DECLARE stmt_14 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_14 FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE stmt_14 into SQL DESCRIPTOR desc_14;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_14 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_14;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_14;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase15"))
+ {
+ reset();
+
+ EXEC SQL DECLARE stmt_15 STATEMENT;
+ EXEC SQL PREPARE stmt_15 FROM :selectString;
+ EXEC SQL EXECUTE stmt_15 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE stmt_15;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase16"))
+ {
+ reset();
+
+ EXEC SQL DECLARE stmt_16 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_16 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE stmt_16 INTO :f1,:f2,:f3;
+
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_16;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase17"))
+ {
+ reset();
+
+ EXEC SQL DECLARE stmt_17 STATEMENT;
+ EXEC SQL PREPARE stmt_17 FROM :selectString;
+ EXEC SQL DECLARE cur_17 CURSOR FOR stmt_17;
+ EXEC SQL OPEN cur_17;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_17 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_17;
+ EXEC SQL DEALLOCATE PREPARE stmt_17;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase18"))
+ {
+ reset();
+
+ EXEC SQL DECLARE stmt_18 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_18 FROM :selectString;
+ EXEC SQL AT con2 DECLARE cur_18 CURSOR FOR stmt_18;
+ EXEC SQL AT con2 OPEN cur_18;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH cur_18 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE cur_18;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_18;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase19"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_19;
+
+ EXEC SQL DECLARE stmt_19 STATEMENT;
+ EXEC SQL PREPARE stmt_19 FROM :selectTb1;
+ EXEC SQL DESCRIBE stmt_19 into SQL DESCRIPTOR desc_19;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_19 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_19;
+ EXEC SQL DEALLOCATE PREPARE stmt_19;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase20"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_20;
+
+ EXEC SQL DECLARE stmt_20 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_20 FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE stmt_20 into SQL DESCRIPTOR desc_20;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_20 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_20;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_20;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase21"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE "stmt_21" STATEMENT;
+ EXEC SQL AT con2 PREPARE "stmt_21" FROM :selectString;
+ EXEC SQL AT con2 EXECUTE "stmt_21" INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE "stmt_21";
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase22"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE "stmt_22" STATEMENT;
+ EXEC SQL AT con2 PREPARE "stmt_22" FROM :selectString;
+ EXEC SQL AT con2 DECLARE "cur_22" CURSOR FOR "stmt_22";
+ EXEC SQL AT con2 OPEN "cur_22";
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH "cur_22" INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE "cur_22";
+ EXEC SQL AT con2 DEALLOCATE PREPARE "stmt_22";
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase23"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_23;
+
+ EXEC SQL AT con1 DECLARE "stmt_23" STATEMENT;
+ EXEC SQL AT con2 PREPARE "stmt_23" FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE "stmt_23" into SQL DESCRIPTOR desc_23;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_23 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_23;
+ EXEC SQL AT con2 DEALLOCATE PREPARE "stmt_23";
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase24"))
+ {
+ EXEC SQL BEGIN DECLARE SECTION;
+ char *char_stmt_24 = "strSTMT24";
+ EXEC SQL END DECLARE SECTION;
+
+ reset();
+
+ EXEC SQL AT con1 DECLARE :char_stmt_24 STATEMENT;
+ EXEC SQL AT con2 PREPARE :char_stmt_24 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE :char_stmt_24 INTO :f1,:f2,:f3;
+
+ EXEC SQL DEALLOCATE PREPARE :char_stmt_24;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase25"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_25 STATEMENT;
+ EXEC SQL AT con2 PREPARE pre_stmt_25 FROM :selectString;
+ EXEC SQL AT con2 EXECUTE pre_stmt_25 INTO :f1,:f2,:f3;
+
+ EXEC SQL AT con2 DEALLOCATE PREPARE pre_stmt_25;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase26"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_26 STATEMENT;
+ EXEC SQL AT con2 PREPARE pre_stmt_26 FROM :selectString;
+ EXEC SQL AT con2 DECLARE cur_26 CURSOR FOR pre_stmt_26;
+ EXEC SQL AT con2 OPEN cur_26;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH cur_26 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE cur_26;
+ EXEC SQL AT con2 DEALLOCATE PREPARE pre_stmt_26;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+ }
+ else if(!strcmp(tc_name,"testcase27"))
+ {
+ reset();
+
+ EXEC SQL ALLOCATE DESCRIPTOR desc_27;
+
+ EXEC SQL AT con1 DECLARE stmt_27 STATEMENT;
+ EXEC SQL AT con2 PREPARE pre_stmt_27 FROM :selectTb1;
+ EXEC SQL AT con2 DESCRIBE pre_stmt_27 into SQL DESCRIPTOR desc_27;
+
+ for(i=1; i<4; i++)
+ {
+ EXEC SQL GET DESCRIPTOR desc_27 value :i :field_name[i-1] = name;
+ }
+
+ EXEC SQL DEALLOCATE DESCRIPTOR desc_27;
+ EXEC SQL AT con2 DEALLOCATE PREPARE pre_stmt_27;
+
+ printFieldName(tc_name);
+ }
+ else if(!strcmp(tc_name,"testcase28"))
+ {
+ EXEC SQL BEGIN DECLARE SECTION;
+ char *cur_28 = "str_cur_28";
+ EXEC SQL END DECLARE SECTION;
+
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_28 STATEMENT;
+ EXEC SQL AT con2 PREPARE stmt_28 FROM :selectString;
+ EXEC SQL AT con2 DECLARE :cur_28 CURSOR FOR stmt_28;
+ EXEC SQL AT con2 OPEN :cur_28;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL AT con2 FETCH :cur_28 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL AT con2 CLOSE str_cur_28;
+ EXEC SQL AT con2 DEALLOCATE PREPARE stmt_28;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(tc_name,3);
+
+ }
+ else if(!strcmp(tc_name,"testcase29"))
+ {
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_29 STATEMENT;
+ EXEC SQL PREPARE stmt_29 FROM :selectString;
+ EXEC SQL DECLARE cur_29 CURSOR FOR stmt_29;
+
+ EXEC SQL OPEN cur_29;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_29 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_29;
+ printResultF123(tc_name,3);
+
+ reset();
+ /* Open and fetch cursor again */
+ EXEC SQL OPEN cur_29;
+ i = 0;
+ while(1)
+ {
+ EXEC SQL FETCH cur_29 INTO :f1[i],:f2[i],:f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_29;
+ EXEC SQL DEALLOCATE PREPARE stmt_29;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResultF123(NULL,3);
+ }
+ else
+ {
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+ printf("Sorry, there isn't this testcase: %s!\n",tc_name);
+ }
+}
+
+
+/*
+ * success -- 0
+ * failed -- -1
+ */
+int createTable()
+{
+ EXEC SQL AT con1 CREATE TABLE source (f1 integer, f2 integer, f3 varchar(20));
+ EXEC SQL AT con2 CREATE TABLE source (f1 integer, f2 integer, f3 varchar(20));
+ EXEC SQL AT con3 CREATE TABLE source (f1 integer, f2 integer, f3 varchar(20));
+
+ EXEC SQL AT con1 CREATE TABLE tb1 (con1_f1 integer, con1_f2 integer, con1_f3 varchar(20));
+ EXEC SQL AT con2 CREATE TABLE tb1 (con2_f1 integer, con2_f2 integer, con2_f3 varchar(20));
+ EXEC SQL AT con3 CREATE TABLE tb1 (con3_f1 integer, con3_f2 integer, con3_f3 varchar(20));
+
+ EXEC SQL AT con1 CREATE TABLE target (f1 integer, f2 integer, f3 varchar(20));
+ EXEC SQL AT con2 CREATE TABLE target (f1 integer, f2 integer, f3 varchar(20));
+ EXEC SQL AT con3 CREATE TABLE target (f1 integer, f2 integer, f3 varchar(20));
+
+
+
+ EXEC SQL AT con1 INSERT INTO source VALUES(1,10,'db on con1');
+ EXEC SQL AT con1 INSERT INTO source VALUES(2,20,'db on con1');
+ EXEC SQL AT con1 INSERT INTO source VALUES(3,30,'db on con1');
+
+ EXEC SQL AT con2 INSERT INTO source VALUES(1,10,'db on con2');
+ EXEC SQL AT con2 INSERT INTO source VALUES(2,20,'db on con2');
+ EXEC SQL AT con2 INSERT INTO source VALUES(3,30,'db on con2');
+
+ EXEC SQL AT con3 INSERT INTO source VALUES(1,10,'db on con3');
+ EXEC SQL AT con3 INSERT INTO source VALUES(2,20,'db on con3');
+ EXEC SQL AT con3 INSERT INTO source VALUES(3,30,'db on con3');
+
+ commitTable();
+
+ return 0;
+}
+
+/*
+ * success -- 0
+ * failed -- -1
+ */
+void dropTable()
+{
+ EXEC SQL AT con1 DROP TABLE IF EXISTS source;
+ EXEC SQL AT con2 DROP TABLE IF EXISTS source;
+ EXEC SQL AT con3 DROP TABLE IF EXISTS source;
+
+ EXEC SQL AT con1 DROP TABLE IF EXISTS target;
+ EXEC SQL AT con2 DROP TABLE IF EXISTS target;
+ EXEC SQL AT con3 DROP TABLE IF EXISTS target;
+
+ EXEC SQL AT con1 DROP TABLE IF EXISTS tb1;
+ EXEC SQL AT con2 DROP TABLE IF EXISTS tb1;
+ EXEC SQL AT con3 DROP TABLE IF EXISTS tb1;
+
+ commitTable();
+}
+
+void reCreateTable()
+{
+ dropTable();
+ createTable();
+}
+
+void truncateTable()
+{
+ EXEC SQL AT con1 TRUNCATE TABLE target;
+ EXEC SQL AT con2 TRUNCATE TABLE target;
+ EXEC SQL AT con3 TRUNCATE TABLE target;
+
+ commitTable();
+}
+
+void commitTable()
+{
+ EXEC SQL AT con1 COMMIT;
+ EXEC SQL AT con2 COMMIT;
+ EXEC SQL AT con3 COMMIT;
+}
+
+/*
+ * reset all the output variables
+ */
+void reset()
+{
+ int i;
+
+ truncateTable();
+
+ memset(f1,0,sizeof(f1));
+ memset(f2,0,sizeof(f2));
+ memset(f3,0,sizeof(f3));
+
+ for(i=0; i<COLUMN_NUM; i++)
+ {
+ memset(field_name[i],0, FIELD_NAME_LEN);
+ }
+}
+
+int initValues()
+{
+ return 0;
+}
+
+void releaseValues()
+{
+}
+
+void printResultF123(char *tc_name, int loop)
+{
+ int i;
+
+ if(loop>OUT_ARRAY_SZIE)
+ {
+ loop = OUT_ARRAY_SZIE;
+ }
+
+ if(tc_name)
+ {
+ printf("****%s test results:****\n",tc_name);
+ }
+
+ for (i = 0; i < loop; i++)
+ printf("f1=%d, f2=%d, f3=%s\n", f1[i], f2[i], f3[i]);
+
+ printf("\n");
+}
+
+void printResultIndF123(char *tc_name, int loop)
+{
+ int i;
+
+ if(loop>OUT_ARRAY_SZIE)
+ {
+ loop = OUT_ARRAY_SZIE;
+ }
+
+ if(tc_name)
+ {
+ printf("****%s indicator results:****\n",tc_name);
+ }
+
+ for (i = 0; i < loop; i++)
+ printf("ind_f1=%d, ind_f2=%d, ind_f3=%d\n", ind_f1[i], ind_f2[i], ind_f3[i]);
+
+ printf("\n");
+}
+
+void printFieldName(char *tc_name)
+{
+ int i;
+
+ if(tc_name)
+ {
+ printf("****%s test results:****\n",tc_name);
+ }
+
+ for (i = 0; i < COLUMN_NUM; i++)
+ {
+ printf("field[%d]'s name = %s\n", i, field_name[i]);
+ }
+
+ printf("\n");
+}
Hi
[004_declareStmt_test_v3.patch]
Regression test and answers.
I made them but I'm thinking these include too much test cases, don't they?
So I'm planning to make it smaller.
I refactored the regression test patch (004_declareStmt_test_v4.patch)
to make it easier to read.
The other patches are same as previous versions.
Regards
Ideriha, Takeshi
From: pgsql-hackers-owner@postgresql.org [mailto:pgsql-hackers-owner@postgresql.org] On Behalf Of Ideriha, Takeshi
Sent: Tuesday, February 7, 2017 5:59 PM
To: Michael Paquier <michael.paquier@gmail.com>
Cc: Michael Meskes <meskes@postgresql.org>; pgsql-hackers@postgresql.org
Subject: Re: [WIP] RE: [HACKERS] DECLARE STATEMENT setting up a connection in ECPG
Hi
By the way, I have been able to crash your patch when running the regression
tests:
(lldb) bt
* thread #1: tid = 0x0000, 0x00007fff89a828b0
libsystem_platform.dylib`_platform_strcmp + 176, stop reason = signal SIGSTOP
* frame #0: 0x00007fff89a828b0 libsystem_platform.dylib`_platform_strcmp +
176
frame #1: 0x000000010c835bc3
libecpg.6.dylib`ecpg_release_declared_statement(connection_name="con3")
+ 83 at prepare.c:740
frame #2: 0x000000010c838103
libecpg.6.dylib`ECPGdisconnect(lineno=81, connection_name="ALL") + 179 at
connect.c:697
frame #3: 0x000000010c811922 declare`main(argc=1,
argv=0x00007fff533ee320) + 434 at declare.pgc:81
frame #4: 0x00007fff932345ad libdyld.dylib`start + 1
You also need to add in src/interfaces/ecpg/test/sql/.gitignore new entries
related to the files you are adding and that get generated.
Thank you very much for your test. I fixed this memory leak bug, and fixed .gitignore.
I also fixed some code style to fit coding conventions,
and splited my patch into 4 parts to improve readability:
* 001_declareStmt_preproc_v3.patch
* 002_declareStmt_ecpglib_v3.patch
* 003_declareStmt_doc_v3.patch
* 004_declareStmt_test_v3.patch
Here is a short summary:
[001_declareStmt_preproc_v3.patch]
This enables ecpg to pre-process "DECLARE prepared_name STATEMENT".
prepared_name is buffered to g_declared_list to check duplication of prepared_name.
After pre-processed, "DECLARE STATEMENT" is translated to ECPGdeclare().
And CUSRSOR STAETEMENT such as OPEN/FETCH/CLOSE cursor is translated into ECPGopen()/ECPGfetch()/ECPGclose().
These new function is defined at 002_declareStmt_ecpglib_v3.patch.
[002_declareStmt_ecpglib_v3.patch]
This patch mainly implements ECPGdeclare(), ECPGopen(), ECPGfetch(), ECPGclose().
ECPGdeclare() links the declared name and connection name.
Handling CURSOR things are originally done by ECPGdo().
But in order to handle connection linked to declared name,
the functions such as ECPGopen(), ECPGfetch()and ECPGclose() are introduced and these functions wraps ecpg_do().
[003_declareStmt_doc_v3.patch]
Docs. I wrote the DECLARE STATEMENT itself.
And added another example to ecpg-set-connection.
[004_declareStmt_test_v3.patch]
Regression test and answers.
I made them but I'm thinking these include too much test cases, don't they?
So I'm planning to make it smaller.
regards,
Ideriha Takeshi
Attachments:
001_declareStmt_preproc_v4.patchapplication/octet-stream; name=001_declareStmt_preproc_v4.patchDownload
diff --git a/src/interfaces/ecpg/preproc/ecpg.addons b/src/interfaces/ecpg/preproc/ecpg.addons
index ca3efad..982ce78 100644
--- a/src/interfaces/ecpg/preproc/ecpg.addons
+++ b/src/interfaces/ecpg/preproc/ecpg.addons
@@ -15,7 +15,7 @@ ECPG: stmtClosePortalStmt block
}
}
- output_statement($1, 0, ECPGst_normal);
+ $1 = $1;
}
ECPG: stmtDeallocateStmt block
{
@@ -25,7 +25,11 @@ ECPG: stmtDeclareCursorStmt block
{ output_simple_statement($1); }
ECPG: stmtDiscardStmt block
ECPG: stmtFetchStmt block
- { output_statement($1, 1, ECPGst_normal); }
+ {
+ /* g_cursor_name is set in the fetch_args block and freed in the output_cursor_statement */
+ output_cursor_statement(ECPGcst_fetch, g_cursor_name, NULL, $1, 1, ECPGst_normal);
+ g_cursor_name = NULL;
+ }
ECPG: stmtDeleteStmt block
ECPG: stmtInsertStmt block
ECPG: stmtSelectStmt block
@@ -63,6 +67,10 @@ ECPG: stmtViewStmt rule
whenever_action(2);
free($1);
}
+ | ECPGDeclareStmt
+ {
+ output_declare_statement($1);
+ }
| ECPGCursorStmt
{
output_simple_statement($1);
@@ -132,7 +140,14 @@ ECPG: stmtViewStmt rule
if ((ptr = add_additional_variables($1, true)) != NULL)
{
connection = ptr->connection ? mm_strdup(ptr->connection) : NULL;
- output_statement(mm_strdup(ptr->command), 0, ECPGst_normal);
+ if (ptr->prepared_name)
+ {
+ output_cursor_statement(ECPGcst_open, $1, mm_strdup(ptr->prepared_name), mm_strdup(ptr->command), 0, ECPGst_normal);
+ }
+ else
+ {
+ output_cursor_statement(ECPGcst_open, $1, NULL, mm_strdup(ptr->command), 0, ECPGst_normal);
+ }
ptr->opened = true;
}
}
@@ -204,6 +219,7 @@ ECPG: var_valueNumericOnly addon
}
ECPG: fetch_argscursor_name addon
add_additional_variables($1, false);
+ g_cursor_name = mm_strdup($1);
if ($1[0] == ':')
{
free($1);
@@ -211,6 +227,7 @@ ECPG: fetch_argscursor_name addon
}
ECPG: fetch_argsfrom_incursor_name addon
add_additional_variables($2, false);
+ g_cursor_name = mm_strdup($2);
if ($2[0] == ':')
{
free($2);
@@ -222,6 +239,7 @@ ECPG: fetch_argsFIRST_Popt_from_incursor_name addon
ECPG: fetch_argsLAST_Popt_from_incursor_name addon
ECPG: fetch_argsALLopt_from_incursor_name addon
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
if ($3[0] == ':')
{
free($3);
@@ -229,6 +247,7 @@ ECPG: fetch_argsALLopt_from_incursor_name addon
}
ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
if ($3[0] == ':')
{
free($3);
@@ -242,6 +261,7 @@ ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDALLopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDALLopt_from_incursor_name addon
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
if ($4[0] == ':')
{
free($4);
@@ -252,6 +272,7 @@ ECPG: fetch_argsRELATIVE_PSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDSignedIconstopt_from_incursor_name addon
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
if ($4[0] == ':')
{
free($4);
@@ -304,6 +325,7 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
}
this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ memset(this, 0 ,sizeof(struct cursor));
this->next = cur;
this->name = $2;
@@ -336,8 +358,31 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
}
ECPG: ClosePortalStmtCLOSEcursor_name block
{
+ char *stmt = NULL;
+ char *cursor_name = NULL;
char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : $2;
- $$ = cat2_str(mm_strdup("close"), cursor_marker);
+
+ cursor_name = mm_strdup($2);
+
+ stmt = cat2_str(mm_strdup("close"), cursor_marker);
+
+ if (INFORMIX_MODE)
+ {
+ if (pg_strcasecmp(stmt+strlen("close "), "database") == 0)
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE statement");
+
+ fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");");
+ whenever_action(2);
+ free(stmt);
+ break;
+ }
+ }
+
+ output_cursor_statement(ECPGcst_close, cursor_name, NULL, stmt, 0, ECPGst_normal);
+
+ $$ = EMPTY;
}
ECPG: opt_hold block
{
@@ -416,48 +461,56 @@ ECPG: FetchStmtMOVEfetch_args rule
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("fetch forward"), cursor_marker);
}
| FETCH FORWARD from_in cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("fetch forward from"), cursor_marker);
}
| FETCH BACKWARD cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("fetch backward"), cursor_marker);
}
| FETCH BACKWARD from_in cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("fetch backward from"), cursor_marker);
}
| MOVE FORWARD cursor_name
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("move forward"), cursor_marker);
}
| MOVE FORWARD from_in cursor_name
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("move forward from"), cursor_marker);
}
| MOVE BACKWARD cursor_name
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("move backward"), cursor_marker);
}
| MOVE BACKWARD from_in cursor_name
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("move backward from"), cursor_marker);
}
ECPG: limit_clauseLIMITselect_limit_value','select_offset_value block
diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c
index fa80bb2..2bda505 100644
--- a/src/interfaces/ecpg/preproc/ecpg.c
+++ b/src/interfaces/ecpg/preproc/ecpg.c
@@ -28,6 +28,7 @@ struct _include_path *include_paths = NULL;
struct cursor *cur = NULL;
struct typedefs *types = NULL;
struct _defines *defines = NULL;
+struct declared_name_st *g_declared_list = NULL;
static void
help(const char *progname)
@@ -111,6 +112,48 @@ add_preprocessor_define(char *define)
defines->next = pd;
}
+static void
+free_argument(struct arguments *arg)
+{
+ if (arg == NULL)
+ return;
+
+ free_argument(arg->next);
+
+ /*
+ * Don't free variables in it because the original codes don't free it either
+ * variables are static structures instead of allocating
+ */
+ free(arg);
+}
+
+static void
+free_cursor(struct cursor *c)
+{
+ if (c == NULL)
+ return;
+
+ free_cursor(c->next);
+ free_argument(c->argsinsert);
+ free_argument(c->argsresult);
+
+ free(c->name);
+ free(c->function);
+ free(c->command);
+ free(c->prepared_name);
+ free(c);
+}
+
+static void
+free_declared_stmt(struct declared_name_st *st)
+{
+ if (st == NULL)
+ return;
+
+ free_declared_stmt(st->next);
+ free(st);
+}
+
#define ECPG_GETOPT_LONG_REGRESSION 1
int
main(int argc, char *const argv[])
@@ -343,29 +386,18 @@ main(int argc, char *const argv[])
struct typedefs *typeptr;
/* remove old cursor definitions if any are still there */
- for (ptr = cur; ptr != NULL;)
+ if (cur)
{
- struct cursor *this = ptr;
- struct arguments *l1,
- *l2;
-
- free(ptr->command);
- free(ptr->connection);
- free(ptr->name);
- for (l1 = ptr->argsinsert; l1; l1 = l2)
- {
- l2 = l1->next;
- free(l1);
- }
- for (l1 = ptr->argsresult; l1; l1 = l2)
- {
- l2 = l1->next;
- free(l1);
- }
- ptr = ptr->next;
- free(this);
+ free_cursor(cur);
+ cur = NULL;
+ }
+
+ /* remove old declared statements if any are still there */
+ if (g_declared_list)
+ {
+ free_declared_stmt(g_declared_list);
+ g_declared_list = NULL;
}
- cur = NULL;
/* remove non-pertinent old defines as well */
while (defines && !defines->pertinent)
@@ -479,6 +511,18 @@ main(int argc, char *const argv[])
free(input_filename);
}
+
+ if(g_declared_list)
+ {
+ free_declared_stmt(g_declared_list);
+ g_declared_list = NULL;
+ }
+
+ if(cur)
+ {
+ free_cursor(cur);
+ cur = NULL;
+ }
}
return ret_value;
}
diff --git a/src/interfaces/ecpg/preproc/ecpg.header b/src/interfaces/ecpg/preproc/ecpg.header
index 2562366..0cebf56 100644
--- a/src/interfaces/ecpg/preproc/ecpg.header
+++ b/src/interfaces/ecpg/preproc/ecpg.header
@@ -38,6 +38,7 @@ char *current_function;
int ecpg_internal_var = 0;
char *connection = NULL;
char *input_filename = NULL;
+char *g_cursor_name = NULL;
static int FoundInto = 0;
static int initializer = 0;
diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer
index 1c10879..af15b88 100644
--- a/src/interfaces/ecpg/preproc/ecpg.trailer
+++ b/src/interfaces/ecpg/preproc/ecpg.trailer
@@ -284,6 +284,38 @@ prepared_name: name
;
/*
+ * Declare Statement
+ */
+ECPGDeclareStmt: DECLARE prepared_name STATEMENT
+ {
+ struct declared_name_st *ptr = NULL;
+
+ /* Check whether the declared name has been defined or not */
+ for (ptr = g_declared_list; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp($2, ptr->name) == 0)
+ {
+ /* re-definition is a bug */
+ mmerror(PARSE_ERROR, ET_ERROR, "declared name %s is already defined", ptr->name);
+ }
+ }
+
+ /* Add a new declared name into the g_declared_list */
+ ptr = NULL;
+ ptr = (struct declared_name_st *) mm_alloc(sizeof(struct declared_name_st));
+ if (ptr)
+ {
+ /* initial definition */
+ ptr->name = $2;
+ ptr->next = g_declared_list;
+ g_declared_list = ptr;
+ }
+
+ $$ = mm_strdup($2);
+ }
+;
+
+/*
* Declare a prepared cursor. The syntax is different from the standard
* declare statement, so we create a new rule.
*/
@@ -309,6 +341,7 @@ ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared
}
this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ memset(this, 0 ,sizeof(struct cursor));
/* initial definition */
this->next = cur;
@@ -318,6 +351,7 @@ ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared
this->command = cat_str(6, mm_strdup("declare"), cursor_marker, $3, mm_strdup("cursor"), $5, mm_strdup("for $1"));
this->argsresult = NULL;
this->argsresult_oos = NULL;
+ this->prepared_name = $7;
thisquery->type = &ecpg_query;
thisquery->brace_level = 0;
diff --git a/src/interfaces/ecpg/preproc/ecpg.type b/src/interfaces/ecpg/preproc/ecpg.type
index ac6aa00..978be84 100644
--- a/src/interfaces/ecpg/preproc/ecpg.type
+++ b/src/interfaces/ecpg/preproc/ecpg.type
@@ -9,6 +9,7 @@
%type <str> ECPGDeallocateDescr
%type <str> ECPGDeclaration
%type <str> ECPGDeclare
+%type <str> ECPGDeclareStmt
%type <str> ECPGDescribe
%type <str> ECPGDisconnect
%type <str> ECPGExecuteImmediateStmt
diff --git a/src/interfaces/ecpg/preproc/extern.h b/src/interfaces/ecpg/preproc/extern.h
index 0ce3a6e..dcfdc06 100644
--- a/src/interfaces/ecpg/preproc/extern.h
+++ b/src/interfaces/ecpg/preproc/extern.h
@@ -50,6 +50,7 @@ extern struct _include_path *include_paths;
extern struct cursor *cur;
extern struct typedefs *types;
extern struct _defines *defines;
+extern struct declared_name_st *g_declared_list;
extern struct ECPGtype ecpg_no_indicator;
extern struct variable no_indicator;
extern struct arguments *argsinsert;
@@ -72,6 +73,8 @@ extern void output_statement(char *, int, enum ECPG_statement_type);
extern void output_prepare_statement(char *, char *);
extern void output_deallocate_prepare_statement(char *);
extern void output_simple_statement(char *);
+extern void output_declare_statement(char *);
+extern void output_cursor_statement(int , char *, char *, char *, int , enum ECPG_statement_type);
extern char *hashline_number(void);
extern int base_yyparse(void);
extern int base_yylex(void);
diff --git a/src/interfaces/ecpg/preproc/output.c b/src/interfaces/ecpg/preproc/output.c
index 59d5d30..65e94b8 100644
--- a/src/interfaces/ecpg/preproc/output.c
+++ b/src/interfaces/ecpg/preproc/output.c
@@ -5,6 +5,7 @@
#include "extern.h"
static void output_escaped_str(char *cmd, bool quoted);
+static void output_cursor_name(char *str);
void
output_line_number(void)
@@ -195,7 +196,16 @@ static void
output_escaped_str(char *str, bool quoted)
{
int i = 0;
- int len = strlen(str);
+ int len = 0;
+
+ if (str == NULL)
+ {
+ fputs("NULL", base_yyout);
+
+ return;
+ }
+
+ len = strlen(str);
if (quoted && str[0] == '"' && str[len - 1] == '"') /* do not escape quotes
* at beginning and end
@@ -244,3 +254,147 @@ output_escaped_str(char *str, bool quoted)
if (quoted && str[0] == '"' && str[len] == '"')
fputs("\"", base_yyout);
}
+
+/*
+ * This is a tool function used by the output_cursor_statement function to print
+ * cursor name after the string such as "ECPGopen(","ECPGfetch(","ECPGclose(".
+ */
+static void
+output_cursor_name(char *str)
+{
+ int i = 0;
+ int len = 0;
+
+ if (str == NULL)
+ {
+ fputs("NULL", base_yyout);
+
+ return;
+ }
+
+ len = strlen(str);
+ fputs("\"", base_yyout);
+ if (str[0] == '\"' && str[len - 1] == '\"')
+ {
+ i = 1;
+ len--;
+ fputs("\\\"", base_yyout);
+
+ /* output this char by char as we have to filter " and \n */
+ for (; i < len; i++)
+ {
+ if (str[i] == '"')
+ fputs("\\\"", base_yyout);
+ else if (str[i] == '\n')
+ fputs("\\\n", base_yyout);
+ else if (str[i] == '\\')
+ {
+ int j = i;
+
+ /*
+ * check whether this is a continuation line if it is, do not
+ * output anything because newlines are escaped anyway
+ */
+
+ /* accept blanks after the '\' as some other compilers do too */
+ do
+ {
+ j++;
+ } while (str[j] == ' ' || str[j] == '\t');
+
+ if ((str[j] != '\n') && (str[j] != '\r' || str[j + 1] != '\n')) /* not followed by a
+ * newline */
+ fputs("\\\\",base_yyout);
+ }
+ else if (str[i] == '\r' && str[i + 1] == '\n')
+ {
+ fputs("\\\r\n", base_yyout);
+ i++;
+ }
+ else
+ fputc(str[i], base_yyout);
+ }
+
+ fputs("\\\"", base_yyout);
+ }
+ else
+ fputs(str, base_yyout);
+
+ fputs("\"", base_yyout);
+}
+
+/*
+ * Translate the EXEC SQL DECLARE STATEMENT into ECPGdeclare function
+ */
+void
+output_declare_statement(char *name)
+{
+ /* connection is set in "at:" token in ecpg.trailer file */
+ fprintf(base_yyout, "{ ECPGdeclare(__LINE__, %s, ", connection ? connection : "NULL");
+ output_escaped_str(name, true);
+ fputs(");", base_yyout);
+
+ whenever_action(2);
+ free(name);
+ if (connection != NULL)
+ free(connection);
+}
+
+/*
+ * Translate the EXEC SQL CURSOR STATEMENT such as OPEN/FETCH/CLOSE cursor into
+ * ECPGopen/ECPGfetch/ECPGclose function
+ */
+void
+output_cursor_statement(int cursor_stmt, char *cursor_name, char *prepared_name, char *stmt, int whenever_mode, enum ECPG_statement_type st)
+{
+ switch(cursor_stmt)
+ {
+ case ECPGcst_open:
+ fprintf(base_yyout, "{ ECPGopen(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", ");
+ output_escaped_str(prepared_name, true);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ case ECPGcst_fetch:
+ fprintf(base_yyout, "{ ECPGfetch(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ case ECPGcst_close:
+ fprintf(base_yyout, "{ ECPGclose(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ }
+
+ if (st == ECPGst_execute || st == ECPGst_exec_immediate)
+ fprintf(base_yyout, "%s, %s, ", ecpg_statement_type_name[st], stmt);
+ else
+ {
+ if (st == ECPGst_prepnormal && auto_prepare)
+ fputs("ECPGst_prepnormal, \"", base_yyout);
+ else
+ fputs("ECPGst_normal, \"", base_yyout);
+
+ output_escaped_str(stmt, false);
+ fputs("\", ", base_yyout);
+ }
+
+ /* dump variables to C file */
+ dump_variables(argsinsert, 1);
+ fputs("ECPGt_EOIT, ", base_yyout);
+ dump_variables(argsresult, 1);
+ fputs("ECPGt_EORT);", base_yyout);
+ reset_variables();
+
+ whenever_action(whenever_mode | 2);
+ free(cursor_name);
+ free(prepared_name);
+ free(stmt);
+ if (connection != NULL)
+ free(connection);
+}
\ No newline at end of file
diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h
index cd0d1da..1b6ddfb 100644
--- a/src/interfaces/ecpg/preproc/type.h
+++ b/src/interfaces/ecpg/preproc/type.h
@@ -129,6 +129,7 @@ struct cursor
char *command;
char *connection;
bool opened;
+ char *prepared_name;
struct arguments *argsinsert;
struct arguments *argsinsert_oos;
struct arguments *argsresult;
@@ -136,6 +137,13 @@ struct cursor
struct cursor *next;
};
+/* structure to store declared name */
+struct declared_name_st
+{
+ char *name; /* declared name */
+ struct declared_name_st *next;
+};
+
struct typedefs
{
char *name;
002_declareStmt_ecpglib_v4.patchapplication/octet-stream; name=002_declareStmt_ecpglib_v4.patchDownload
diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile
index fbb1407..132e53a 100644
--- a/src/interfaces/ecpg/ecpglib/Makefile
+++ b/src/interfaces/ecpg/ecpglib/Makefile
@@ -26,7 +26,7 @@ override CFLAGS += $(PTHREAD_CFLAGS)
LIBS := $(filter-out -lpgport, $(LIBS))
OBJS= execute.o typename.o descriptor.o sqlda.o data.o error.o prepare.o memory.o \
- connect.o misc.o path.o pgstrcasecmp.o \
+ connect.o misc.o path.o pgstrcasecmp.o cursor.o \
$(filter snprintf.o strlcpy.o win32setlocale.o isinf.o, $(LIBOBJS)) $(WIN32RES)
# thread.c is needed only for non-WIN32 implementation of path.c
diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c
index c90f13d..ddbc08c 100644
--- a/src/interfaces/ecpg/ecpglib/connect.c
+++ b/src/interfaces/ecpg/ecpglib/connect.c
@@ -340,6 +340,8 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
return false;
}
+ memset(this, 0, sizeof(struct connection));
+
if (dbname != NULL)
{
/* get the detail information from dbname */
@@ -684,12 +686,15 @@ ECPGdisconnect(int lineno, const char *connection_name)
if (strcmp(connection_name, "ALL") == 0)
{
+ struct connection *f = NULL;
+
ecpg_init_sqlca(sqlca);
for (con = all_connections; con;)
{
- struct connection *f = con;
+ f = con;
con = con->next;
+ ecpg_release_declared_statement(f->name);
ecpg_finish(f);
}
}
@@ -705,7 +710,10 @@ ECPGdisconnect(int lineno, const char *connection_name)
return (false);
}
else
+ {
+ ecpg_release_declared_statement(connection_name);
ecpg_finish(con);
+ }
}
#ifdef ENABLE_THREAD_SAFETY
diff --git a/src/interfaces/ecpg/ecpglib/cursor.c b/src/interfaces/ecpg/ecpglib/cursor.c
new file mode 100644
index 0000000..4391ec3
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/cursor.c
@@ -0,0 +1,260 @@
+/* src/interfaces/ecpg/ecpglib/cursor.c */
+
+#define POSTGRES_ECPG_INTERNAL
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <locale.h>
+#include <string.h>
+
+#include "ecpgtype.h"
+#include "ecpglib.h"
+#include "ecpgerrno.h"
+#include "extern.h"
+#include "sqlca.h"
+
+static void add_cursor(const int, const char *, const char *);
+static void remove_cursor(const char *, struct connection *);
+static bool find_cursor(const char *, const struct connection *);
+
+/*
+ * Function: Handle the EXEC SQL OPEN cursor statement:
+ * Input:
+ * cursor_name --- cursor name
+ * prepared_name --- prepared name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGopen(const char *cursor_name,const char *prepared_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ /*
+ * If the declared name is referred by the PREPARE statement then the
+ * prepared_name is same as declared name
+ */
+ real_connection_name = ecpg_get_con_name_by_declared_name(prepared_name);
+ if (real_connection_name)
+ {
+ /* Add the cursor name into the declared node */
+ ecpg_update_declare_statement(prepared_name, cursor_name, lineno);
+ }
+ else
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+
+ /* Add the cursor into the connection */
+ add_cursor(lineno, cursor_name, real_connection_name);
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return status;
+}
+
+
+/*
+ * Function: Handle the EXEC SQL FETCH/MOVE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGfetch(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return (false);
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return status;
+}
+
+
+/*
+ * Function: Handle the EXEC SQL CLOSE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGclose(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+ struct connection *con = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+
+ /* check the existence of the cursor in the connection */
+ if (false == find_cursor(cursor_name, con))
+ {
+ ecpg_raise(lineno, ECPG_INVALID_CURSOR, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ remove_cursor(cursor_name, con);
+
+ return status;
+}
+
+/*
+ * Function: Add a cursor into the connection
+ */
+static void
+add_cursor(const int lineno, const char *cursor_name, const char *connection_name)
+{
+ struct connection *con;
+ struct cursor_statement *new = NULL;
+
+ if (!cursor_name)
+ return ;
+
+ con = ecpg_get_connection(connection_name);
+ if (!con)
+ {
+ return;
+ }
+
+ if (find_cursor(cursor_name, con))
+ {
+ /*
+ * Should never goto here, because ECPG has checked the duplication of
+ * the cursor in pre-compile stage.
+ */
+ return;
+ }
+
+ /* allocate a node to store the new cursor */
+ new = (struct cursor_statement *)ecpg_alloc(sizeof(struct cursor_statement), lineno);
+ if (new)
+ {
+ new->name = ecpg_strdup(cursor_name, lineno);
+ new->next = con->cursor_stmts;
+ con->cursor_stmts = new;
+ }
+}
+
+/*
+ * Function: Remove the cursor from the connection
+ */
+static void
+remove_cursor(const char *cursor_name, struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+ struct cursor_statement *prev = NULL;
+
+ if (!connection || !cursor_name)
+ return ;
+
+ cur = connection->cursor_stmts;
+ while (cur)
+ {
+ if (strcmp(cur->name, cursor_name) == 0)
+ {
+ if (!prev)
+ connection->cursor_stmts = cur->next;
+ else
+ prev->next = cur->next;
+
+ ecpg_free(cur->name);
+ ecpg_free(cur);
+
+ break;
+ }
+ prev = cur;
+ cur = cur->next;
+ }
+}
+
+/*
+ * Function: Find whether the cursor exists in the connection or not
+ * Return: true ---Found
+ * false --- Not found
+ */
+static bool
+find_cursor(const char *cursor_name, const struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+
+ if (!connection || !cursor_name)
+ return false;
+
+ for (cur = connection->cursor_stmts; cur != NULL; cur = cur->next)
+ {
+ if (strcmp(cur->name, cursor_name) == 0)
+ return true;
+ }
+
+ return false;
+}
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c
index 15fd7a0..858be01 100644
--- a/src/interfaces/ecpg/ecpglib/descriptor.c
+++ b/src/interfaces/ecpg/ecpglib/descriptor.c
@@ -818,6 +818,7 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
struct prepared_statement *prep;
PGresult *res;
va_list args;
+ const char *real_connection_name = NULL;
/* DESCRIBE INPUT is not yet supported */
if (input)
@@ -826,13 +827,20 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
return ret;
}
- con = ecpg_get_connection(connection_name);
- if (!con)
+ real_connection_name = ecpg_get_con_name_by_declared_name(stmt_name);
+ if (real_connection_name == NULL)
{
- ecpg_raise(line, ECPG_NO_CONN, ECPG_SQLSTATE_CONNECTION_DOES_NOT_EXIST,
- connection_name ? connection_name : ecpg_gettext("NULL"));
- return ret;
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
}
+
+ con = ecpg_get_connection(real_connection_name);
+ if (!ecpg_init(con, real_connection_name, line))
+ return false;
+
prep = ecpg_find_prepared_statement(stmt_name, con, NULL);
if (!prep)
{
diff --git a/src/interfaces/ecpg/ecpglib/error.c b/src/interfaces/ecpg/ecpglib/error.c
index 656b2c4..11a1a7c 100644
--- a/src/interfaces/ecpg/ecpglib/error.c
+++ b/src/interfaces/ecpg/ecpglib/error.c
@@ -200,6 +200,13 @@ ecpg_raise(int line, int code, const char *sqlstate, const char *str)
ecpg_gettext("could not connect to database \"%s\" on line %d"), str, line);
break;
+ case ECPG_INVALID_CURSOR:
+ snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
+ /*------
+ translator: this string will be truncated at 149 characters expanded. */
+ ecpg_gettext("The cursor is invalid on line %d"),line);
+ break;
+
default:
snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
/*------
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index d5a463d..1a50307 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -2032,9 +2032,32 @@ ECPGdo(const int lineno, const int compat, const int force_indicator, const char
{
va_list args;
bool ret;
+ const char *real_connection_name = NULL;
+
+ real_connection_name = connection_name;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ /* Handle the EXEC SQL EXECUTE... statement */
+ if(ECPGst_execute == st)
+ {
+ real_connection_name = ecpg_get_con_name_by_declared_name(query);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+ }
va_start(args, query);
- ret = ecpg_do(lineno, compat, force_indicator, connection_name,
+ ret = ecpg_do(lineno, compat, force_indicator, real_connection_name,
questionmarks, st, query, args);
va_end(args);
diff --git a/src/interfaces/ecpg/ecpglib/exports.txt b/src/interfaces/ecpg/ecpglib/exports.txt
index 69e9617..08fa1bb 100644
--- a/src/interfaces/ecpg/ecpglib/exports.txt
+++ b/src/interfaces/ecpg/ecpglib/exports.txt
@@ -29,3 +29,7 @@ ECPGget_PGconn 26
ECPGtransactionStatus 27
ECPGset_var 28
ECPGget_var 29
+ECPGdeclare 30
+ECPGopen 31
+ECPGfetch 32
+ECPGclose 33
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/extern.h b/src/interfaces/ecpg/ecpglib/extern.h
index c3082be..13d978c 100644
--- a/src/interfaces/ecpg/ecpglib/extern.h
+++ b/src/interfaces/ecpg/ecpglib/extern.h
@@ -66,6 +66,15 @@ struct statement
PGresult *results;
};
+/* structure to store declared statements */
+struct declared_statement
+{
+ char *name; /* declared name */
+ char *connection_name;
+ char *cursor_name;
+ struct declared_statement *next;
+};
+
/* structure to store prepared statements for a connection */
struct prepared_statement
{
@@ -75,6 +84,12 @@ struct prepared_statement
struct prepared_statement *next;
};
+struct cursor_statement
+{
+ char *name; /*cursor name*/
+ struct cursor_statement *next;
+};
+
/* structure to store connections */
struct connection
{
@@ -83,6 +98,7 @@ struct connection
bool autocommit;
struct ECPGtype_information_cache *cache_head;
struct prepared_statement *prep_stmts;
+ struct cursor_statement *cursor_stmts;
struct connection *next;
};
@@ -165,6 +181,11 @@ struct descriptor *ecpg_find_desc(int line, const char *name);
struct prepared_statement *ecpg_find_prepared_statement(const char *,
struct connection *, struct prepared_statement **);
+void ecpg_update_declare_statement(const char *, const char *, const int);
+char *ecpg_get_con_name_by_declared_name(const char *);
+const char *ecpg_get_con_name_by_cursor_name(const char *);
+void ecpg_release_declared_statement(const char *);
+
bool ecpg_store_result(const PGresult *results, int act_field,
const struct statement * stmt, struct variable * var);
bool ecpg_store_input(const int, const bool, const struct variable *, char **, bool);
@@ -220,4 +241,4 @@ void ecpg_set_native_sqlda(int, struct sqlda_struct **, const PGresult *, int,
#define ECPG_SQLSTATE_ECPG_INTERNAL_ERROR "YE000"
#define ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY "YE001"
-#endif /* _ECPG_LIB_EXTERN_H */
+#endif /* _ECPG_LIB_EXTERN_H */
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/prepare.c b/src/interfaces/ecpg/ecpglib/prepare.c
index 983b242..0a939cd 100644
--- a/src/interfaces/ecpg/ecpglib/prepare.c
+++ b/src/interfaces/ecpg/ecpglib/prepare.c
@@ -26,9 +26,11 @@ static int nextStmtID = 1;
static const int stmtCacheNBuckets = 2039; /* # buckets - a prime # */
static const int stmtCacheEntPerBucket = 8; /* # entries/bucket */
static stmtCacheEntry stmtCacheEntries[16384] = {{0, {0}, 0, 0, 0}};
+static struct declared_statement *g_declared_list;
static bool deallocate_one(int lineno, enum COMPAT_MODE c, struct connection * con,
struct prepared_statement * prev, struct prepared_statement * this);
+static struct declared_statement *ecpg_find_declared_statement(const char *);
static bool
isvarchar(unsigned char c)
@@ -117,6 +119,7 @@ prepare_common(int lineno, struct connection * con, const char *name, const char
ecpg_free(this);
return false;
}
+ memset(stmt, 0, sizeof(struct statement));
/* create statement */
stmt->lineno = lineno;
@@ -163,11 +166,22 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
(void) questionmarks; /* quiet the compiler */
- con = ecpg_get_connection(connection_name);
- if (!ecpg_init(con, connection_name, lineno))
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+ if (!ecpg_init(con, real_connection_name, lineno))
return false;
/* check if we already have prepared this statement */
@@ -255,9 +269,19 @@ ECPGdeallocate(int lineno, int c, const char *connection_name, const char *name)
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
- con = ecpg_get_connection(connection_name);
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+ con = ecpg_get_connection(real_connection_name);
if (!ecpg_init(con, connection_name, lineno))
return false;
@@ -305,8 +329,21 @@ ecpg_prepared(const char *name, struct connection * con)
char *
ECPGprepared_statement(const char *connection_name, const char *name, int lineno)
{
+ const char *real_connection_name = NULL;
+
(void) lineno; /* keep the compiler quiet */
- return ecpg_prepared(name, ecpg_get_connection(connection_name));
+
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ return ecpg_prepared(name, ecpg_get_connection(real_connection_name));
}
/*
@@ -513,3 +550,196 @@ ecpg_auto_prepare(int lineno, const char *connection_name, const int compat, cha
return (true);
}
+
+/*
+ * handle the EXEC SQL DECLARE STATEMENT
+ * Input: connection_name -- connection name
+ * name -- declared name
+ */
+bool
+ECPGdeclare(int lineno, const char *connection_name, const char *name)
+{
+ struct connection *con = NULL;
+ struct declared_statement *p = NULL;
+
+ if(name == NULL)
+ {
+ /* Should never go to here because ECPG pre-compiler will check it */
+ return false;
+ }
+
+ if(connection_name == NULL)
+ {
+ /*
+ * Going to here means not using AT clause in the DECLARE STATEMENT
+ * We don't allocate a node to store the declared name because the
+ * DECLARE STATEMENT without using AT clause will be ignored.
+ */
+ return true;
+ }
+
+ con = ecpg_get_connection(connection_name);
+ if (!ecpg_init(con, connection_name, lineno))
+ return false;
+
+ if(ecpg_find_declared_statement(name))
+ {
+ /* Should not go to here because the pre-compiler has check the duplicate name */
+ return false;
+ }
+
+ /* allocate a declared_statement as a new node */
+ p = (struct declared_statement *) ecpg_alloc(sizeof(struct declared_statement), lineno);
+ if (!p)
+ return false;
+
+ memset(p, 0, sizeof(struct declared_statement));
+
+ ecpg_log("ECPGdeclare on line %d: declared name %s on connection: \"%s\"\n", lineno, name, connection_name);
+
+ p->name = ecpg_strdup(name, lineno);
+ p->connection_name = ecpg_strdup(connection_name, lineno);
+
+ /* Add the new node into the g_declared_list */
+ if(g_declared_list != NULL)
+ {
+ p->next = g_declared_list;
+ g_declared_list = p;
+ }
+ else
+ g_declared_list = p;
+
+ return true;
+}
+
+/*
+ * Find a declared node by declared name
+ * Input: name -- declared name
+ * Return: Found -- The pointer points to the declared node
+ * Not found -- NULL
+ */
+static struct declared_statement *
+ecpg_find_declared_statement(const char *name)
+{
+ struct declared_statement *p;
+
+ if(name == NULL)
+ return NULL;
+
+ p = g_declared_list;
+ while(p)
+ {
+ if (strcmp(p->name, name) == 0)
+ return p;
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/*
+ * Build the relationship between the declared name and cursor name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * cursor_name -- cursor name declared in the DECLARE/OPEN CURSOR statement
+ */
+void
+ecpg_update_declare_statement(const char *declared_name, const char *cursor_name, const int lineno)
+{
+ struct declared_statement *p = NULL;
+
+ if(!declared_name || !cursor_name)
+ return;
+
+ /* Find the declared node by declared name */
+ p = ecpg_find_declared_statement(declared_name);
+ if(p)
+ p->cursor_name = ecpg_strdup(cursor_name,lineno);
+}
+
+/*
+ * Find and return the connection name referred by the declared name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+char *
+ecpg_get_con_name_by_declared_name(const char *declared_name)
+{
+ struct declared_statement *p;
+
+ p = ecpg_find_declared_statement(declared_name);
+ if(p)
+ return p->connection_name;
+
+ return NULL;
+}
+
+/*
+ * Find the declared name referred by the cursor,
+ * then return the connection name used by the declared name.
+ * Input: cursor_name -- the cursor name
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+const char *
+ecpg_get_con_name_by_cursor_name(const char *cursor_name)
+{
+ struct declared_statement *p;
+
+ if(cursor_name == NULL)
+ return NULL;
+
+ p = g_declared_list;
+ while(p)
+ {
+ /* Search the cursor name in the declared list */
+ if(p->cursor_name && (strcmp(p->cursor_name, cursor_name) == 0))
+ return p->connection_name;
+
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/*
+ * Release the declare node from the g_declared_list which refers the connection_name
+ * Input: connection_name -- connection name
+ */
+void
+ecpg_release_declared_statement(const char *connection_name)
+{
+ struct declared_statement *cur = NULL;
+ struct declared_statement *prev = NULL;
+ struct declared_statement *next = NULL;
+
+ if(connection_name == NULL)
+ return;
+
+ cur = g_declared_list;
+ while(cur)
+ {
+ next = cur->next;
+ if (strcmp(cur->connection_name, connection_name) == 0)
+ {
+ /* If find then release the declared node from the list */
+ if(prev)
+ prev->next = next;
+ else
+ g_declared_list = next;
+
+ ecpg_log("ecpg_release_declared_statement: declared name %s is released\n", cur->name);
+
+ ecpg_free(cur->name);
+ ecpg_free(cur->connection_name);
+ ecpg_free(cur->cursor_name);
+ ecpg_free(cur);
+
+ /* One connection can be used by multiple declared name, so no break here */
+ }
+ else
+ prev = cur;
+
+ cur = next;
+ }
+}
\ No newline at end of file
diff --git a/src/interfaces/ecpg/include/ecpgerrno.h b/src/interfaces/ecpg/include/ecpgerrno.h
index 36b15b7..fae9440 100644
--- a/src/interfaces/ecpg/include/ecpgerrno.h
+++ b/src/interfaces/ecpg/include/ecpgerrno.h
@@ -44,6 +44,7 @@
#define ECPG_UNKNOWN_DESCRIPTOR_ITEM -242
#define ECPG_VAR_NOT_NUMERIC -243
#define ECPG_VAR_NOT_CHAR -244
+#define ECPG_INVALID_CURSOR -245
/* finally the backend error messages, they start at 400 */
#define ECPG_PGSQL -400
diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h
index c32df6c..8c91212 100644
--- a/src/interfaces/ecpg/include/ecpglib.h
+++ b/src/interfaces/ecpg/include/ecpglib.h
@@ -55,6 +55,10 @@ bool ECPGdisconnect(int, const char *);
bool ECPGprepare(int, const char *, const bool, const char *, const char *);
bool ECPGdeallocate(int, int, const char *, const char *);
bool ECPGdeallocate_all(int, int, const char *);
+bool ECPGdeclare(int, const char *, const char *);
+bool ECPGopen(const char*, const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGfetch(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGclose(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
char *ECPGprepared_statement(const char *, const char *, int);
PGconn *ECPGget_PGconn(const char *);
PGTransactionStatusType ECPGtransactionStatus(const char *);
diff --git a/src/interfaces/ecpg/include/ecpgtype.h b/src/interfaces/ecpg/include/ecpgtype.h
index 7cc47e9..2c3f348 100644
--- a/src/interfaces/ecpg/include/ecpgtype.h
+++ b/src/interfaces/ecpg/include/ecpgtype.h
@@ -99,8 +99,15 @@ enum ECPG_statement_type
ECPGst_prepnormal
};
+enum ECPG_cursor_statement_type
+{
+ ECPGcst_declare,
+ ECPGcst_open,
+ ECPGcst_fetch,
+ ECPGcst_close
+};
#ifdef __cplusplus
}
#endif
-#endif /* _ECPGTYPE_H */
+#endif /* _ECPGTYPE_H */
003_declareStmt_doc_v4.patchapplication/octet-stream; name=003_declareStmt_doc_v4.patchDownload
diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml
index b8021cb..1c104b0 100644
--- a/doc/src/sgml/ecpg.sgml
+++ b/doc/src/sgml/ecpg.sgml
@@ -224,7 +224,7 @@ EXEC SQL CONNECT TO :target USER :user USING :passwd;
SQL statements in embedded SQL programs are by default executed on
the current connection, that is, the most recently opened one. If
an application needs to manage multiple connections, then there are
- two ways to handle this.
+ three ways to handle this.
</para>
<para>
@@ -296,6 +296,17 @@ current=testdb2 (should be testdb2)
current=testdb1 (should be testdb1)
</screen>
</para>
+
+ <para>
+ The third option is to declare a sql identifier linked to
+ the connection, for example:
+<programlisting>
+EXEC SQL AT <replaceable>connection-name</replaceable> DECLARE <replaceable>statement-name</replaceable> STATEMENT;
+EXEC SQL PREPARE <replaceable>statement-name</replaceable> FROM :<replaceable>dyn-string</replaceable>;
+</programlisting>
+ Once you link a sql identifier to a connection, you execute a dynamic SQL
+ without AT clause.
+ </para>
</sect2>
<sect2 id="ecpg-disconnect">
@@ -6683,6 +6694,107 @@ EXEC SQL DECLARE cur1 CURSOR FOR stmt1;
</refsect1>
</refentry>
+ <refentry id="ecpg-sql-declare-statement">
+ <refnamediv>
+ <refname>DECLARE STATEMENT</refname>
+ <refpurpose>declares SQL statement identifier associated with connection</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+<synopsis>
+EXEC SQL [ AT connection_name ] DECLARE <replaceable class="PARAMETER">statement_name</replaceable> STATEMENT
+</synopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>Description</title>
+
+ <para>
+ <command>DECLARE STATEMENT</command> declares SQL statement identifier.
+ SQL statement identifier is associated with connection.
+ </para>
+
+ <para>
+ <command>DELARE CURSOR</command> with a SQL statement identifier can be written before PREPARE.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Parameters</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><replaceable class="PARAMETER">connection_name</replaceable></term>
+ <listitem>
+ <para>
+ A database connection name established by the <command>CONNECT</command> command.
+ </para>
+ <para>
+ If AT clause is omitted, an SQL statement identifier is associated with the DEFAULT connection.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <variablelist>
+ <varlistentry>
+ <term><replaceable class="PARAMETER">statement_name</replaceable></term>
+ <listitem>
+ <para>
+ The name of a SQL statement identifier, either as an SQL identifier or a host variable.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>Notes</title>
+
+ <para>
+ An SQL statement with a SQL statement identifier must use a same connection
+ as the connection that the SQL statement identifier is associated with.
+ </para>
+
+ <para>
+ AT clause cannot be used with the SQL statement which have been identified by <command>DECLARE STATEMENT</command>
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Examples</title>
+
+<programlisting>
+EXEC SQL CONNECT TO postgres AS con1;
+EXEC SQL AT con1 DECLARE sql_stmt STATEMENT;
+EXEC SQL DECLARE cursor_name CURSOR FOR sql_stmt;
+EXEC SQL PREPARE sql_stmt FROM :dyn_string;
+EXEC SQL OPEN cursor_name;
+EXEC SQL FETCH cursor_name INTO :column1;
+EXEC SQL CLOSE cursor_name;
+</programlisting>
+ </refsect1>
+
+ <refsect1>
+ <title>Compatibility</title>
+
+ <para>
+ <command>DECLARE STATEMENT</command> is a PostgreSQL extension of the SQL standard,
+ but can be used in Oracle and DB2.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>See Also</title>
+
+ <simplelist type="inline">
+ <member><xref linkend="ecpg-sql-connect"></member>
+ <member><xref linkend="ecpg-sql-declare"></member>
+ <member><xref linkend="ecpg-sql-open"></member>
+ </simplelist>
+ </refsect1>
+ </refentry>
+
<refentry id="ecpg-sql-describe">
<refnamediv>
<refname>DESCRIBE</refname>
004_declareStmt_test_v4.patchapplication/octet-stream; name=004_declareStmt_test_v4.patchDownload
diff --git a/src/interfaces/ecpg/test/ecpg_schedule b/src/interfaces/ecpg/test/ecpg_schedule
index c3ec125..5f7fe5b 100644
--- a/src/interfaces/ecpg/test/ecpg_schedule
+++ b/src/interfaces/ecpg/test/ecpg_schedule
@@ -48,6 +48,7 @@ test: sql/quote
test: sql/show
test: sql/insupd
test: sql/parser
+test: sql/declare
test: thread/thread
test: thread/thread_implicit
test: thread/prep
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
index 1f316fb..b4a7c44 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
@@ -241,7 +241,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
+ { ECPGopen("mycur1", "st_id1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 101 "sqlda.pgc"
@@ -258,7 +258,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
+ { ECPGfetch("mycur1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 109 "sqlda.pgc"
@@ -279,7 +279,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
#line 118 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -316,7 +316,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
+ { ECPGopen("mycur2", "st_id2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 138 "sqlda.pgc"
@@ -333,7 +333,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch from mycur2", ECPGt_EOIT,
+ { ECPGfetch("mycur2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch from mycur2", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 146 "sqlda.pgc"
@@ -354,7 +354,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
#line 155 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c b/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
index 9934947..48b9197 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
@@ -158,7 +158,7 @@ if (sqlca.sqlcode < 0) dosqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch forward c", ECPGt_EOIT,
+ { ECPGfetch("c", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch forward c", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_decimal,&(j),(long)1,(long)1,sizeof(decimal),
@@ -244,7 +244,7 @@ if (sqlca.sqlcode < 0) dosqlprint ( );}
static void openit(void)
{
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare c cursor for select * from test where i <= $1 ",
+ { ECPGopen("c", NULL, __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare c cursor for select * from test where i <= $1 ",
ECPGt_int,&(*( int *)(ECPGget_var( 0))),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 95 "test_informix.pgc"
diff --git a/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c b/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
index a56513a..ffa5687 100644
--- a/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
+++ b/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
@@ -82,7 +82,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
/* declare cur cursor for select id , d , d from nantest1 */
#line 33 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
#line 34 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -90,7 +90,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_double,&(d),(long)1,(long)1,sizeof(double),
@@ -130,14 +130,14 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
#line 46 "nan_test.pgc"
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 48 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
#line 48 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
#line 50 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -145,7 +145,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_double,&(d),(long)1,(long)1,sizeof(double),
@@ -164,7 +164,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
if (isnan(d))
printf("%d NaN '%s'\n", id, val);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 61 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -221,7 +221,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
/* declare cur1 cursor for select id , d , d from nantest2 */
#line 75 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for select id , d , d from nantest2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur1", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for select id , d , d from nantest2", ECPGt_EOIT, ECPGt_EORT);
#line 76 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -229,7 +229,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur1", ECPGt_EOIT,
+ { ECPGfetch("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur1", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_numeric,&(num),(long)1,(long)0,sizeof(numeric),
@@ -245,7 +245,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
break;
printf("%d %s '%s'\n", id, (num->sign == NUMERIC_NAN ? "NaN" : "not NaN"), val);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
#line 84 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
diff --git a/src/interfaces/ecpg/test/expected/preproc-autoprep.c b/src/interfaces/ecpg/test/expected/preproc-autoprep.c
index 10ede3e..e3abb29 100644
--- a/src/interfaces/ecpg/test/expected/preproc-autoprep.c
+++ b/src/interfaces/ecpg/test/expected/preproc-autoprep.c
@@ -133,7 +133,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 35 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select Item1 from T", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select Item1 from T", ECPGt_EOIT, ECPGt_EORT);
#line 37 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -143,7 +143,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 37 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 39 "autoprep.pgc"
@@ -156,7 +156,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("i = %d\n", i);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
#line 42 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -180,7 +180,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 46 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for $1",
+ { ECPGopen("cur1", "stmt1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 48 "autoprep.pgc"
@@ -199,7 +199,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
i = 0;
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur1", ECPGt_EOIT,
+ { ECPGfetch("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur1", ECPGt_EOIT,
ECPGt_int,&(item1),(long)1,(long)1,sizeof(int),
ECPGt_int,&(ind1),(long)1,(long)1,sizeof(int), ECPGt_EORT);
#line 55 "autoprep.pgc"
@@ -217,7 +217,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
i++;
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
#line 60 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
diff --git a/src/interfaces/ecpg/test/expected/preproc-cursor.c b/src/interfaces/ecpg/test/expected/preproc-cursor.c
index f7da753..ad86a56 100644
--- a/src/interfaces/ecpg/test/expected/preproc-cursor.c
+++ b/src/interfaces/ecpg/test/expected/preproc-cursor.c
@@ -187,7 +187,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
+ { ECPGopen(":curname1", NULL, __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 67 "cursor.pgc"
@@ -197,7 +197,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward from $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -212,7 +212,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -227,7 +227,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -243,7 +243,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
@@ -260,7 +260,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move in");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 in $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 in $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 87 "cursor.pgc"
@@ -270,7 +270,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -286,7 +286,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
@@ -303,7 +303,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 99 "cursor.pgc"
@@ -323,7 +323,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
+ { ECPGopen(":curname2", NULL, __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -337,7 +337,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -352,7 +352,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -367,7 +367,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -383,7 +383,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
@@ -400,7 +400,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -414,7 +414,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -430,7 +430,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
@@ -447,7 +447,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 140 "cursor.pgc"
@@ -483,7 +483,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname3", "st_id1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test1", "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -493,7 +493,7 @@ if (sqlca.sqlcode < 0) exit (1);}
if (sqlca.sqlcode < 0) exit (1);}
#line 153 "cursor.pgc"
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname5", "st_id1", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test2", "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -505,7 +505,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname5", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "fetch $0",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -520,7 +520,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -535,7 +535,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -551,7 +551,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
@@ -568,7 +568,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 174 "cursor.pgc"
@@ -578,7 +578,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -594,7 +594,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
@@ -611,7 +611,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 186 "cursor.pgc"
@@ -619,7 +619,7 @@ if (sqlca.sqlcode < 0) exit (1);}
if (sqlca.sqlcode < 0) exit (1);}
#line 186 "cursor.pgc"
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname5", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 187 "cursor.pgc"
@@ -663,7 +663,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname4", "st_id2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test1", "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -675,7 +675,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -690,7 +690,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -705,7 +705,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -721,7 +721,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
@@ -738,7 +738,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 226 "cursor.pgc"
@@ -748,7 +748,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -764,7 +764,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
@@ -781,7 +781,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 238 "cursor.pgc"
diff --git a/src/interfaces/ecpg/test/expected/preproc-outofscope.c b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
index 348e843..23ce610 100644
--- a/src/interfaces/ecpg/test/expected/preproc-outofscope.c
+++ b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
@@ -201,7 +201,7 @@ get_var1(MYTYPE **myvar0, MYNULLTYPE **mynullvar0)
static void
open_cur1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur cursor for select * from a1", ECPGt_EOIT,
+ { ECPGopen("mycur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur cursor for select * from a1", ECPGt_EOIT,
ECPGt_int,&((*( MYTYPE *)(ECPGget_var( 0)) ).id),(long)1,(long)1,sizeof( struct mytype ),
ECPGt_int,&((*( MYNULLTYPE *)(ECPGget_var( 1)) ).id),(long)1,(long)1,sizeof( struct mynulltype ),
ECPGt_char,&((*( MYTYPE *)(ECPGget_var( 0)) ).t),(long)64,(long)1,sizeof( struct mytype ),
@@ -225,7 +225,7 @@ if (sqlca.sqlcode < 0) exit (1);}
static void
get_record1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch mycur", ECPGt_EOIT,
+ { ECPGfetch("mycur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch mycur", ECPGt_EOIT,
ECPGt_int,&((*( MYTYPE *)(ECPGget_var( 0)) ).id),(long)1,(long)1,sizeof( struct mytype ),
ECPGt_int,&((*( MYNULLTYPE *)(ECPGget_var( 1)) ).id),(long)1,(long)1,sizeof( struct mynulltype ),
ECPGt_char,&((*( MYTYPE *)(ECPGget_var( 0)) ).t),(long)64,(long)1,sizeof( struct mytype ),
@@ -249,7 +249,7 @@ if (sqlca.sqlcode < 0) exit (1);}
static void
close_cur1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur", ECPGt_EOIT, ECPGt_EORT);
#line 58 "outofscope.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/preproc-variable.c b/src/interfaces/ecpg/test/expected/preproc-variable.c
index 7fd03ba..722c02e 100644
--- a/src/interfaces/ecpg/test/expected/preproc-variable.c
+++ b/src/interfaces/ecpg/test/expected/preproc-variable.c
@@ -190,7 +190,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select name , born , age , married , children from family", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select name , born , age , married , children from family", ECPGt_EOIT, ECPGt_EORT);
#line 63 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -206,7 +206,7 @@ if (sqlca.sqlcode < 0) exit (1);}
memset(i, 0, sizeof(ind_personal));
while (1) {
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT,
ECPGt_varchar,&(p->name),(long)BUFFERSIZ,(long)-1,sizeof( struct birthinfo ),
ECPGt_int,&(i->ind_name),(long)1,(long)-1,sizeof( struct birthinfo ),
ECPGt_long,&(p->birth.born),(long)1,(long)1,sizeof( struct birthinfo ),
@@ -241,7 +241,7 @@ if (sqlca.sqlcode < 0) exit (1);}
}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 89 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/sql-binary.c b/src/interfaces/ecpg/test/expected/sql-binary.c
index b91ab7b..ce64de5 100644
--- a/src/interfaces/ecpg/test/expected/sql-binary.c
+++ b/src/interfaces/ecpg/test/expected/sql-binary.c
@@ -111,12 +111,12 @@ main (void)
/* declare C cursor for select name , accs , byte from empl where idnum = $1 */
#line 58 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select name , accs , byte from empl where idnum = $1 ",
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select name , accs , byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 59 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
@@ -133,7 +133,7 @@ main (void)
printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);}
#line 69 "binary.pgc"
@@ -142,12 +142,12 @@ main (void)
/* declare B binary cursor for select name , accs , byte from empl where idnum = $1 */
#line 72 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare B binary cursor for select name , accs , byte from empl where idnum = $1 ",
+ { ECPGopen("B", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare B binary cursor for select name , accs , byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 73 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch B", ECPGt_EOIT,
+ { ECPGfetch("B", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch B", ECPGt_EOIT,
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
@@ -162,7 +162,7 @@ main (void)
exit (sqlca.sqlcode);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close B", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("B", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close B", ECPGt_EOIT, ECPGt_EORT);}
#line 81 "binary.pgc"
@@ -176,12 +176,12 @@ main (void)
/* declare A binary cursor for select byte from empl where idnum = $1 */
#line 89 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare A binary cursor for select byte from empl where idnum = $1 ",
+ { ECPGopen("A", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare A binary cursor for select byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 90 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch A", ECPGt_EOIT,
+ { ECPGfetch("A", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch A", ECPGt_EOIT,
ECPGt_char,&(pointer),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
#line 91 "binary.pgc"
@@ -192,7 +192,7 @@ main (void)
exit (sqlca.sqlcode);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close A", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("A", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close A", ECPGt_EOIT, ECPGt_EORT);}
#line 98 "binary.pgc"
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.c b/src/interfaces/ecpg/test/expected/sql-declare.c
new file mode 100644
index 0000000..342134b
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.c
@@ -0,0 +1,375 @@
+/* Processed by ecpg (regression mode) */
+/* These include files are added by the preprocessor */
+#include <ecpglib.h>
+#include <ecpgerrno.h>
+#include <sqlca.h>
+/* End of automatic include section */
+#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
+
+#line 1 "declare.pgc"
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* exec sql whenever sqlerror sqlprint ; */
+#line 5 "declare.pgc"
+
+
+
+#line 1 "sqlca.h"
+#ifndef POSTGRES_SQLCA_H
+#define POSTGRES_SQLCA_H
+
+#ifndef PGDLLIMPORT
+#if defined(WIN32) || defined(__CYGWIN__)
+#define PGDLLIMPORT __declspec (dllimport)
+#else
+#define PGDLLIMPORT
+#endif /* __CYGWIN__ */
+#endif /* PGDLLIMPORT */
+
+#define SQLERRMC_LEN 150
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+struct sqlca_t
+{
+ char sqlcaid[8];
+ long sqlabc;
+ long sqlcode;
+ struct
+ {
+ int sqlerrml;
+ char sqlerrmc[SQLERRMC_LEN];
+ } sqlerrm;
+ char sqlerrp[8];
+ long sqlerrd[6];
+ /* Element 0: empty */
+ /* 1: OID of processed tuple if applicable */
+ /* 2: number of rows processed */
+ /* after an INSERT, UPDATE or */
+ /* DELETE statement */
+ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ char sqlwarn[8];
+ /* Element 0: set to 'W' if at least one other is 'W' */
+ /* 1: if 'W' at least one character string */
+ /* value was truncated when it was */
+ /* stored into a host variable. */
+
+ /*
+ * 2: if 'W' a (hopefully) non-fatal notice occurred
+ */ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ /* 6: empty */
+ /* 7: empty */
+
+ char sqlstate[5];
+};
+
+struct sqlca_t *ECPGget_sqlca(void);
+
+#ifndef POSTGRES_ECPG_INTERNAL
+#define sqlca (*ECPGget_sqlca())
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#line 7 "declare.pgc"
+
+
+#line 1 "regression.h"
+
+
+
+
+
+
+#line 8 "declare.pgc"
+
+
+#define ARRAY_SZIE 20
+
+void execute_test(void);
+void commitTable(void);
+void reset(void);
+void printResult(char *tc_name, int loop);
+
+/* exec sql begin declare section */
+
+
+
+
+#line 18 "declare.pgc"
+ int f1 [ ARRAY_SZIE ] ;
+
+#line 19 "declare.pgc"
+ int f2 [ ARRAY_SZIE ] ;
+
+#line 20 "declare.pgc"
+ char f3 [ ARRAY_SZIE ] [ 20 ] ;
+/* exec sql end declare section */
+#line 21 "declare.pgc"
+
+
+int main(void)
+{
+ setlocale(LC_ALL, "C");
+
+ ECPGdebug(1, stderr);
+
+ { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , "con1", 0);
+#line 29 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 29 "declare.pgc"
+
+ { ECPGconnect(__LINE__, 0, "ecpg2_regression" , NULL, NULL , "con2", 0);
+#line 30 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 30 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 32 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 32 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 33 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 33 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 35 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 35 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 36 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 36 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 38 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 38 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 39 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 39 "declare.pgc"
+
+
+ commitTable();
+
+ execute_test();
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 45 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 45 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 46 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 46 "declare.pgc"
+
+
+ commitTable();
+
+ { ECPGdisconnect(__LINE__, "ALL");
+#line 50 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 50 "declare.pgc"
+
+
+ return 0;
+}
+
+/*
+ * default connection: con2
+ * Non-default connection: con1
+ *
+ */
+void execute_test(void)
+{
+ /* exec sql begin declare section */
+
+
+
+#line 63 "declare.pgc"
+ int i ;
+
+#line 64 "declare.pgc"
+ char * selectString = "SELECT f1,f2,f3 FROM source" ;
+/* exec sql end declare section */
+#line 65 "declare.pgc"
+
+
+ /* testcase1. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement*/
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_1");
+#line 70 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 70 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_1", selectString);
+#line 71 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 71 "declare.pgc"
+
+ /* declare cur_1 cursor for $1 */
+#line 72 "declare.pgc"
+
+ { ECPGopen("cur_1", "stmt_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_1 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 73 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 73 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 75 "declare.pgc"
+
+ i = 0;
+ while (1)
+ {
+ { ECPGfetch("cur_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_1", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 79 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 79 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 79 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_1", ECPGt_EOIT, ECPGt_EORT);
+#line 83 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 83 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_1");
+#line 84 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 84 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 85 "declare.pgc"
+
+
+ printResult("testcase1", 2);
+
+ /* testcase2. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement*/
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_2");
+#line 92 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 92 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_2", selectString);
+#line 93 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 93 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "stmt_2", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 94 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 94 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_2");
+#line 96 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 96 "declare.pgc"
+
+
+ printResult("testcase2", 2);
+}
+
+void commitTable()
+{
+ { ECPGtrans(__LINE__, "con1", "commit");
+#line 103 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 103 "declare.pgc"
+
+ { ECPGtrans(__LINE__, "con2", "commit");
+#line 104 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 104 "declare.pgc"
+
+}
+
+/*
+ * reset all the output variables
+ */
+void reset()
+{
+ memset(f1, 0, sizeof(f1));
+ memset(f2, 0, sizeof(f2));
+ memset(f3, 0, sizeof(f3));
+}
+
+void printResult(char *tc_name, int loop)
+{
+ int i;
+
+ if (tc_name)
+ printf("****%s test results:****\n", tc_name);
+
+ for (i = 0; i < loop; i++)
+ printf("f1=%d, f2=%d, f3=%s\n", f1[i], f2[i], f3[i]);
+
+ printf("\n");
+}
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stderr b/src/interfaces/ecpg/test/expected/sql-declare.stderr
new file mode 100644
index 0000000..3693f8b
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.stderr
@@ -0,0 +1,140 @@
+[NO_PID]: ECPGdebug: set to 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg1_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg2_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 32: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 32: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 32: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 33: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 33: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 33: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 35: query: insert into source values ( 1 , 10 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 35: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 35: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 36: query: insert into source values ( 2 , 20 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 36: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 36: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 38: query: insert into source values ( 1 , 10 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 38: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 38: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 39: query: insert into source values ( 2 , 20 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 39: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 39: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 103: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 104: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 70: declared name stmt_1 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 71: name stmt_1; query: "SELECT f1,f2,f3 FROM source"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 73: query: declare cur_1 cursor for SELECT f1,f2,f3 FROM source; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 73: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 73: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: query: fetch cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 79: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: query: fetch cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 79: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: query: fetch cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 79: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 79: no data found on line 79
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 83: query: close cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 83: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 83: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 84: name stmt_1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 93: name stmt_2; query: "SELECT f1,f2,f3 FROM source"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 94: query: SELECT f1,f2,f3 FROM source; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 94: using PQexecPrepared for "SELECT f1,f2,f3 FROM source"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 94: correctly got 2 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 96: name stmt_2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 45: query: drop table if exists source; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 45: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 45: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 46: query: drop table if exists source; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 46: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 46: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 103: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 104: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con2 closed
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_1 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con1 closed
+[NO_PID]: sqlca: code: 0, state: 00000
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stdout b/src/interfaces/ecpg/test/expected/sql-declare.stdout
new file mode 100644
index 0000000..d80d079
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.stdout
@@ -0,0 +1,8 @@
+****testcase1 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+
+****testcase2 test results:****
+f1=1, f2=10, f3=db on con2
+f1=2, f2=20, f3=db on con2
+
diff --git a/src/interfaces/ecpg/test/expected/sql-desc.c b/src/interfaces/ecpg/test/expected/sql-desc.c
index bdd12a5..bcfe1bd 100644
--- a/src/interfaces/ecpg/test/expected/sql-desc.c
+++ b/src/interfaces/ecpg/test/expected/sql-desc.c
@@ -249,7 +249,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* declare c1 cursor for $1 */
#line 58 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c1 cursor for $1",
+ { ECPGopen("c1", "foo2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "foo2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_descriptor, "indesc", 1L, 1L, 1L,
@@ -260,7 +260,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 59 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c1", ECPGt_EOIT,
+ { ECPGfetch("c1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c1", ECPGt_EOIT,
ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int),
ECPGt_int,&(ind1),(long)1,(long)1,sizeof(int),
ECPGt_char,(val2output),(long)sizeof("AAA"),(long)1,(sizeof("AAA"))*sizeof(char),
@@ -273,7 +273,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("val1=%d (ind1: %d) val2=%s (ind2: %d)\n",
val1output, ind1, val2output, ind2);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("c1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c1", ECPGt_EOIT, ECPGt_EORT);
#line 65 "desc.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -299,7 +299,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* declare c2 cursor for $1 */
#line 70 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c2 cursor for $1",
+ { ECPGopen("c2", "foo3", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "foo3", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_descriptor, "indesc", 1L, 1L, 1L,
@@ -310,7 +310,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 71 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c2", ECPGt_EOIT,
+ { ECPGfetch("c2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c2", ECPGt_EOIT,
ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(val2output),(long)sizeof("AAA"),(long)1,(sizeof("AAA"))*sizeof(char),
@@ -322,7 +322,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("val1=%d val2=%s\n", val1output, val2i ? "null" : val2output);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("c2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c2", ECPGt_EOIT, ECPGt_EORT);
#line 76 "desc.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-dyntest.c b/src/interfaces/ecpg/test/expected/sql-dyntest.c
index 2cbc196..dff22aa 100644
--- a/src/interfaces/ecpg/test/expected/sql-dyntest.c
+++ b/src/interfaces/ecpg/test/expected/sql-dyntest.c
@@ -261,7 +261,7 @@ if (sqlca.sqlcode < 0) error ( );}
#line 58 "dyntest.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare MYCURS cursor for $1",
+ { ECPGopen("MYCURS", "myquery", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare MYCURS cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "myquery", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 60 "dyntest.pgc"
@@ -272,7 +272,7 @@ if (sqlca.sqlcode < 0) error ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in MYCURS", ECPGt_EOIT,
+ { ECPGfetch("MYCURS", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in MYCURS", ECPGt_EOIT,
ECPGt_descriptor, "MYDESC", 1L, 1L, 1L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 64 "dyntest.pgc"
@@ -468,7 +468,7 @@ if (sqlca.sqlcode < 0) error ( );}
}
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close MYCURS", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("MYCURS", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close MYCURS", ECPGt_EOIT, ECPGt_EORT);
#line 194 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
diff --git a/src/interfaces/ecpg/test/expected/sql-execute.c b/src/interfaces/ecpg/test/expected/sql-execute.c
index aee3c1b..c511349 100644
--- a/src/interfaces/ecpg/test/expected/sql-execute.c
+++ b/src/interfaces/ecpg/test/expected/sql-execute.c
@@ -140,7 +140,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 50 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR cursor for $1",
+ { ECPGopen("CUR", "f", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 52 "execute.pgc"
@@ -148,7 +148,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 52 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
+ { ECPGfetch("CUR", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -180,7 +180,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
#line 66 "execute.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -205,7 +205,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 72 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR2 cursor for $1",
+ { ECPGopen("CUR2", "f", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
@@ -215,7 +215,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 74 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in CUR2", ECPGt_EOIT,
+ { ECPGfetch("CUR2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in CUR2", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -247,7 +247,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR2", ECPGt_EOIT, ECPGt_EORT);
#line 88 "execute.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-fetch.c b/src/interfaces/ecpg/test/expected/sql-fetch.c
index b547b25..e6beaf5 100644
--- a/src/interfaces/ecpg/test/expected/sql-fetch.c
+++ b/src/interfaces/ecpg/test/expected/sql-fetch.c
@@ -99,7 +99,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 26 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from My_Table", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from My_Table", ECPGt_EOIT, ECPGt_EORT);
#line 28 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -113,7 +113,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 30 "fetch.pgc"
while (1) {
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(str),(long)25,(long)1,(25)*sizeof(char),
@@ -135,7 +135,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* exec sql whenever not found continue ; */
#line 36 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "move backward 2 in C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "move backward 2 in C", ECPGt_EOIT, ECPGt_EORT);
#line 37 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -145,7 +145,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 37 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch $0 in C",
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch $0 in C",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
@@ -162,7 +162,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("%d: %s\n", i, str);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
#line 42 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -176,7 +176,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 44 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare D cursor for select * from My_Table where Item1 = $1",
+ { ECPGopen("D", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare D cursor for select * from My_Table where Item1 = $1",
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 46 "fetch.pgc"
@@ -192,7 +192,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 48 "fetch.pgc"
while (1) {
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in D", ECPGt_EOIT,
+ { ECPGfetch("D", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in D", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(str),(long)25,(long)1,(25)*sizeof(char),
@@ -210,7 +210,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("%d: %s\n", i, str);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close D", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("D", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close D", ECPGt_EOIT, ECPGt_EORT);
#line 53 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
diff --git a/src/interfaces/ecpg/test/expected/sql-oldexec.c b/src/interfaces/ecpg/test/expected/sql-oldexec.c
index 5b74dda..2e398c2 100644
--- a/src/interfaces/ecpg/test/expected/sql-oldexec.c
+++ b/src/interfaces/ecpg/test/expected/sql-oldexec.c
@@ -141,7 +141,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 51 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR cursor for $1",
+ { ECPGopen("CUR", "f", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 53 "oldexec.pgc"
@@ -149,7 +149,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 53 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
+ { ECPGfetch("CUR", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -171,7 +171,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
#line 65 "oldexec.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -190,7 +190,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 70 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR3 cursor for $1",
+ { ECPGopen("CUR3", "f", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR3 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
@@ -200,7 +200,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 72 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch in CUR3", ECPGt_EOIT,
+ { ECPGfetch("CUR3", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch in CUR3", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -222,7 +222,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR3", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR3", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR3", ECPGt_EOIT, ECPGt_EORT);
#line 84 "oldexec.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-quote.c b/src/interfaces/ecpg/test/expected/sql-quote.c
index 0a3b77c..ec03612 100644
--- a/src/interfaces/ecpg/test/expected/sql-quote.c
+++ b/src/interfaces/ecpg/test/expected/sql-quote.c
@@ -162,7 +162,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 43 "quote.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
#line 45 "quote.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -178,7 +178,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
while (true)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(var),(long)25,(long)1,(25)*sizeof(char),
diff --git a/src/interfaces/ecpg/test/expected/sql-sqlda.c b/src/interfaces/ecpg/test/expected/sql-sqlda.c
index b470b04..6bfcbe2 100644
--- a/src/interfaces/ecpg/test/expected/sql-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/sql-sqlda.c
@@ -251,7 +251,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
+ { ECPGopen("mycur1", "st_id1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 103 "sqlda.pgc"
@@ -268,7 +268,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
+ { ECPGfetch("mycur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 111 "sqlda.pgc"
@@ -289,7 +289,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
#line 120 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -324,7 +324,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
+ { ECPGopen("mycur2", "st_id2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 138 "sqlda.pgc"
@@ -334,7 +334,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch all from mycur2", ECPGt_EOIT,
+ { ECPGfetch("mycur2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch all from mycur2", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 141 "sqlda.pgc"
@@ -357,7 +357,7 @@ if (sqlca.sqlcode < 0) exit (1);}
}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
#line 157 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/sql/.gitignore b/src/interfaces/ecpg/test/sql/.gitignore
index cd6f342..83bc47e 100644
--- a/src/interfaces/ecpg/test/sql/.gitignore
+++ b/src/interfaces/ecpg/test/sql/.gitignore
@@ -6,6 +6,8 @@
/code100.c
/copystdout
/copystdout.c
+/declare
+/declare.c
/define
/define.c
/desc
diff --git a/src/interfaces/ecpg/test/sql/Makefile b/src/interfaces/ecpg/test/sql/Makefile
index 6bc67e9..d313464 100644
--- a/src/interfaces/ecpg/test/sql/Makefile
+++ b/src/interfaces/ecpg/test/sql/Makefile
@@ -22,7 +22,8 @@ TESTS = array array.c \
parser parser.c \
quote quote.c \
show show.c \
- insupd insupd.c
+ insupd insupd.c \
+ declare declare.c
all: $(TESTS)
diff --git a/src/interfaces/ecpg/test/sql/declare.pgc b/src/interfaces/ecpg/test/sql/declare.pgc
new file mode 100644
index 0000000..f307341
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/declare.pgc
@@ -0,0 +1,128 @@
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+EXEC SQL WHENEVER SQLERROR SQLPRINT;
+
+EXEC SQL INCLUDE sqlca;
+EXEC SQL INCLUDE ../regression;
+
+#define ARRAY_SZIE 20
+
+void execute_test(void);
+void commitTable(void);
+void reset(void);
+void printResult(char *tc_name, int loop);
+
+EXEC SQL BEGIN DECLARE SECTION;
+int f1[ARRAY_SZIE];
+int f2[ARRAY_SZIE];
+char f3[ARRAY_SZIE][20];
+EXEC SQL END DECLARE SECTION;
+
+int main(void)
+{
+ setlocale(LC_ALL, "C");
+
+ ECPGdebug(1, stderr);
+
+ EXEC SQL CONNECT TO REGRESSDB1 AS con1;
+ EXEC SQL CONNECT TO REGRESSDB2 AS con2;
+
+ EXEC SQL AT con1 CREATE TABLE source(f1 integer, f2 integer, f3 varchar(20));
+ EXEC SQL AT con2 CREATE TABLE source(f1 integer, f2 integer, f3 varchar(20));
+
+ EXEC SQL AT con1 INSERT INTO source VALUES(1, 10, 'db on con1');
+ EXEC SQL AT con1 INSERT INTO source VALUES(2, 20, 'db on con1');
+
+ EXEC SQL AT con2 INSERT INTO source VALUES(1, 10, 'db on con2');
+ EXEC SQL AT con2 INSERT INTO source VALUES(2, 20, 'db on con2');
+
+ commitTable();
+
+ execute_test();
+
+ EXEC SQL AT con1 DROP TABLE IF EXISTS source;
+ EXEC SQL AT con2 DROP TABLE IF EXISTS source;
+
+ commitTable();
+
+ EXEC SQL DISCONNECT ALL;
+
+ return 0;
+}
+
+/*
+ * default connection: con2
+ * Non-default connection: con1
+ *
+ */
+void execute_test(void)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int i;
+ char *selectString = "SELECT f1,f2,f3 FROM source";
+ EXEC SQL END DECLARE SECTION;
+
+ /* testcase1. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement*/
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_1 STATEMENT;
+ EXEC SQL PREPARE stmt_1 FROM :selectString;
+ EXEC SQL DECLARE cur_1 CURSOR FOR stmt_1;
+ EXEC SQL OPEN cur_1;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while (1)
+ {
+ EXEC SQL FETCH cur_1 INTO :f1[i], :f2[i], :f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_1;
+ EXEC SQL DEALLOCATE PREPARE stmt_1;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResult("testcase1", 2);
+
+ /* testcase2. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement*/
+ reset();
+
+ EXEC SQL DECLARE stmt_2 STATEMENT;
+ EXEC SQL PREPARE stmt_2 FROM :selectString;
+ EXEC SQL EXECUTE stmt_2 INTO :f1, :f2, :f3;
+
+ EXEC SQL DEALLOCATE PREPARE stmt_2;
+
+ printResult("testcase2", 2);
+}
+
+void commitTable()
+{
+ EXEC SQL AT con1 COMMIT;
+ EXEC SQL AT con2 COMMIT;
+}
+
+/*
+ * reset all the output variables
+ */
+void reset()
+{
+ memset(f1, 0, sizeof(f1));
+ memset(f2, 0, sizeof(f2));
+ memset(f3, 0, sizeof(f3));
+}
+
+void printResult(char *tc_name, int loop)
+{
+ int i;
+
+ if (tc_name)
+ printf("****%s test results:****\n", tc_name);
+
+ for (i = 0; i < loop; i++)
+ printf("f1=%d, f2=%d, f3=%s\n", f1[i], f2[i], f3[i]);
+
+ printf("\n");
+}
Hi
I tried applying your patches. But it failed...
The error messages are as below.
$ git apply ../004_declareStmt_test_v4.patch
error: patch failed: src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c:82
error: src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c: patch does not apply
Regards,
Okano Naoki
Hi
Thank you for checking!
I tried applying your patches. But it failed...
The error messages are as below.
Attached 004_declareStmt_test_v5.patch is a rebased one.
The rest of patches are same as older version.
Regards,
Ideriha, Takeshi
Attachments:
003_declareStmt_doc_v5.patchapplication/octet-stream; name=003_declareStmt_doc_v5.patchDownload
diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml
index b8021cb..1c104b0 100644
--- a/doc/src/sgml/ecpg.sgml
+++ b/doc/src/sgml/ecpg.sgml
@@ -224,7 +224,7 @@ EXEC SQL CONNECT TO :target USER :user USING :passwd;
SQL statements in embedded SQL programs are by default executed on
the current connection, that is, the most recently opened one. If
an application needs to manage multiple connections, then there are
- two ways to handle this.
+ three ways to handle this.
</para>
<para>
@@ -296,6 +296,17 @@ current=testdb2 (should be testdb2)
current=testdb1 (should be testdb1)
</screen>
</para>
+
+ <para>
+ The third option is to declare a sql identifier linked to
+ the connection, for example:
+<programlisting>
+EXEC SQL AT <replaceable>connection-name</replaceable> DECLARE <replaceable>statement-name</replaceable> STATEMENT;
+EXEC SQL PREPARE <replaceable>statement-name</replaceable> FROM :<replaceable>dyn-string</replaceable>;
+</programlisting>
+ Once you link a sql identifier to a connection, you execute a dynamic SQL
+ without AT clause.
+ </para>
</sect2>
<sect2 id="ecpg-disconnect">
@@ -6683,6 +6694,107 @@ EXEC SQL DECLARE cur1 CURSOR FOR stmt1;
</refsect1>
</refentry>
+ <refentry id="ecpg-sql-declare-statement">
+ <refnamediv>
+ <refname>DECLARE STATEMENT</refname>
+ <refpurpose>declares SQL statement identifier associated with connection</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+<synopsis>
+EXEC SQL [ AT connection_name ] DECLARE <replaceable class="PARAMETER">statement_name</replaceable> STATEMENT
+</synopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>Description</title>
+
+ <para>
+ <command>DECLARE STATEMENT</command> declares SQL statement identifier.
+ SQL statement identifier is associated with connection.
+ </para>
+
+ <para>
+ <command>DELARE CURSOR</command> with a SQL statement identifier can be written before PREPARE.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Parameters</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><replaceable class="PARAMETER">connection_name</replaceable></term>
+ <listitem>
+ <para>
+ A database connection name established by the <command>CONNECT</command> command.
+ </para>
+ <para>
+ If AT clause is omitted, an SQL statement identifier is associated with the DEFAULT connection.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <variablelist>
+ <varlistentry>
+ <term><replaceable class="PARAMETER">statement_name</replaceable></term>
+ <listitem>
+ <para>
+ The name of a SQL statement identifier, either as an SQL identifier or a host variable.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>Notes</title>
+
+ <para>
+ An SQL statement with a SQL statement identifier must use a same connection
+ as the connection that the SQL statement identifier is associated with.
+ </para>
+
+ <para>
+ AT clause cannot be used with the SQL statement which have been identified by <command>DECLARE STATEMENT</command>
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Examples</title>
+
+<programlisting>
+EXEC SQL CONNECT TO postgres AS con1;
+EXEC SQL AT con1 DECLARE sql_stmt STATEMENT;
+EXEC SQL DECLARE cursor_name CURSOR FOR sql_stmt;
+EXEC SQL PREPARE sql_stmt FROM :dyn_string;
+EXEC SQL OPEN cursor_name;
+EXEC SQL FETCH cursor_name INTO :column1;
+EXEC SQL CLOSE cursor_name;
+</programlisting>
+ </refsect1>
+
+ <refsect1>
+ <title>Compatibility</title>
+
+ <para>
+ <command>DECLARE STATEMENT</command> is a PostgreSQL extension of the SQL standard,
+ but can be used in Oracle and DB2.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>See Also</title>
+
+ <simplelist type="inline">
+ <member><xref linkend="ecpg-sql-connect"></member>
+ <member><xref linkend="ecpg-sql-declare"></member>
+ <member><xref linkend="ecpg-sql-open"></member>
+ </simplelist>
+ </refsect1>
+ </refentry>
+
<refentry id="ecpg-sql-describe">
<refnamediv>
<refname>DESCRIBE</refname>
001_declareStmt_preproc_v5.patchapplication/octet-stream; name=001_declareStmt_preproc_v5.patchDownload
diff --git a/src/interfaces/ecpg/preproc/ecpg.addons b/src/interfaces/ecpg/preproc/ecpg.addons
index ca3efad..982ce78 100644
--- a/src/interfaces/ecpg/preproc/ecpg.addons
+++ b/src/interfaces/ecpg/preproc/ecpg.addons
@@ -15,7 +15,7 @@ ECPG: stmtClosePortalStmt block
}
}
- output_statement($1, 0, ECPGst_normal);
+ $1 = $1;
}
ECPG: stmtDeallocateStmt block
{
@@ -25,7 +25,11 @@ ECPG: stmtDeclareCursorStmt block
{ output_simple_statement($1); }
ECPG: stmtDiscardStmt block
ECPG: stmtFetchStmt block
- { output_statement($1, 1, ECPGst_normal); }
+ {
+ /* g_cursor_name is set in the fetch_args block and freed in the output_cursor_statement */
+ output_cursor_statement(ECPGcst_fetch, g_cursor_name, NULL, $1, 1, ECPGst_normal);
+ g_cursor_name = NULL;
+ }
ECPG: stmtDeleteStmt block
ECPG: stmtInsertStmt block
ECPG: stmtSelectStmt block
@@ -63,6 +67,10 @@ ECPG: stmtViewStmt rule
whenever_action(2);
free($1);
}
+ | ECPGDeclareStmt
+ {
+ output_declare_statement($1);
+ }
| ECPGCursorStmt
{
output_simple_statement($1);
@@ -132,7 +140,14 @@ ECPG: stmtViewStmt rule
if ((ptr = add_additional_variables($1, true)) != NULL)
{
connection = ptr->connection ? mm_strdup(ptr->connection) : NULL;
- output_statement(mm_strdup(ptr->command), 0, ECPGst_normal);
+ if (ptr->prepared_name)
+ {
+ output_cursor_statement(ECPGcst_open, $1, mm_strdup(ptr->prepared_name), mm_strdup(ptr->command), 0, ECPGst_normal);
+ }
+ else
+ {
+ output_cursor_statement(ECPGcst_open, $1, NULL, mm_strdup(ptr->command), 0, ECPGst_normal);
+ }
ptr->opened = true;
}
}
@@ -204,6 +219,7 @@ ECPG: var_valueNumericOnly addon
}
ECPG: fetch_argscursor_name addon
add_additional_variables($1, false);
+ g_cursor_name = mm_strdup($1);
if ($1[0] == ':')
{
free($1);
@@ -211,6 +227,7 @@ ECPG: fetch_argscursor_name addon
}
ECPG: fetch_argsfrom_incursor_name addon
add_additional_variables($2, false);
+ g_cursor_name = mm_strdup($2);
if ($2[0] == ':')
{
free($2);
@@ -222,6 +239,7 @@ ECPG: fetch_argsFIRST_Popt_from_incursor_name addon
ECPG: fetch_argsLAST_Popt_from_incursor_name addon
ECPG: fetch_argsALLopt_from_incursor_name addon
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
if ($3[0] == ':')
{
free($3);
@@ -229,6 +247,7 @@ ECPG: fetch_argsALLopt_from_incursor_name addon
}
ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
if ($3[0] == ':')
{
free($3);
@@ -242,6 +261,7 @@ ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDALLopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDALLopt_from_incursor_name addon
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
if ($4[0] == ':')
{
free($4);
@@ -252,6 +272,7 @@ ECPG: fetch_argsRELATIVE_PSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDSignedIconstopt_from_incursor_name addon
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
if ($4[0] == ':')
{
free($4);
@@ -304,6 +325,7 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
}
this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ memset(this, 0 ,sizeof(struct cursor));
this->next = cur;
this->name = $2;
@@ -336,8 +358,31 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
}
ECPG: ClosePortalStmtCLOSEcursor_name block
{
+ char *stmt = NULL;
+ char *cursor_name = NULL;
char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : $2;
- $$ = cat2_str(mm_strdup("close"), cursor_marker);
+
+ cursor_name = mm_strdup($2);
+
+ stmt = cat2_str(mm_strdup("close"), cursor_marker);
+
+ if (INFORMIX_MODE)
+ {
+ if (pg_strcasecmp(stmt+strlen("close "), "database") == 0)
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE statement");
+
+ fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");");
+ whenever_action(2);
+ free(stmt);
+ break;
+ }
+ }
+
+ output_cursor_statement(ECPGcst_close, cursor_name, NULL, stmt, 0, ECPGst_normal);
+
+ $$ = EMPTY;
}
ECPG: opt_hold block
{
@@ -416,48 +461,56 @@ ECPG: FetchStmtMOVEfetch_args rule
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("fetch forward"), cursor_marker);
}
| FETCH FORWARD from_in cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("fetch forward from"), cursor_marker);
}
| FETCH BACKWARD cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("fetch backward"), cursor_marker);
}
| FETCH BACKWARD from_in cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("fetch backward from"), cursor_marker);
}
| MOVE FORWARD cursor_name
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("move forward"), cursor_marker);
}
| MOVE FORWARD from_in cursor_name
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("move forward from"), cursor_marker);
}
| MOVE BACKWARD cursor_name
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("move backward"), cursor_marker);
}
| MOVE BACKWARD from_in cursor_name
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("move backward from"), cursor_marker);
}
ECPG: limit_clauseLIMITselect_limit_value','select_offset_value block
diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c
index aaecbf81..c2396db 100644
--- a/src/interfaces/ecpg/preproc/ecpg.c
+++ b/src/interfaces/ecpg/preproc/ecpg.c
@@ -28,6 +28,7 @@ struct _include_path *include_paths = NULL;
struct cursor *cur = NULL;
struct typedefs *types = NULL;
struct _defines *defines = NULL;
+struct declared_name_st *g_declared_list = NULL;
static void
help(const char *progname)
@@ -111,6 +112,48 @@ add_preprocessor_define(char *define)
defines->next = pd;
}
+static void
+free_argument(struct arguments *arg)
+{
+ if (arg == NULL)
+ return;
+
+ free_argument(arg->next);
+
+ /*
+ * Don't free variables in it because the original codes don't free it either
+ * variables are static structures instead of allocating
+ */
+ free(arg);
+}
+
+static void
+free_cursor(struct cursor *c)
+{
+ if (c == NULL)
+ return;
+
+ free_cursor(c->next);
+ free_argument(c->argsinsert);
+ free_argument(c->argsresult);
+
+ free(c->name);
+ free(c->function);
+ free(c->command);
+ free(c->prepared_name);
+ free(c);
+}
+
+static void
+free_declared_stmt(struct declared_name_st *st)
+{
+ if (st == NULL)
+ return;
+
+ free_declared_stmt(st->next);
+ free(st);
+}
+
#define ECPG_GETOPT_LONG_REGRESSION 1
int
main(int argc, char *const argv[])
@@ -343,29 +386,18 @@ main(int argc, char *const argv[])
struct typedefs *typeptr;
/* remove old cursor definitions if any are still there */
- for (ptr = cur; ptr != NULL;)
+ if (cur)
{
- struct cursor *this = ptr;
- struct arguments *l1,
- *l2;
-
- free(ptr->command);
- free(ptr->connection);
- free(ptr->name);
- for (l1 = ptr->argsinsert; l1; l1 = l2)
- {
- l2 = l1->next;
- free(l1);
- }
- for (l1 = ptr->argsresult; l1; l1 = l2)
- {
- l2 = l1->next;
- free(l1);
- }
- ptr = ptr->next;
- free(this);
+ free_cursor(cur);
+ cur = NULL;
+ }
+
+ /* remove old declared statements if any are still there */
+ if (g_declared_list)
+ {
+ free_declared_stmt(g_declared_list);
+ g_declared_list = NULL;
}
- cur = NULL;
/* remove non-pertinent old defines as well */
while (defines && !defines->pertinent)
@@ -479,6 +511,18 @@ main(int argc, char *const argv[])
free(input_filename);
}
+
+ if(g_declared_list)
+ {
+ free_declared_stmt(g_declared_list);
+ g_declared_list = NULL;
+ }
+
+ if(cur)
+ {
+ free_cursor(cur);
+ cur = NULL;
+ }
}
return ret_value;
}
diff --git a/src/interfaces/ecpg/preproc/ecpg.header b/src/interfaces/ecpg/preproc/ecpg.header
index 2562366..0cebf56 100644
--- a/src/interfaces/ecpg/preproc/ecpg.header
+++ b/src/interfaces/ecpg/preproc/ecpg.header
@@ -38,6 +38,7 @@ char *current_function;
int ecpg_internal_var = 0;
char *connection = NULL;
char *input_filename = NULL;
+char *g_cursor_name = NULL;
static int FoundInto = 0;
static int initializer = 0;
diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer
index 1c10879..af15b88 100644
--- a/src/interfaces/ecpg/preproc/ecpg.trailer
+++ b/src/interfaces/ecpg/preproc/ecpg.trailer
@@ -284,6 +284,38 @@ prepared_name: name
;
/*
+ * Declare Statement
+ */
+ECPGDeclareStmt: DECLARE prepared_name STATEMENT
+ {
+ struct declared_name_st *ptr = NULL;
+
+ /* Check whether the declared name has been defined or not */
+ for (ptr = g_declared_list; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp($2, ptr->name) == 0)
+ {
+ /* re-definition is a bug */
+ mmerror(PARSE_ERROR, ET_ERROR, "declared name %s is already defined", ptr->name);
+ }
+ }
+
+ /* Add a new declared name into the g_declared_list */
+ ptr = NULL;
+ ptr = (struct declared_name_st *) mm_alloc(sizeof(struct declared_name_st));
+ if (ptr)
+ {
+ /* initial definition */
+ ptr->name = $2;
+ ptr->next = g_declared_list;
+ g_declared_list = ptr;
+ }
+
+ $$ = mm_strdup($2);
+ }
+;
+
+/*
* Declare a prepared cursor. The syntax is different from the standard
* declare statement, so we create a new rule.
*/
@@ -309,6 +341,7 @@ ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared
}
this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ memset(this, 0 ,sizeof(struct cursor));
/* initial definition */
this->next = cur;
@@ -318,6 +351,7 @@ ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared
this->command = cat_str(6, mm_strdup("declare"), cursor_marker, $3, mm_strdup("cursor"), $5, mm_strdup("for $1"));
this->argsresult = NULL;
this->argsresult_oos = NULL;
+ this->prepared_name = $7;
thisquery->type = &ecpg_query;
thisquery->brace_level = 0;
diff --git a/src/interfaces/ecpg/preproc/ecpg.type b/src/interfaces/ecpg/preproc/ecpg.type
index ac6aa00..978be84 100644
--- a/src/interfaces/ecpg/preproc/ecpg.type
+++ b/src/interfaces/ecpg/preproc/ecpg.type
@@ -9,6 +9,7 @@
%type <str> ECPGDeallocateDescr
%type <str> ECPGDeclaration
%type <str> ECPGDeclare
+%type <str> ECPGDeclareStmt
%type <str> ECPGDescribe
%type <str> ECPGDisconnect
%type <str> ECPGExecuteImmediateStmt
diff --git a/src/interfaces/ecpg/preproc/extern.h b/src/interfaces/ecpg/preproc/extern.h
index 0ce3a6e..dcfdc06 100644
--- a/src/interfaces/ecpg/preproc/extern.h
+++ b/src/interfaces/ecpg/preproc/extern.h
@@ -50,6 +50,7 @@ extern struct _include_path *include_paths;
extern struct cursor *cur;
extern struct typedefs *types;
extern struct _defines *defines;
+extern struct declared_name_st *g_declared_list;
extern struct ECPGtype ecpg_no_indicator;
extern struct variable no_indicator;
extern struct arguments *argsinsert;
@@ -72,6 +73,8 @@ extern void output_statement(char *, int, enum ECPG_statement_type);
extern void output_prepare_statement(char *, char *);
extern void output_deallocate_prepare_statement(char *);
extern void output_simple_statement(char *);
+extern void output_declare_statement(char *);
+extern void output_cursor_statement(int , char *, char *, char *, int , enum ECPG_statement_type);
extern char *hashline_number(void);
extern int base_yyparse(void);
extern int base_yylex(void);
diff --git a/src/interfaces/ecpg/preproc/output.c b/src/interfaces/ecpg/preproc/output.c
index 59d5d30..65e94b8 100644
--- a/src/interfaces/ecpg/preproc/output.c
+++ b/src/interfaces/ecpg/preproc/output.c
@@ -5,6 +5,7 @@
#include "extern.h"
static void output_escaped_str(char *cmd, bool quoted);
+static void output_cursor_name(char *str);
void
output_line_number(void)
@@ -195,7 +196,16 @@ static void
output_escaped_str(char *str, bool quoted)
{
int i = 0;
- int len = strlen(str);
+ int len = 0;
+
+ if (str == NULL)
+ {
+ fputs("NULL", base_yyout);
+
+ return;
+ }
+
+ len = strlen(str);
if (quoted && str[0] == '"' && str[len - 1] == '"') /* do not escape quotes
* at beginning and end
@@ -244,3 +254,147 @@ output_escaped_str(char *str, bool quoted)
if (quoted && str[0] == '"' && str[len] == '"')
fputs("\"", base_yyout);
}
+
+/*
+ * This is a tool function used by the output_cursor_statement function to print
+ * cursor name after the string such as "ECPGopen(","ECPGfetch(","ECPGclose(".
+ */
+static void
+output_cursor_name(char *str)
+{
+ int i = 0;
+ int len = 0;
+
+ if (str == NULL)
+ {
+ fputs("NULL", base_yyout);
+
+ return;
+ }
+
+ len = strlen(str);
+ fputs("\"", base_yyout);
+ if (str[0] == '\"' && str[len - 1] == '\"')
+ {
+ i = 1;
+ len--;
+ fputs("\\\"", base_yyout);
+
+ /* output this char by char as we have to filter " and \n */
+ for (; i < len; i++)
+ {
+ if (str[i] == '"')
+ fputs("\\\"", base_yyout);
+ else if (str[i] == '\n')
+ fputs("\\\n", base_yyout);
+ else if (str[i] == '\\')
+ {
+ int j = i;
+
+ /*
+ * check whether this is a continuation line if it is, do not
+ * output anything because newlines are escaped anyway
+ */
+
+ /* accept blanks after the '\' as some other compilers do too */
+ do
+ {
+ j++;
+ } while (str[j] == ' ' || str[j] == '\t');
+
+ if ((str[j] != '\n') && (str[j] != '\r' || str[j + 1] != '\n')) /* not followed by a
+ * newline */
+ fputs("\\\\",base_yyout);
+ }
+ else if (str[i] == '\r' && str[i + 1] == '\n')
+ {
+ fputs("\\\r\n", base_yyout);
+ i++;
+ }
+ else
+ fputc(str[i], base_yyout);
+ }
+
+ fputs("\\\"", base_yyout);
+ }
+ else
+ fputs(str, base_yyout);
+
+ fputs("\"", base_yyout);
+}
+
+/*
+ * Translate the EXEC SQL DECLARE STATEMENT into ECPGdeclare function
+ */
+void
+output_declare_statement(char *name)
+{
+ /* connection is set in "at:" token in ecpg.trailer file */
+ fprintf(base_yyout, "{ ECPGdeclare(__LINE__, %s, ", connection ? connection : "NULL");
+ output_escaped_str(name, true);
+ fputs(");", base_yyout);
+
+ whenever_action(2);
+ free(name);
+ if (connection != NULL)
+ free(connection);
+}
+
+/*
+ * Translate the EXEC SQL CURSOR STATEMENT such as OPEN/FETCH/CLOSE cursor into
+ * ECPGopen/ECPGfetch/ECPGclose function
+ */
+void
+output_cursor_statement(int cursor_stmt, char *cursor_name, char *prepared_name, char *stmt, int whenever_mode, enum ECPG_statement_type st)
+{
+ switch(cursor_stmt)
+ {
+ case ECPGcst_open:
+ fprintf(base_yyout, "{ ECPGopen(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", ");
+ output_escaped_str(prepared_name, true);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ case ECPGcst_fetch:
+ fprintf(base_yyout, "{ ECPGfetch(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ case ECPGcst_close:
+ fprintf(base_yyout, "{ ECPGclose(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ }
+
+ if (st == ECPGst_execute || st == ECPGst_exec_immediate)
+ fprintf(base_yyout, "%s, %s, ", ecpg_statement_type_name[st], stmt);
+ else
+ {
+ if (st == ECPGst_prepnormal && auto_prepare)
+ fputs("ECPGst_prepnormal, \"", base_yyout);
+ else
+ fputs("ECPGst_normal, \"", base_yyout);
+
+ output_escaped_str(stmt, false);
+ fputs("\", ", base_yyout);
+ }
+
+ /* dump variables to C file */
+ dump_variables(argsinsert, 1);
+ fputs("ECPGt_EOIT, ", base_yyout);
+ dump_variables(argsresult, 1);
+ fputs("ECPGt_EORT);", base_yyout);
+ reset_variables();
+
+ whenever_action(whenever_mode | 2);
+ free(cursor_name);
+ free(prepared_name);
+ free(stmt);
+ if (connection != NULL)
+ free(connection);
+}
\ No newline at end of file
diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h
index cd0d1da..1b6ddfb 100644
--- a/src/interfaces/ecpg/preproc/type.h
+++ b/src/interfaces/ecpg/preproc/type.h
@@ -129,6 +129,7 @@ struct cursor
char *command;
char *connection;
bool opened;
+ char *prepared_name;
struct arguments *argsinsert;
struct arguments *argsinsert_oos;
struct arguments *argsresult;
@@ -136,6 +137,13 @@ struct cursor
struct cursor *next;
};
+/* structure to store declared name */
+struct declared_name_st
+{
+ char *name; /* declared name */
+ struct declared_name_st *next;
+};
+
struct typedefs
{
char *name;
002_declareStmt_ecpglib_v5.patchapplication/octet-stream; name=002_declareStmt_ecpglib_v5.patchDownload
diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile
index fbb1407..132e53a 100644
--- a/src/interfaces/ecpg/ecpglib/Makefile
+++ b/src/interfaces/ecpg/ecpglib/Makefile
@@ -26,7 +26,7 @@ override CFLAGS += $(PTHREAD_CFLAGS)
LIBS := $(filter-out -lpgport, $(LIBS))
OBJS= execute.o typename.o descriptor.o sqlda.o data.o error.o prepare.o memory.o \
- connect.o misc.o path.o pgstrcasecmp.o \
+ connect.o misc.o path.o pgstrcasecmp.o cursor.o \
$(filter snprintf.o strlcpy.o win32setlocale.o isinf.o, $(LIBOBJS)) $(WIN32RES)
# thread.c is needed only for non-WIN32 implementation of path.c
diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c
index c90f13d..ddbc08c 100644
--- a/src/interfaces/ecpg/ecpglib/connect.c
+++ b/src/interfaces/ecpg/ecpglib/connect.c
@@ -340,6 +340,8 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
return false;
}
+ memset(this, 0, sizeof(struct connection));
+
if (dbname != NULL)
{
/* get the detail information from dbname */
@@ -684,12 +686,15 @@ ECPGdisconnect(int lineno, const char *connection_name)
if (strcmp(connection_name, "ALL") == 0)
{
+ struct connection *f = NULL;
+
ecpg_init_sqlca(sqlca);
for (con = all_connections; con;)
{
- struct connection *f = con;
+ f = con;
con = con->next;
+ ecpg_release_declared_statement(f->name);
ecpg_finish(f);
}
}
@@ -705,7 +710,10 @@ ECPGdisconnect(int lineno, const char *connection_name)
return (false);
}
else
+ {
+ ecpg_release_declared_statement(connection_name);
ecpg_finish(con);
+ }
}
#ifdef ENABLE_THREAD_SAFETY
diff --git a/src/interfaces/ecpg/ecpglib/cursor.c b/src/interfaces/ecpg/ecpglib/cursor.c
new file mode 100644
index 0000000..4391ec3
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/cursor.c
@@ -0,0 +1,260 @@
+/* src/interfaces/ecpg/ecpglib/cursor.c */
+
+#define POSTGRES_ECPG_INTERNAL
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <locale.h>
+#include <string.h>
+
+#include "ecpgtype.h"
+#include "ecpglib.h"
+#include "ecpgerrno.h"
+#include "extern.h"
+#include "sqlca.h"
+
+static void add_cursor(const int, const char *, const char *);
+static void remove_cursor(const char *, struct connection *);
+static bool find_cursor(const char *, const struct connection *);
+
+/*
+ * Function: Handle the EXEC SQL OPEN cursor statement:
+ * Input:
+ * cursor_name --- cursor name
+ * prepared_name --- prepared name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGopen(const char *cursor_name,const char *prepared_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ /*
+ * If the declared name is referred by the PREPARE statement then the
+ * prepared_name is same as declared name
+ */
+ real_connection_name = ecpg_get_con_name_by_declared_name(prepared_name);
+ if (real_connection_name)
+ {
+ /* Add the cursor name into the declared node */
+ ecpg_update_declare_statement(prepared_name, cursor_name, lineno);
+ }
+ else
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+
+ /* Add the cursor into the connection */
+ add_cursor(lineno, cursor_name, real_connection_name);
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return status;
+}
+
+
+/*
+ * Function: Handle the EXEC SQL FETCH/MOVE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGfetch(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return (false);
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return status;
+}
+
+
+/*
+ * Function: Handle the EXEC SQL CLOSE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGclose(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+ struct connection *con = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+
+ /* check the existence of the cursor in the connection */
+ if (false == find_cursor(cursor_name, con))
+ {
+ ecpg_raise(lineno, ECPG_INVALID_CURSOR, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ remove_cursor(cursor_name, con);
+
+ return status;
+}
+
+/*
+ * Function: Add a cursor into the connection
+ */
+static void
+add_cursor(const int lineno, const char *cursor_name, const char *connection_name)
+{
+ struct connection *con;
+ struct cursor_statement *new = NULL;
+
+ if (!cursor_name)
+ return ;
+
+ con = ecpg_get_connection(connection_name);
+ if (!con)
+ {
+ return;
+ }
+
+ if (find_cursor(cursor_name, con))
+ {
+ /*
+ * Should never goto here, because ECPG has checked the duplication of
+ * the cursor in pre-compile stage.
+ */
+ return;
+ }
+
+ /* allocate a node to store the new cursor */
+ new = (struct cursor_statement *)ecpg_alloc(sizeof(struct cursor_statement), lineno);
+ if (new)
+ {
+ new->name = ecpg_strdup(cursor_name, lineno);
+ new->next = con->cursor_stmts;
+ con->cursor_stmts = new;
+ }
+}
+
+/*
+ * Function: Remove the cursor from the connection
+ */
+static void
+remove_cursor(const char *cursor_name, struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+ struct cursor_statement *prev = NULL;
+
+ if (!connection || !cursor_name)
+ return ;
+
+ cur = connection->cursor_stmts;
+ while (cur)
+ {
+ if (strcmp(cur->name, cursor_name) == 0)
+ {
+ if (!prev)
+ connection->cursor_stmts = cur->next;
+ else
+ prev->next = cur->next;
+
+ ecpg_free(cur->name);
+ ecpg_free(cur);
+
+ break;
+ }
+ prev = cur;
+ cur = cur->next;
+ }
+}
+
+/*
+ * Function: Find whether the cursor exists in the connection or not
+ * Return: true ---Found
+ * false --- Not found
+ */
+static bool
+find_cursor(const char *cursor_name, const struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+
+ if (!connection || !cursor_name)
+ return false;
+
+ for (cur = connection->cursor_stmts; cur != NULL; cur = cur->next)
+ {
+ if (strcmp(cur->name, cursor_name) == 0)
+ return true;
+ }
+
+ return false;
+}
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c
index 15fd7a0..858be01 100644
--- a/src/interfaces/ecpg/ecpglib/descriptor.c
+++ b/src/interfaces/ecpg/ecpglib/descriptor.c
@@ -818,6 +818,7 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
struct prepared_statement *prep;
PGresult *res;
va_list args;
+ const char *real_connection_name = NULL;
/* DESCRIBE INPUT is not yet supported */
if (input)
@@ -826,13 +827,20 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
return ret;
}
- con = ecpg_get_connection(connection_name);
- if (!con)
+ real_connection_name = ecpg_get_con_name_by_declared_name(stmt_name);
+ if (real_connection_name == NULL)
{
- ecpg_raise(line, ECPG_NO_CONN, ECPG_SQLSTATE_CONNECTION_DOES_NOT_EXIST,
- connection_name ? connection_name : ecpg_gettext("NULL"));
- return ret;
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
}
+
+ con = ecpg_get_connection(real_connection_name);
+ if (!ecpg_init(con, real_connection_name, line))
+ return false;
+
prep = ecpg_find_prepared_statement(stmt_name, con, NULL);
if (!prep)
{
diff --git a/src/interfaces/ecpg/ecpglib/error.c b/src/interfaces/ecpg/ecpglib/error.c
index 656b2c4..11a1a7c 100644
--- a/src/interfaces/ecpg/ecpglib/error.c
+++ b/src/interfaces/ecpg/ecpglib/error.c
@@ -200,6 +200,13 @@ ecpg_raise(int line, int code, const char *sqlstate, const char *str)
ecpg_gettext("could not connect to database \"%s\" on line %d"), str, line);
break;
+ case ECPG_INVALID_CURSOR:
+ snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
+ /*------
+ translator: this string will be truncated at 149 characters expanded. */
+ ecpg_gettext("The cursor is invalid on line %d"),line);
+ break;
+
default:
snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
/*------
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index bd9b86b..a4adc97 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -2031,9 +2031,32 @@ ECPGdo(const int lineno, const int compat, const int force_indicator, const char
{
va_list args;
bool ret;
+ const char *real_connection_name = NULL;
+
+ real_connection_name = connection_name;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ /* Handle the EXEC SQL EXECUTE... statement */
+ if(ECPGst_execute == st)
+ {
+ real_connection_name = ecpg_get_con_name_by_declared_name(query);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+ }
va_start(args, query);
- ret = ecpg_do(lineno, compat, force_indicator, connection_name,
+ ret = ecpg_do(lineno, compat, force_indicator, real_connection_name,
questionmarks, st, query, args);
va_end(args);
diff --git a/src/interfaces/ecpg/ecpglib/exports.txt b/src/interfaces/ecpg/ecpglib/exports.txt
index 69e9617..08fa1bb 100644
--- a/src/interfaces/ecpg/ecpglib/exports.txt
+++ b/src/interfaces/ecpg/ecpglib/exports.txt
@@ -29,3 +29,7 @@ ECPGget_PGconn 26
ECPGtransactionStatus 27
ECPGset_var 28
ECPGget_var 29
+ECPGdeclare 30
+ECPGopen 31
+ECPGfetch 32
+ECPGclose 33
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/extern.h b/src/interfaces/ecpg/ecpglib/extern.h
index c3082be..13d978c 100644
--- a/src/interfaces/ecpg/ecpglib/extern.h
+++ b/src/interfaces/ecpg/ecpglib/extern.h
@@ -66,6 +66,15 @@ struct statement
PGresult *results;
};
+/* structure to store declared statements */
+struct declared_statement
+{
+ char *name; /* declared name */
+ char *connection_name;
+ char *cursor_name;
+ struct declared_statement *next;
+};
+
/* structure to store prepared statements for a connection */
struct prepared_statement
{
@@ -75,6 +84,12 @@ struct prepared_statement
struct prepared_statement *next;
};
+struct cursor_statement
+{
+ char *name; /*cursor name*/
+ struct cursor_statement *next;
+};
+
/* structure to store connections */
struct connection
{
@@ -83,6 +98,7 @@ struct connection
bool autocommit;
struct ECPGtype_information_cache *cache_head;
struct prepared_statement *prep_stmts;
+ struct cursor_statement *cursor_stmts;
struct connection *next;
};
@@ -165,6 +181,11 @@ struct descriptor *ecpg_find_desc(int line, const char *name);
struct prepared_statement *ecpg_find_prepared_statement(const char *,
struct connection *, struct prepared_statement **);
+void ecpg_update_declare_statement(const char *, const char *, const int);
+char *ecpg_get_con_name_by_declared_name(const char *);
+const char *ecpg_get_con_name_by_cursor_name(const char *);
+void ecpg_release_declared_statement(const char *);
+
bool ecpg_store_result(const PGresult *results, int act_field,
const struct statement * stmt, struct variable * var);
bool ecpg_store_input(const int, const bool, const struct variable *, char **, bool);
@@ -220,4 +241,4 @@ void ecpg_set_native_sqlda(int, struct sqlda_struct **, const PGresult *, int,
#define ECPG_SQLSTATE_ECPG_INTERNAL_ERROR "YE000"
#define ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY "YE001"
-#endif /* _ECPG_LIB_EXTERN_H */
+#endif /* _ECPG_LIB_EXTERN_H */
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/prepare.c b/src/interfaces/ecpg/ecpglib/prepare.c
index 983b242..0a939cd 100644
--- a/src/interfaces/ecpg/ecpglib/prepare.c
+++ b/src/interfaces/ecpg/ecpglib/prepare.c
@@ -26,9 +26,11 @@ static int nextStmtID = 1;
static const int stmtCacheNBuckets = 2039; /* # buckets - a prime # */
static const int stmtCacheEntPerBucket = 8; /* # entries/bucket */
static stmtCacheEntry stmtCacheEntries[16384] = {{0, {0}, 0, 0, 0}};
+static struct declared_statement *g_declared_list;
static bool deallocate_one(int lineno, enum COMPAT_MODE c, struct connection * con,
struct prepared_statement * prev, struct prepared_statement * this);
+static struct declared_statement *ecpg_find_declared_statement(const char *);
static bool
isvarchar(unsigned char c)
@@ -117,6 +119,7 @@ prepare_common(int lineno, struct connection * con, const char *name, const char
ecpg_free(this);
return false;
}
+ memset(stmt, 0, sizeof(struct statement));
/* create statement */
stmt->lineno = lineno;
@@ -163,11 +166,22 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
(void) questionmarks; /* quiet the compiler */
- con = ecpg_get_connection(connection_name);
- if (!ecpg_init(con, connection_name, lineno))
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+ if (!ecpg_init(con, real_connection_name, lineno))
return false;
/* check if we already have prepared this statement */
@@ -255,9 +269,19 @@ ECPGdeallocate(int lineno, int c, const char *connection_name, const char *name)
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
- con = ecpg_get_connection(connection_name);
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+ con = ecpg_get_connection(real_connection_name);
if (!ecpg_init(con, connection_name, lineno))
return false;
@@ -305,8 +329,21 @@ ecpg_prepared(const char *name, struct connection * con)
char *
ECPGprepared_statement(const char *connection_name, const char *name, int lineno)
{
+ const char *real_connection_name = NULL;
+
(void) lineno; /* keep the compiler quiet */
- return ecpg_prepared(name, ecpg_get_connection(connection_name));
+
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ return ecpg_prepared(name, ecpg_get_connection(real_connection_name));
}
/*
@@ -513,3 +550,196 @@ ecpg_auto_prepare(int lineno, const char *connection_name, const int compat, cha
return (true);
}
+
+/*
+ * handle the EXEC SQL DECLARE STATEMENT
+ * Input: connection_name -- connection name
+ * name -- declared name
+ */
+bool
+ECPGdeclare(int lineno, const char *connection_name, const char *name)
+{
+ struct connection *con = NULL;
+ struct declared_statement *p = NULL;
+
+ if(name == NULL)
+ {
+ /* Should never go to here because ECPG pre-compiler will check it */
+ return false;
+ }
+
+ if(connection_name == NULL)
+ {
+ /*
+ * Going to here means not using AT clause in the DECLARE STATEMENT
+ * We don't allocate a node to store the declared name because the
+ * DECLARE STATEMENT without using AT clause will be ignored.
+ */
+ return true;
+ }
+
+ con = ecpg_get_connection(connection_name);
+ if (!ecpg_init(con, connection_name, lineno))
+ return false;
+
+ if(ecpg_find_declared_statement(name))
+ {
+ /* Should not go to here because the pre-compiler has check the duplicate name */
+ return false;
+ }
+
+ /* allocate a declared_statement as a new node */
+ p = (struct declared_statement *) ecpg_alloc(sizeof(struct declared_statement), lineno);
+ if (!p)
+ return false;
+
+ memset(p, 0, sizeof(struct declared_statement));
+
+ ecpg_log("ECPGdeclare on line %d: declared name %s on connection: \"%s\"\n", lineno, name, connection_name);
+
+ p->name = ecpg_strdup(name, lineno);
+ p->connection_name = ecpg_strdup(connection_name, lineno);
+
+ /* Add the new node into the g_declared_list */
+ if(g_declared_list != NULL)
+ {
+ p->next = g_declared_list;
+ g_declared_list = p;
+ }
+ else
+ g_declared_list = p;
+
+ return true;
+}
+
+/*
+ * Find a declared node by declared name
+ * Input: name -- declared name
+ * Return: Found -- The pointer points to the declared node
+ * Not found -- NULL
+ */
+static struct declared_statement *
+ecpg_find_declared_statement(const char *name)
+{
+ struct declared_statement *p;
+
+ if(name == NULL)
+ return NULL;
+
+ p = g_declared_list;
+ while(p)
+ {
+ if (strcmp(p->name, name) == 0)
+ return p;
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/*
+ * Build the relationship between the declared name and cursor name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * cursor_name -- cursor name declared in the DECLARE/OPEN CURSOR statement
+ */
+void
+ecpg_update_declare_statement(const char *declared_name, const char *cursor_name, const int lineno)
+{
+ struct declared_statement *p = NULL;
+
+ if(!declared_name || !cursor_name)
+ return;
+
+ /* Find the declared node by declared name */
+ p = ecpg_find_declared_statement(declared_name);
+ if(p)
+ p->cursor_name = ecpg_strdup(cursor_name,lineno);
+}
+
+/*
+ * Find and return the connection name referred by the declared name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+char *
+ecpg_get_con_name_by_declared_name(const char *declared_name)
+{
+ struct declared_statement *p;
+
+ p = ecpg_find_declared_statement(declared_name);
+ if(p)
+ return p->connection_name;
+
+ return NULL;
+}
+
+/*
+ * Find the declared name referred by the cursor,
+ * then return the connection name used by the declared name.
+ * Input: cursor_name -- the cursor name
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+const char *
+ecpg_get_con_name_by_cursor_name(const char *cursor_name)
+{
+ struct declared_statement *p;
+
+ if(cursor_name == NULL)
+ return NULL;
+
+ p = g_declared_list;
+ while(p)
+ {
+ /* Search the cursor name in the declared list */
+ if(p->cursor_name && (strcmp(p->cursor_name, cursor_name) == 0))
+ return p->connection_name;
+
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/*
+ * Release the declare node from the g_declared_list which refers the connection_name
+ * Input: connection_name -- connection name
+ */
+void
+ecpg_release_declared_statement(const char *connection_name)
+{
+ struct declared_statement *cur = NULL;
+ struct declared_statement *prev = NULL;
+ struct declared_statement *next = NULL;
+
+ if(connection_name == NULL)
+ return;
+
+ cur = g_declared_list;
+ while(cur)
+ {
+ next = cur->next;
+ if (strcmp(cur->connection_name, connection_name) == 0)
+ {
+ /* If find then release the declared node from the list */
+ if(prev)
+ prev->next = next;
+ else
+ g_declared_list = next;
+
+ ecpg_log("ecpg_release_declared_statement: declared name %s is released\n", cur->name);
+
+ ecpg_free(cur->name);
+ ecpg_free(cur->connection_name);
+ ecpg_free(cur->cursor_name);
+ ecpg_free(cur);
+
+ /* One connection can be used by multiple declared name, so no break here */
+ }
+ else
+ prev = cur;
+
+ cur = next;
+ }
+}
\ No newline at end of file
diff --git a/src/interfaces/ecpg/include/ecpgerrno.h b/src/interfaces/ecpg/include/ecpgerrno.h
index 36b15b7..fae9440 100644
--- a/src/interfaces/ecpg/include/ecpgerrno.h
+++ b/src/interfaces/ecpg/include/ecpgerrno.h
@@ -44,6 +44,7 @@
#define ECPG_UNKNOWN_DESCRIPTOR_ITEM -242
#define ECPG_VAR_NOT_NUMERIC -243
#define ECPG_VAR_NOT_CHAR -244
+#define ECPG_INVALID_CURSOR -245
/* finally the backend error messages, they start at 400 */
#define ECPG_PGSQL -400
diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h
index c32df6c..8c91212 100644
--- a/src/interfaces/ecpg/include/ecpglib.h
+++ b/src/interfaces/ecpg/include/ecpglib.h
@@ -55,6 +55,10 @@ bool ECPGdisconnect(int, const char *);
bool ECPGprepare(int, const char *, const bool, const char *, const char *);
bool ECPGdeallocate(int, int, const char *, const char *);
bool ECPGdeallocate_all(int, int, const char *);
+bool ECPGdeclare(int, const char *, const char *);
+bool ECPGopen(const char*, const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGfetch(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGclose(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
char *ECPGprepared_statement(const char *, const char *, int);
PGconn *ECPGget_PGconn(const char *);
PGTransactionStatusType ECPGtransactionStatus(const char *);
diff --git a/src/interfaces/ecpg/include/ecpgtype.h b/src/interfaces/ecpg/include/ecpgtype.h
index 7cc47e9..2c3f348 100644
--- a/src/interfaces/ecpg/include/ecpgtype.h
+++ b/src/interfaces/ecpg/include/ecpgtype.h
@@ -99,8 +99,15 @@ enum ECPG_statement_type
ECPGst_prepnormal
};
+enum ECPG_cursor_statement_type
+{
+ ECPGcst_declare,
+ ECPGcst_open,
+ ECPGcst_fetch,
+ ECPGcst_close
+};
#ifdef __cplusplus
}
#endif
-#endif /* _ECPGTYPE_H */
+#endif /* _ECPGTYPE_H */
004_declareStmt_test_v5.patchapplication/octet-stream; name=004_declareStmt_test_v5.patchDownload
diff --git a/src/interfaces/ecpg/test/ecpg_schedule b/src/interfaces/ecpg/test/ecpg_schedule
index c3ec125..5f7fe5b 100644
--- a/src/interfaces/ecpg/test/ecpg_schedule
+++ b/src/interfaces/ecpg/test/ecpg_schedule
@@ -48,6 +48,7 @@ test: sql/quote
test: sql/show
test: sql/insupd
test: sql/parser
+test: sql/declare
test: thread/thread
test: thread/thread_implicit
test: thread/prep
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
index 1f316fb..b4a7c44 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
@@ -241,7 +241,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
+ { ECPGopen("mycur1", "st_id1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 101 "sqlda.pgc"
@@ -258,7 +258,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
+ { ECPGfetch("mycur1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 109 "sqlda.pgc"
@@ -279,7 +279,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
#line 118 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -316,7 +316,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
+ { ECPGopen("mycur2", "st_id2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 138 "sqlda.pgc"
@@ -333,7 +333,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch from mycur2", ECPGt_EOIT,
+ { ECPGfetch("mycur2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch from mycur2", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 146 "sqlda.pgc"
@@ -354,7 +354,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
#line 155 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c b/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
index 9934947..48b9197 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
@@ -158,7 +158,7 @@ if (sqlca.sqlcode < 0) dosqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch forward c", ECPGt_EOIT,
+ { ECPGfetch("c", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch forward c", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_decimal,&(j),(long)1,(long)1,sizeof(decimal),
@@ -244,7 +244,7 @@ if (sqlca.sqlcode < 0) dosqlprint ( );}
static void openit(void)
{
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare c cursor for select * from test where i <= $1 ",
+ { ECPGopen("c", NULL, __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare c cursor for select * from test where i <= $1 ",
ECPGt_int,&(*( int *)(ECPGget_var( 0))),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 95 "test_informix.pgc"
diff --git a/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c b/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
index ecd2343..2df8353 100644
--- a/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
+++ b/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
@@ -84,7 +84,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
/* declare cur cursor for select id , d , d from nantest1 */
#line 35 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
#line 36 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -92,7 +92,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_double,&(d),(long)1,(long)1,sizeof(double),
@@ -132,14 +132,14 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
#line 48 "nan_test.pgc"
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 50 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
#line 50 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
#line 52 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -147,7 +147,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_double,&(d),(long)1,(long)1,sizeof(double),
@@ -166,7 +166,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
if (isnan(d))
printf("%d NaN '%s'\n", id, val);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 63 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -223,7 +223,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
/* declare cur1 cursor for select id , d , d from nantest2 */
#line 77 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for select id , d , d from nantest2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur1", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for select id , d , d from nantest2", ECPGt_EOIT, ECPGt_EORT);
#line 78 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -231,7 +231,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur1", ECPGt_EOIT,
+ { ECPGfetch("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur1", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_numeric,&(num),(long)1,(long)0,sizeof(numeric),
@@ -247,7 +247,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
break;
printf("%d %s '%s'\n", id, (num->sign == NUMERIC_NAN ? "NaN" : "not NaN"), val);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
#line 86 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
diff --git a/src/interfaces/ecpg/test/expected/preproc-autoprep.c b/src/interfaces/ecpg/test/expected/preproc-autoprep.c
index 10ede3e..e3abb29 100644
--- a/src/interfaces/ecpg/test/expected/preproc-autoprep.c
+++ b/src/interfaces/ecpg/test/expected/preproc-autoprep.c
@@ -133,7 +133,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 35 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select Item1 from T", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select Item1 from T", ECPGt_EOIT, ECPGt_EORT);
#line 37 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -143,7 +143,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 37 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 39 "autoprep.pgc"
@@ -156,7 +156,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("i = %d\n", i);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
#line 42 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -180,7 +180,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 46 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for $1",
+ { ECPGopen("cur1", "stmt1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 48 "autoprep.pgc"
@@ -199,7 +199,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
i = 0;
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur1", ECPGt_EOIT,
+ { ECPGfetch("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur1", ECPGt_EOIT,
ECPGt_int,&(item1),(long)1,(long)1,sizeof(int),
ECPGt_int,&(ind1),(long)1,(long)1,sizeof(int), ECPGt_EORT);
#line 55 "autoprep.pgc"
@@ -217,7 +217,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
i++;
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
#line 60 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
diff --git a/src/interfaces/ecpg/test/expected/preproc-cursor.c b/src/interfaces/ecpg/test/expected/preproc-cursor.c
index f7da753..ad86a56 100644
--- a/src/interfaces/ecpg/test/expected/preproc-cursor.c
+++ b/src/interfaces/ecpg/test/expected/preproc-cursor.c
@@ -187,7 +187,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
+ { ECPGopen(":curname1", NULL, __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 67 "cursor.pgc"
@@ -197,7 +197,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward from $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -212,7 +212,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -227,7 +227,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -243,7 +243,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
@@ -260,7 +260,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move in");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 in $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 in $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 87 "cursor.pgc"
@@ -270,7 +270,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -286,7 +286,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
@@ -303,7 +303,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 99 "cursor.pgc"
@@ -323,7 +323,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
+ { ECPGopen(":curname2", NULL, __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -337,7 +337,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -352,7 +352,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -367,7 +367,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -383,7 +383,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
@@ -400,7 +400,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -414,7 +414,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -430,7 +430,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
@@ -447,7 +447,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 140 "cursor.pgc"
@@ -483,7 +483,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname3", "st_id1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test1", "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -493,7 +493,7 @@ if (sqlca.sqlcode < 0) exit (1);}
if (sqlca.sqlcode < 0) exit (1);}
#line 153 "cursor.pgc"
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname5", "st_id1", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test2", "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -505,7 +505,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname5", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "fetch $0",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -520,7 +520,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -535,7 +535,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -551,7 +551,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
@@ -568,7 +568,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 174 "cursor.pgc"
@@ -578,7 +578,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -594,7 +594,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
@@ -611,7 +611,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 186 "cursor.pgc"
@@ -619,7 +619,7 @@ if (sqlca.sqlcode < 0) exit (1);}
if (sqlca.sqlcode < 0) exit (1);}
#line 186 "cursor.pgc"
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname5", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 187 "cursor.pgc"
@@ -663,7 +663,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname4", "st_id2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test1", "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -675,7 +675,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -690,7 +690,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -705,7 +705,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -721,7 +721,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
@@ -738,7 +738,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 226 "cursor.pgc"
@@ -748,7 +748,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -764,7 +764,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
@@ -781,7 +781,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 238 "cursor.pgc"
diff --git a/src/interfaces/ecpg/test/expected/preproc-outofscope.c b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
index 348e843..23ce610 100644
--- a/src/interfaces/ecpg/test/expected/preproc-outofscope.c
+++ b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
@@ -201,7 +201,7 @@ get_var1(MYTYPE **myvar0, MYNULLTYPE **mynullvar0)
static void
open_cur1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur cursor for select * from a1", ECPGt_EOIT,
+ { ECPGopen("mycur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur cursor for select * from a1", ECPGt_EOIT,
ECPGt_int,&((*( MYTYPE *)(ECPGget_var( 0)) ).id),(long)1,(long)1,sizeof( struct mytype ),
ECPGt_int,&((*( MYNULLTYPE *)(ECPGget_var( 1)) ).id),(long)1,(long)1,sizeof( struct mynulltype ),
ECPGt_char,&((*( MYTYPE *)(ECPGget_var( 0)) ).t),(long)64,(long)1,sizeof( struct mytype ),
@@ -225,7 +225,7 @@ if (sqlca.sqlcode < 0) exit (1);}
static void
get_record1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch mycur", ECPGt_EOIT,
+ { ECPGfetch("mycur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch mycur", ECPGt_EOIT,
ECPGt_int,&((*( MYTYPE *)(ECPGget_var( 0)) ).id),(long)1,(long)1,sizeof( struct mytype ),
ECPGt_int,&((*( MYNULLTYPE *)(ECPGget_var( 1)) ).id),(long)1,(long)1,sizeof( struct mynulltype ),
ECPGt_char,&((*( MYTYPE *)(ECPGget_var( 0)) ).t),(long)64,(long)1,sizeof( struct mytype ),
@@ -249,7 +249,7 @@ if (sqlca.sqlcode < 0) exit (1);}
static void
close_cur1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur", ECPGt_EOIT, ECPGt_EORT);
#line 58 "outofscope.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/preproc-variable.c b/src/interfaces/ecpg/test/expected/preproc-variable.c
index 7fd03ba..722c02e 100644
--- a/src/interfaces/ecpg/test/expected/preproc-variable.c
+++ b/src/interfaces/ecpg/test/expected/preproc-variable.c
@@ -190,7 +190,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select name , born , age , married , children from family", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select name , born , age , married , children from family", ECPGt_EOIT, ECPGt_EORT);
#line 63 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -206,7 +206,7 @@ if (sqlca.sqlcode < 0) exit (1);}
memset(i, 0, sizeof(ind_personal));
while (1) {
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT,
ECPGt_varchar,&(p->name),(long)BUFFERSIZ,(long)-1,sizeof( struct birthinfo ),
ECPGt_int,&(i->ind_name),(long)1,(long)-1,sizeof( struct birthinfo ),
ECPGt_long,&(p->birth.born),(long)1,(long)1,sizeof( struct birthinfo ),
@@ -241,7 +241,7 @@ if (sqlca.sqlcode < 0) exit (1);}
}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 89 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/sql-binary.c b/src/interfaces/ecpg/test/expected/sql-binary.c
index b91ab7b..ce64de5 100644
--- a/src/interfaces/ecpg/test/expected/sql-binary.c
+++ b/src/interfaces/ecpg/test/expected/sql-binary.c
@@ -111,12 +111,12 @@ main (void)
/* declare C cursor for select name , accs , byte from empl where idnum = $1 */
#line 58 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select name , accs , byte from empl where idnum = $1 ",
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select name , accs , byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 59 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
@@ -133,7 +133,7 @@ main (void)
printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);}
#line 69 "binary.pgc"
@@ -142,12 +142,12 @@ main (void)
/* declare B binary cursor for select name , accs , byte from empl where idnum = $1 */
#line 72 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare B binary cursor for select name , accs , byte from empl where idnum = $1 ",
+ { ECPGopen("B", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare B binary cursor for select name , accs , byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 73 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch B", ECPGt_EOIT,
+ { ECPGfetch("B", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch B", ECPGt_EOIT,
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
@@ -162,7 +162,7 @@ main (void)
exit (sqlca.sqlcode);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close B", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("B", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close B", ECPGt_EOIT, ECPGt_EORT);}
#line 81 "binary.pgc"
@@ -176,12 +176,12 @@ main (void)
/* declare A binary cursor for select byte from empl where idnum = $1 */
#line 89 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare A binary cursor for select byte from empl where idnum = $1 ",
+ { ECPGopen("A", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare A binary cursor for select byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 90 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch A", ECPGt_EOIT,
+ { ECPGfetch("A", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch A", ECPGt_EOIT,
ECPGt_char,&(pointer),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
#line 91 "binary.pgc"
@@ -192,7 +192,7 @@ main (void)
exit (sqlca.sqlcode);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close A", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("A", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close A", ECPGt_EOIT, ECPGt_EORT);}
#line 98 "binary.pgc"
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.c b/src/interfaces/ecpg/test/expected/sql-declare.c
new file mode 100644
index 0000000..342134b
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.c
@@ -0,0 +1,375 @@
+/* Processed by ecpg (regression mode) */
+/* These include files are added by the preprocessor */
+#include <ecpglib.h>
+#include <ecpgerrno.h>
+#include <sqlca.h>
+/* End of automatic include section */
+#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
+
+#line 1 "declare.pgc"
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* exec sql whenever sqlerror sqlprint ; */
+#line 5 "declare.pgc"
+
+
+
+#line 1 "sqlca.h"
+#ifndef POSTGRES_SQLCA_H
+#define POSTGRES_SQLCA_H
+
+#ifndef PGDLLIMPORT
+#if defined(WIN32) || defined(__CYGWIN__)
+#define PGDLLIMPORT __declspec (dllimport)
+#else
+#define PGDLLIMPORT
+#endif /* __CYGWIN__ */
+#endif /* PGDLLIMPORT */
+
+#define SQLERRMC_LEN 150
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+struct sqlca_t
+{
+ char sqlcaid[8];
+ long sqlabc;
+ long sqlcode;
+ struct
+ {
+ int sqlerrml;
+ char sqlerrmc[SQLERRMC_LEN];
+ } sqlerrm;
+ char sqlerrp[8];
+ long sqlerrd[6];
+ /* Element 0: empty */
+ /* 1: OID of processed tuple if applicable */
+ /* 2: number of rows processed */
+ /* after an INSERT, UPDATE or */
+ /* DELETE statement */
+ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ char sqlwarn[8];
+ /* Element 0: set to 'W' if at least one other is 'W' */
+ /* 1: if 'W' at least one character string */
+ /* value was truncated when it was */
+ /* stored into a host variable. */
+
+ /*
+ * 2: if 'W' a (hopefully) non-fatal notice occurred
+ */ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ /* 6: empty */
+ /* 7: empty */
+
+ char sqlstate[5];
+};
+
+struct sqlca_t *ECPGget_sqlca(void);
+
+#ifndef POSTGRES_ECPG_INTERNAL
+#define sqlca (*ECPGget_sqlca())
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#line 7 "declare.pgc"
+
+
+#line 1 "regression.h"
+
+
+
+
+
+
+#line 8 "declare.pgc"
+
+
+#define ARRAY_SZIE 20
+
+void execute_test(void);
+void commitTable(void);
+void reset(void);
+void printResult(char *tc_name, int loop);
+
+/* exec sql begin declare section */
+
+
+
+
+#line 18 "declare.pgc"
+ int f1 [ ARRAY_SZIE ] ;
+
+#line 19 "declare.pgc"
+ int f2 [ ARRAY_SZIE ] ;
+
+#line 20 "declare.pgc"
+ char f3 [ ARRAY_SZIE ] [ 20 ] ;
+/* exec sql end declare section */
+#line 21 "declare.pgc"
+
+
+int main(void)
+{
+ setlocale(LC_ALL, "C");
+
+ ECPGdebug(1, stderr);
+
+ { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , "con1", 0);
+#line 29 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 29 "declare.pgc"
+
+ { ECPGconnect(__LINE__, 0, "ecpg2_regression" , NULL, NULL , "con2", 0);
+#line 30 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 30 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 32 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 32 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 33 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 33 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 35 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 35 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 36 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 36 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 38 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 38 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 39 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 39 "declare.pgc"
+
+
+ commitTable();
+
+ execute_test();
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 45 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 45 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 46 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 46 "declare.pgc"
+
+
+ commitTable();
+
+ { ECPGdisconnect(__LINE__, "ALL");
+#line 50 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 50 "declare.pgc"
+
+
+ return 0;
+}
+
+/*
+ * default connection: con2
+ * Non-default connection: con1
+ *
+ */
+void execute_test(void)
+{
+ /* exec sql begin declare section */
+
+
+
+#line 63 "declare.pgc"
+ int i ;
+
+#line 64 "declare.pgc"
+ char * selectString = "SELECT f1,f2,f3 FROM source" ;
+/* exec sql end declare section */
+#line 65 "declare.pgc"
+
+
+ /* testcase1. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement*/
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_1");
+#line 70 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 70 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_1", selectString);
+#line 71 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 71 "declare.pgc"
+
+ /* declare cur_1 cursor for $1 */
+#line 72 "declare.pgc"
+
+ { ECPGopen("cur_1", "stmt_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_1 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 73 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 73 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 75 "declare.pgc"
+
+ i = 0;
+ while (1)
+ {
+ { ECPGfetch("cur_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_1", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 79 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 79 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 79 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_1", ECPGt_EOIT, ECPGt_EORT);
+#line 83 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 83 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_1");
+#line 84 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 84 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 85 "declare.pgc"
+
+
+ printResult("testcase1", 2);
+
+ /* testcase2. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement*/
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_2");
+#line 92 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 92 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_2", selectString);
+#line 93 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 93 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "stmt_2", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 94 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 94 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_2");
+#line 96 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 96 "declare.pgc"
+
+
+ printResult("testcase2", 2);
+}
+
+void commitTable()
+{
+ { ECPGtrans(__LINE__, "con1", "commit");
+#line 103 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 103 "declare.pgc"
+
+ { ECPGtrans(__LINE__, "con2", "commit");
+#line 104 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 104 "declare.pgc"
+
+}
+
+/*
+ * reset all the output variables
+ */
+void reset()
+{
+ memset(f1, 0, sizeof(f1));
+ memset(f2, 0, sizeof(f2));
+ memset(f3, 0, sizeof(f3));
+}
+
+void printResult(char *tc_name, int loop)
+{
+ int i;
+
+ if (tc_name)
+ printf("****%s test results:****\n", tc_name);
+
+ for (i = 0; i < loop; i++)
+ printf("f1=%d, f2=%d, f3=%s\n", f1[i], f2[i], f3[i]);
+
+ printf("\n");
+}
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stderr b/src/interfaces/ecpg/test/expected/sql-declare.stderr
new file mode 100644
index 0000000..3693f8b
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.stderr
@@ -0,0 +1,140 @@
+[NO_PID]: ECPGdebug: set to 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg1_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg2_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 32: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 32: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 32: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 33: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 33: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 33: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 35: query: insert into source values ( 1 , 10 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 35: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 35: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 36: query: insert into source values ( 2 , 20 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 36: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 36: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 38: query: insert into source values ( 1 , 10 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 38: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 38: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 39: query: insert into source values ( 2 , 20 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 39: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 39: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 103: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 104: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 70: declared name stmt_1 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 71: name stmt_1; query: "SELECT f1,f2,f3 FROM source"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 73: query: declare cur_1 cursor for SELECT f1,f2,f3 FROM source; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 73: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 73: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: query: fetch cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 79: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: query: fetch cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 79: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: query: fetch cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 79: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 79: no data found on line 79
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 83: query: close cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 83: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 83: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 84: name stmt_1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 93: name stmt_2; query: "SELECT f1,f2,f3 FROM source"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 94: query: SELECT f1,f2,f3 FROM source; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 94: using PQexecPrepared for "SELECT f1,f2,f3 FROM source"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 94: correctly got 2 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 96: name stmt_2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 45: query: drop table if exists source; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 45: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 45: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 46: query: drop table if exists source; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 46: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 46: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 103: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 104: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con2 closed
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_1 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con1 closed
+[NO_PID]: sqlca: code: 0, state: 00000
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stdout b/src/interfaces/ecpg/test/expected/sql-declare.stdout
new file mode 100644
index 0000000..d80d079
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.stdout
@@ -0,0 +1,8 @@
+****testcase1 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+
+****testcase2 test results:****
+f1=1, f2=10, f3=db on con2
+f1=2, f2=20, f3=db on con2
+
diff --git a/src/interfaces/ecpg/test/expected/sql-desc.c b/src/interfaces/ecpg/test/expected/sql-desc.c
index bdd12a5..bcfe1bd 100644
--- a/src/interfaces/ecpg/test/expected/sql-desc.c
+++ b/src/interfaces/ecpg/test/expected/sql-desc.c
@@ -249,7 +249,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* declare c1 cursor for $1 */
#line 58 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c1 cursor for $1",
+ { ECPGopen("c1", "foo2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "foo2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_descriptor, "indesc", 1L, 1L, 1L,
@@ -260,7 +260,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 59 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c1", ECPGt_EOIT,
+ { ECPGfetch("c1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c1", ECPGt_EOIT,
ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int),
ECPGt_int,&(ind1),(long)1,(long)1,sizeof(int),
ECPGt_char,(val2output),(long)sizeof("AAA"),(long)1,(sizeof("AAA"))*sizeof(char),
@@ -273,7 +273,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("val1=%d (ind1: %d) val2=%s (ind2: %d)\n",
val1output, ind1, val2output, ind2);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("c1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c1", ECPGt_EOIT, ECPGt_EORT);
#line 65 "desc.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -299,7 +299,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* declare c2 cursor for $1 */
#line 70 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c2 cursor for $1",
+ { ECPGopen("c2", "foo3", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "foo3", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_descriptor, "indesc", 1L, 1L, 1L,
@@ -310,7 +310,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 71 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c2", ECPGt_EOIT,
+ { ECPGfetch("c2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c2", ECPGt_EOIT,
ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(val2output),(long)sizeof("AAA"),(long)1,(sizeof("AAA"))*sizeof(char),
@@ -322,7 +322,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("val1=%d val2=%s\n", val1output, val2i ? "null" : val2output);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("c2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c2", ECPGt_EOIT, ECPGt_EORT);
#line 76 "desc.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-dyntest.c b/src/interfaces/ecpg/test/expected/sql-dyntest.c
index 2cbc196..dff22aa 100644
--- a/src/interfaces/ecpg/test/expected/sql-dyntest.c
+++ b/src/interfaces/ecpg/test/expected/sql-dyntest.c
@@ -261,7 +261,7 @@ if (sqlca.sqlcode < 0) error ( );}
#line 58 "dyntest.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare MYCURS cursor for $1",
+ { ECPGopen("MYCURS", "myquery", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare MYCURS cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "myquery", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 60 "dyntest.pgc"
@@ -272,7 +272,7 @@ if (sqlca.sqlcode < 0) error ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in MYCURS", ECPGt_EOIT,
+ { ECPGfetch("MYCURS", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in MYCURS", ECPGt_EOIT,
ECPGt_descriptor, "MYDESC", 1L, 1L, 1L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 64 "dyntest.pgc"
@@ -468,7 +468,7 @@ if (sqlca.sqlcode < 0) error ( );}
}
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close MYCURS", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("MYCURS", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close MYCURS", ECPGt_EOIT, ECPGt_EORT);
#line 194 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
diff --git a/src/interfaces/ecpg/test/expected/sql-execute.c b/src/interfaces/ecpg/test/expected/sql-execute.c
index aee3c1b..c511349 100644
--- a/src/interfaces/ecpg/test/expected/sql-execute.c
+++ b/src/interfaces/ecpg/test/expected/sql-execute.c
@@ -140,7 +140,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 50 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR cursor for $1",
+ { ECPGopen("CUR", "f", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 52 "execute.pgc"
@@ -148,7 +148,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 52 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
+ { ECPGfetch("CUR", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -180,7 +180,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
#line 66 "execute.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -205,7 +205,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 72 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR2 cursor for $1",
+ { ECPGopen("CUR2", "f", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
@@ -215,7 +215,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 74 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in CUR2", ECPGt_EOIT,
+ { ECPGfetch("CUR2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in CUR2", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -247,7 +247,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR2", ECPGt_EOIT, ECPGt_EORT);
#line 88 "execute.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-fetch.c b/src/interfaces/ecpg/test/expected/sql-fetch.c
index b547b25..e6beaf5 100644
--- a/src/interfaces/ecpg/test/expected/sql-fetch.c
+++ b/src/interfaces/ecpg/test/expected/sql-fetch.c
@@ -99,7 +99,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 26 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from My_Table", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from My_Table", ECPGt_EOIT, ECPGt_EORT);
#line 28 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -113,7 +113,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 30 "fetch.pgc"
while (1) {
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(str),(long)25,(long)1,(25)*sizeof(char),
@@ -135,7 +135,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* exec sql whenever not found continue ; */
#line 36 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "move backward 2 in C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "move backward 2 in C", ECPGt_EOIT, ECPGt_EORT);
#line 37 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -145,7 +145,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 37 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch $0 in C",
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch $0 in C",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
@@ -162,7 +162,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("%d: %s\n", i, str);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
#line 42 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -176,7 +176,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 44 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare D cursor for select * from My_Table where Item1 = $1",
+ { ECPGopen("D", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare D cursor for select * from My_Table where Item1 = $1",
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 46 "fetch.pgc"
@@ -192,7 +192,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 48 "fetch.pgc"
while (1) {
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in D", ECPGt_EOIT,
+ { ECPGfetch("D", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in D", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(str),(long)25,(long)1,(25)*sizeof(char),
@@ -210,7 +210,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("%d: %s\n", i, str);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close D", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("D", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close D", ECPGt_EOIT, ECPGt_EORT);
#line 53 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
diff --git a/src/interfaces/ecpg/test/expected/sql-oldexec.c b/src/interfaces/ecpg/test/expected/sql-oldexec.c
index 5b74dda..2e398c2 100644
--- a/src/interfaces/ecpg/test/expected/sql-oldexec.c
+++ b/src/interfaces/ecpg/test/expected/sql-oldexec.c
@@ -141,7 +141,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 51 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR cursor for $1",
+ { ECPGopen("CUR", "f", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 53 "oldexec.pgc"
@@ -149,7 +149,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 53 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
+ { ECPGfetch("CUR", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -171,7 +171,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
#line 65 "oldexec.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -190,7 +190,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 70 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR3 cursor for $1",
+ { ECPGopen("CUR3", "f", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR3 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
@@ -200,7 +200,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 72 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch in CUR3", ECPGt_EOIT,
+ { ECPGfetch("CUR3", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch in CUR3", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -222,7 +222,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR3", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR3", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR3", ECPGt_EOIT, ECPGt_EORT);
#line 84 "oldexec.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-quote.c b/src/interfaces/ecpg/test/expected/sql-quote.c
index 0a3b77c..ec03612 100644
--- a/src/interfaces/ecpg/test/expected/sql-quote.c
+++ b/src/interfaces/ecpg/test/expected/sql-quote.c
@@ -162,7 +162,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 43 "quote.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
#line 45 "quote.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -178,7 +178,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
while (true)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(var),(long)25,(long)1,(25)*sizeof(char),
diff --git a/src/interfaces/ecpg/test/expected/sql-sqlda.c b/src/interfaces/ecpg/test/expected/sql-sqlda.c
index b470b04..6bfcbe2 100644
--- a/src/interfaces/ecpg/test/expected/sql-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/sql-sqlda.c
@@ -251,7 +251,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
+ { ECPGopen("mycur1", "st_id1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 103 "sqlda.pgc"
@@ -268,7 +268,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
+ { ECPGfetch("mycur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 111 "sqlda.pgc"
@@ -289,7 +289,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
#line 120 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -324,7 +324,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
+ { ECPGopen("mycur2", "st_id2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 138 "sqlda.pgc"
@@ -334,7 +334,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch all from mycur2", ECPGt_EOIT,
+ { ECPGfetch("mycur2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch all from mycur2", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 141 "sqlda.pgc"
@@ -357,7 +357,7 @@ if (sqlca.sqlcode < 0) exit (1);}
}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
#line 157 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/sql/.gitignore b/src/interfaces/ecpg/test/sql/.gitignore
index cd6f342..83bc47e 100644
--- a/src/interfaces/ecpg/test/sql/.gitignore
+++ b/src/interfaces/ecpg/test/sql/.gitignore
@@ -6,6 +6,8 @@
/code100.c
/copystdout
/copystdout.c
+/declare
+/declare.c
/define
/define.c
/desc
diff --git a/src/interfaces/ecpg/test/sql/Makefile b/src/interfaces/ecpg/test/sql/Makefile
index 6bc67e9..d313464 100644
--- a/src/interfaces/ecpg/test/sql/Makefile
+++ b/src/interfaces/ecpg/test/sql/Makefile
@@ -22,7 +22,8 @@ TESTS = array array.c \
parser parser.c \
quote quote.c \
show show.c \
- insupd insupd.c
+ insupd insupd.c \
+ declare declare.c
all: $(TESTS)
diff --git a/src/interfaces/ecpg/test/sql/declare.pgc b/src/interfaces/ecpg/test/sql/declare.pgc
new file mode 100644
index 0000000..f307341
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/declare.pgc
@@ -0,0 +1,128 @@
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+EXEC SQL WHENEVER SQLERROR SQLPRINT;
+
+EXEC SQL INCLUDE sqlca;
+EXEC SQL INCLUDE ../regression;
+
+#define ARRAY_SZIE 20
+
+void execute_test(void);
+void commitTable(void);
+void reset(void);
+void printResult(char *tc_name, int loop);
+
+EXEC SQL BEGIN DECLARE SECTION;
+int f1[ARRAY_SZIE];
+int f2[ARRAY_SZIE];
+char f3[ARRAY_SZIE][20];
+EXEC SQL END DECLARE SECTION;
+
+int main(void)
+{
+ setlocale(LC_ALL, "C");
+
+ ECPGdebug(1, stderr);
+
+ EXEC SQL CONNECT TO REGRESSDB1 AS con1;
+ EXEC SQL CONNECT TO REGRESSDB2 AS con2;
+
+ EXEC SQL AT con1 CREATE TABLE source(f1 integer, f2 integer, f3 varchar(20));
+ EXEC SQL AT con2 CREATE TABLE source(f1 integer, f2 integer, f3 varchar(20));
+
+ EXEC SQL AT con1 INSERT INTO source VALUES(1, 10, 'db on con1');
+ EXEC SQL AT con1 INSERT INTO source VALUES(2, 20, 'db on con1');
+
+ EXEC SQL AT con2 INSERT INTO source VALUES(1, 10, 'db on con2');
+ EXEC SQL AT con2 INSERT INTO source VALUES(2, 20, 'db on con2');
+
+ commitTable();
+
+ execute_test();
+
+ EXEC SQL AT con1 DROP TABLE IF EXISTS source;
+ EXEC SQL AT con2 DROP TABLE IF EXISTS source;
+
+ commitTable();
+
+ EXEC SQL DISCONNECT ALL;
+
+ return 0;
+}
+
+/*
+ * default connection: con2
+ * Non-default connection: con1
+ *
+ */
+void execute_test(void)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int i;
+ char *selectString = "SELECT f1,f2,f3 FROM source";
+ EXEC SQL END DECLARE SECTION;
+
+ /* testcase1. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement*/
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_1 STATEMENT;
+ EXEC SQL PREPARE stmt_1 FROM :selectString;
+ EXEC SQL DECLARE cur_1 CURSOR FOR stmt_1;
+ EXEC SQL OPEN cur_1;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while (1)
+ {
+ EXEC SQL FETCH cur_1 INTO :f1[i], :f2[i], :f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_1;
+ EXEC SQL DEALLOCATE PREPARE stmt_1;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResult("testcase1", 2);
+
+ /* testcase2. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement*/
+ reset();
+
+ EXEC SQL DECLARE stmt_2 STATEMENT;
+ EXEC SQL PREPARE stmt_2 FROM :selectString;
+ EXEC SQL EXECUTE stmt_2 INTO :f1, :f2, :f3;
+
+ EXEC SQL DEALLOCATE PREPARE stmt_2;
+
+ printResult("testcase2", 2);
+}
+
+void commitTable()
+{
+ EXEC SQL AT con1 COMMIT;
+ EXEC SQL AT con2 COMMIT;
+}
+
+/*
+ * reset all the output variables
+ */
+void reset()
+{
+ memset(f1, 0, sizeof(f1));
+ memset(f2, 0, sizeof(f2));
+ memset(f3, 0, sizeof(f3));
+}
+
+void printResult(char *tc_name, int loop)
+{
+ int i;
+
+ if (tc_name)
+ printf("****%s test results:****\n", tc_name);
+
+ for (i = 0; i < loop; i++)
+ printf("f1=%d, f2=%d, f3=%s\n", f1[i], f2[i], f3[i]);
+
+ printf("\n");
+}
Hi Haribabu,
On 3/7/17 12:09 AM, Ideriha, Takeshi wrote:
I tried applying your patches. But it failed...
The error messages are as below.Attached 004_declareStmt_test_v5.patch is a rebased one.
The rest of patches are same as older version.Regards,
Ideriha, Takeshi
You are signed up to review this patch. Do you know when you'll have a
chance to do that?
Thanks,
--
-David
david@pgmasters.net
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Tue, Mar 7, 2017 at 4:09 PM, Ideriha, Takeshi <
ideriha.takeshi@jp.fujitsu.com> wrote:
Attached 004_declareStmt_test_v5.patch is a rebased one.
The rest of patches are same as older version.
Thanks for the update patch. I started reviewing the patches.
There was a minor conflict in applying 004_declareXX patch.
Some comments in 001_declareStmt_preproc_v5.patch:
+ if (INFORMIX_MODE)
+ {
+ if (pg_strcasecmp(stmt+strlen("close "), "database") == 0)
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE
statement");
+
+ fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");");
+ whenever_action(2);
+ free(stmt);
+ break;
+ }
+ }
The same code block is present in the stmtClosePortalStmt condition to
verify the close
statement. Because of the above code addition, the code present in
stmtClosePortalStmt
is a dead code. So remove the code present in stmtClosePortalStmt or try to
reuse it.
+static void
+output_cursor_name(char *str)
This function needs some comments to explain the code flow for better
understanding.
+/*
+ * Translate the EXEC SQL DECLARE STATEMENT into ECPGdeclare function
+ */
How about using Transform instead of Translate? (similar references also)
I am yet to review the other patches.
Regards,
Hari Babu
Fujitsu Australia
On Wed, Mar 22, 2017 at 12:51 PM, Haribabu Kommi <kommi.haribabu@gmail.com>
wrote:
On Tue, Mar 7, 2017 at 4:09 PM, Ideriha, Takeshi <
ideriha.takeshi@jp.fujitsu.com> wrote:Attached 004_declareStmt_test_v5.patch is a rebased one.
The rest of patches are same as older version.Thanks for the update patch. I started reviewing the patches.
There was a minor conflict in applying 004_declareXX patch.
Some comments in 001_declareStmt_preproc_v5.patch:
+ if (INFORMIX_MODE) + { + if (pg_strcasecmp(stmt+strlen("close "), "database") == 0) + { + if (connection) + mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE statement"); + + fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");"); + whenever_action(2); + free(stmt); + break; + } + }The same code block is present in the stmtClosePortalStmt condition to
verify the close
statement. Because of the above code addition, the code present in
stmtClosePortalStmt
is a dead code. So remove the code present in stmtClosePortalStmt or try
to reuse it.+static void
+output_cursor_name(char *str)This function needs some comments to explain the code flow for better
understanding.+/* + * Translate the EXEC SQL DECLARE STATEMENT into ECPGdeclare function + */How about using Transform instead of Translate? (similar references also)
002_declareStmt_ecpglib_v5.patch:
+ struct connection *f = NULL;
+
ecpg_init_sqlca(sqlca);
for (con = all_connections; con;)
{
- struct connection *f = con;
+ f = con;
What is the need of moving the structure declartion
to outside, i didn't find any usage of it later.
+ con = ecpg_get_connection(connection_name);
+ if (!con)
+ {
+ return;
+ }
No need of {}.
+ if (find_cursor(cursor_name, con))
+ {
+ /*
+ * Should never goto here, because ECPG has checked the duplication of
+ * the cursor in pre-compile stage.
+ */
+ return;
+ }
Do we really need this check? If it is for additional check, How about
checking
it with an Assert? (check for similar instances)
+ if (!ecpg_init(con, real_connection_name, line))
+ return false;
What is the need of ecpg_init call? why the same is not done in other
functions.
Better if you provide some comments about the need of the function call.
-#endif /* _ECPG_LIB_EXTERN_H */
+#endif /* _ECPG_LIB_EXTERN_H */
Not related change.
+ if(connection_name == NULL)
+ {
+ /*
+ * Going to here means not using AT clause in the DECLARE STATEMENT
+ * We don't allocate a node to store the declared name because the
+ * DECLARE STATEMENT without using AT clause will be ignored.
+ */
+ return true;
+ }
I am not sure that just ignore the declare statement may be wrong.
I feel whether such case is possible? Does the preprocessor allows it?
+ * Find the declared name referred by the cursor,
+ * then return the connection name used by the declared name.
How about rewriting the above statement as follows? This is because
we are not finding the declare name, as we are looping through all
the declare statements for this cursor.
"Find the connection name by referring the declared statements
cursors by using the provided cursor name"
+ struct declared_statement *cur = NULL;
+ struct declared_statement *prev = NULL;
+ struct declared_statement *next = NULL;
+
+ if(connection_name == NULL)
+ return;
+
+ cur = g_declared_list;
+ while(cur)
+ {
+ next = cur->next;
+ if (strcmp(cur->connection_name, connection_name) == 0)
+ {
+ /* If find then release the declared node from the list */
+ if(prev)
+ prev->next = next;
+ else
+ g_declared_list = next;
+
+ ecpg_log("ecpg_release_declared_statement: declared name %s is
released\n", cur->name);
+
+ ecpg_free(cur->name);
+ ecpg_free(cur->connection_name);
+ ecpg_free(cur->cursor_name);
+ ecpg_free(cur);
+
+ /* One connection can be used by multiple declared name, so no break here
*/
+ }
+ else
+ prev = cur;
+
+ cur = next;
+ }
The above logic can be written without "next" pointer.
That way it should be simpler.
-#endif /* _ECPGTYPE_H */
+#endif /* _ECPGTYPE_H */
Not related change.
Regards,
Hari Babu
Fujitsu Australia
Hi, thank you very much for reviewing.
Attached is v6 patch.
There was a minor conflict in applying 004_declareXX patch.
I rebased 004_declareStmt_test_v6.patch.
Some comments in 001_declareStmt_preproc_v5.patch:
+ if (INFORMIX_MODE) + { + if (pg_strcasecmp(stmt+strlen("close "), "database") == 0) + { + if (connection) + mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE statement");
+
+ fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");"); + whenever_action(2); + free(stmt); + break; + } + }
The same code block is present in the stmtClosePortalStmt condition to verify the close
statement. Because of the above code addition, the code present in stmtClosePortalStmt
is a dead code. So remove the code present in stmtClosePortalStmt or try to reuse it.
I remove almost all the stmtClosePortalStmt code
and just leave the interface which actually does nothing not to affect other codes.
But I'm not sure this implementation is good or not.
Maybe I should completely remove stmtClosePortalStmt code
and rename ClosePortalStmtCLOSEcursor_name to stmtClosePortalStmt to make code easier to understand.
+static void
+output_cursor_name(char *str)
This function needs some comments to explain the code flow for better understanding.
I add some explanation that output_cursor_name() filters escape sequences.
+/* + * Translate the EXEC SQL DECLARE STATEMENT into ECPGdeclare function + */
How about using Transform instead of Translate? (similar references also)
I changed two comments with the word Translate.
regards,
Ideriha, Takeshi
Attachments:
001_declareStmt_preproc_v6.patchapplication/octet-stream; name=001_declareStmt_preproc_v6.patchDownload
diff --git a/src/interfaces/ecpg/preproc/ecpg.addons b/src/interfaces/ecpg/preproc/ecpg.addons
index ca3efad..219203f 100644
--- a/src/interfaces/ecpg/preproc/ecpg.addons
+++ b/src/interfaces/ecpg/preproc/ecpg.addons
@@ -1,22 +1,6 @@
/* src/interfaces/ecpg/preproc/ecpg.addons */
ECPG: stmtClosePortalStmt block
- {
- if (INFORMIX_MODE)
- {
- if (pg_strcasecmp($1+strlen("close "), "database") == 0)
- {
- if (connection)
- mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE statement");
-
- fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");");
- whenever_action(2);
- free($1);
- break;
- }
- }
-
- output_statement($1, 0, ECPGst_normal);
- }
+ { $$ = $1;}
ECPG: stmtDeallocateStmt block
{
output_deallocate_prepare_statement($1);
@@ -25,7 +9,11 @@ ECPG: stmtDeclareCursorStmt block
{ output_simple_statement($1); }
ECPG: stmtDiscardStmt block
ECPG: stmtFetchStmt block
- { output_statement($1, 1, ECPGst_normal); }
+ {
+ /* g_cursor_name is set in the fetch_args block and freed in the output_cursor_statement */
+ output_cursor_statement(ECPGcst_fetch, g_cursor_name, NULL, $1, 1, ECPGst_normal);
+ g_cursor_name = NULL;
+ }
ECPG: stmtDeleteStmt block
ECPG: stmtInsertStmt block
ECPG: stmtSelectStmt block
@@ -63,6 +51,10 @@ ECPG: stmtViewStmt rule
whenever_action(2);
free($1);
}
+ | ECPGDeclareStmt
+ {
+ output_declare_statement($1);
+ }
| ECPGCursorStmt
{
output_simple_statement($1);
@@ -132,7 +124,14 @@ ECPG: stmtViewStmt rule
if ((ptr = add_additional_variables($1, true)) != NULL)
{
connection = ptr->connection ? mm_strdup(ptr->connection) : NULL;
- output_statement(mm_strdup(ptr->command), 0, ECPGst_normal);
+ if (ptr->prepared_name)
+ {
+ output_cursor_statement(ECPGcst_open, $1, mm_strdup(ptr->prepared_name), mm_strdup(ptr->command), 0, ECPGst_normal);
+ }
+ else
+ {
+ output_cursor_statement(ECPGcst_open, $1, NULL, mm_strdup(ptr->command), 0, ECPGst_normal);
+ }
ptr->opened = true;
}
}
@@ -204,6 +203,7 @@ ECPG: var_valueNumericOnly addon
}
ECPG: fetch_argscursor_name addon
add_additional_variables($1, false);
+ g_cursor_name = mm_strdup($1);
if ($1[0] == ':')
{
free($1);
@@ -211,6 +211,7 @@ ECPG: fetch_argscursor_name addon
}
ECPG: fetch_argsfrom_incursor_name addon
add_additional_variables($2, false);
+ g_cursor_name = mm_strdup($2);
if ($2[0] == ':')
{
free($2);
@@ -222,6 +223,7 @@ ECPG: fetch_argsFIRST_Popt_from_incursor_name addon
ECPG: fetch_argsLAST_Popt_from_incursor_name addon
ECPG: fetch_argsALLopt_from_incursor_name addon
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
if ($3[0] == ':')
{
free($3);
@@ -229,6 +231,7 @@ ECPG: fetch_argsALLopt_from_incursor_name addon
}
ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
if ($3[0] == ':')
{
free($3);
@@ -242,6 +245,7 @@ ECPG: fetch_argsSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDALLopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDALLopt_from_incursor_name addon
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
if ($4[0] == ':')
{
free($4);
@@ -252,6 +256,7 @@ ECPG: fetch_argsRELATIVE_PSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsFORWARDSignedIconstopt_from_incursor_name addon
ECPG: fetch_argsBACKWARDSignedIconstopt_from_incursor_name addon
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
if ($4[0] == ':')
{
free($4);
@@ -304,6 +309,7 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
}
this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ memset(this, 0 ,sizeof(struct cursor));
this->next = cur;
this->name = $2;
@@ -336,8 +342,31 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
}
ECPG: ClosePortalStmtCLOSEcursor_name block
{
+ char *stmt = NULL;
+ char *cursor_name = NULL;
char *cursor_marker = $2[0] == ':' ? mm_strdup("$0") : $2;
- $$ = cat2_str(mm_strdup("close"), cursor_marker);
+
+ cursor_name = mm_strdup($2);
+
+ stmt = cat2_str(mm_strdup("close"), cursor_marker);
+
+ if (INFORMIX_MODE)
+ {
+ if (pg_strcasecmp(stmt+strlen("close "), "database") == 0)
+ {
+ if (connection)
+ mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE statement");
+
+ fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");");
+ whenever_action(2);
+ free(stmt);
+ break;
+ }
+ }
+
+ output_cursor_statement(ECPGcst_close, cursor_name, NULL, stmt, 0, ECPGst_normal);
+
+ $$ = EMPTY;
}
ECPG: opt_hold block
{
@@ -416,48 +445,56 @@ ECPG: FetchStmtMOVEfetch_args rule
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("fetch forward"), cursor_marker);
}
| FETCH FORWARD from_in cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("fetch forward from"), cursor_marker);
}
| FETCH BACKWARD cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("fetch backward"), cursor_marker);
}
| FETCH BACKWARD from_in cursor_name opt_ecpg_fetch_into
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("fetch backward from"), cursor_marker);
}
| MOVE FORWARD cursor_name
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("move forward"), cursor_marker);
}
| MOVE FORWARD from_in cursor_name
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("move forward from"), cursor_marker);
}
| MOVE BACKWARD cursor_name
{
char *cursor_marker = $3[0] == ':' ? mm_strdup("$0") : $3;
add_additional_variables($3, false);
+ g_cursor_name = mm_strdup($3);
$$ = cat_str(2, mm_strdup("move backward"), cursor_marker);
}
| MOVE BACKWARD from_in cursor_name
{
char *cursor_marker = $4[0] == ':' ? mm_strdup("$0") : $4;
add_additional_variables($4, false);
+ g_cursor_name = mm_strdup($4);
$$ = cat_str(2, mm_strdup("move backward from"), cursor_marker);
}
ECPG: limit_clauseLIMITselect_limit_value','select_offset_value block
diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c
index aaecbf81..c2396db 100644
--- a/src/interfaces/ecpg/preproc/ecpg.c
+++ b/src/interfaces/ecpg/preproc/ecpg.c
@@ -28,6 +28,7 @@ struct _include_path *include_paths = NULL;
struct cursor *cur = NULL;
struct typedefs *types = NULL;
struct _defines *defines = NULL;
+struct declared_name_st *g_declared_list = NULL;
static void
help(const char *progname)
@@ -111,6 +112,48 @@ add_preprocessor_define(char *define)
defines->next = pd;
}
+static void
+free_argument(struct arguments *arg)
+{
+ if (arg == NULL)
+ return;
+
+ free_argument(arg->next);
+
+ /*
+ * Don't free variables in it because the original codes don't free it either
+ * variables are static structures instead of allocating
+ */
+ free(arg);
+}
+
+static void
+free_cursor(struct cursor *c)
+{
+ if (c == NULL)
+ return;
+
+ free_cursor(c->next);
+ free_argument(c->argsinsert);
+ free_argument(c->argsresult);
+
+ free(c->name);
+ free(c->function);
+ free(c->command);
+ free(c->prepared_name);
+ free(c);
+}
+
+static void
+free_declared_stmt(struct declared_name_st *st)
+{
+ if (st == NULL)
+ return;
+
+ free_declared_stmt(st->next);
+ free(st);
+}
+
#define ECPG_GETOPT_LONG_REGRESSION 1
int
main(int argc, char *const argv[])
@@ -343,29 +386,18 @@ main(int argc, char *const argv[])
struct typedefs *typeptr;
/* remove old cursor definitions if any are still there */
- for (ptr = cur; ptr != NULL;)
+ if (cur)
{
- struct cursor *this = ptr;
- struct arguments *l1,
- *l2;
-
- free(ptr->command);
- free(ptr->connection);
- free(ptr->name);
- for (l1 = ptr->argsinsert; l1; l1 = l2)
- {
- l2 = l1->next;
- free(l1);
- }
- for (l1 = ptr->argsresult; l1; l1 = l2)
- {
- l2 = l1->next;
- free(l1);
- }
- ptr = ptr->next;
- free(this);
+ free_cursor(cur);
+ cur = NULL;
+ }
+
+ /* remove old declared statements if any are still there */
+ if (g_declared_list)
+ {
+ free_declared_stmt(g_declared_list);
+ g_declared_list = NULL;
}
- cur = NULL;
/* remove non-pertinent old defines as well */
while (defines && !defines->pertinent)
@@ -479,6 +511,18 @@ main(int argc, char *const argv[])
free(input_filename);
}
+
+ if(g_declared_list)
+ {
+ free_declared_stmt(g_declared_list);
+ g_declared_list = NULL;
+ }
+
+ if(cur)
+ {
+ free_cursor(cur);
+ cur = NULL;
+ }
}
return ret_value;
}
diff --git a/src/interfaces/ecpg/preproc/ecpg.header b/src/interfaces/ecpg/preproc/ecpg.header
index 2562366..0cebf56 100644
--- a/src/interfaces/ecpg/preproc/ecpg.header
+++ b/src/interfaces/ecpg/preproc/ecpg.header
@@ -38,6 +38,7 @@ char *current_function;
int ecpg_internal_var = 0;
char *connection = NULL;
char *input_filename = NULL;
+char *g_cursor_name = NULL;
static int FoundInto = 0;
static int initializer = 0;
diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer
index 1c10879..af15b88 100644
--- a/src/interfaces/ecpg/preproc/ecpg.trailer
+++ b/src/interfaces/ecpg/preproc/ecpg.trailer
@@ -284,6 +284,38 @@ prepared_name: name
;
/*
+ * Declare Statement
+ */
+ECPGDeclareStmt: DECLARE prepared_name STATEMENT
+ {
+ struct declared_name_st *ptr = NULL;
+
+ /* Check whether the declared name has been defined or not */
+ for (ptr = g_declared_list; ptr != NULL; ptr = ptr->next)
+ {
+ if (strcmp($2, ptr->name) == 0)
+ {
+ /* re-definition is a bug */
+ mmerror(PARSE_ERROR, ET_ERROR, "declared name %s is already defined", ptr->name);
+ }
+ }
+
+ /* Add a new declared name into the g_declared_list */
+ ptr = NULL;
+ ptr = (struct declared_name_st *) mm_alloc(sizeof(struct declared_name_st));
+ if (ptr)
+ {
+ /* initial definition */
+ ptr->name = $2;
+ ptr->next = g_declared_list;
+ g_declared_list = ptr;
+ }
+
+ $$ = mm_strdup($2);
+ }
+;
+
+/*
* Declare a prepared cursor. The syntax is different from the standard
* declare statement, so we create a new rule.
*/
@@ -309,6 +341,7 @@ ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared
}
this = (struct cursor *) mm_alloc(sizeof(struct cursor));
+ memset(this, 0 ,sizeof(struct cursor));
/* initial definition */
this->next = cur;
@@ -318,6 +351,7 @@ ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared
this->command = cat_str(6, mm_strdup("declare"), cursor_marker, $3, mm_strdup("cursor"), $5, mm_strdup("for $1"));
this->argsresult = NULL;
this->argsresult_oos = NULL;
+ this->prepared_name = $7;
thisquery->type = &ecpg_query;
thisquery->brace_level = 0;
diff --git a/src/interfaces/ecpg/preproc/ecpg.type b/src/interfaces/ecpg/preproc/ecpg.type
index ac6aa00..978be84 100644
--- a/src/interfaces/ecpg/preproc/ecpg.type
+++ b/src/interfaces/ecpg/preproc/ecpg.type
@@ -9,6 +9,7 @@
%type <str> ECPGDeallocateDescr
%type <str> ECPGDeclaration
%type <str> ECPGDeclare
+%type <str> ECPGDeclareStmt
%type <str> ECPGDescribe
%type <str> ECPGDisconnect
%type <str> ECPGExecuteImmediateStmt
diff --git a/src/interfaces/ecpg/preproc/extern.h b/src/interfaces/ecpg/preproc/extern.h
index 0ce3a6e..dcfdc06 100644
--- a/src/interfaces/ecpg/preproc/extern.h
+++ b/src/interfaces/ecpg/preproc/extern.h
@@ -50,6 +50,7 @@ extern struct _include_path *include_paths;
extern struct cursor *cur;
extern struct typedefs *types;
extern struct _defines *defines;
+extern struct declared_name_st *g_declared_list;
extern struct ECPGtype ecpg_no_indicator;
extern struct variable no_indicator;
extern struct arguments *argsinsert;
@@ -72,6 +73,8 @@ extern void output_statement(char *, int, enum ECPG_statement_type);
extern void output_prepare_statement(char *, char *);
extern void output_deallocate_prepare_statement(char *);
extern void output_simple_statement(char *);
+extern void output_declare_statement(char *);
+extern void output_cursor_statement(int , char *, char *, char *, int , enum ECPG_statement_type);
extern char *hashline_number(void);
extern int base_yyparse(void);
extern int base_yylex(void);
diff --git a/src/interfaces/ecpg/preproc/output.c b/src/interfaces/ecpg/preproc/output.c
index 59d5d30..cac8bc5 100644
--- a/src/interfaces/ecpg/preproc/output.c
+++ b/src/interfaces/ecpg/preproc/output.c
@@ -5,6 +5,7 @@
#include "extern.h"
static void output_escaped_str(char *cmd, bool quoted);
+static void output_cursor_name(char *str);
void
output_line_number(void)
@@ -195,7 +196,16 @@ static void
output_escaped_str(char *str, bool quoted)
{
int i = 0;
- int len = strlen(str);
+ int len = 0;
+
+ if (str == NULL)
+ {
+ fputs("NULL", base_yyout);
+
+ return;
+ }
+
+ len = strlen(str);
if (quoted && str[0] == '"' && str[len - 1] == '"') /* do not escape quotes
* at beginning and end
@@ -244,3 +254,148 @@ output_escaped_str(char *str, bool quoted)
if (quoted && str[0] == '"' && str[len] == '"')
fputs("\"", base_yyout);
}
+
+/*
+ * This is a tool function used by the output_cursor_statement function to print
+ * cursor name after the string such as "ECPGopen(","ECPGfetch(","ECPGclose(".
+ * This function filters escaped sequences such as \t, \n, \r to print cursor name cleanly
+ * /
+static void
+output_cursor_name(char *str)
+{
+ int i = 0;
+ int len = 0;
+
+ if (str == NULL)
+ {
+ fputs("NULL", base_yyout);
+
+ return;
+ }
+
+ len = strlen(str);
+ fputs("\"", base_yyout);
+ if (str[0] == '\"' && str[len - 1] == '\"')
+ {
+ i = 1;
+ len--;
+ fputs("\\\"", base_yyout);
+
+ /* output this char by char as we have to filter " and \n */
+ for (; i < len; i++)
+ {
+ if (str[i] == '"')
+ fputs("\\\"", base_yyout);
+ else if (str[i] == '\n')
+ fputs("\\\n", base_yyout);
+ else if (str[i] == '\\')
+ {
+ int j = i;
+
+ /*
+ * check whether this is a continuation line if it is, do not
+ * output anything because newlines are escaped anyway
+ */
+
+ /* accept blanks after the '\' as some other compilers do too */
+ do
+ {
+ j++;
+ } while (str[j] == ' ' || str[j] == '\t');
+
+ if ((str[j] != '\n') && (str[j] != '\r' || str[j + 1] != '\n')) /* not followed by a
+ * newline */
+ fputs("\\\\",base_yyout);
+ }
+ else if (str[i] == '\r' && str[i + 1] == '\n')
+ {
+ fputs("\\\r\n", base_yyout);
+ i++;
+ }
+ else
+ fputc(str[i], base_yyout);
+ }
+
+ fputs("\\\"", base_yyout);
+ }
+ else
+ fputs(str, base_yyout);
+
+ fputs("\"", base_yyout);
+}
+
+/*
+ * Transform the EXEC SQL DECLARE STATEMENT into ECPGdeclare function
+ */
+void
+output_declare_statement(char *name)
+{
+ /* connection is set in "at:" token in ecpg.trailer file */
+ fprintf(base_yyout, "{ ECPGdeclare(__LINE__, %s, ", connection ? connection : "NULL");
+ output_escaped_str(name, true);
+ fputs(");", base_yyout);
+
+ whenever_action(2);
+ free(name);
+ if (connection != NULL)
+ free(connection);
+}
+
+/*
+ * Transform the EXEC SQL CURSOR STATEMENT such as OPEN/FETCH/CLOSE cursor into
+ * ECPGopen/ECPGfetch/ECPGclose function
+ */
+void
+output_cursor_statement(int cursor_stmt, char *cursor_name, char *prepared_name, char *stmt, int whenever_mode, enum ECPG_statement_type st)
+{
+ switch(cursor_stmt)
+ {
+ case ECPGcst_open:
+ fprintf(base_yyout, "{ ECPGopen(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", ");
+ output_escaped_str(prepared_name, true);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ case ECPGcst_fetch:
+ fprintf(base_yyout, "{ ECPGfetch(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ case ECPGcst_close:
+ fprintf(base_yyout, "{ ECPGclose(");
+ output_cursor_name(cursor_name);
+ fprintf(base_yyout, ", __LINE__, %d, %d, %s, %d, ",
+ compat, force_indicator, connection ? connection : "NULL", questionmarks);
+ break;
+ }
+
+ if (st == ECPGst_execute || st == ECPGst_exec_immediate)
+ fprintf(base_yyout, "%s, %s, ", ecpg_statement_type_name[st], stmt);
+ else
+ {
+ if (st == ECPGst_prepnormal && auto_prepare)
+ fputs("ECPGst_prepnormal, \"", base_yyout);
+ else
+ fputs("ECPGst_normal, \"", base_yyout);
+
+ output_escaped_str(stmt, false);
+ fputs("\", ", base_yyout);
+ }
+
+ /* dump variables to C file */
+ dump_variables(argsinsert, 1);
+ fputs("ECPGt_EOIT, ", base_yyout);
+ dump_variables(argsresult, 1);
+ fputs("ECPGt_EORT);", base_yyout);
+ reset_variables();
+
+ whenever_action(whenever_mode | 2);
+ free(cursor_name);
+ free(prepared_name);
+ free(stmt);
+ if (connection != NULL)
+ free(connection);
+}
diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h
index cd0d1da..1b6ddfb 100644
--- a/src/interfaces/ecpg/preproc/type.h
+++ b/src/interfaces/ecpg/preproc/type.h
@@ -129,6 +129,7 @@ struct cursor
char *command;
char *connection;
bool opened;
+ char *prepared_name;
struct arguments *argsinsert;
struct arguments *argsinsert_oos;
struct arguments *argsresult;
@@ -136,6 +137,13 @@ struct cursor
struct cursor *next;
};
+/* structure to store declared name */
+struct declared_name_st
+{
+ char *name; /* declared name */
+ struct declared_name_st *next;
+};
+
struct typedefs
{
char *name;
002_declareStmt_ecpglib_v6.patchapplication/octet-stream; name=002_declareStmt_ecpglib_v6.patchDownload
diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile
index fbb1407..132e53a 100644
--- a/src/interfaces/ecpg/ecpglib/Makefile
+++ b/src/interfaces/ecpg/ecpglib/Makefile
@@ -26,7 +26,7 @@ override CFLAGS += $(PTHREAD_CFLAGS)
LIBS := $(filter-out -lpgport, $(LIBS))
OBJS= execute.o typename.o descriptor.o sqlda.o data.o error.o prepare.o memory.o \
- connect.o misc.o path.o pgstrcasecmp.o \
+ connect.o misc.o path.o pgstrcasecmp.o cursor.o \
$(filter snprintf.o strlcpy.o win32setlocale.o isinf.o, $(LIBOBJS)) $(WIN32RES)
# thread.c is needed only for non-WIN32 implementation of path.c
diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c
index c90f13d..ddbc08c 100644
--- a/src/interfaces/ecpg/ecpglib/connect.c
+++ b/src/interfaces/ecpg/ecpglib/connect.c
@@ -340,6 +340,8 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
return false;
}
+ memset(this, 0, sizeof(struct connection));
+
if (dbname != NULL)
{
/* get the detail information from dbname */
@@ -684,12 +686,15 @@ ECPGdisconnect(int lineno, const char *connection_name)
if (strcmp(connection_name, "ALL") == 0)
{
+ struct connection *f = NULL;
+
ecpg_init_sqlca(sqlca);
for (con = all_connections; con;)
{
- struct connection *f = con;
+ f = con;
con = con->next;
+ ecpg_release_declared_statement(f->name);
ecpg_finish(f);
}
}
@@ -705,7 +710,10 @@ ECPGdisconnect(int lineno, const char *connection_name)
return (false);
}
else
+ {
+ ecpg_release_declared_statement(connection_name);
ecpg_finish(con);
+ }
}
#ifdef ENABLE_THREAD_SAFETY
diff --git a/src/interfaces/ecpg/ecpglib/cursor.c b/src/interfaces/ecpg/ecpglib/cursor.c
new file mode 100644
index 0000000..4391ec3
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/cursor.c
@@ -0,0 +1,260 @@
+/* src/interfaces/ecpg/ecpglib/cursor.c */
+
+#define POSTGRES_ECPG_INTERNAL
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <locale.h>
+#include <string.h>
+
+#include "ecpgtype.h"
+#include "ecpglib.h"
+#include "ecpgerrno.h"
+#include "extern.h"
+#include "sqlca.h"
+
+static void add_cursor(const int, const char *, const char *);
+static void remove_cursor(const char *, struct connection *);
+static bool find_cursor(const char *, const struct connection *);
+
+/*
+ * Function: Handle the EXEC SQL OPEN cursor statement:
+ * Input:
+ * cursor_name --- cursor name
+ * prepared_name --- prepared name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGopen(const char *cursor_name,const char *prepared_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ /*
+ * If the declared name is referred by the PREPARE statement then the
+ * prepared_name is same as declared name
+ */
+ real_connection_name = ecpg_get_con_name_by_declared_name(prepared_name);
+ if (real_connection_name)
+ {
+ /* Add the cursor name into the declared node */
+ ecpg_update_declare_statement(prepared_name, cursor_name, lineno);
+ }
+ else
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+
+ /* Add the cursor into the connection */
+ add_cursor(lineno, cursor_name, real_connection_name);
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return status;
+}
+
+
+/*
+ * Function: Handle the EXEC SQL FETCH/MOVE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGfetch(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return (false);
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return status;
+}
+
+
+/*
+ * Function: Handle the EXEC SQL CLOSE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGclose(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+ struct connection *con = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+
+ /* check the existence of the cursor in the connection */
+ if (false == find_cursor(cursor_name, con))
+ {
+ ecpg_raise(lineno, ECPG_INVALID_CURSOR, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ remove_cursor(cursor_name, con);
+
+ return status;
+}
+
+/*
+ * Function: Add a cursor into the connection
+ */
+static void
+add_cursor(const int lineno, const char *cursor_name, const char *connection_name)
+{
+ struct connection *con;
+ struct cursor_statement *new = NULL;
+
+ if (!cursor_name)
+ return ;
+
+ con = ecpg_get_connection(connection_name);
+ if (!con)
+ {
+ return;
+ }
+
+ if (find_cursor(cursor_name, con))
+ {
+ /*
+ * Should never goto here, because ECPG has checked the duplication of
+ * the cursor in pre-compile stage.
+ */
+ return;
+ }
+
+ /* allocate a node to store the new cursor */
+ new = (struct cursor_statement *)ecpg_alloc(sizeof(struct cursor_statement), lineno);
+ if (new)
+ {
+ new->name = ecpg_strdup(cursor_name, lineno);
+ new->next = con->cursor_stmts;
+ con->cursor_stmts = new;
+ }
+}
+
+/*
+ * Function: Remove the cursor from the connection
+ */
+static void
+remove_cursor(const char *cursor_name, struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+ struct cursor_statement *prev = NULL;
+
+ if (!connection || !cursor_name)
+ return ;
+
+ cur = connection->cursor_stmts;
+ while (cur)
+ {
+ if (strcmp(cur->name, cursor_name) == 0)
+ {
+ if (!prev)
+ connection->cursor_stmts = cur->next;
+ else
+ prev->next = cur->next;
+
+ ecpg_free(cur->name);
+ ecpg_free(cur);
+
+ break;
+ }
+ prev = cur;
+ cur = cur->next;
+ }
+}
+
+/*
+ * Function: Find whether the cursor exists in the connection or not
+ * Return: true ---Found
+ * false --- Not found
+ */
+static bool
+find_cursor(const char *cursor_name, const struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+
+ if (!connection || !cursor_name)
+ return false;
+
+ for (cur = connection->cursor_stmts; cur != NULL; cur = cur->next)
+ {
+ if (strcmp(cur->name, cursor_name) == 0)
+ return true;
+ }
+
+ return false;
+}
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c
index 15fd7a0..858be01 100644
--- a/src/interfaces/ecpg/ecpglib/descriptor.c
+++ b/src/interfaces/ecpg/ecpglib/descriptor.c
@@ -818,6 +818,7 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
struct prepared_statement *prep;
PGresult *res;
va_list args;
+ const char *real_connection_name = NULL;
/* DESCRIBE INPUT is not yet supported */
if (input)
@@ -826,13 +827,20 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
return ret;
}
- con = ecpg_get_connection(connection_name);
- if (!con)
+ real_connection_name = ecpg_get_con_name_by_declared_name(stmt_name);
+ if (real_connection_name == NULL)
{
- ecpg_raise(line, ECPG_NO_CONN, ECPG_SQLSTATE_CONNECTION_DOES_NOT_EXIST,
- connection_name ? connection_name : ecpg_gettext("NULL"));
- return ret;
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
}
+
+ con = ecpg_get_connection(real_connection_name);
+ if (!ecpg_init(con, real_connection_name, line))
+ return false;
+
prep = ecpg_find_prepared_statement(stmt_name, con, NULL);
if (!prep)
{
diff --git a/src/interfaces/ecpg/ecpglib/error.c b/src/interfaces/ecpg/ecpglib/error.c
index 656b2c4..11a1a7c 100644
--- a/src/interfaces/ecpg/ecpglib/error.c
+++ b/src/interfaces/ecpg/ecpglib/error.c
@@ -200,6 +200,13 @@ ecpg_raise(int line, int code, const char *sqlstate, const char *str)
ecpg_gettext("could not connect to database \"%s\" on line %d"), str, line);
break;
+ case ECPG_INVALID_CURSOR:
+ snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
+ /*------
+ translator: this string will be truncated at 149 characters expanded. */
+ ecpg_gettext("The cursor is invalid on line %d"),line);
+ break;
+
default:
snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
/*------
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index bd9b86b..a4adc97 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -2031,9 +2031,32 @@ ECPGdo(const int lineno, const int compat, const int force_indicator, const char
{
va_list args;
bool ret;
+ const char *real_connection_name = NULL;
+
+ real_connection_name = connection_name;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ /* Handle the EXEC SQL EXECUTE... statement */
+ if(ECPGst_execute == st)
+ {
+ real_connection_name = ecpg_get_con_name_by_declared_name(query);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+ }
va_start(args, query);
- ret = ecpg_do(lineno, compat, force_indicator, connection_name,
+ ret = ecpg_do(lineno, compat, force_indicator, real_connection_name,
questionmarks, st, query, args);
va_end(args);
diff --git a/src/interfaces/ecpg/ecpglib/exports.txt b/src/interfaces/ecpg/ecpglib/exports.txt
index 69e9617..08fa1bb 100644
--- a/src/interfaces/ecpg/ecpglib/exports.txt
+++ b/src/interfaces/ecpg/ecpglib/exports.txt
@@ -29,3 +29,7 @@ ECPGget_PGconn 26
ECPGtransactionStatus 27
ECPGset_var 28
ECPGget_var 29
+ECPGdeclare 30
+ECPGopen 31
+ECPGfetch 32
+ECPGclose 33
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/extern.h b/src/interfaces/ecpg/ecpglib/extern.h
index fb9b5ae..056b6aa 100644
--- a/src/interfaces/ecpg/ecpglib/extern.h
+++ b/src/interfaces/ecpg/ecpglib/extern.h
@@ -66,6 +66,15 @@ struct statement
PGresult *results;
};
+/* structure to store declared statements */
+struct declared_statement
+{
+ char *name; /* declared name */
+ char *connection_name;
+ char *cursor_name;
+ struct declared_statement *next;
+};
+
/* structure to store prepared statements for a connection */
struct prepared_statement
{
@@ -75,6 +84,12 @@ struct prepared_statement
struct prepared_statement *next;
};
+struct cursor_statement
+{
+ char *name; /*cursor name*/
+ struct cursor_statement *next;
+};
+
/* structure to store connections */
struct connection
{
@@ -83,6 +98,7 @@ struct connection
bool autocommit;
struct ECPGtype_information_cache *cache_head;
struct prepared_statement *prep_stmts;
+ struct cursor_statement *cursor_stmts;
struct connection *next;
};
@@ -165,6 +181,11 @@ struct descriptor *ecpg_find_desc(int line, const char *name);
struct prepared_statement *ecpg_find_prepared_statement(const char *,
struct connection *, struct prepared_statement **);
+void ecpg_update_declare_statement(const char *, const char *, const int);
+char *ecpg_get_con_name_by_declared_name(const char *);
+const char *ecpg_get_con_name_by_cursor_name(const char *);
+void ecpg_release_declared_statement(const char *);
+
bool ecpg_store_result(const PGresult *results, int act_field,
const struct statement * stmt, struct variable * var);
bool ecpg_store_input(const int, const bool, const struct variable *, char **, bool);
diff --git a/src/interfaces/ecpg/ecpglib/prepare.c b/src/interfaces/ecpg/ecpglib/prepare.c
index 983b242..0a939cd 100644
--- a/src/interfaces/ecpg/ecpglib/prepare.c
+++ b/src/interfaces/ecpg/ecpglib/prepare.c
@@ -26,9 +26,11 @@ static int nextStmtID = 1;
static const int stmtCacheNBuckets = 2039; /* # buckets - a prime # */
static const int stmtCacheEntPerBucket = 8; /* # entries/bucket */
static stmtCacheEntry stmtCacheEntries[16384] = {{0, {0}, 0, 0, 0}};
+static struct declared_statement *g_declared_list;
static bool deallocate_one(int lineno, enum COMPAT_MODE c, struct connection * con,
struct prepared_statement * prev, struct prepared_statement * this);
+static struct declared_statement *ecpg_find_declared_statement(const char *);
static bool
isvarchar(unsigned char c)
@@ -117,6 +119,7 @@ prepare_common(int lineno, struct connection * con, const char *name, const char
ecpg_free(this);
return false;
}
+ memset(stmt, 0, sizeof(struct statement));
/* create statement */
stmt->lineno = lineno;
@@ -163,11 +166,22 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
(void) questionmarks; /* quiet the compiler */
- con = ecpg_get_connection(connection_name);
- if (!ecpg_init(con, connection_name, lineno))
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+ if (!ecpg_init(con, real_connection_name, lineno))
return false;
/* check if we already have prepared this statement */
@@ -255,9 +269,19 @@ ECPGdeallocate(int lineno, int c, const char *connection_name, const char *name)
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
- con = ecpg_get_connection(connection_name);
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+ con = ecpg_get_connection(real_connection_name);
if (!ecpg_init(con, connection_name, lineno))
return false;
@@ -305,8 +329,21 @@ ecpg_prepared(const char *name, struct connection * con)
char *
ECPGprepared_statement(const char *connection_name, const char *name, int lineno)
{
+ const char *real_connection_name = NULL;
+
(void) lineno; /* keep the compiler quiet */
- return ecpg_prepared(name, ecpg_get_connection(connection_name));
+
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if(real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ return ecpg_prepared(name, ecpg_get_connection(real_connection_name));
}
/*
@@ -513,3 +550,196 @@ ecpg_auto_prepare(int lineno, const char *connection_name, const int compat, cha
return (true);
}
+
+/*
+ * handle the EXEC SQL DECLARE STATEMENT
+ * Input: connection_name -- connection name
+ * name -- declared name
+ */
+bool
+ECPGdeclare(int lineno, const char *connection_name, const char *name)
+{
+ struct connection *con = NULL;
+ struct declared_statement *p = NULL;
+
+ if(name == NULL)
+ {
+ /* Should never go to here because ECPG pre-compiler will check it */
+ return false;
+ }
+
+ if(connection_name == NULL)
+ {
+ /*
+ * Going to here means not using AT clause in the DECLARE STATEMENT
+ * We don't allocate a node to store the declared name because the
+ * DECLARE STATEMENT without using AT clause will be ignored.
+ */
+ return true;
+ }
+
+ con = ecpg_get_connection(connection_name);
+ if (!ecpg_init(con, connection_name, lineno))
+ return false;
+
+ if(ecpg_find_declared_statement(name))
+ {
+ /* Should not go to here because the pre-compiler has check the duplicate name */
+ return false;
+ }
+
+ /* allocate a declared_statement as a new node */
+ p = (struct declared_statement *) ecpg_alloc(sizeof(struct declared_statement), lineno);
+ if (!p)
+ return false;
+
+ memset(p, 0, sizeof(struct declared_statement));
+
+ ecpg_log("ECPGdeclare on line %d: declared name %s on connection: \"%s\"\n", lineno, name, connection_name);
+
+ p->name = ecpg_strdup(name, lineno);
+ p->connection_name = ecpg_strdup(connection_name, lineno);
+
+ /* Add the new node into the g_declared_list */
+ if(g_declared_list != NULL)
+ {
+ p->next = g_declared_list;
+ g_declared_list = p;
+ }
+ else
+ g_declared_list = p;
+
+ return true;
+}
+
+/*
+ * Find a declared node by declared name
+ * Input: name -- declared name
+ * Return: Found -- The pointer points to the declared node
+ * Not found -- NULL
+ */
+static struct declared_statement *
+ecpg_find_declared_statement(const char *name)
+{
+ struct declared_statement *p;
+
+ if(name == NULL)
+ return NULL;
+
+ p = g_declared_list;
+ while(p)
+ {
+ if (strcmp(p->name, name) == 0)
+ return p;
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/*
+ * Build the relationship between the declared name and cursor name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * cursor_name -- cursor name declared in the DECLARE/OPEN CURSOR statement
+ */
+void
+ecpg_update_declare_statement(const char *declared_name, const char *cursor_name, const int lineno)
+{
+ struct declared_statement *p = NULL;
+
+ if(!declared_name || !cursor_name)
+ return;
+
+ /* Find the declared node by declared name */
+ p = ecpg_find_declared_statement(declared_name);
+ if(p)
+ p->cursor_name = ecpg_strdup(cursor_name,lineno);
+}
+
+/*
+ * Find and return the connection name referred by the declared name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+char *
+ecpg_get_con_name_by_declared_name(const char *declared_name)
+{
+ struct declared_statement *p;
+
+ p = ecpg_find_declared_statement(declared_name);
+ if(p)
+ return p->connection_name;
+
+ return NULL;
+}
+
+/*
+ * Find the declared name referred by the cursor,
+ * then return the connection name used by the declared name.
+ * Input: cursor_name -- the cursor name
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+const char *
+ecpg_get_con_name_by_cursor_name(const char *cursor_name)
+{
+ struct declared_statement *p;
+
+ if(cursor_name == NULL)
+ return NULL;
+
+ p = g_declared_list;
+ while(p)
+ {
+ /* Search the cursor name in the declared list */
+ if(p->cursor_name && (strcmp(p->cursor_name, cursor_name) == 0))
+ return p->connection_name;
+
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/*
+ * Release the declare node from the g_declared_list which refers the connection_name
+ * Input: connection_name -- connection name
+ */
+void
+ecpg_release_declared_statement(const char *connection_name)
+{
+ struct declared_statement *cur = NULL;
+ struct declared_statement *prev = NULL;
+ struct declared_statement *next = NULL;
+
+ if(connection_name == NULL)
+ return;
+
+ cur = g_declared_list;
+ while(cur)
+ {
+ next = cur->next;
+ if (strcmp(cur->connection_name, connection_name) == 0)
+ {
+ /* If find then release the declared node from the list */
+ if(prev)
+ prev->next = next;
+ else
+ g_declared_list = next;
+
+ ecpg_log("ecpg_release_declared_statement: declared name %s is released\n", cur->name);
+
+ ecpg_free(cur->name);
+ ecpg_free(cur->connection_name);
+ ecpg_free(cur->cursor_name);
+ ecpg_free(cur);
+
+ /* One connection can be used by multiple declared name, so no break here */
+ }
+ else
+ prev = cur;
+
+ cur = next;
+ }
+}
\ No newline at end of file
diff --git a/src/interfaces/ecpg/include/ecpgerrno.h b/src/interfaces/ecpg/include/ecpgerrno.h
index 36b15b7..fae9440 100644
--- a/src/interfaces/ecpg/include/ecpgerrno.h
+++ b/src/interfaces/ecpg/include/ecpgerrno.h
@@ -44,6 +44,7 @@
#define ECPG_UNKNOWN_DESCRIPTOR_ITEM -242
#define ECPG_VAR_NOT_NUMERIC -243
#define ECPG_VAR_NOT_CHAR -244
+#define ECPG_INVALID_CURSOR -245
/* finally the backend error messages, they start at 400 */
#define ECPG_PGSQL -400
diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h
index c32df6c..8c91212 100644
--- a/src/interfaces/ecpg/include/ecpglib.h
+++ b/src/interfaces/ecpg/include/ecpglib.h
@@ -55,6 +55,10 @@ bool ECPGdisconnect(int, const char *);
bool ECPGprepare(int, const char *, const bool, const char *, const char *);
bool ECPGdeallocate(int, int, const char *, const char *);
bool ECPGdeallocate_all(int, int, const char *);
+bool ECPGdeclare(int, const char *, const char *);
+bool ECPGopen(const char*, const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGfetch(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGclose(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
char *ECPGprepared_statement(const char *, const char *, int);
PGconn *ECPGget_PGconn(const char *);
PGTransactionStatusType ECPGtransactionStatus(const char *);
diff --git a/src/interfaces/ecpg/include/ecpgtype.h b/src/interfaces/ecpg/include/ecpgtype.h
index 7cc47e9..2c3f348 100644
--- a/src/interfaces/ecpg/include/ecpgtype.h
+++ b/src/interfaces/ecpg/include/ecpgtype.h
@@ -99,8 +99,15 @@ enum ECPG_statement_type
ECPGst_prepnormal
};
+enum ECPG_cursor_statement_type
+{
+ ECPGcst_declare,
+ ECPGcst_open,
+ ECPGcst_fetch,
+ ECPGcst_close
+};
#ifdef __cplusplus
}
#endif
-#endif /* _ECPGTYPE_H */
+#endif /* _ECPGTYPE_H */
003_declareStmt_doc_v6.patchapplication/octet-stream; name=003_declareStmt_doc_v6.patchDownload
diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml
index 89d4c57..7ec122e 100644
--- a/doc/src/sgml/ecpg.sgml
+++ b/doc/src/sgml/ecpg.sgml
@@ -224,7 +224,7 @@ EXEC SQL CONNECT TO :target USER :user USING :passwd;
SQL statements in embedded SQL programs are by default executed on
the current connection, that is, the most recently opened one. If
an application needs to manage multiple connections, then there are
- two ways to handle this.
+ three ways to handle this.
</para>
<para>
@@ -296,6 +296,17 @@ current=testdb2 (should be testdb2)
current=testdb1 (should be testdb1)
</screen>
</para>
+
+ <para>
+ The third option is to declare a sql identifier linked to
+ the connection, for example:
+<programlisting>
+EXEC SQL AT <replaceable>connection-name</replaceable> DECLARE <replaceable>statement-name</replaceable> STATEMENT;
+EXEC SQL PREPARE <replaceable>statement-name</replaceable> FROM :<replaceable>dyn-string</replaceable>;
+</programlisting>
+ Once you link a sql identifier to a connection, you execute a dynamic SQL
+ without AT clause.
+ </para>
</sect2>
<sect2 id="ecpg-disconnect">
@@ -6710,6 +6721,107 @@ EXEC SQL DECLARE cur1 CURSOR FOR stmt1;
</refsect1>
</refentry>
+ <refentry id="ecpg-sql-declare-statement">
+ <refnamediv>
+ <refname>DECLARE STATEMENT</refname>
+ <refpurpose>declares SQL statement identifier associated with connection</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+<synopsis>
+EXEC SQL [ AT connection_name ] DECLARE <replaceable class="PARAMETER">statement_name</replaceable> STATEMENT
+</synopsis>
+ </refsynopsisdiv>
+
+ <refsect1>
+ <title>Description</title>
+
+ <para>
+ <command>DECLARE STATEMENT</command> declares SQL statement identifier.
+ SQL statement identifier is associated with connection.
+ </para>
+
+ <para>
+ <command>DELARE CURSOR</command> with a SQL statement identifier can be written before PREPARE.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Parameters</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><replaceable class="PARAMETER">connection_name</replaceable></term>
+ <listitem>
+ <para>
+ A database connection name established by the <command>CONNECT</command> command.
+ </para>
+ <para>
+ If AT clause is omitted, an SQL statement identifier is associated with the DEFAULT connection.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <variablelist>
+ <varlistentry>
+ <term><replaceable class="PARAMETER">statement_name</replaceable></term>
+ <listitem>
+ <para>
+ The name of a SQL statement identifier, either as an SQL identifier or a host variable.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
+ <title>Notes</title>
+
+ <para>
+ An SQL statement with a SQL statement identifier must use a same connection
+ as the connection that the SQL statement identifier is associated with.
+ </para>
+
+ <para>
+ AT clause cannot be used with the SQL statement which have been identified by <command>DECLARE STATEMENT</command>
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Examples</title>
+
+<programlisting>
+EXEC SQL CONNECT TO postgres AS con1;
+EXEC SQL AT con1 DECLARE sql_stmt STATEMENT;
+EXEC SQL DECLARE cursor_name CURSOR FOR sql_stmt;
+EXEC SQL PREPARE sql_stmt FROM :dyn_string;
+EXEC SQL OPEN cursor_name;
+EXEC SQL FETCH cursor_name INTO :column1;
+EXEC SQL CLOSE cursor_name;
+</programlisting>
+ </refsect1>
+
+ <refsect1>
+ <title>Compatibility</title>
+
+ <para>
+ <command>DECLARE STATEMENT</command> is a PostgreSQL extension of the SQL standard,
+ but can be used in Oracle and DB2.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>See Also</title>
+
+ <simplelist type="inline">
+ <member><xref linkend="ecpg-sql-connect"></member>
+ <member><xref linkend="ecpg-sql-declare"></member>
+ <member><xref linkend="ecpg-sql-open"></member>
+ </simplelist>
+ </refsect1>
+ </refentry>
+
<refentry id="ecpg-sql-describe">
<refnamediv>
<refname>DESCRIBE</refname>
004_declareStmt_test_v6.patchapplication/octet-stream; name=004_declareStmt_test_v6.patchDownload
diff --git a/src/interfaces/ecpg/test/ecpg_schedule b/src/interfaces/ecpg/test/ecpg_schedule
index c3ec125..5f7fe5b 100644
--- a/src/interfaces/ecpg/test/ecpg_schedule
+++ b/src/interfaces/ecpg/test/ecpg_schedule
@@ -48,6 +48,7 @@ test: sql/quote
test: sql/show
test: sql/insupd
test: sql/parser
+test: sql/declare
test: thread/thread
test: thread/thread_implicit
test: thread/prep
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
index 1f316fb..b4a7c44 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c
@@ -241,7 +241,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
+ { ECPGopen("mycur1", "st_id1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 101 "sqlda.pgc"
@@ -258,7 +258,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
+ { ECPGfetch("mycur1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 109 "sqlda.pgc"
@@ -279,7 +279,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur1", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
#line 118 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -316,7 +316,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
+ { ECPGopen("mycur2", "st_id2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 138 "sqlda.pgc"
@@ -333,7 +333,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch from mycur2", ECPGt_EOIT,
+ { ECPGfetch("mycur2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch from mycur2", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 146 "sqlda.pgc"
@@ -354,7 +354,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur2", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
#line 155 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c b/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
index 9934947..48b9197 100644
--- a/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
+++ b/src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
@@ -158,7 +158,7 @@ if (sqlca.sqlcode < 0) dosqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch forward c", ECPGt_EOIT,
+ { ECPGfetch("c", __LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch forward c", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_decimal,&(j),(long)1,(long)1,sizeof(decimal),
@@ -244,7 +244,7 @@ if (sqlca.sqlcode < 0) dosqlprint ( );}
static void openit(void)
{
- { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare c cursor for select * from test where i <= $1 ",
+ { ECPGopen("c", NULL, __LINE__, 1, 1, NULL, 0, ECPGst_normal, "declare c cursor for select * from test where i <= $1 ",
ECPGt_int,&(*( int *)(ECPGget_var( 0))),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 95 "test_informix.pgc"
diff --git a/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c b/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
index ecd2343..2df8353 100644
--- a/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
+++ b/src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
@@ -84,7 +84,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
/* declare cur cursor for select id , d , d from nantest1 */
#line 35 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
#line 36 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -92,7 +92,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_double,&(d),(long)1,(long)1,sizeof(double),
@@ -132,14 +132,14 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
#line 48 "nan_test.pgc"
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 50 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
#line 50 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select id , d , d from nantest1", ECPGt_EOIT, ECPGt_EORT);
#line 52 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -147,7 +147,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_double,&(d),(long)1,(long)1,sizeof(double),
@@ -166,7 +166,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
if (isnan(d))
printf("%d NaN '%s'\n", id, val);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 63 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -223,7 +223,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
/* declare cur1 cursor for select id , d , d from nantest2 */
#line 77 "nan_test.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for select id , d , d from nantest2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur1", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for select id , d , d from nantest2", ECPGt_EOIT, ECPGt_EORT);
#line 78 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
@@ -231,7 +231,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur1", ECPGt_EOIT,
+ { ECPGfetch("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur1", ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_numeric,&(num),(long)1,(long)0,sizeof(numeric),
@@ -247,7 +247,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
break;
printf("%d %s '%s'\n", id, (num->sign == NUMERIC_NAN ? "NaN" : "not NaN"), val);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
#line 86 "nan_test.pgc"
if (sqlca.sqlcode < 0) sqlprint ( );}
diff --git a/src/interfaces/ecpg/test/expected/preproc-autoprep.c b/src/interfaces/ecpg/test/expected/preproc-autoprep.c
index 10ede3e..e3abb29 100644
--- a/src/interfaces/ecpg/test/expected/preproc-autoprep.c
+++ b/src/interfaces/ecpg/test/expected/preproc-autoprep.c
@@ -133,7 +133,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 35 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select Item1 from T", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select Item1 from T", ECPGt_EOIT, ECPGt_EORT);
#line 37 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -143,7 +143,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 37 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 39 "autoprep.pgc"
@@ -156,7 +156,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("i = %d\n", i);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
#line 42 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -180,7 +180,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 46 "autoprep.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for $1",
+ { ECPGopen("cur1", "stmt1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 48 "autoprep.pgc"
@@ -199,7 +199,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
i = 0;
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur1", ECPGt_EOIT,
+ { ECPGfetch("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur1", ECPGt_EOIT,
ECPGt_int,&(item1),(long)1,(long)1,sizeof(int),
ECPGt_int,&(ind1),(long)1,(long)1,sizeof(int), ECPGt_EORT);
#line 55 "autoprep.pgc"
@@ -217,7 +217,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
i++;
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur1", ECPGt_EOIT, ECPGt_EORT);
#line 60 "autoprep.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
diff --git a/src/interfaces/ecpg/test/expected/preproc-cursor.c b/src/interfaces/ecpg/test/expected/preproc-cursor.c
index f7da753..ad86a56 100644
--- a/src/interfaces/ecpg/test/expected/preproc-cursor.c
+++ b/src/interfaces/ecpg/test/expected/preproc-cursor.c
@@ -187,7 +187,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
+ { ECPGopen(":curname1", NULL, __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 67 "cursor.pgc"
@@ -197,7 +197,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward from $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -212,7 +212,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch forward $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -227,7 +227,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -243,7 +243,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
@@ -260,7 +260,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move in");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 in $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 in $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 87 "cursor.pgc"
@@ -270,7 +270,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -286,7 +286,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
@@ -303,7 +303,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname1),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 99 "cursor.pgc"
@@ -323,7 +323,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
+ { ECPGopen(":curname2", NULL, __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for select id , t from t1",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -337,7 +337,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -352,7 +352,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -367,7 +367,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -383,7 +383,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
@@ -400,7 +400,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -414,7 +414,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -430,7 +430,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
@@ -447,7 +447,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname2),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 140 "cursor.pgc"
@@ -483,7 +483,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname3", "st_id1", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test1", "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -493,7 +493,7 @@ if (sqlca.sqlcode < 0) exit (1);}
if (sqlca.sqlcode < 0) exit (1);}
#line 153 "cursor.pgc"
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname5", "st_id1", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test2", "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -505,7 +505,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname5", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "fetch $0",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -520,7 +520,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -535,7 +535,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -551,7 +551,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
@@ -568,7 +568,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 174 "cursor.pgc"
@@ -578,7 +578,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -594,7 +594,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
@@ -611,7 +611,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname3", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname3),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 186 "cursor.pgc"
@@ -619,7 +619,7 @@ if (sqlca.sqlcode < 0) exit (1);}
if (sqlca.sqlcode < 0) exit (1);}
#line 186 "cursor.pgc"
- { ECPGdo(__LINE__, 0, 1, "test2", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname5", __LINE__, 0, 1, "test2", 0, ECPGst_normal, "close $0",
ECPGt_char,&(curname5),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 187 "cursor.pgc"
@@ -663,7 +663,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
+ { ECPGopen(":curname4", "st_id2", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "declare $0 cursor for $1",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char_variable,(ECPGprepared_statement("test1", "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
@@ -675,7 +675,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch from $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -690,7 +690,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -705,7 +705,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "fetch 1 from");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 from $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -721,7 +721,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count from");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 from $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
@@ -738,7 +738,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "move");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "move absolute 0 $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 226 "cursor.pgc"
@@ -748,7 +748,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch 1");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch 1 $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(id),(long)1,(long)1,sizeof(int),
@@ -764,7 +764,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch :count");
count = 1;
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
+ { ECPGfetch(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "fetch $0 $0",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
@@ -781,7 +781,7 @@ if (sqlca.sqlcode < 0) exit (1);}
printf("%d %s\n", id, t);
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
+ { ECPGclose(":curname4", __LINE__, 0, 1, "test1", 0, ECPGst_normal, "close $0",
ECPGt_varchar,&(curname4),(long)50,(long)1,sizeof(struct varchar_1),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 238 "cursor.pgc"
diff --git a/src/interfaces/ecpg/test/expected/preproc-outofscope.c b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
index 348e843..23ce610 100644
--- a/src/interfaces/ecpg/test/expected/preproc-outofscope.c
+++ b/src/interfaces/ecpg/test/expected/preproc-outofscope.c
@@ -201,7 +201,7 @@ get_var1(MYTYPE **myvar0, MYNULLTYPE **mynullvar0)
static void
open_cur1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur cursor for select * from a1", ECPGt_EOIT,
+ { ECPGopen("mycur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur cursor for select * from a1", ECPGt_EOIT,
ECPGt_int,&((*( MYTYPE *)(ECPGget_var( 0)) ).id),(long)1,(long)1,sizeof( struct mytype ),
ECPGt_int,&((*( MYNULLTYPE *)(ECPGget_var( 1)) ).id),(long)1,(long)1,sizeof( struct mynulltype ),
ECPGt_char,&((*( MYTYPE *)(ECPGget_var( 0)) ).t),(long)64,(long)1,sizeof( struct mytype ),
@@ -225,7 +225,7 @@ if (sqlca.sqlcode < 0) exit (1);}
static void
get_record1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch mycur", ECPGt_EOIT,
+ { ECPGfetch("mycur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch mycur", ECPGt_EOIT,
ECPGt_int,&((*( MYTYPE *)(ECPGget_var( 0)) ).id),(long)1,(long)1,sizeof( struct mytype ),
ECPGt_int,&((*( MYNULLTYPE *)(ECPGget_var( 1)) ).id),(long)1,(long)1,sizeof( struct mynulltype ),
ECPGt_char,&((*( MYTYPE *)(ECPGget_var( 0)) ).t),(long)64,(long)1,sizeof( struct mytype ),
@@ -249,7 +249,7 @@ if (sqlca.sqlcode < 0) exit (1);}
static void
close_cur1(void)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur", ECPGt_EOIT, ECPGt_EORT);
#line 58 "outofscope.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/preproc-variable.c b/src/interfaces/ecpg/test/expected/preproc-variable.c
index 7fd03ba..722c02e 100644
--- a/src/interfaces/ecpg/test/expected/preproc-variable.c
+++ b/src/interfaces/ecpg/test/expected/preproc-variable.c
@@ -190,7 +190,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select name , born , age , married , children from family", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("cur", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select name , born , age , married , children from family", ECPGt_EOIT, ECPGt_EORT);
#line 63 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -206,7 +206,7 @@ if (sqlca.sqlcode < 0) exit (1);}
memset(i, 0, sizeof(ind_personal));
while (1) {
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT,
+ { ECPGfetch("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT,
ECPGt_varchar,&(p->name),(long)BUFFERSIZ,(long)-1,sizeof( struct birthinfo ),
ECPGt_int,&(i->ind_name),(long)1,(long)-1,sizeof( struct birthinfo ),
ECPGt_long,&(p->birth.born),(long)1,(long)1,sizeof( struct birthinfo ),
@@ -241,7 +241,7 @@ if (sqlca.sqlcode < 0) exit (1);}
}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("cur", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
#line 89 "variable.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/expected/sql-binary.c b/src/interfaces/ecpg/test/expected/sql-binary.c
index b91ab7b..ce64de5 100644
--- a/src/interfaces/ecpg/test/expected/sql-binary.c
+++ b/src/interfaces/ecpg/test/expected/sql-binary.c
@@ -111,12 +111,12 @@ main (void)
/* declare C cursor for select name , accs , byte from empl where idnum = $1 */
#line 58 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select name , accs , byte from empl where idnum = $1 ",
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select name , accs , byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 59 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
@@ -133,7 +133,7 @@ main (void)
printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);}
#line 69 "binary.pgc"
@@ -142,12 +142,12 @@ main (void)
/* declare B binary cursor for select name , accs , byte from empl where idnum = $1 */
#line 72 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare B binary cursor for select name , accs , byte from empl where idnum = $1 ",
+ { ECPGopen("B", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare B binary cursor for select name , accs , byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 73 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch B", ECPGt_EOIT,
+ { ECPGfetch("B", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch B", ECPGt_EOIT,
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_short,&(empl.accs),(long)1,(long)1,sizeof(short),
@@ -162,7 +162,7 @@ main (void)
exit (sqlca.sqlcode);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close B", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("B", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close B", ECPGt_EOIT, ECPGt_EORT);}
#line 81 "binary.pgc"
@@ -176,12 +176,12 @@ main (void)
/* declare A binary cursor for select byte from empl where idnum = $1 */
#line 89 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare A binary cursor for select byte from empl where idnum = $1 ",
+ { ECPGopen("A", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare A binary cursor for select byte from empl where idnum = $1 ",
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);}
#line 90 "binary.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch A", ECPGt_EOIT,
+ { ECPGfetch("A", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch A", ECPGt_EOIT,
ECPGt_char,&(pointer),(long)0,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}
#line 91 "binary.pgc"
@@ -192,7 +192,7 @@ main (void)
exit (sqlca.sqlcode);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close A", ECPGt_EOIT, ECPGt_EORT);}
+ { ECPGclose("A", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close A", ECPGt_EOIT, ECPGt_EORT);}
#line 98 "binary.pgc"
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.c b/src/interfaces/ecpg/test/expected/sql-declare.c
new file mode 100644
index 0000000..342134b
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.c
@@ -0,0 +1,375 @@
+/* Processed by ecpg (regression mode) */
+/* These include files are added by the preprocessor */
+#include <ecpglib.h>
+#include <ecpgerrno.h>
+#include <sqlca.h>
+/* End of automatic include section */
+#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
+
+#line 1 "declare.pgc"
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* exec sql whenever sqlerror sqlprint ; */
+#line 5 "declare.pgc"
+
+
+
+#line 1 "sqlca.h"
+#ifndef POSTGRES_SQLCA_H
+#define POSTGRES_SQLCA_H
+
+#ifndef PGDLLIMPORT
+#if defined(WIN32) || defined(__CYGWIN__)
+#define PGDLLIMPORT __declspec (dllimport)
+#else
+#define PGDLLIMPORT
+#endif /* __CYGWIN__ */
+#endif /* PGDLLIMPORT */
+
+#define SQLERRMC_LEN 150
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+struct sqlca_t
+{
+ char sqlcaid[8];
+ long sqlabc;
+ long sqlcode;
+ struct
+ {
+ int sqlerrml;
+ char sqlerrmc[SQLERRMC_LEN];
+ } sqlerrm;
+ char sqlerrp[8];
+ long sqlerrd[6];
+ /* Element 0: empty */
+ /* 1: OID of processed tuple if applicable */
+ /* 2: number of rows processed */
+ /* after an INSERT, UPDATE or */
+ /* DELETE statement */
+ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ char sqlwarn[8];
+ /* Element 0: set to 'W' if at least one other is 'W' */
+ /* 1: if 'W' at least one character string */
+ /* value was truncated when it was */
+ /* stored into a host variable. */
+
+ /*
+ * 2: if 'W' a (hopefully) non-fatal notice occurred
+ */ /* 3: empty */
+ /* 4: empty */
+ /* 5: empty */
+ /* 6: empty */
+ /* 7: empty */
+
+ char sqlstate[5];
+};
+
+struct sqlca_t *ECPGget_sqlca(void);
+
+#ifndef POSTGRES_ECPG_INTERNAL
+#define sqlca (*ECPGget_sqlca())
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#line 7 "declare.pgc"
+
+
+#line 1 "regression.h"
+
+
+
+
+
+
+#line 8 "declare.pgc"
+
+
+#define ARRAY_SZIE 20
+
+void execute_test(void);
+void commitTable(void);
+void reset(void);
+void printResult(char *tc_name, int loop);
+
+/* exec sql begin declare section */
+
+
+
+
+#line 18 "declare.pgc"
+ int f1 [ ARRAY_SZIE ] ;
+
+#line 19 "declare.pgc"
+ int f2 [ ARRAY_SZIE ] ;
+
+#line 20 "declare.pgc"
+ char f3 [ ARRAY_SZIE ] [ 20 ] ;
+/* exec sql end declare section */
+#line 21 "declare.pgc"
+
+
+int main(void)
+{
+ setlocale(LC_ALL, "C");
+
+ ECPGdebug(1, stderr);
+
+ { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , "con1", 0);
+#line 29 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 29 "declare.pgc"
+
+ { ECPGconnect(__LINE__, 0, "ecpg2_regression" , NULL, NULL , "con2", 0);
+#line 30 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 30 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 32 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 32 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) )", ECPGt_EOIT, ECPGt_EORT);
+#line 33 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 33 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 35 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 35 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 36 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 36 "declare.pgc"
+
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 1 , 10 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 38 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 38 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "insert into source values ( 2 , 20 , 'db on con2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 39 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 39 "declare.pgc"
+
+
+ commitTable();
+
+ execute_test();
+
+ { ECPGdo(__LINE__, 0, 1, "con1", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 45 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 45 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_normal, "drop table if exists source", ECPGt_EOIT, ECPGt_EORT);
+#line 46 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 46 "declare.pgc"
+
+
+ commitTable();
+
+ { ECPGdisconnect(__LINE__, "ALL");
+#line 50 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 50 "declare.pgc"
+
+
+ return 0;
+}
+
+/*
+ * default connection: con2
+ * Non-default connection: con1
+ *
+ */
+void execute_test(void)
+{
+ /* exec sql begin declare section */
+
+
+
+#line 63 "declare.pgc"
+ int i ;
+
+#line 64 "declare.pgc"
+ char * selectString = "SELECT f1,f2,f3 FROM source" ;
+/* exec sql end declare section */
+#line 65 "declare.pgc"
+
+
+ /* testcase1. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement*/
+ reset();
+
+ { ECPGdeclare(__LINE__, "con1", "stmt_1");
+#line 70 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 70 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_1", selectString);
+#line 71 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 71 "declare.pgc"
+
+ /* declare cur_1 cursor for $1 */
+#line 72 "declare.pgc"
+
+ { ECPGopen("cur_1", "stmt_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur_1 cursor for $1",
+ ECPGt_char_variable,(ECPGprepared_statement(NULL, "stmt_1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 73 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 73 "declare.pgc"
+
+
+ /* exec sql whenever not found break ; */
+#line 75 "declare.pgc"
+
+ i = 0;
+ while (1)
+ {
+ { ECPGfetch("cur_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur_1", ECPGt_EOIT,
+ ECPGt_int,&(f1[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,&(f2[i]),(long)1,(long)1,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3[i]),(long)20,(long)1,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 79 "declare.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 79 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 79 "declare.pgc"
+
+ i++;
+ }
+
+ { ECPGclose("cur_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_1", ECPGt_EOIT, ECPGt_EORT);
+#line 83 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 83 "declare.pgc"
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_1");
+#line 84 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 84 "declare.pgc"
+
+ /* exec sql whenever not found continue ; */
+#line 85 "declare.pgc"
+
+
+ printResult("testcase1", 2);
+
+ /* testcase2. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement*/
+ reset();
+
+ { ECPGdeclare(__LINE__, NULL, "stmt_2");
+#line 92 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 92 "declare.pgc"
+
+ { ECPGprepare(__LINE__, NULL, 0, "stmt_2", selectString);
+#line 93 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 93 "declare.pgc"
+
+ { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "stmt_2", ECPGt_EOIT,
+ ECPGt_int,(f1),(long)1,(long)ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_int,(f2),(long)1,(long)ARRAY_SZIE,sizeof(int),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
+ ECPGt_char,(f3),(long)20,(long)ARRAY_SZIE,(20)*sizeof(char),
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 94 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 94 "declare.pgc"
+
+
+ { ECPGdeallocate(__LINE__, 0, NULL, "stmt_2");
+#line 96 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 96 "declare.pgc"
+
+
+ printResult("testcase2", 2);
+}
+
+void commitTable()
+{
+ { ECPGtrans(__LINE__, "con1", "commit");
+#line 103 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 103 "declare.pgc"
+
+ { ECPGtrans(__LINE__, "con2", "commit");
+#line 104 "declare.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 104 "declare.pgc"
+
+}
+
+/*
+ * reset all the output variables
+ */
+void reset()
+{
+ memset(f1, 0, sizeof(f1));
+ memset(f2, 0, sizeof(f2));
+ memset(f3, 0, sizeof(f3));
+}
+
+void printResult(char *tc_name, int loop)
+{
+ int i;
+
+ if (tc_name)
+ printf("****%s test results:****\n", tc_name);
+
+ for (i = 0; i < loop; i++)
+ printf("f1=%d, f2=%d, f3=%s\n", f1[i], f2[i], f3[i]);
+
+ printf("\n");
+}
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stderr b/src/interfaces/ecpg/test/expected/sql-declare.stderr
new file mode 100644
index 0000000..3693f8b
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.stderr
@@ -0,0 +1,140 @@
+[NO_PID]: ECPGdebug: set to 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg1_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg2_regression on <DEFAULT> port <DEFAULT>
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 32: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 32: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 32: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 33: query: create table source ( f1 integer , f2 integer , f3 varchar ( 20 ) ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 33: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 33: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 35: query: insert into source values ( 1 , 10 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 35: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 35: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 36: query: insert into source values ( 2 , 20 , 'db on con1' ); with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 36: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 36: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 38: query: insert into source values ( 1 , 10 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 38: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 38: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 39: query: insert into source values ( 2 , 20 , 'db on con2' ); with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 39: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 39: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 103: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 104: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGdeclare on line 70: declared name stmt_1 on connection: "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 71: name stmt_1; query: "SELECT f1,f2,f3 FROM source"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 73: query: declare cur_1 cursor for SELECT f1,f2,f3 FROM source; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 73: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 73: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: query: fetch cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 79: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: query: fetch cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 79: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 79: RESULT: db on con1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: query: fetch cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 79: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 79: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 79: no data found on line 79
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 83: query: close cur_1; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 83: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 83: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 84: name stmt_1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: prepare_common on line 93: name stmt_2; query: "SELECT f1,f2,f3 FROM source"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 94: query: SELECT f1,f2,f3 FROM source; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 94: using PQexecPrepared for "SELECT f1,f2,f3 FROM source"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 94: correctly got 2 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 10 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: 20 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 94: RESULT: db on con2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: deallocate_one on line 96: name stmt_2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 45: query: drop table if exists source; with 0 parameter(s) on connection con1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 45: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 45: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 46: query: drop table if exists source; with 0 parameter(s) on connection con2
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 46: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 46: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 103: action "commit"; connection "con1"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 104: action "commit"; connection "con2"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con2 closed
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_release_declared_statement: declared name stmt_1 is released
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection con1 closed
+[NO_PID]: sqlca: code: 0, state: 00000
diff --git a/src/interfaces/ecpg/test/expected/sql-declare.stdout b/src/interfaces/ecpg/test/expected/sql-declare.stdout
new file mode 100644
index 0000000..d80d079
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/sql-declare.stdout
@@ -0,0 +1,8 @@
+****testcase1 test results:****
+f1=1, f2=10, f3=db on con1
+f1=2, f2=20, f3=db on con1
+
+****testcase2 test results:****
+f1=1, f2=10, f3=db on con2
+f1=2, f2=20, f3=db on con2
+
diff --git a/src/interfaces/ecpg/test/expected/sql-desc.c b/src/interfaces/ecpg/test/expected/sql-desc.c
index bdd12a5..bcfe1bd 100644
--- a/src/interfaces/ecpg/test/expected/sql-desc.c
+++ b/src/interfaces/ecpg/test/expected/sql-desc.c
@@ -249,7 +249,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* declare c1 cursor for $1 */
#line 58 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c1 cursor for $1",
+ { ECPGopen("c1", "foo2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "foo2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_descriptor, "indesc", 1L, 1L, 1L,
@@ -260,7 +260,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 59 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c1", ECPGt_EOIT,
+ { ECPGfetch("c1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c1", ECPGt_EOIT,
ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int),
ECPGt_int,&(ind1),(long)1,(long)1,sizeof(int),
ECPGt_char,(val2output),(long)sizeof("AAA"),(long)1,(sizeof("AAA"))*sizeof(char),
@@ -273,7 +273,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("val1=%d (ind1: %d) val2=%s (ind2: %d)\n",
val1output, ind1, val2output, ind2);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("c1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c1", ECPGt_EOIT, ECPGt_EORT);
#line 65 "desc.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -299,7 +299,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* declare c2 cursor for $1 */
#line 70 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c2 cursor for $1",
+ { ECPGopen("c2", "foo3", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare c2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "foo3", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_descriptor, "indesc", 1L, 1L, 1L,
@@ -310,7 +310,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 71 "desc.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c2", ECPGt_EOIT,
+ { ECPGfetch("c2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch next from c2", ECPGt_EOIT,
ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(val2output),(long)sizeof("AAA"),(long)1,(sizeof("AAA"))*sizeof(char),
@@ -322,7 +322,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("val1=%d val2=%s\n", val1output, val2i ? "null" : val2output);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("c2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close c2", ECPGt_EOIT, ECPGt_EORT);
#line 76 "desc.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-dyntest.c b/src/interfaces/ecpg/test/expected/sql-dyntest.c
index 2cbc196..dff22aa 100644
--- a/src/interfaces/ecpg/test/expected/sql-dyntest.c
+++ b/src/interfaces/ecpg/test/expected/sql-dyntest.c
@@ -261,7 +261,7 @@ if (sqlca.sqlcode < 0) error ( );}
#line 58 "dyntest.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare MYCURS cursor for $1",
+ { ECPGopen("MYCURS", "myquery", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare MYCURS cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "myquery", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 60 "dyntest.pgc"
@@ -272,7 +272,7 @@ if (sqlca.sqlcode < 0) error ( );}
while (1)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in MYCURS", ECPGt_EOIT,
+ { ECPGfetch("MYCURS", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in MYCURS", ECPGt_EOIT,
ECPGt_descriptor, "MYDESC", 1L, 1L, 1L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 64 "dyntest.pgc"
@@ -468,7 +468,7 @@ if (sqlca.sqlcode < 0) error ( );}
}
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close MYCURS", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("MYCURS", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close MYCURS", ECPGt_EOIT, ECPGt_EORT);
#line 194 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
diff --git a/src/interfaces/ecpg/test/expected/sql-execute.c b/src/interfaces/ecpg/test/expected/sql-execute.c
index aee3c1b..c511349 100644
--- a/src/interfaces/ecpg/test/expected/sql-execute.c
+++ b/src/interfaces/ecpg/test/expected/sql-execute.c
@@ -140,7 +140,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 50 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR cursor for $1",
+ { ECPGopen("CUR", "f", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 52 "execute.pgc"
@@ -148,7 +148,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 52 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
+ { ECPGfetch("CUR", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -180,7 +180,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
#line 66 "execute.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -205,7 +205,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 72 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR2 cursor for $1",
+ { ECPGopen("CUR2", "f", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare CUR2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
@@ -215,7 +215,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 74 "execute.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in CUR2", ECPGt_EOIT,
+ { ECPGfetch("CUR2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch in CUR2", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -247,7 +247,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close CUR2", ECPGt_EOIT, ECPGt_EORT);
#line 88 "execute.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-fetch.c b/src/interfaces/ecpg/test/expected/sql-fetch.c
index b547b25..e6beaf5 100644
--- a/src/interfaces/ecpg/test/expected/sql-fetch.c
+++ b/src/interfaces/ecpg/test/expected/sql-fetch.c
@@ -99,7 +99,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 26 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from My_Table", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from My_Table", ECPGt_EOIT, ECPGt_EORT);
#line 28 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -113,7 +113,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 30 "fetch.pgc"
while (1) {
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(str),(long)25,(long)1,(25)*sizeof(char),
@@ -135,7 +135,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
/* exec sql whenever not found continue ; */
#line 36 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "move backward 2 in C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "move backward 2 in C", ECPGt_EOIT, ECPGt_EORT);
#line 37 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -145,7 +145,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 37 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch $0 in C",
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch $0 in C",
ECPGt_int,&(count),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
@@ -162,7 +162,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("%d: %s\n", i, str);
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close C", ECPGt_EOIT, ECPGt_EORT);
#line 42 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -176,7 +176,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 44 "fetch.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare D cursor for select * from My_Table where Item1 = $1",
+ { ECPGopen("D", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare D cursor for select * from My_Table where Item1 = $1",
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 46 "fetch.pgc"
@@ -192,7 +192,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 48 "fetch.pgc"
while (1) {
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in D", ECPGt_EOIT,
+ { ECPGfetch("D", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in D", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(str),(long)25,(long)1,(25)*sizeof(char),
@@ -210,7 +210,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("%d: %s\n", i, str);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close D", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("D", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close D", ECPGt_EOIT, ECPGt_EORT);
#line 53 "fetch.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
diff --git a/src/interfaces/ecpg/test/expected/sql-oldexec.c b/src/interfaces/ecpg/test/expected/sql-oldexec.c
index 5b74dda..2e398c2 100644
--- a/src/interfaces/ecpg/test/expected/sql-oldexec.c
+++ b/src/interfaces/ecpg/test/expected/sql-oldexec.c
@@ -141,7 +141,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 51 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR cursor for $1",
+ { ECPGopen("CUR", "f", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 53 "oldexec.pgc"
@@ -149,7 +149,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 53 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
+ { ECPGfetch("CUR", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch 8 in CUR", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -171,7 +171,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR", ECPGt_EOIT, ECPGt_EORT);
#line 65 "oldexec.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
@@ -190,7 +190,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 70 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR3 cursor for $1",
+ { ECPGopen("CUR3", "f", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "declare CUR3 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "f", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_const,"1",(long)1,(long)1,strlen("1"),
@@ -200,7 +200,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
if (sqlca.sqlcode < 0) sqlprint();}
#line 72 "oldexec.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch in CUR3", ECPGt_EOIT,
+ { ECPGfetch("CUR3", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "fetch in CUR3", ECPGt_EOIT,
ECPGt_char,(name),(long)8,(long)8,(8)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_int,(amount),(long)1,(long)8,sizeof(int),
@@ -222,7 +222,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
}
- { ECPGdo(__LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR3", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("CUR3", __LINE__, 0, 1, NULL, 1, ECPGst_normal, "close CUR3", ECPGt_EOIT, ECPGt_EORT);
#line 84 "oldexec.pgc"
if (sqlca.sqlcode < 0) sqlprint();}
diff --git a/src/interfaces/ecpg/test/expected/sql-quote.c b/src/interfaces/ecpg/test/expected/sql-quote.c
index 0a3b77c..ec03612 100644
--- a/src/interfaces/ecpg/test/expected/sql-quote.c
+++ b/src/interfaces/ecpg/test/expected/sql-quote.c
@@ -162,7 +162,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
#line 43 "quote.pgc"
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGopen("C", NULL, __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
#line 45 "quote.pgc"
if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -178,7 +178,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
while (true)
{
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
+ { ECPGfetch("C", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
ECPGt_char,(var),(long)25,(long)1,(25)*sizeof(char),
diff --git a/src/interfaces/ecpg/test/expected/sql-sqlda.c b/src/interfaces/ecpg/test/expected/sql-sqlda.c
index b470b04..6bfcbe2 100644
--- a/src/interfaces/ecpg/test/expected/sql-sqlda.c
+++ b/src/interfaces/ecpg/test/expected/sql-sqlda.c
@@ -251,7 +251,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
+ { ECPGopen("mycur1", "st_id1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 103 "sqlda.pgc"
@@ -268,7 +268,7 @@ if (sqlca.sqlcode < 0) exit (1);}
while (1)
{
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
+ { ECPGfetch("mycur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 111 "sqlda.pgc"
@@ -289,7 +289,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
#line 120 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
@@ -324,7 +324,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "open");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
+ { ECPGopen("mycur2", "st_id2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 138 "sqlda.pgc"
@@ -334,7 +334,7 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "fetch");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch all from mycur2", ECPGt_EOIT,
+ { ECPGfetch("mycur2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch all from mycur2", ECPGt_EOIT,
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 141 "sqlda.pgc"
@@ -357,7 +357,7 @@ if (sqlca.sqlcode < 0) exit (1);}
}
strcpy(msg, "close");
- { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
+ { ECPGclose("mycur2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
#line 157 "sqlda.pgc"
if (sqlca.sqlcode < 0) exit (1);}
diff --git a/src/interfaces/ecpg/test/sql/.gitignore b/src/interfaces/ecpg/test/sql/.gitignore
index bbdada9..d683629 100644
--- a/src/interfaces/ecpg/test/sql/.gitignore
+++ b/src/interfaces/ecpg/test/sql/.gitignore
@@ -6,6 +6,8 @@
/code100.c
/copystdout
/copystdout.c
+/declare
+/declare.c
/define
/define.c
/desc
diff --git a/src/interfaces/ecpg/test/sql/Makefile b/src/interfaces/ecpg/test/sql/Makefile
index b7bc034..c3d86ae 100644
--- a/src/interfaces/ecpg/test/sql/Makefile
+++ b/src/interfaces/ecpg/test/sql/Makefile
@@ -22,8 +22,9 @@ TESTS = array array.c \
parser parser.c \
quote quote.c \
show show.c \
+ insupd insupd.c \
twophase twophase.c \
- insupd insupd.c
+ declare declare.c
all: $(TESTS)
diff --git a/src/interfaces/ecpg/test/sql/declare.pgc b/src/interfaces/ecpg/test/sql/declare.pgc
new file mode 100644
index 0000000..f307341
--- /dev/null
+++ b/src/interfaces/ecpg/test/sql/declare.pgc
@@ -0,0 +1,128 @@
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+
+EXEC SQL WHENEVER SQLERROR SQLPRINT;
+
+EXEC SQL INCLUDE sqlca;
+EXEC SQL INCLUDE ../regression;
+
+#define ARRAY_SZIE 20
+
+void execute_test(void);
+void commitTable(void);
+void reset(void);
+void printResult(char *tc_name, int loop);
+
+EXEC SQL BEGIN DECLARE SECTION;
+int f1[ARRAY_SZIE];
+int f2[ARRAY_SZIE];
+char f3[ARRAY_SZIE][20];
+EXEC SQL END DECLARE SECTION;
+
+int main(void)
+{
+ setlocale(LC_ALL, "C");
+
+ ECPGdebug(1, stderr);
+
+ EXEC SQL CONNECT TO REGRESSDB1 AS con1;
+ EXEC SQL CONNECT TO REGRESSDB2 AS con2;
+
+ EXEC SQL AT con1 CREATE TABLE source(f1 integer, f2 integer, f3 varchar(20));
+ EXEC SQL AT con2 CREATE TABLE source(f1 integer, f2 integer, f3 varchar(20));
+
+ EXEC SQL AT con1 INSERT INTO source VALUES(1, 10, 'db on con1');
+ EXEC SQL AT con1 INSERT INTO source VALUES(2, 20, 'db on con1');
+
+ EXEC SQL AT con2 INSERT INTO source VALUES(1, 10, 'db on con2');
+ EXEC SQL AT con2 INSERT INTO source VALUES(2, 20, 'db on con2');
+
+ commitTable();
+
+ execute_test();
+
+ EXEC SQL AT con1 DROP TABLE IF EXISTS source;
+ EXEC SQL AT con2 DROP TABLE IF EXISTS source;
+
+ commitTable();
+
+ EXEC SQL DISCONNECT ALL;
+
+ return 0;
+}
+
+/*
+ * default connection: con2
+ * Non-default connection: con1
+ *
+ */
+void execute_test(void)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int i;
+ char *selectString = "SELECT f1,f2,f3 FROM source";
+ EXEC SQL END DECLARE SECTION;
+
+ /* testcase1. using DECLARE STATEMENT at con1, using PREPARE and CURSOR statement*/
+ reset();
+
+ EXEC SQL AT con1 DECLARE stmt_1 STATEMENT;
+ EXEC SQL PREPARE stmt_1 FROM :selectString;
+ EXEC SQL DECLARE cur_1 CURSOR FOR stmt_1;
+ EXEC SQL OPEN cur_1;
+
+ EXEC SQL WHENEVER NOT FOUND DO BREAK;
+ i = 0;
+ while (1)
+ {
+ EXEC SQL FETCH cur_1 INTO :f1[i], :f2[i], :f3[i];
+ i++;
+ }
+
+ EXEC SQL CLOSE cur_1;
+ EXEC SQL DEALLOCATE PREPARE stmt_1;
+ EXEC SQL WHENEVER NOT FOUND CONTINUE;
+
+ printResult("testcase1", 2);
+
+ /* testcase2. using DECLARE STATEMENT without using AT clause, using PREPARE and EXECUTE statement*/
+ reset();
+
+ EXEC SQL DECLARE stmt_2 STATEMENT;
+ EXEC SQL PREPARE stmt_2 FROM :selectString;
+ EXEC SQL EXECUTE stmt_2 INTO :f1, :f2, :f3;
+
+ EXEC SQL DEALLOCATE PREPARE stmt_2;
+
+ printResult("testcase2", 2);
+}
+
+void commitTable()
+{
+ EXEC SQL AT con1 COMMIT;
+ EXEC SQL AT con2 COMMIT;
+}
+
+/*
+ * reset all the output variables
+ */
+void reset()
+{
+ memset(f1, 0, sizeof(f1));
+ memset(f2, 0, sizeof(f2));
+ memset(f3, 0, sizeof(f3));
+}
+
+void printResult(char *tc_name, int loop)
+{
+ int i;
+
+ if (tc_name)
+ printf("****%s test results:****\n", tc_name);
+
+ for (i = 0; i < loop; i++)
+ printf("f1=%d, f2=%d, f3=%s\n", f1[i], f2[i], f3[i]);
+
+ printf("\n");
+}
On Wed, Mar 22, 2017 at 7:57 PM, Ideriha, Takeshi <
ideriha.takeshi@jp.fujitsu.com> wrote:
Hi, thank you very much for reviewing.
Attached is v6 patch.There was a minor conflict in applying 004_declareXX patch.
I rebased 004_declareStmt_test_v6.patch.
Some comments in 001_declareStmt_preproc_v5.patch:
+ if (INFORMIX_MODE) + { + if (pg_strcasecmp(stmt+strlen("close "), "database") == 0) + { + if (connection) + mmerror(PARSE_ERROR, ET_ERROR, "AT optionnot allowed in CLOSE DATABASE statement");
++ fprintf(base_yyout, "{ ECPGdisconnect(__LINE__,
\"CURRENT\");");
+ whenever_action(2); + free(stmt); + break; + } + }The same code block is present in the stmtClosePortalStmt condition to
verify the close
statement. Because of the above code addition, the code present in
stmtClosePortalStmt
is a dead code. So remove the code present in stmtClosePortalStmt or try
to reuse it.
I remove almost all the stmtClosePortalStmt code
and just leave the interface which actually does nothing not to affect
other codes.But I'm not sure this implementation is good or not.
Maybe I should completely remove stmtClosePortalStmt code
and rename ClosePortalStmtCLOSEcursor_name to stmtClosePortalStmt to make
code easier to understand.+static void
+output_cursor_name(char *str)This function needs some comments to explain the code flow for better
understanding.
I add some explanation that output_cursor_name() filters escape sequences.
+/* + * Translate the EXEC SQL DECLARE STATEMENT into ECPGdeclare function + */How about using Transform instead of Translate? (similar references also)
I changed two comments with the word Translate.
Thanks for the updated patch. It looks good to me.
I have some comments in the doc patch.
+
+ <para>
+ The third option is to declare a sql identifier linked to
+ the connection, for example:
+<programlisting>
+EXEC SQL AT <replaceable>connection-name</replaceable> DECLARE
<replaceable>statement-name</replaceable> STATEMENT;
+EXEC SQL PREPARE <replaceable>statement-name</replaceable> FROM
:<replaceable>dyn-string</replaceable>;
+</programlisting>
+ Once you link a sql identifier to a connection, you execute a dynamic
SQL
+ without AT clause.
+ </para>
The above code part should be moved to the below of the following code
location
and provide some example usage of it in the example code will be better.
<programlisting>
EXEC SQL SET CONNECTION <replaceable>connection-name</replaceable>;
</programlisting>
+ <para>
+ <command>DELARE CURSOR</command> with a SQL statement identifier can
be written before PREPARE.
+ </para>
what is the need of providing details about DECLARE CURSOR here?
+ <para>
+ AT clause cannot be used with the SQL statement which have been
identified by <command>DECLARE STATEMENT</command>
+ </para>
I didn't clearly understand the limitation here, If you can provide an
example here, it will be good.
The test patch looks good to me.
Regards,
Hari Babu
Fujitsu Australia
Hi Takeshi,
On 3/23/17 1:33 AM, Haribabu Kommi wrote:
The test patch looks good to me.
This thread has been idle for five days. Please respond with a new
patch by 2017-03-30 00:00 AoE (UTC-12) or this submission will be marked
"Returned with Feedback".
--
-David
david@pgmasters.net
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Thank you very much for thorough review and sorry for late replay.
Attched is 002_declareStmt_ecpglib_v7.patch and I haven't revised doc patch yet.
002_declareStmt_ecpglib_v5.patch:
+ struct connection *f = NULL; + ecpg_init_sqlca(sqlca); for (con = all_connections; con;) { - struct connection *f = con; + f = con;
What is the need of moving the structure declartion
to outside, i didn't find any usage of it later.
Fixed.
+ con = ecpg_get_connection(connection_name); + if (!con) + { + return; + }No need of {}.
Fixed.
+ if (find_cursor(cursor_name, con)) + { + /* + * Should never goto here, because ECPG has checked the duplication of + * the cursor in pre-compile stage. + */ + return; + }Do we really need this check? If it is for additional check, How about
checking
it with an Assert? (check for similar instances)
I remove the above check because we check the duplication when parsing ECPGCursorStmt token at ecpg.trailer and in the existing master code we also check the cursor name duplication only when pre-compilineg pgc code.
Regarding similar codes, I added ecpg_raise() assertion.
+ if (!ecpg_init(con, real_connection_name, line)) + return false;What is the need of ecpg_init call? why the same is not done in other
functions.
Better if you provide some comments about the need of the function call.
Removed ecpg_init() and added checking if con exists or not.
-#endif /* _ECPG_LIB_EXTERN_H */ +#endif /* _ECPG_LIB_EXTERN_H */Not related change.
Fixed.
+ * Find the declared name referred by the cursor, + * then return the connection name used by the declared name.How about rewriting the above statement as follows? This is because
we are not finding the declare name, as we are looping through all
the declare statements for this cursor."Find the connection name by referring the declared statements
cursors by using the provided cursor name"
Fixed.
+ struct declared_statement *cur = NULL; + struct declared_statement *prev = NULL; + struct declared_statement *next = NULL;The above logic can be written without "next" pointer.
That way it should be simpler.
Fixed.
-#endif /* _ECPGTYPE_H */ +#endif /* _ECPGTYPE_H */Not related change.
Fixed.
+ if(connection_name == NULL) + { + /* + * Going to here means not using AT clause in the DECLARE STATEMENT + * We don't allocate a node to store the declared name because the + * DECLARE STATEMENT without using AT clause will be ignored. + */ + return true; + }I am not sure that just ignore the declare statement may be wrong.
I feel whether such case is possible? Does the preprocessor allows it?
As you pointed out, the above thing should be discussed.
The current implementation is as follows:
ECPG pre-processor allows the DECLARE STATEMENT without using AT clause.
And the following statement after DECLARE STATEMENT such as PREPARE, EXECUTE are
executed as usual on the current connection.
But there's a limitation here.
(This limitation should be disccused earlier and be specified in the doc...
but I didn't realize this clearly by myself, sorry)
When using DECLARE STATEMENT without AT clause
and using OPEN statement with AT clause, it doesn't work.
There's an example where you cannot fetch rows from db:
EXEC SQL CONNECT TO db AS con;
EXEC SQL DECLARE stmt STATEMENT;
EXEC SQL AT con PREPARE stmt FROM :selectString;
EXEC SQL AT con DECLARE cur CURSOR FOR stmt;
EXEC SQL AT con OPEN cur;
...
This limitation looks troublesome for users,
so maybe I need to fix this implementation.
regards,
Ideriha Takeshi
Attachments:
002_declareStmt_ecpglib_v7.patchapplication/octet-stream; name=002_declareStmt_ecpglib_v7.patchDownload
diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile
index fbb1407..132e53a 100644
--- a/src/interfaces/ecpg/ecpglib/Makefile
+++ b/src/interfaces/ecpg/ecpglib/Makefile
@@ -26,7 +26,7 @@ override CFLAGS += $(PTHREAD_CFLAGS)
LIBS := $(filter-out -lpgport, $(LIBS))
OBJS= execute.o typename.o descriptor.o sqlda.o data.o error.o prepare.o memory.o \
- connect.o misc.o path.o pgstrcasecmp.o \
+ connect.o misc.o path.o pgstrcasecmp.o cursor.o \
$(filter snprintf.o strlcpy.o win32setlocale.o isinf.o, $(LIBOBJS)) $(WIN32RES)
# thread.c is needed only for non-WIN32 implementation of path.c
diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c
index c90f13d..3aa3abd 100644
--- a/src/interfaces/ecpg/ecpglib/connect.c
+++ b/src/interfaces/ecpg/ecpglib/connect.c
@@ -340,6 +340,8 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
return false;
}
+ memset(this, 0, sizeof(struct connection));
+
if (dbname != NULL)
{
/* get the detail information from dbname */
@@ -690,6 +692,7 @@ ECPGdisconnect(int lineno, const char *connection_name)
struct connection *f = con;
con = con->next;
+ ecpg_release_declared_statement(f->name);
ecpg_finish(f);
}
}
@@ -705,7 +708,10 @@ ECPGdisconnect(int lineno, const char *connection_name)
return (false);
}
else
+ {
+ ecpg_release_declared_statement(connection_name);
ecpg_finish(con);
+ }
}
#ifdef ENABLE_THREAD_SAFETY
diff --git a/src/interfaces/ecpg/ecpglib/cursor.c b/src/interfaces/ecpg/ecpglib/cursor.c
new file mode 100644
index 0000000..b4d9b53
--- /dev/null
+++ b/src/interfaces/ecpg/ecpglib/cursor.c
@@ -0,0 +1,258 @@
+/* src/interfaces/ecpg/ecpglib/cursor.c */
+
+#define POSTGRES_ECPG_INTERNAL
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <locale.h>
+#include <string.h>
+
+#include "ecpgtype.h"
+#include "ecpglib.h"
+#include "ecpgerrno.h"
+#include "extern.h"
+#include "sqlca.h"
+
+static void add_cursor(const int, const char *, const char *);
+static void remove_cursor(const char *, struct connection *);
+static bool find_cursor(const char *, const struct connection *);
+
+/*
+ * Function: Handle the EXEC SQL OPEN cursor statement:
+ * Input:
+ * cursor_name --- cursor name
+ * prepared_name --- prepared name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGopen(const char *cursor_name,const char *prepared_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ /*
+ * If the declared name is referred by the PREPARE statement then the
+ * prepared_name is same as declared name
+ */
+ real_connection_name = ecpg_get_con_name_by_declared_name(prepared_name);
+ if (real_connection_name)
+ {
+ /* Add the cursor name into the declared node */
+ ecpg_update_declare_statement(prepared_name, cursor_name, lineno);
+ }
+ else
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+
+ /* Add the cursor into the connection */
+ add_cursor(lineno, cursor_name, real_connection_name);
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return status;
+}
+
+
+/*
+ * Function: Handle the EXEC SQL FETCH/MOVE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGfetch(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return (false);
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ return status;
+}
+
+
+/*
+ * Function: Handle the EXEC SQL CLOSE CURSOR statements:
+ * Input:
+ * cursor_name --- cursor name
+ * others --- keep same as the parameters in ECPGdo() function
+ */
+bool
+ECPGclose(const char *cursor_name,
+ const int lineno, const int compat,const int force_indicator,
+ const char *connection_name, const bool questionmarks,
+ const int st, const char *query,...)
+{
+ va_list args;
+ bool status;
+ const char *real_connection_name = NULL;
+ struct connection *con = NULL;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ real_connection_name = ecpg_get_con_name_by_cursor_name(cursor_name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by cursor name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+
+ /* check the existence of the cursor in the connection */
+ if (find_cursor(cursor_name, con) == false)
+ {
+ ecpg_raise(lineno, ECPG_INVALID_CURSOR, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ va_start(args, query);
+
+ status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args);
+
+ va_end(args);
+
+ remove_cursor(cursor_name, con);
+
+ return status;
+}
+
+/*
+ * Function: Add a cursor into the connection
+ * The duplication of cursor_name is checked at ecpg.trailer,
+ * so we don't check here.
+ */
+static void
+add_cursor(const int lineno, const char *cursor_name, const char *connection_name)
+{
+ struct connection *con;
+ struct cursor_statement *new = NULL;
+
+ if (!cursor_name)
+ {
+ ecpg_raise(lineno, ECPG_INVALID_CURSOR, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return;
+ }
+
+ con = ecpg_get_connection(connection_name);
+ if (!con)
+ {
+ ecpg_raise(lineno, ECPG_NO_CONN, ECPG_SQLSTATE_CONNECTION_DOES_NOT_EXIST,
+ connection_name ? connection_name : ecpg_gettext("NULL"));
+ return;
+ }
+
+ /* allocate a node to store the new cursor */
+ new = (struct cursor_statement *)ecpg_alloc(sizeof(struct cursor_statement), lineno);
+ if (new)
+ {
+ new->name = ecpg_strdup(cursor_name, lineno);
+ new->next = con->cursor_stmts;
+ con->cursor_stmts = new;
+ }
+}
+
+/*
+ * Function: Remove the cursor from the connection
+ */
+static void
+remove_cursor(const char *cursor_name, struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+ struct cursor_statement *prev = NULL;
+
+ if (!connection || !cursor_name)
+ return;
+
+ cur = connection->cursor_stmts;
+ while (cur)
+ {
+ if (strcmp(cur->name, cursor_name) == 0)
+ {
+ if (!prev)
+ connection->cursor_stmts = cur->next;
+ else
+ prev->next = cur->next;
+
+ ecpg_free(cur->name);
+ ecpg_free(cur);
+
+ break;
+ }
+ prev = cur;
+ cur = cur->next;
+ }
+}
+
+/*
+ * Function: check the existence of the cursor in the connection
+ * Return: true ---Found
+ * false --- Not found
+ */
+static bool
+find_cursor(const char *cursor_name, const struct connection *connection)
+{
+ struct cursor_statement *cur = NULL;
+
+ if (!connection || !cursor_name)
+ return false;
+
+ for (cur = connection->cursor_stmts; cur != NULL; cur = cur->next)
+ {
+ if (strcmp(cur->name, cursor_name) == 0)
+ return true;
+ }
+
+ return false;
+}
diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c
index 15fd7a0..84189a4 100644
--- a/src/interfaces/ecpg/ecpglib/descriptor.c
+++ b/src/interfaces/ecpg/ecpglib/descriptor.c
@@ -818,6 +818,7 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
struct prepared_statement *prep;
PGresult *res;
va_list args;
+ const char *real_connection_name = NULL;
/* DESCRIBE INPUT is not yet supported */
if (input)
@@ -826,11 +827,21 @@ ECPGdescribe(int line, int compat, bool input, const char *connection_name, cons
return ret;
}
- con = ecpg_get_connection(connection_name);
+ real_connection_name = ecpg_get_con_name_by_declared_name(stmt_name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
if (!con)
{
ecpg_raise(line, ECPG_NO_CONN, ECPG_SQLSTATE_CONNECTION_DOES_NOT_EXIST,
- connection_name ? connection_name : ecpg_gettext("NULL"));
+ real_connection_name ? real_connection_name : ecpg_gettext("NULL"));
return ret;
}
prep = ecpg_find_prepared_statement(stmt_name, con, NULL);
diff --git a/src/interfaces/ecpg/ecpglib/error.c b/src/interfaces/ecpg/ecpglib/error.c
index 656b2c4..11a1a7c 100644
--- a/src/interfaces/ecpg/ecpglib/error.c
+++ b/src/interfaces/ecpg/ecpglib/error.c
@@ -200,6 +200,13 @@ ecpg_raise(int line, int code, const char *sqlstate, const char *str)
ecpg_gettext("could not connect to database \"%s\" on line %d"), str, line);
break;
+ case ECPG_INVALID_CURSOR:
+ snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
+ /*------
+ translator: this string will be truncated at 149 characters expanded. */
+ ecpg_gettext("The cursor is invalid on line %d"),line);
+ break;
+
default:
snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
/*------
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index bd9b86b..35360b1 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -2031,9 +2031,32 @@ ECPGdo(const int lineno, const int compat, const int force_indicator, const char
{
va_list args;
bool ret;
+ const char *real_connection_name = NULL;
+
+ real_connection_name = connection_name;
+
+ if (!query)
+ {
+ ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
+ return false;
+ }
+
+ /* Handle the EXEC SQL EXECUTE... statement */
+ if (ECPGst_execute == st)
+ {
+ real_connection_name = ecpg_get_con_name_by_declared_name(query);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+ }
va_start(args, query);
- ret = ecpg_do(lineno, compat, force_indicator, connection_name,
+ ret = ecpg_do(lineno, compat, force_indicator, real_connection_name,
questionmarks, st, query, args);
va_end(args);
diff --git a/src/interfaces/ecpg/ecpglib/exports.txt b/src/interfaces/ecpg/ecpglib/exports.txt
index 69e9617..08fa1bb 100644
--- a/src/interfaces/ecpg/ecpglib/exports.txt
+++ b/src/interfaces/ecpg/ecpglib/exports.txt
@@ -29,3 +29,7 @@ ECPGget_PGconn 26
ECPGtransactionStatus 27
ECPGset_var 28
ECPGget_var 29
+ECPGdeclare 30
+ECPGopen 31
+ECPGfetch 32
+ECPGclose 33
\ No newline at end of file
diff --git a/src/interfaces/ecpg/ecpglib/extern.h b/src/interfaces/ecpg/ecpglib/extern.h
index fb9b5ae..056b6aa 100644
--- a/src/interfaces/ecpg/ecpglib/extern.h
+++ b/src/interfaces/ecpg/ecpglib/extern.h
@@ -66,6 +66,15 @@ struct statement
PGresult *results;
};
+/* structure to store declared statements */
+struct declared_statement
+{
+ char *name; /* declared name */
+ char *connection_name;
+ char *cursor_name;
+ struct declared_statement *next;
+};
+
/* structure to store prepared statements for a connection */
struct prepared_statement
{
@@ -75,6 +84,12 @@ struct prepared_statement
struct prepared_statement *next;
};
+struct cursor_statement
+{
+ char *name; /*cursor name*/
+ struct cursor_statement *next;
+};
+
/* structure to store connections */
struct connection
{
@@ -83,6 +98,7 @@ struct connection
bool autocommit;
struct ECPGtype_information_cache *cache_head;
struct prepared_statement *prep_stmts;
+ struct cursor_statement *cursor_stmts;
struct connection *next;
};
@@ -165,6 +181,11 @@ struct descriptor *ecpg_find_desc(int line, const char *name);
struct prepared_statement *ecpg_find_prepared_statement(const char *,
struct connection *, struct prepared_statement **);
+void ecpg_update_declare_statement(const char *, const char *, const int);
+char *ecpg_get_con_name_by_declared_name(const char *);
+const char *ecpg_get_con_name_by_cursor_name(const char *);
+void ecpg_release_declared_statement(const char *);
+
bool ecpg_store_result(const PGresult *results, int act_field,
const struct statement * stmt, struct variable * var);
bool ecpg_store_input(const int, const bool, const struct variable *, char **, bool);
diff --git a/src/interfaces/ecpg/ecpglib/prepare.c b/src/interfaces/ecpg/ecpglib/prepare.c
index 983b242..140b0b7 100644
--- a/src/interfaces/ecpg/ecpglib/prepare.c
+++ b/src/interfaces/ecpg/ecpglib/prepare.c
@@ -26,9 +26,11 @@ static int nextStmtID = 1;
static const int stmtCacheNBuckets = 2039; /* # buckets - a prime # */
static const int stmtCacheEntPerBucket = 8; /* # entries/bucket */
static stmtCacheEntry stmtCacheEntries[16384] = {{0, {0}, 0, 0, 0}};
+static struct declared_statement *g_declared_list;
static bool deallocate_one(int lineno, enum COMPAT_MODE c, struct connection * con,
struct prepared_statement * prev, struct prepared_statement * this);
+static struct declared_statement *ecpg_find_declared_statement(const char *);
static bool
isvarchar(unsigned char c)
@@ -117,6 +119,7 @@ prepare_common(int lineno, struct connection * con, const char *name, const char
ecpg_free(this);
return false;
}
+ memset(stmt, 0, sizeof(struct statement));
/* create statement */
stmt->lineno = lineno;
@@ -163,11 +166,22 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
(void) questionmarks; /* quiet the compiler */
- con = ecpg_get_connection(connection_name);
- if (!ecpg_init(con, connection_name, lineno))
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ con = ecpg_get_connection(real_connection_name);
+ if (!ecpg_init(con, real_connection_name, lineno))
return false;
/* check if we already have prepared this statement */
@@ -255,9 +269,19 @@ ECPGdeallocate(int lineno, int c, const char *connection_name, const char *name)
struct connection *con;
struct prepared_statement *this,
*prev;
+ const char *real_connection_name = NULL;
- con = ecpg_get_connection(connection_name);
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+ con = ecpg_get_connection(real_connection_name);
if (!ecpg_init(con, connection_name, lineno))
return false;
@@ -305,8 +329,21 @@ ecpg_prepared(const char *name, struct connection * con)
char *
ECPGprepared_statement(const char *connection_name, const char *name, int lineno)
{
+ const char *real_connection_name = NULL;
+
(void) lineno; /* keep the compiler quiet */
- return ecpg_prepared(name, ecpg_get_connection(connection_name));
+
+ real_connection_name = ecpg_get_con_name_by_declared_name(name);
+ if (real_connection_name == NULL)
+ {
+ /*
+ * If can't get the connection name by declared name then using connection name
+ * coming from the parameter connection_name
+ */
+ real_connection_name = connection_name;
+ }
+
+ return ecpg_prepared(name, ecpg_get_connection(real_connection_name));
}
/*
@@ -513,3 +550,200 @@ ecpg_auto_prepare(int lineno, const char *connection_name, const int compat, cha
return (true);
}
+
+/*
+ * handle the EXEC SQL DECLARE STATEMENT
+ * Input: connection_name -- connection name
+ * name -- declared name
+ */
+bool
+ECPGdeclare(int lineno, const char *connection_name, const char *name)
+{
+ struct connection *con = NULL;
+ struct declared_statement *p = NULL;
+
+ if (name == NULL)
+ {
+ /* Should never go to here because ECPG pre-compiler will check it */
+ return false;
+ }
+
+ if (connection_name == NULL)
+ {
+ /*
+ * Going to here means not using AT clause in the DECLARE STATEMENT
+ * ECPG pre-processor allows this case.
+ * However, we don't allocate a node to store the declared name
+ * because the DECLARE STATEMENT without using AT clause will be ignored.
+ * The following statement such as PREPARE, EXECUTE are executed
+ * as usual on the current connection.
+ */
+ return true;
+ }
+
+ con = ecpg_get_connection(connection_name);
+ if (!ecpg_init(con, connection_name, lineno))
+ return false;
+
+ if (ecpg_find_declared_statement(name))
+ {
+ /* Should not go to here because the pre-compiler has check the duplicate name */
+ return false;
+ }
+
+ /* allocate a declared_statement as a new node */
+ p = (struct declared_statement *) ecpg_alloc(sizeof(struct declared_statement), lineno);
+ if (!p)
+ return false;
+
+ memset(p, 0, sizeof(struct declared_statement));
+
+ ecpg_log("ECPGdeclare on line %d: declared name %s on connection: \"%s\"\n", lineno, name, connection_name);
+
+ p->name = ecpg_strdup(name, lineno);
+ p->connection_name = ecpg_strdup(connection_name, lineno);
+
+ /* Add the new node into the g_declared_list */
+ if (g_declared_list != NULL)
+ {
+ p->next = g_declared_list;
+ g_declared_list = p;
+ }
+ else
+ g_declared_list = p;
+
+ return true;
+}
+
+/*
+ * Find a declared node by declared name
+ * Input: name -- declared name
+ * Return: Found -- The pointer points to the declared node
+ * Not found -- NULL
+ */
+static struct declared_statement *
+ecpg_find_declared_statement(const char *name)
+{
+ struct declared_statement *p;
+
+ if (name == NULL)
+ return NULL;
+
+ p = g_declared_list;
+ while (p)
+ {
+ if (strcmp(p->name, name) == 0)
+ return p;
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/*
+ * Build the relationship between the declared name and cursor name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * cursor_name -- cursor name declared in the DECLARE/OPEN CURSOR statement
+ */
+void
+ecpg_update_declare_statement(const char *declared_name, const char *cursor_name, const int lineno)
+{
+ struct declared_statement *p = NULL;
+
+ if (!declared_name || !cursor_name)
+ return;
+
+ /* Find the declared node by declared name */
+ p = ecpg_find_declared_statement(declared_name);
+ if (p)
+ p->cursor_name = ecpg_strdup(cursor_name,lineno);
+}
+
+/*
+ * Find and return the connection name referred by the declared name
+ * Input: declared_name -- the name declared in the DECLARE STATEMENT
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+char *
+ecpg_get_con_name_by_declared_name(const char *declared_name)
+{
+ struct declared_statement *p;
+
+ p = ecpg_find_declared_statement(declared_name);
+ if (p)
+ return p->connection_name;
+
+ return NULL;
+}
+
+/*
+ * Find the connection name by referring the declared statements
+ * cursors by using the provided cursor name
+ * Input: cursor_name -- the cursor name
+ * Return: Found -- The connection name
+ * Not found -- NULL
+ */
+const char *
+ecpg_get_con_name_by_cursor_name(const char *cursor_name)
+{
+ struct declared_statement *p;
+
+ if (cursor_name == NULL)
+ return NULL;
+
+ p = g_declared_list;
+ while (p)
+ {
+ /* Search the cursor name in the declared list */
+ if (p->cursor_name && (strcmp(p->cursor_name, cursor_name) == 0))
+ return p->connection_name;
+
+ p = p->next;
+ }
+
+ return NULL;
+}
+
+/*
+ * Release the declare node from the g_declared_list which refers the connection_name
+ * Input: connection_name -- connection name
+ */
+void
+ecpg_release_declared_statement(const char *connection_name)
+{
+ struct declared_statement *cur = NULL;
+ struct declared_statement *prev = NULL;
+
+ if (connection_name == NULL)
+ return;
+
+ cur = g_declared_list;
+ while (cur)
+ {
+ if (strcmp(cur->connection_name, connection_name) == 0)
+ {
+ /* If find then release the declared node from the list */
+ if (prev)
+ prev->next = cur->next;
+ else
+ g_declared_list = cur->next;
+
+ ecpg_log("ecpg_release_declared_statement: declared name %s is released\n", cur->name);
+
+ ecpg_free(cur->name);
+ ecpg_free(cur->connection_name);
+ ecpg_free(cur->cursor_name);
+ ecpg_free(cur);
+
+ /* One connection can be used by multiple declared name, so no break here */
+ }
+ else
+ prev = cur;
+
+ if (prev)
+ cur = prev->next;
+ else
+ cur = g_declared_list;
+ }
+}
diff --git a/src/interfaces/ecpg/include/ecpgerrno.h b/src/interfaces/ecpg/include/ecpgerrno.h
index 36b15b7..fae9440 100644
--- a/src/interfaces/ecpg/include/ecpgerrno.h
+++ b/src/interfaces/ecpg/include/ecpgerrno.h
@@ -44,6 +44,7 @@
#define ECPG_UNKNOWN_DESCRIPTOR_ITEM -242
#define ECPG_VAR_NOT_NUMERIC -243
#define ECPG_VAR_NOT_CHAR -244
+#define ECPG_INVALID_CURSOR -245
/* finally the backend error messages, they start at 400 */
#define ECPG_PGSQL -400
diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h
index c32df6c..8c91212 100644
--- a/src/interfaces/ecpg/include/ecpglib.h
+++ b/src/interfaces/ecpg/include/ecpglib.h
@@ -55,6 +55,10 @@ bool ECPGdisconnect(int, const char *);
bool ECPGprepare(int, const char *, const bool, const char *, const char *);
bool ECPGdeallocate(int, int, const char *, const char *);
bool ECPGdeallocate_all(int, int, const char *);
+bool ECPGdeclare(int, const char *, const char *);
+bool ECPGopen(const char*, const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGfetch(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
+bool ECPGclose(const char*, const int, const int, const int, const char *, const bool, const int, const char *,...);
char *ECPGprepared_statement(const char *, const char *, int);
PGconn *ECPGget_PGconn(const char *);
PGTransactionStatusType ECPGtransactionStatus(const char *);
diff --git a/src/interfaces/ecpg/include/ecpgtype.h b/src/interfaces/ecpg/include/ecpgtype.h
index 7cc47e9..7512398 100644
--- a/src/interfaces/ecpg/include/ecpgtype.h
+++ b/src/interfaces/ecpg/include/ecpgtype.h
@@ -99,6 +99,13 @@ enum ECPG_statement_type
ECPGst_prepnormal
};
+enum ECPG_cursor_statement_type
+{
+ ECPGcst_declare,
+ ECPGcst_open,
+ ECPGcst_fetch,
+ ECPGcst_close
+};
#ifdef __cplusplus
}
#endif
On Thu, Mar 30, 2017 at 1:57 PM, Ideriha, Takeshi <
ideriha.takeshi@jp.fujitsu.com> wrote:
+ if(connection_name == NULL) + { + /* + * Going to here means not using AT clause in the DECLARE STATEMENT + * We don't allocate a node to store the declared name because the + * DECLARE STATEMENT without using AT clause will be ignored. + */ + return true; + }I am not sure that just ignore the declare statement may be wrong.
I feel whether such case is possible? Does the preprocessor allows it?As you pointed out, the above thing should be discussed.
The current implementation is as follows:ECPG pre-processor allows the DECLARE STATEMENT without using AT clause.
And the following statement after DECLARE STATEMENT such as PREPARE,
EXECUTE are
executed as usual on the current connection.But there's a limitation here.
(This limitation should be disccused earlier and be specified in the
doc...
but I didn't realize this clearly by myself, sorry)When using DECLARE STATEMENT without AT clause
and using OPEN statement with AT clause, it doesn't work.There's an example where you cannot fetch rows from db:
EXEC SQL CONNECT TO db AS con;EXEC SQL DECLARE stmt STATEMENT;
EXEC SQL AT con PREPARE stmt FROM :selectString;
EXEC SQL AT con DECLARE cur CURSOR FOR stmt;
EXEC SQL AT con OPEN cur;
...This limitation looks troublesome for users,
so maybe I need to fix this implementation.
As per above test steps, it doesn't produce the results and doesn't
generate the error also. I feel this needs to be fixed.
As we are at the end of commitfest, it is better you can move it
to next one commitfest and provide an updated patch to solve the
above problem.
Regards,
Hari Babu
Fujitsu Australia
Thank you for prompt check!
As per above test steps, it doesn't produce the results and doesn't
generate the error also. I feel this needs to be fixed.
As we are at the end of commitfest, it is better you can move it
to next one commitfest and provide an updated patch to solve the
above problem.
I tottaly agreed.
I moved to next CF with waiting on author.
Regards,
Ideriha Takeshi
On 30 Mar 2017, at 09:11, Ideriha, Takeshi <ideriha.takeshi@jp.fujitsu.com> wrote:
Thank you for prompt check!
As per above test steps, it doesn't produce the results and doesn't
generate the error also. I feel this needs to be fixed.As we are at the end of commitfest, it is better you can move it
to next one commitfest and provide an updated patch to solve the
above problem.I tottaly agreed.
I moved to next CF with waiting on author.
This patch was moved to the current commitfest (and to the previous one from
the 201701 CF). Have you had the chance to address the review comments such
that there is an update expected within this CF?
cheers ./daniel
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Hi
I’m sorry but I haven’t updated this patch for a half year.
At the CF in last March I got some feedback and it takes some time for me to update my patch.
So I closed this patch as ‘Returned with Feedback’.
I’d like to update my patch and challenge CF again.
Thank you very much for those who invloved in this patch.
Regards,
Takeshi Ideriha
Subject: RE: [HACKERS] [WIP] RE: DECLARE STATEMENT setting up a connection in ECPG
Thank you for prompt check!
As per above test steps, it doesn't produce the results and doesn't
generate the error also. I feel this needs to be fixed.
As we are at the end of commitfest, it is better you can move it
to next one commitfest and provide an updated patch to solve the
above problem.
I tottaly agreed.
I moved to next CF with waiting on author.
Regards,
Ideriha Takeshi