From 54f55276060529343dff7c942604c7644a3f0f21 Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Tue, 22 Aug 2006 12:46:18 +0000 Subject: [PATCH] Descriptor values were quoted twice. Fixed some regression test problems. --- src/interfaces/ecpg/ChangeLog | 5 +++- src/interfaces/ecpg/ecpglib/execute.c | 24 ++++++++++++++----- .../ecpg/test/expected/pgtypeslib-dt_test.c | 15 ++++++------ .../test/expected/pgtypeslib-dt_test.stderr | 4 ++-- src/interfaces/ecpg/test/expected/sql-desc.c | 16 ++++++------- .../ecpg/test/expected/sql-desc.stderr | 8 +++---- .../ecpg/test/expected/sql-desc.stdout | 2 +- .../ecpg/test/pgtypeslib/dt_test.pgc | 5 ++-- src/interfaces/ecpg/test/sql/desc.pgc | 2 +- 9 files changed, 47 insertions(+), 34 deletions(-) diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 7ecb2f0b6d..0c23471cf8 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -2095,7 +2095,6 @@ Mo Aug 14 10:39:59 CEST 2006 - Fixed broken newline on Windows. - Fixed a nasty buffer underrun that only occured when using Informix no_indicator NULL setting on timestamps and intervals. -<<<<<<< ChangeLog Fr 18. Aug 17:32:54 CEST 2006 @@ -2107,5 +2106,9 @@ Fr 18. Aug 17:32:54 CEST 2006 Sa 19. Aug 14:11:32 CEST 2006 - More SoC stuff. + +Tu 22. Aug 13:54:08 CEST 2006 + + - Descriptor values were quoted twice. - Set ecpg library version to 5.2. - Set ecpg version to 4.2.1. diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index 0eb12e1b15..bba3b6ee49 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.59 2006/08/18 16:30:53 meskes Exp $ */ +/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.60 2006/08/22 12:46:17 meskes Exp $ */ /* * The aim is to get a simpler inteface to the database routines. @@ -39,9 +39,8 @@ static char * quote_postgres(char *arg, int lineno) { char *res = (char *) ECPGalloc(2 * strlen(arg) + 3, lineno); - int i, + int i, quoted = false, ri = 0; - if (!res) return (res); @@ -51,16 +50,29 @@ quote_postgres(char *arg, int lineno) */ if (strchr(arg, '\\') != NULL) res[ri++] = ESCAPE_STRING_SYNTAX; - res[ri++] = '\''; - for (i = 0; arg[i]; i++, ri++) + i = 0; + res[ri++] = '\''; + /* do not quote the string if it is already quoted */ + if (*arg == '\'' && arg[strlen(arg)-1] == '\'') + { + quoted = true; + i = 1; + } + + for (; arg[i]; i++, ri++) { if (SQL_STR_DOUBLE(arg[i], true)) res[ri++] = arg[i]; res[ri] = arg[i]; } - res[ri++] = '\''; + /* do not quote the string if it is already quoted */ + if (quoted) + ri--; + else + res[ri++] = '\''; + res[ri] = '\0'; ECPGfree(arg); diff --git a/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.c b/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.c index 6082488a8b..ed734e5449 100644 --- a/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.c +++ b/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.c @@ -81,7 +81,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );} date1 = PGTYPESdate_from_asc(d1, NULL); ts1 = PGTYPEStimestamp_from_asc(t1, NULL); - { ECPGdo(__LINE__, 0, 1, NULL, "insert into date_test ( d , ts ) values( ? , ? )", + { ECPGdo(__LINE__, 0, 1, NULL, "insert into date_test ( d , ts ) values( ? , ? ) ", ECPGt_date,&(date1),(long)1,(long)1,sizeof(date), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_timestamp,&(ts1),(long)1,(long)1,sizeof(timestamp), @@ -131,14 +131,13 @@ if (sqlca.sqlcode < 0) sqlprint ( );} ts1 = PGTYPEStimestamp_from_asc("2003-12-04 17:34:29", NULL); text = PGTYPEStimestamp_to_asc(ts1); - printf("date_day of %s is %d\n", text, PGTYPESdate_dayofweek(ts1)); - free(text); - fmt = "(ddd), mmm. dd, yyyy, repeat: (ddd), mmm. dd, yyyy. end"; out = (char*) malloc(strlen(fmt) + 1); date1 = PGTYPESdate_from_timestamp(ts1); PGTYPESdate_fmt_asc(date1, fmt, out); + printf("date_day of %s is %d\n", text, PGTYPESdate_dayofweek(date1)); printf("Above date in format \"%s\" is \"%s\"\n", fmt, out); + free(text); free(out); /* rdate_defmt_asc() */ @@ -418,16 +417,16 @@ if (sqlca.sqlcode < 0) sqlprint ( );} free(text); { ECPGtrans(__LINE__, NULL, "rollback"); -#line 351 "dt_test.pgc" +#line 350 "dt_test.pgc" if (sqlca.sqlcode < 0) sqlprint ( );} -#line 351 "dt_test.pgc" +#line 350 "dt_test.pgc" { ECPGdisconnect(__LINE__, "CURRENT"); -#line 352 "dt_test.pgc" +#line 351 "dt_test.pgc" if (sqlca.sqlcode < 0) sqlprint ( );} -#line 352 "dt_test.pgc" +#line 351 "dt_test.pgc" return (0); diff --git a/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stderr b/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stderr index 6ee6091ecd..8f984c6675 100644 --- a/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stderr +++ b/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stderr @@ -10,7 +10,7 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGexecute line 30 Ok: SET [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGexecute line 35: QUERY: insert into date_test ( d , ts ) values( date '1966-01-17' , timestamp '2000-07-12 17:34:29' ) on connection regress1 +[NO_PID]: ECPGexecute line 35: QUERY: insert into date_test ( d , ts ) values( date '1966-01-17' , timestamp '2000-07-12 17:34:29' ) on connection regress1 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGexecute line 35 Ok: INSERT 0 1 [NO_PID]: sqlca: code: 0, state: 00000 @@ -22,7 +22,7 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGget_data line 37: RESULT: 2000-07-12 17:34:29 offset: -1 array: Yes [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGtrans line 351 action = rollback connection = regress1 +[NO_PID]: ECPGtrans line 350 action = rollback connection = regress1 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_finish: Connection regress1 closed. [NO_PID]: sqlca: code: 0, state: 00000 diff --git a/src/interfaces/ecpg/test/expected/sql-desc.c b/src/interfaces/ecpg/test/expected/sql-desc.c index aef542de85..66eb1d1d58 100644 --- a/src/interfaces/ecpg/test/expected/sql-desc.c +++ b/src/interfaces/ecpg/test/expected/sql-desc.c @@ -48,7 +48,7 @@ main(void) int val1 = 1 ; #line 13 "desc.pgc" - char val2 [] = "one" , val2output [] = "AAA" ; + char val2 [ 4 ] = "one" , val2output [ 4 ] = "AAA" ; #line 14 "desc.pgc" int val1output = 2 , val2i = 0 ; @@ -86,7 +86,7 @@ if (sqlca.sqlcode < 0) sqlprint();} #line 24 "desc.pgc" { ECPGset_desc(__LINE__, "indesc", 2,ECPGd_data, - ECPGt_char,&(val2),(long)-1,(long)1,(-1)*sizeof(char), ECPGd_indicator, + ECPGt_char,(val2),(long)4,(long)1,(4)*sizeof(char), ECPGd_indicator, ECPGt_int,&(val2i),(long)1,(long)1,sizeof(int), ECPGd_EODT); #line 25 "desc.pgc" @@ -147,7 +147,7 @@ if (sqlca.sqlcode < 0) sqlprint();} #line 36 "desc.pgc" { ECPGset_desc(__LINE__, "indesc", 2,ECPGd_data, - ECPGt_char,&(val2),(long)-1,(long)1,(-1)*sizeof(char), ECPGd_indicator, + ECPGt_char,(val2),(long)4,(long)1,(4)*sizeof(char), ECPGd_indicator, ECPGt_int,&(val2null),(long)1,(long)1,sizeof(int), ECPGd_EODT); #line 37 "desc.pgc" @@ -176,7 +176,7 @@ if (sqlca.sqlcode < 0) sqlprint();} #line 41 "desc.pgc" { ECPGset_desc(__LINE__, "indesc", 2,ECPGd_data, - ECPGt_char,&(val2),(long)-1,(long)1,(-1)*sizeof(char), ECPGd_indicator, + ECPGt_char,(val2),(long)4,(long)1,(4)*sizeof(char), ECPGd_indicator, ECPGt_int,&(val2i),(long)1,(long)1,sizeof(int), ECPGd_EODT); #line 42 "desc.pgc" @@ -199,7 +199,7 @@ if (sqlca.sqlcode < 0) sqlprint();} { ECPGget_desc(__LINE__, "outdesc", 1,ECPGd_data, - ECPGt_char,&(val2output),(long)-1,(long)1,(-1)*sizeof(char), ECPGd_EODT); + ECPGt_char,(val2output),(long)4,(long)1,(4)*sizeof(char), ECPGd_EODT); #line 46 "desc.pgc" @@ -225,7 +225,7 @@ if (sqlca.sqlcode < 0) sqlprint();} { ECPGdo(__LINE__, 0, 1, NULL, "fetch next from c1", ECPGt_EOIT, ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int), ECPGt_int,&(ind1),(long)1,(long)1,sizeof(int), - ECPGt_char,&(val2output),(long)-1,(long)1,(-1)*sizeof(char), + ECPGt_char,(val2output),(long)4,(long)1,(4)*sizeof(char), ECPGt_int,&(ind2),(long)1,(long)1,sizeof(int), ECPGt_EORT); #line 52 "desc.pgc" @@ -275,7 +275,7 @@ if (sqlca.sqlcode < 0) sqlprint();} { ECPGdo(__LINE__, 0, 1, NULL, "fetch next from c2", ECPGt_EOIT, ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, - ECPGt_char,&(val2output),(long)-1,(long)1,(-1)*sizeof(char), + ECPGt_char,(val2output),(long)4,(long)1,(4)*sizeof(char), ECPGt_int,&(val2i),(long)1,(long)1,sizeof(int), ECPGt_EORT); #line 64 "desc.pgc" @@ -294,7 +294,7 @@ if (sqlca.sqlcode < 0) sqlprint();} { ECPGdo(__LINE__, 0, 1, NULL, "select * from test1 where a = 2 ", ECPGt_EOIT, ECPGt_int,&(val1output),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, - ECPGt_char,&(val2output),(long)-1,(long)1,(-1)*sizeof(char), + ECPGt_char,(val2output),(long)4,(long)1,(4)*sizeof(char), ECPGt_int,&(val2i),(long)1,(long)1,sizeof(int), ECPGt_EORT); #line 69 "desc.pgc" diff --git a/src/interfaces/ecpg/test/expected/sql-desc.stderr b/src/interfaces/ecpg/test/expected/sql-desc.stderr index 23673cc4b8..4b92519ba6 100644 --- a/src/interfaces/ecpg/test/expected/sql-desc.stderr +++ b/src/interfaces/ecpg/test/expected/sql-desc.stderr @@ -12,7 +12,7 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGprepare line 32: QUERY: SELECT * from test1 where a = ? [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGexecute line 34: QUERY: INSERT INTO test1 VALUES ('1', '''one''') on connection regress1 +[NO_PID]: ECPGexecute line 34: QUERY: INSERT INTO test1 VALUES ('1', 'one') on connection regress1 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGexecute line 34 Ok: INSERT 0 1 [NO_PID]: sqlca: code: 0, state: 00000 @@ -20,7 +20,7 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGexecute line 39 Ok: INSERT 0 1 [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGexecute line 44: QUERY: SELECT * from test1 where a = '1' and b = '''one''' on connection regress1 +[NO_PID]: ECPGexecute line 44: QUERY: SELECT * from test1 where a = '1' and b = 'one' on connection regress1 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGexecute line 44: Correctly got 1 tuples with 2 fields [NO_PID]: sqlca: code: 0, state: 00000 @@ -30,7 +30,7 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGget_data line 46: RESULT: 1 offset: -1 array: Yes [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGexecute line 50: QUERY: declare c1 cursor for SELECT * from test1 where a = '1' and b = '''one''' on connection regress1 +[NO_PID]: ECPGexecute line 50: QUERY: declare c1 cursor for SELECT * from test1 where a = '1' and b = 'one' on connection regress1 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGexecute line 50 Ok: DECLARE CURSOR [NO_PID]: sqlca: code: 0, state: 00000 @@ -40,7 +40,7 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGget_data line 52: RESULT: 1 offset: -1 array: Yes [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGget_data line 52: RESULT: 'one' offset: -1 array: Yes +[NO_PID]: ECPGget_data line 52: RESULT: one offset: -1 array: Yes [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGexecute line 56: QUERY: close c1 on connection regress1 [NO_PID]: sqlca: code: 0, state: 00000 diff --git a/src/interfaces/ecpg/test/expected/sql-desc.stdout b/src/interfaces/ecpg/test/expected/sql-desc.stdout index 1c478b62f7..676e3ffce1 100644 --- a/src/interfaces/ecpg/test/expected/sql-desc.stdout +++ b/src/interfaces/ecpg/test/expected/sql-desc.stdout @@ -1,4 +1,4 @@ output = 1 -val1=1 (ind1: 0) val2='one' (ind2: 0) +val1=1 (ind1: 0) val2=one (ind2: 0) val1=2 val2=null val1=2 val2=null diff --git a/src/interfaces/ecpg/test/pgtypeslib/dt_test.pgc b/src/interfaces/ecpg/test/pgtypeslib/dt_test.pgc index 51dcf37f90..d6c166477f 100644 --- a/src/interfaces/ecpg/test/pgtypeslib/dt_test.pgc +++ b/src/interfaces/ecpg/test/pgtypeslib/dt_test.pgc @@ -62,14 +62,13 @@ main(void) ts1 = PGTYPEStimestamp_from_asc("2003-12-04 17:34:29", NULL); text = PGTYPEStimestamp_to_asc(ts1); - printf("date_day of %s is %d\n", text, PGTYPESdate_dayofweek(ts1)); - free(text); - fmt = "(ddd), mmm. dd, yyyy, repeat: (ddd), mmm. dd, yyyy. end"; out = (char*) malloc(strlen(fmt) + 1); date1 = PGTYPESdate_from_timestamp(ts1); PGTYPESdate_fmt_asc(date1, fmt, out); + printf("date_day of %s is %d\n", text, PGTYPESdate_dayofweek(date1)); printf("Above date in format \"%s\" is \"%s\"\n", fmt, out); + free(text); free(out); /* rdate_defmt_asc() */ diff --git a/src/interfaces/ecpg/test/sql/desc.pgc b/src/interfaces/ecpg/test/sql/desc.pgc index dd91a8780f..c4d47cab84 100644 --- a/src/interfaces/ecpg/test/sql/desc.pgc +++ b/src/interfaces/ecpg/test/sql/desc.pgc @@ -10,7 +10,7 @@ main(void) char *stmt3 = "SELECT * from test1 where a = ?"; int val1 = 1; - char val2[] = "one", val2output[] = "AAA"; + char val2[4] = "one", val2output[4] = "AAA"; int val1output = 2, val2i = 0; int val2null = -1; int ind1, ind2;