mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +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:
		@@ -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!!
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user