mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +03:00
Add Oracle like handling of char arrays.
In some cases Oracle Pro*C handles char array differently than ECPG. This patch adds a Oracle compatibility mode to make ECPG behave like Pro*C. Patch by David Rader <davidr@openscg.com>
This commit is contained in:
parent
db2fc801f6
commit
3b7ab43804
@ -464,7 +464,45 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
|
||||
|
||||
if (varcharsize == 0 || varcharsize > size)
|
||||
{
|
||||
strncpy(str, pval, size + 1);
|
||||
/* compatibility mode, blank pad and null terminate char array */
|
||||
if (ORACLE_MODE(compat) && (type == ECPGt_char || type == ECPGt_unsigned_char))
|
||||
{
|
||||
memset(str, ' ', varcharsize);
|
||||
memcpy(str, pval, size);
|
||||
str[varcharsize-1] = '\0';
|
||||
|
||||
/* compatiblity mode empty string gets -1 indicator but no warning */
|
||||
if (size == 0) {
|
||||
/* truncation */
|
||||
switch (ind_type)
|
||||
{
|
||||
case ECPGt_short:
|
||||
case ECPGt_unsigned_short:
|
||||
*((short *) (ind + ind_offset * act_tuple)) = -1;
|
||||
break;
|
||||
case ECPGt_int:
|
||||
case ECPGt_unsigned_int:
|
||||
*((int *) (ind + ind_offset * act_tuple)) = -1;
|
||||
break;
|
||||
case ECPGt_long:
|
||||
case ECPGt_unsigned_long:
|
||||
*((long *) (ind + ind_offset * act_tuple)) = -1;
|
||||
break;
|
||||
#ifdef HAVE_LONG_LONG_INT
|
||||
case ECPGt_long_long:
|
||||
case ECPGt_unsigned_long_long:
|
||||
*((long long int *) (ind + ind_offset * act_tuple)) = -1;
|
||||
break;
|
||||
#endif /* HAVE_LONG_LONG_INT */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(str, pval, size + 1);
|
||||
}
|
||||
/* do the rtrim() */
|
||||
if (type == ECPGt_string)
|
||||
{
|
||||
@ -481,7 +519,14 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
|
||||
{
|
||||
strncpy(str, pval, varcharsize);
|
||||
|
||||
if (varcharsize < size)
|
||||
/* compatibility mode, null terminate char array */
|
||||
if (ORACLE_MODE(compat) && (varcharsize - 1) < size)
|
||||
{
|
||||
if (type == ECPGt_char || type == ECPGt_unsigned_char)
|
||||
str[varcharsize-1] = '\0';
|
||||
}
|
||||
|
||||
if (varcharsize < size || (ORACLE_MODE(compat) && (varcharsize - 1) < size))
|
||||
{
|
||||
/* truncation */
|
||||
switch (ind_type)
|
||||
|
@ -15,12 +15,13 @@
|
||||
|
||||
enum COMPAT_MODE
|
||||
{
|
||||
ECPG_COMPAT_PGSQL = 0, ECPG_COMPAT_INFORMIX, ECPG_COMPAT_INFORMIX_SE
|
||||
ECPG_COMPAT_PGSQL = 0, ECPG_COMPAT_INFORMIX, ECPG_COMPAT_INFORMIX_SE, ECPG_COMPAT_ORACLE
|
||||
};
|
||||
|
||||
extern bool ecpg_internal_regression_mode;
|
||||
|
||||
#define INFORMIX_MODE(X) ((X) == ECPG_COMPAT_INFORMIX || (X) == ECPG_COMPAT_INFORMIX_SE)
|
||||
#define ORACLE_MODE(X) ((X) == ECPG_COMPAT_ORACLE)
|
||||
|
||||
enum ARRAY_TYPE
|
||||
{
|
||||
|
@ -41,7 +41,7 @@ help(const char *progname)
|
||||
printf(_(" -c automatically generate C code from embedded SQL code;\n"
|
||||
" this affects EXEC SQL TYPE\n"));
|
||||
printf(_(" -C MODE set compatibility mode; MODE can be one of\n"
|
||||
" \"INFORMIX\", \"INFORMIX_SE\"\n"));
|
||||
" \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n"));
|
||||
#ifdef YYDEBUG
|
||||
printf(_(" -d generate parser debug output\n"));
|
||||
#endif
|
||||
@ -208,6 +208,10 @@ main(int argc, char *const argv[])
|
||||
snprintf(informix_path, MAXPGPATH, "%s/informix/esql", pkginclude_path);
|
||||
add_include_path(informix_path);
|
||||
}
|
||||
else if (strncmp(optarg, "ORACLE", strlen("ORACLE")) == 0)
|
||||
{
|
||||
compat = ECPG_COMPAT_ORACLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), argv[0]);
|
||||
|
@ -122,10 +122,12 @@ extern int filtered_base_yylex(void);
|
||||
|
||||
enum COMPAT_MODE
|
||||
{
|
||||
ECPG_COMPAT_PGSQL = 0, ECPG_COMPAT_INFORMIX, ECPG_COMPAT_INFORMIX_SE
|
||||
ECPG_COMPAT_PGSQL = 0, ECPG_COMPAT_INFORMIX, ECPG_COMPAT_INFORMIX_SE, ECPG_COMPAT_ORACLE
|
||||
};
|
||||
extern enum COMPAT_MODE compat;
|
||||
|
||||
#define INFORMIX_MODE (compat == ECPG_COMPAT_INFORMIX || compat == ECPG_COMPAT_INFORMIX_SE)
|
||||
#define ORACLE_MODE (compat == ECPG_COMPAT_ORACLE)
|
||||
|
||||
|
||||
#endif /* _ECPG_PREPROC_EXTERN_H */
|
||||
|
@ -30,6 +30,7 @@ all install installdirs uninstall distprep:
|
||||
$(MAKE) -C pgtypeslib $@
|
||||
$(MAKE) -C preproc $@
|
||||
$(MAKE) -C compat_informix $@
|
||||
$(MAKE) -C compat_oracle $@
|
||||
$(MAKE) -C thread $@
|
||||
|
||||
clean distclean maintainer-clean:
|
||||
@ -38,6 +39,7 @@ clean distclean maintainer-clean:
|
||||
$(MAKE) -C pgtypeslib $@
|
||||
$(MAKE) -C preproc $@
|
||||
$(MAKE) -C compat_informix $@
|
||||
$(MAKE) -C compat_oracle $@
|
||||
$(MAKE) -C thread $@
|
||||
rm -rf tmp_check results log
|
||||
rm -f pg_regress regression.diffs regression.out pg_regress_ecpg.o $(WIN32RES)
|
||||
|
2
src/interfaces/ecpg/test/compat_oracle/.gitignore
vendored
Normal file
2
src/interfaces/ecpg/test/compat_oracle/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/char_array
|
||||
/char_array.c
|
11
src/interfaces/ecpg/test/compat_oracle/Makefile
Normal file
11
src/interfaces/ecpg/test/compat_oracle/Makefile
Normal file
@ -0,0 +1,11 @@
|
||||
subdir = src/interfaces/ecpg/test/compat_oracle
|
||||
top_builddir = ../../../../..
|
||||
include $(top_builddir)/src/Makefile.global
|
||||
include $(top_srcdir)/$(subdir)/../Makefile.regress
|
||||
|
||||
# Use special oracle compatibility switch for all tests in this directory
|
||||
ECPG += -C ORACLE
|
||||
|
||||
TESTS = char_array char_array.c
|
||||
|
||||
all: $(TESTS)
|
66
src/interfaces/ecpg/test/compat_oracle/char_array.pgc
Normal file
66
src/interfaces/ecpg/test/compat_oracle/char_array.pgc
Normal file
@ -0,0 +1,66 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
EXEC SQL INCLUDE ../regression;
|
||||
|
||||
static void warn();
|
||||
|
||||
/* Compatible handling of char array to retrieve varchar field to char array
|
||||
should be fixed-length, blank-padded, then null-terminated.
|
||||
Conforms to the ANSI Fixed Character type. */
|
||||
|
||||
int main() {
|
||||
|
||||
ECPGdebug(1, stderr);
|
||||
EXEC SQL CONNECT TO REGRESSDB1;
|
||||
|
||||
EXEC SQL WHENEVER SQLWARNING do warn();
|
||||
EXEC SQL WHENEVER SQLERROR SQLPRINT;
|
||||
|
||||
const char *ppppp = "XXXXX";
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
char shortstr[5];
|
||||
char bigstr[11];
|
||||
short shstr_ind = 0;
|
||||
short bigstr_ind = 0;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
|
||||
EXEC SQL CREATE TABLE strdbase (strval varchar(10));
|
||||
EXEC SQL INSERT INTO strdbase values ('');
|
||||
EXEC SQL INSERT INTO strdbase values ('AB');
|
||||
EXEC SQL INSERT INTO strdbase values ('ABCD');
|
||||
EXEC SQL INSERT INTO strdbase values ('ABCDE');
|
||||
EXEC SQL INSERT INTO strdbase values ('ABCDEF');
|
||||
EXEC SQL INSERT INTO strdbase values ('ABCDEFGHIJ');
|
||||
|
||||
EXEC SQL declare C cursor for select strval, strval from strdbase;
|
||||
EXEC SQL OPEN C;
|
||||
|
||||
EXEC SQL WHENEVER NOT FOUND DO BREAK;
|
||||
|
||||
printf("Full Str. : Short Ind.\n");
|
||||
while(1) {
|
||||
strncpy(shortstr, ppppp, sizeof shortstr);
|
||||
memset(bigstr, 0, sizeof bigstr);
|
||||
EXEC SQL FETCH C into :bigstr :bigstr_ind, :shortstr :shstr_ind;
|
||||
printf("\"%s\": \"%s\" %d\n", bigstr, shortstr, shstr_ind);
|
||||
}
|
||||
|
||||
EXEC SQL close cstr;
|
||||
EXEC SQL DROP TABLE strdbase;
|
||||
|
||||
printf("\nGOOD-BYE!!\n\n");
|
||||
|
||||
EXEC SQL COMMIT WORK;
|
||||
|
||||
EXEC SQL DISCONNECT ALL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void warn(void)
|
||||
{
|
||||
fprintf(stderr, "Warning: At least one column was truncated\n");
|
||||
}
|
@ -7,6 +7,7 @@ test: compat_informix/sqlda
|
||||
test: compat_informix/describe
|
||||
test: compat_informix/test_informix
|
||||
test: compat_informix/test_informix2
|
||||
test: compat_oracle/char_array
|
||||
test: connect/test2
|
||||
test: connect/test3
|
||||
test: connect/test4
|
||||
|
219
src/interfaces/ecpg/test/expected/compat_oracle-char_array.c
Normal file
219
src/interfaces/ecpg/test/expected/compat_oracle-char_array.c
Normal file
@ -0,0 +1,219 @@
|
||||
/* 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 "char_array.pgc"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#line 1 "regression.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#line 5 "char_array.pgc"
|
||||
|
||||
|
||||
static void warn();
|
||||
|
||||
/* Compatible handling of char array to retrieve varchar field to char array
|
||||
should be fixed-length, blank-padded, then null-terminated.
|
||||
Conforms to the ANSI Fixed Character type. */
|
||||
|
||||
int main() {
|
||||
|
||||
ECPGdebug(1, stderr);
|
||||
{ ECPGconnect(__LINE__, 3, "ecpg1_regression" , NULL, NULL , NULL, 0); }
|
||||
#line 16 "char_array.pgc"
|
||||
|
||||
|
||||
/* exec sql whenever sql_warning do warn ( ) ; */
|
||||
#line 18 "char_array.pgc"
|
||||
|
||||
/* exec sql whenever sqlerror sqlprint ; */
|
||||
#line 19 "char_array.pgc"
|
||||
|
||||
|
||||
const char *ppppp = "XXXXX";
|
||||
|
||||
/* exec sql begin declare section */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#line 24 "char_array.pgc"
|
||||
char shortstr [ 5 ] ;
|
||||
|
||||
#line 25 "char_array.pgc"
|
||||
char bigstr [ 11 ] ;
|
||||
|
||||
#line 26 "char_array.pgc"
|
||||
short shstr_ind = 0 ;
|
||||
|
||||
#line 27 "char_array.pgc"
|
||||
short bigstr_ind = 0 ;
|
||||
/* exec sql end declare section */
|
||||
#line 28 "char_array.pgc"
|
||||
|
||||
|
||||
{ ECPGdo(__LINE__, 3, 1, NULL, 0, ECPGst_normal, "create table strdbase ( strval varchar ( 10 ) )", ECPGt_EOIT, ECPGt_EORT);
|
||||
#line 30 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 30 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 30 "char_array.pgc"
|
||||
|
||||
{ ECPGdo(__LINE__, 3, 1, NULL, 0, ECPGst_normal, "insert into strdbase values ( '' )", ECPGt_EOIT, ECPGt_EORT);
|
||||
#line 31 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 31 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 31 "char_array.pgc"
|
||||
|
||||
{ ECPGdo(__LINE__, 3, 1, NULL, 0, ECPGst_normal, "insert into strdbase values ( 'AB' )", ECPGt_EOIT, ECPGt_EORT);
|
||||
#line 32 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 32 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 32 "char_array.pgc"
|
||||
|
||||
{ ECPGdo(__LINE__, 3, 1, NULL, 0, ECPGst_normal, "insert into strdbase values ( 'ABCD' )", ECPGt_EOIT, ECPGt_EORT);
|
||||
#line 33 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 33 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 33 "char_array.pgc"
|
||||
|
||||
{ ECPGdo(__LINE__, 3, 1, NULL, 0, ECPGst_normal, "insert into strdbase values ( 'ABCDE' )", ECPGt_EOIT, ECPGt_EORT);
|
||||
#line 34 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 34 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 34 "char_array.pgc"
|
||||
|
||||
{ ECPGdo(__LINE__, 3, 1, NULL, 0, ECPGst_normal, "insert into strdbase values ( 'ABCDEF' )", ECPGt_EOIT, ECPGt_EORT);
|
||||
#line 35 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 35 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 35 "char_array.pgc"
|
||||
|
||||
{ ECPGdo(__LINE__, 3, 1, NULL, 0, ECPGst_normal, "insert into strdbase values ( 'ABCDEFGHIJ' )", ECPGt_EOIT, ECPGt_EORT);
|
||||
#line 36 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 36 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 36 "char_array.pgc"
|
||||
|
||||
|
||||
/* declare C cursor for select strval , strval from strdbase */
|
||||
#line 38 "char_array.pgc"
|
||||
|
||||
{ ECPGdo(__LINE__, 3, 1, NULL, 0, ECPGst_normal, "declare C cursor for select strval , strval from strdbase", ECPGt_EOIT, ECPGt_EORT);
|
||||
#line 39 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 39 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 39 "char_array.pgc"
|
||||
|
||||
|
||||
/* exec sql whenever not found break ; */
|
||||
#line 41 "char_array.pgc"
|
||||
|
||||
|
||||
printf("Full Str. : Short Ind.\n");
|
||||
while(1) {
|
||||
strncpy(shortstr, ppppp, sizeof shortstr);
|
||||
memset(bigstr, 0, sizeof bigstr);
|
||||
{ ECPGdo(__LINE__, 3, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
|
||||
ECPGt_char,(bigstr),(long)11,(long)1,(11)*sizeof(char),
|
||||
ECPGt_short,&(bigstr_ind),(long)1,(long)1,sizeof(short),
|
||||
ECPGt_char,(shortstr),(long)5,(long)1,(5)*sizeof(char),
|
||||
ECPGt_short,&(shstr_ind),(long)1,(long)1,sizeof(short), ECPGt_EORT);
|
||||
#line 47 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
|
||||
#line 47 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 47 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 47 "char_array.pgc"
|
||||
|
||||
printf("\"%s\": \"%s\" %d\n", bigstr, shortstr, shstr_ind);
|
||||
}
|
||||
|
||||
{ ECPGdo(__LINE__, 3, 1, NULL, 0, ECPGst_normal, "close cstr", ECPGt_EOIT, ECPGt_EORT);
|
||||
#line 51 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 51 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 51 "char_array.pgc"
|
||||
|
||||
{ ECPGdo(__LINE__, 3, 1, NULL, 0, ECPGst_normal, "drop table strdbase", ECPGt_EOIT, ECPGt_EORT);
|
||||
#line 52 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 52 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 52 "char_array.pgc"
|
||||
|
||||
|
||||
printf("\nGOOD-BYE!!\n\n");
|
||||
|
||||
{ ECPGtrans(__LINE__, NULL, "commit work");
|
||||
#line 56 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 56 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 56 "char_array.pgc"
|
||||
|
||||
|
||||
{ ECPGdisconnect(__LINE__, "ALL");
|
||||
#line 58 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlwarn[0] == 'W') warn ( );
|
||||
#line 58 "char_array.pgc"
|
||||
|
||||
if (sqlca.sqlcode < 0) sqlprint();}
|
||||
#line 58 "char_array.pgc"
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void warn(void)
|
||||
{
|
||||
fprintf(stderr, "Warning: At least one column was truncated\n");
|
||||
}
|
@ -0,0 +1,145 @@
|
||||
[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]: ecpg_execute on line 30: query: create table strdbase ( strval varchar ( 10 ) ); with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 30: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_process_output on line 30: OK: CREATE TABLE
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 31: query: insert into strdbase values ( '' ); with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 31: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_process_output on line 31: OK: INSERT 0 1
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 32: query: insert into strdbase values ( 'AB' ); with 0 parameter(s) on connection ecpg1_regression
|
||||
[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: INSERT 0 1
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 33: query: insert into strdbase values ( 'ABCD' ); with 0 parameter(s) on connection ecpg1_regression
|
||||
[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: INSERT 0 1
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 34: query: insert into strdbase values ( 'ABCDE' ); with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 34: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_process_output on line 34: OK: INSERT 0 1
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 35: query: insert into strdbase values ( 'ABCDEF' ); with 0 parameter(s) on connection ecpg1_regression
|
||||
[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 strdbase values ( 'ABCDEFGHIJ' ); with 0 parameter(s) on connection ecpg1_regression
|
||||
[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 39: query: declare C cursor for select strval , strval from strdbase; with 0 parameter(s) on connection ecpg1_regression
|
||||
[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: DECLARE CURSOR
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 47: query: fetch C; with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 47: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_process_output on line 47: correctly got 1 tuples with 2 fields
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 47: query: fetch C; with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 47: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_process_output on line 47: correctly got 1 tuples with 2 fields
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: AB offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: AB offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 47: query: fetch C; with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 47: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_process_output on line 47: correctly got 1 tuples with 2 fields
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: ABCD offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: ABCD offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 47: query: fetch C; with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 47: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_process_output on line 47: correctly got 1 tuples with 2 fields
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: ABCDE offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: ABCDE offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
Warning: At least one column was truncated
|
||||
[NO_PID]: ecpg_execute on line 47: query: fetch C; with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 47: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_process_output on line 47: correctly got 1 tuples with 2 fields
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: ABCDEF offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: ABCDEF offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
Warning: At least one column was truncated
|
||||
[NO_PID]: ecpg_execute on line 47: query: fetch C; with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 47: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_process_output on line 47: correctly got 1 tuples with 2 fields
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: ABCDEFGHIJ offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_get_data on line 47: RESULT: ABCDEFGHIJ offset: -1; array: no
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
Warning: At least one column was truncated
|
||||
[NO_PID]: ecpg_execute on line 47: query: fetch C; with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 47: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_process_output on line 47: correctly got 0 tuples with 2 fields
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: raising sqlcode 100 on line 47: no data found on line 47
|
||||
[NO_PID]: sqlca: code: 100, state: 02000
|
||||
[NO_PID]: ecpg_execute on line 51: query: close cstr; with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 51: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_check_PQresult on line 51: bad response - ERROR: cursor "cstr" does not exist
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: raising sqlstate 34000 (sqlcode -400): cursor "cstr" does not exist on line 51
|
||||
[NO_PID]: sqlca: code: -400, state: 34000
|
||||
SQL error: cursor "cstr" does not exist on line 51
|
||||
[NO_PID]: ecpg_execute on line 52: query: drop table strdbase; with 0 parameter(s) on connection ecpg1_regression
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_execute on line 52: using PQexec
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_check_PQresult on line 52: bad response - ERROR: current transaction is aborted, commands ignored until end of transaction block
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: raising sqlstate 25P02 (sqlcode -400): current transaction is aborted, commands ignored until end of transaction block on line 52
|
||||
[NO_PID]: sqlca: code: -400, state: 25P02
|
||||
SQL error: current transaction is aborted, commands ignored until end of transaction block on line 52
|
||||
[NO_PID]: ECPGtrans on line 56: action "commit work"; connection "ecpg1_regression"
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
||||
[NO_PID]: ecpg_finish: connection ecpg1_regression closed
|
||||
[NO_PID]: sqlca: code: 0, state: 00000
|
@ -0,0 +1,10 @@
|
||||
Full Str. : Short Ind.
|
||||
" ": " " -1
|
||||
"AB ": "AB " 0
|
||||
"ABCD ": "ABCD" 0
|
||||
"ABCDE ": "ABCD" 5
|
||||
"ABCDEF ": "ABCD" 6
|
||||
"ABCDEFGHIJ": "ABCD" 10
|
||||
|
||||
GOOD-BYE!!
|
||||
|
Loading…
x
Reference in New Issue
Block a user