mirror of https://github.com/postgres/postgres
This reverts commit bd7c95f0c1
,
along with assorted follow-on fixes. There are some questions
about the definition and implementation of that statement, and
we don't have time to resolve them before v13 release. Rather
than ship the feature and then have backwards-compatibility
concerns constraining any redesign, let's remove it for now
and try again later.
Discussion: https://postgr.es/m/TY2PR01MB2443EC8286995378AEB7D9F8F5B10@TY2PR01MB2443.jpnprd01.prod.outlook.com
pull/47/head
parent
d1b0007639
commit
96b6c82c9d
@ -1,261 +0,0 @@ |
||||
/* 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 "ecpglib_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); |
||||
|
||||
/* send the query to backend */ |
||||
va_start(args, query); |
||||
|
||||
status = ecpg_do(lineno, compat, force_indicator, real_connection_name, questionmarks, st, query, args); |
||||
|
||||
va_end(args); |
||||
|
||||
/* if it fails, raise an error */ |
||||
if (!status) |
||||
{ |
||||
ecpg_raise(lineno, ECPG_INVALID_CURSOR, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL); |
||||
return false; |
||||
} |
||||
|
||||
/* check the existence of the cursor in the connection */ |
||||
if (find_cursor(cursor_name, con) == true) |
||||
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; |
||||
} |
@ -1,595 +0,0 @@ |
||||
/* 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 without using AT clause, |
||||
* using PREPARE and CURSOR statement without using AT clause |
||||
*/ |
||||
reset(); |
||||
|
||||
{ ECPGdeclare(__LINE__, NULL, "stmt_1"); |
||||
#line 73 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 73 "declare.pgc" |
||||
|
||||
{ ECPGprepare(__LINE__, NULL, 0, "stmt_1", selectString); |
||||
#line 74 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 74 "declare.pgc" |
||||
|
||||
/* declare cur_1 cursor for $1 */ |
||||
#line 75 "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 76 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 76 "declare.pgc" |
||||
|
||||
|
||||
/* exec sql whenever not found break ; */ |
||||
#line 78 "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 82 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode == ECPG_NOT_FOUND) break; |
||||
#line 82 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 82 "declare.pgc" |
||||
|
||||
i++; |
||||
} |
||||
{ ECPGclose("cur_1", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_1", ECPGt_EOIT, ECPGt_EORT); |
||||
#line 85 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 85 "declare.pgc" |
||||
|
||||
{ ECPGdeallocate(__LINE__, 0, NULL, "stmt_1"); |
||||
#line 86 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 86 "declare.pgc" |
||||
|
||||
/* exec sql whenever not found continue ; */ |
||||
#line 87 "declare.pgc" |
||||
|
||||
|
||||
printResult("testcase1", 2); |
||||
|
||||
|
||||
/*
|
||||
* testcase2. using DECLARE STATEMENT at con1, |
||||
* using PREPARE and CURSOR statement without using AT clause |
||||
*/ |
||||
reset(); |
||||
|
||||
{ ECPGdeclare(__LINE__, "con1", "stmt_2"); |
||||
#line 98 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 98 "declare.pgc" |
||||
|
||||
{ ECPGprepare(__LINE__, NULL, 0, "stmt_2", selectString); |
||||
#line 99 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 99 "declare.pgc" |
||||
|
||||
/* declare cur_2 cursor for $1 */ |
||||
#line 100 "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 101 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 101 "declare.pgc" |
||||
|
||||
|
||||
/* exec sql whenever not found break ; */ |
||||
#line 103 "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 107 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode == ECPG_NOT_FOUND) break; |
||||
#line 107 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 107 "declare.pgc" |
||||
|
||||
i++; |
||||
} |
||||
{ ECPGclose("cur_2", __LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur_2", ECPGt_EOIT, ECPGt_EORT); |
||||
#line 110 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 110 "declare.pgc" |
||||
|
||||
{ ECPGdeallocate(__LINE__, 0, NULL, "stmt_2"); |
||||
#line 111 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 111 "declare.pgc" |
||||
|
||||
/* exec sql whenever not found continue ; */ |
||||
#line 112 "declare.pgc" |
||||
|
||||
|
||||
printResult("testcase2", 2); |
||||
|
||||
/*
|
||||
* testcase3. using DECLARE STATEMENT at con1, |
||||
* using PREPARE and CURSOR statement at con2 |
||||
*/ |
||||
reset(); |
||||
|
||||
{ ECPGdeclare(__LINE__, "con1", "stmt_3"); |
||||
#line 122 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 122 "declare.pgc" |
||||
|
||||
{ ECPGprepare(__LINE__, "con2", 0, "stmt_3", selectString); |
||||
#line 123 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 123 "declare.pgc" |
||||
|
||||
/* declare cur_3 cursor for $1 */ |
||||
#line 124 "declare.pgc" |
||||
|
||||
{ ECPGopen("cur_3", "stmt_3", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare cur_3 cursor for $1",
|
||||
ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_3", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
|
||||
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT); |
||||
#line 125 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 125 "declare.pgc" |
||||
|
||||
|
||||
/* exec sql whenever not found break ; */ |
||||
#line 127 "declare.pgc" |
||||
|
||||
i = 0; |
||||
while (1) |
||||
{ |
||||
{ ECPGfetch("cur_3", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch cur_3", 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 131 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode == ECPG_NOT_FOUND) break; |
||||
#line 131 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 131 "declare.pgc" |
||||
|
||||
i++; |
||||
} |
||||
{ ECPGclose("cur_3", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close cur_3", ECPGt_EOIT, ECPGt_EORT); |
||||
#line 134 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 134 "declare.pgc" |
||||
|
||||
{ ECPGdeallocate(__LINE__, 0, "con2", "stmt_3"); |
||||
#line 135 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 135 "declare.pgc" |
||||
|
||||
/* exec sql whenever not found continue ; */ |
||||
#line 136 "declare.pgc" |
||||
|
||||
|
||||
printResult("testcase3", 2); |
||||
|
||||
|
||||
/*
|
||||
* testcase4. using DECLARE STATEMENT without using AT clause, |
||||
* using PREPARE and CURSOR statement at con2 |
||||
*/ |
||||
reset(); |
||||
|
||||
{ ECPGdeclare(__LINE__, NULL, "stmt_4"); |
||||
#line 147 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 147 "declare.pgc" |
||||
|
||||
{ ECPGprepare(__LINE__, "con2", 0, "stmt_4", selectString); |
||||
#line 148 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 148 "declare.pgc" |
||||
|
||||
/* declare cur_4 cursor for $1 */ |
||||
#line 149 "declare.pgc" |
||||
|
||||
{ ECPGopen("cur_4", "stmt_4", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "declare cur_4 cursor for $1",
|
||||
ECPGt_char_variable,(ECPGprepared_statement("con2", "stmt_4", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
|
||||
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT); |
||||
#line 150 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 150 "declare.pgc" |
||||
|
||||
|
||||
/* exec sql whenever not found break ; */ |
||||
#line 152 "declare.pgc" |
||||
|
||||
i = 0; |
||||
while (1) |
||||
{ |
||||
{ ECPGfetch("cur_4", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "fetch cur_4", 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 156 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode == ECPG_NOT_FOUND) break; |
||||
#line 156 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 156 "declare.pgc" |
||||
|
||||
i++; |
||||
} |
||||
{ ECPGclose("cur_4", __LINE__, 0, 1, "con2", 0, ECPGst_normal, "close cur_4", ECPGt_EOIT, ECPGt_EORT); |
||||
#line 159 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 159 "declare.pgc" |
||||
|
||||
{ ECPGdeallocate(__LINE__, 0, "con2", "stmt_4"); |
||||
#line 160 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 160 "declare.pgc" |
||||
|
||||
/* exec sql whenever not found continue ; */ |
||||
#line 161 "declare.pgc" |
||||
|
||||
|
||||
printResult("testcase4", 2); |
||||
|
||||
/*
|
||||
* testcase5. using DECLARE STATEMENT without using AT clause, |
||||
* using PREPARE and EXECUTE statement without using AT clause |
||||
*/ |
||||
reset(); |
||||
|
||||
{ ECPGdeclare(__LINE__, NULL, "stmt_5"); |
||||
#line 171 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 171 "declare.pgc" |
||||
|
||||
{ ECPGprepare(__LINE__, NULL, 0, "stmt_5", selectString); |
||||
#line 172 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 172 "declare.pgc" |
||||
|
||||
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "stmt_5", 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 173 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 173 "declare.pgc" |
||||
|
||||
|
||||
{ ECPGdeallocate(__LINE__, 0, NULL, "stmt_5"); |
||||
#line 175 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 175 "declare.pgc" |
||||
|
||||
|
||||
printResult("testcase5", 2); |
||||
} |
||||
|
||||
void commitTable() |
||||
{ |
||||
{ ECPGtrans(__LINE__, "con1", "commit"); |
||||
#line 182 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 182 "declare.pgc" |
||||
|
||||
{ ECPGtrans(__LINE__, "con2", "commit"); |
||||
#line 183 "declare.pgc" |
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();} |
||||
#line 183 "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"); |
||||
} |
@ -1,288 +0,0 @@ |
||||
[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 182: action "commit"; connection "con1" |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ECPGtrans on line 183: action "commit"; connection "con2" |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: prepare_common on line 74: name stmt_1; query: "SELECT f1,f2,f3 FROM source" |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 76: query: declare cur_1 cursor for 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 76: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 76: OK: DECLARE CURSOR |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 82: query: fetch cur_1; with 0 parameter(s) on connection con2 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 82: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 82: correctly got 1 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 82: RESULT: 1 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 82: RESULT: 10 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 82: RESULT: db on con2 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 82: query: fetch cur_1; with 0 parameter(s) on connection con2 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 82: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 82: correctly got 1 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 82: RESULT: 2 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 82: RESULT: 20 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 82: RESULT: db on con2 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 82: query: fetch cur_1; with 0 parameter(s) on connection con2 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 82: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 82: correctly got 0 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: raising sqlcode 100 on line 82: no data found on line 82 |
||||
[NO_PID]: sqlca: code: 100, state: 02000 |
||||
[NO_PID]: ecpg_execute on line 85: query: close cur_1; with 0 parameter(s) on connection con2 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 85: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 85: OK: CLOSE CURSOR |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: deallocate_one on line 86: name stmt_1 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ECPGdeclare on line 98: declared name "stmt_2" on connection: "con1" |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: prepare_common on line 99: name stmt_2; query: "SELECT f1,f2,f3 FROM source" |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 101: query: declare cur_2 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 101: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 101: OK: DECLARE CURSOR |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 107: query: fetch cur_2; with 0 parameter(s) on connection con1 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 107: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 107: correctly got 1 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 107: RESULT: 1 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 107: RESULT: 10 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 107: RESULT: db on con1 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 107: query: fetch cur_2; with 0 parameter(s) on connection con1 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 107: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 107: correctly got 1 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 107: RESULT: 2 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 107: RESULT: 20 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 107: RESULT: db on con1 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 107: query: fetch cur_2; with 0 parameter(s) on connection con1 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 107: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 107: correctly got 0 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: raising sqlcode 100 on line 107: no data found on line 107 |
||||
[NO_PID]: sqlca: code: 100, state: 02000 |
||||
[NO_PID]: ecpg_execute on line 110: query: close cur_2; with 0 parameter(s) on connection con1 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 110: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 110: OK: CLOSE CURSOR |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: deallocate_one on line 111: name stmt_2 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ECPGdeclare on line 122: declared name "stmt_3" on connection: "con1" |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: prepare_common on line 123: name stmt_3; query: "SELECT f1,f2,f3 FROM source" |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 125: query: declare cur_3 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 125: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 125: OK: DECLARE CURSOR |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 131: query: fetch cur_3; with 0 parameter(s) on connection con1 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 131: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 131: correctly got 1 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 131: RESULT: 1 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 131: RESULT: 10 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 131: RESULT: db on con1 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 131: query: fetch cur_3; with 0 parameter(s) on connection con1 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 131: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 131: correctly got 1 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 131: RESULT: 2 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 131: RESULT: 20 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 131: RESULT: db on con1 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 131: query: fetch cur_3; with 0 parameter(s) on connection con1 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 131: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 131: correctly got 0 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: raising sqlcode 100 on line 131: no data found on line 131 |
||||
[NO_PID]: sqlca: code: 100, state: 02000 |
||||
[NO_PID]: ecpg_execute on line 134: query: close cur_3; with 0 parameter(s) on connection con1 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 134: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 134: OK: CLOSE CURSOR |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: deallocate_one on line 135: name stmt_3 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: prepare_common on line 148: name stmt_4; query: "SELECT f1,f2,f3 FROM source" |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 150: query: declare cur_4 cursor for 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 150: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 150: OK: DECLARE CURSOR |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 156: query: fetch cur_4; with 0 parameter(s) on connection con2 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 156: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 156: correctly got 1 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 156: RESULT: 1 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 156: RESULT: 10 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 156: RESULT: db on con2 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 156: query: fetch cur_4; with 0 parameter(s) on connection con2 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 156: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 156: correctly got 1 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 156: RESULT: 2 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 156: RESULT: 20 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 156: RESULT: db on con2 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 156: query: fetch cur_4; with 0 parameter(s) on connection con2 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 156: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 156: correctly got 0 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: raising sqlcode 100 on line 156: no data found on line 156 |
||||
[NO_PID]: sqlca: code: 100, state: 02000 |
||||
[NO_PID]: ecpg_execute on line 159: query: close cur_4; with 0 parameter(s) on connection con2 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 159: using PQexec |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 159: OK: CLOSE CURSOR |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: deallocate_one on line 160: name stmt_4 |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: prepare_common on line 172: name stmt_5; query: "SELECT f1,f2,f3 FROM source" |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_execute on line 173: 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 173: using PQexecPrepared for "SELECT f1,f2,f3 FROM source" |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_process_output on line 173: correctly got 2 tuples with 3 fields |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 173: RESULT: 1 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 173: RESULT: 2 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 173: RESULT: 10 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 173: RESULT: 20 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 173: RESULT: db on con2 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_get_data on line 173: RESULT: db on con2 offset: -1; array: no |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: deallocate_one on line 175: name stmt_5 |
||||
[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 182: action "commit"; connection "con1" |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ECPGtrans on line 183: 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_3" is released |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_release_declared_statement: declared name "stmt_2" is released |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
||||
[NO_PID]: ecpg_finish: connection con1 closed |
||||
[NO_PID]: sqlca: code: 0, state: 00000 |
@ -1,20 +0,0 @@ |
||||
****testcase1 test results:**** |
||||
f1=1, f2=10, f3=db on con2 |
||||
f1=2, f2=20, f3=db on con2 |
||||
|
||||
****testcase2 test results:**** |
||||
f1=1, f2=10, f3=db on con1 |
||||
f1=2, f2=20, f3=db on con1 |
||||
|
||||
****testcase3 test results:**** |
||||
f1=1, f2=10, f3=db on con1 |
||||
f1=2, f2=20, f3=db on con1 |
||||
|
||||
****testcase4 test results:**** |
||||
f1=1, f2=10, f3=db on con2 |
||||
f1=2, f2=20, f3=db on con2 |
||||
|
||||
****testcase5 test results:**** |
||||
f1=1, f2=10, f3=db on con2 |
||||
f1=2, f2=20, f3=db on con2 |
||||
|
@ -1,207 +0,0 @@ |
||||
#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 without using AT clause, |
||||
* using PREPARE and CURSOR statement without using AT clause |
||||
*/ |
||||
reset(); |
||||
|
||||
EXEC SQL 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 at con1, |
||||
* using PREPARE and CURSOR statement without using AT clause |
||||
*/ |
||||
reset(); |
||||
|
||||
EXEC SQL AT con1 DECLARE stmt_2 STATEMENT; |
||||
EXEC SQL PREPARE stmt_2 FROM :selectString; |
||||
EXEC SQL DECLARE cur_2 CURSOR FOR stmt_2; |
||||
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; |
||||
|
||||
printResult("testcase2", 2); |
||||
|
||||
/* |
||||
* testcase3. using DECLARE STATEMENT at con1, |
||||
* using PREPARE and CURSOR statement at con2 |
||||
*/ |
||||
reset(); |
||||
|
||||
EXEC SQL AT con1 DECLARE stmt_3 STATEMENT; |
||||
EXEC SQL AT con2 PREPARE stmt_3 FROM :selectString; |
||||
EXEC SQL AT con2 DECLARE cur_3 CURSOR FOR stmt_3; |
||||
EXEC SQL AT con2 OPEN cur_3; |
||||
|
||||
EXEC SQL WHENEVER NOT FOUND DO BREAK; |
||||
i = 0; |
||||
while (1) |
||||
{ |
||||
EXEC SQL AT con2 FETCH cur_3 INTO :f1[i], :f2[i], :f3[i]; |
||||
i++; |
||||
} |
||||
EXEC SQL AT con2 CLOSE cur_3; |
||||
EXEC SQL AT con2 DEALLOCATE PREPARE stmt_3; |
||||
EXEC SQL WHENEVER NOT FOUND CONTINUE; |
||||
|
||||
printResult("testcase3", 2); |
||||
|
||||
|
||||
/* |
||||
* testcase4. using DECLARE STATEMENT without using AT clause, |
||||
* using PREPARE and CURSOR statement at con2 |
||||
*/ |
||||
reset(); |
||||
|
||||
EXEC SQL DECLARE stmt_4 STATEMENT; |
||||
EXEC SQL AT con2 PREPARE stmt_4 FROM :selectString; |
||||
EXEC SQL AT con2 DECLARE cur_4 CURSOR FOR stmt_4; |
||||
EXEC SQL AT con2 OPEN cur_4; |
||||
|
||||
EXEC SQL WHENEVER NOT FOUND DO BREAK; |
||||
i = 0; |
||||
while (1) |
||||
{ |
||||
EXEC SQL AT con2 FETCH cur_4 INTO :f1[i], :f2[i], :f3[i]; |
||||
i++; |
||||
} |
||||
EXEC SQL AT con2 CLOSE cur_4; |
||||
EXEC SQL AT con2 DEALLOCATE PREPARE stmt_4; |
||||
EXEC SQL WHENEVER NOT FOUND CONTINUE; |
||||
|
||||
printResult("testcase4", 2); |
||||
|
||||
/* |
||||
* testcase5. using DECLARE STATEMENT without using AT clause, |
||||
* using PREPARE and EXECUTE statement without using AT clause |
||||
*/ |
||||
reset(); |
||||
|
||||
EXEC SQL DECLARE stmt_5 STATEMENT; |
||||
EXEC SQL PREPARE stmt_5 FROM :selectString; |
||||
EXEC SQL EXECUTE stmt_5 INTO :f1, :f2, :f3; |
||||
|
||||
EXEC SQL DEALLOCATE PREPARE stmt_5; |
||||
|
||||
printResult("testcase5", 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"); |
||||
} |
Loading…
Reference in new issue