mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04: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