Changed ECPG outofscope handling to always print out statements in the same order

so regression testing is possible,

by Zoltan Boszormenyi
This commit is contained in:
Michael Meskes 2010-01-29 16:28:13 +00:00
parent f180856596
commit 83fa037b73
8 changed files with 127 additions and 162 deletions

View File

@ -1,4 +1,4 @@
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.addons,v 1.15 2010/01/26 09:07:31 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.addons,v 1.16 2010/01/29 16:28:13 meskes Exp $ */
ECPG: stmtClosePortalStmt block ECPG: stmtClosePortalStmt block
{ {
if (INFORMIX_MODE) if (INFORMIX_MODE)
@ -331,16 +331,11 @@ ECPG: DeclareCursorStmtDECLAREcursor_namecursor_optionsCURSORopt_holdFORSelectSt
comment = cat_str(3, make_str("/*"), c1, make_str("*/")); comment = cat_str(3, make_str("/*"), c1, make_str("*/"));
if ((braces_open > 0) && INFORMIX_MODE) /* we're in a function */ if ((braces_open > 0) && INFORMIX_MODE) /* we're in a function */
$$ = cat_str(4, $$ = cat_str(3, adjust_outofscope_cursor_vars(this),
adjust_outofscope_cursor_vars(this, true),
adjust_outofscope_cursor_vars(this, false),
make_str("ECPG_informix_reset_sqlca();"), make_str("ECPG_informix_reset_sqlca();"),
comment); comment);
else else
$$ = cat_str(3, $$ = cat2_str(adjust_outofscope_cursor_vars(this), comment);
adjust_outofscope_cursor_vars(this, true),
adjust_outofscope_cursor_vars(this, false),
comment);
} }
ECPG: ClosePortalStmtCLOSEcursor_name block ECPG: ClosePortalStmtCLOSEcursor_name block
{ {

View File

@ -1,4 +1,4 @@
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.header,v 1.12 2010/01/29 15:57:01 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.header,v 1.13 2010/01/29 16:28:13 meskes Exp $ */
/* Copyright comment */ /* Copyright comment */
%{ %{
@ -227,7 +227,7 @@ create_questionmarks(char *name, bool array)
} }
static char * static char *
adjust_outofscope_cursor_vars(struct cursor *cur, bool insert) adjust_outofscope_cursor_vars(struct cursor *cur)
{ {
/* Informix accepts DECLARE with variables that are out of scope when OPEN is called. /* Informix accepts DECLARE with variables that are out of scope when OPEN is called.
* For instance you can DECLARE a cursor in one function, and OPEN/FETCH/CLOSE * For instance you can DECLARE a cursor in one function, and OPEN/FETCH/CLOSE
@ -240,17 +240,21 @@ adjust_outofscope_cursor_vars(struct cursor *cur, bool insert)
* instead of the variable. Do it only for local variables, not for globals. * instead of the variable. Do it only for local variables, not for globals.
*/ */
char *result = make_str("");
int insert;
for (insert = 1; insert >= 0; insert--)
{
struct arguments *list; struct arguments *list;
struct arguments *ptr; struct arguments *ptr;
struct arguments *newlist = NULL; struct arguments *newlist = NULL;
struct variable *newvar, *newind; struct variable *newvar, *newind;
char *result = make_str("");
list = (insert ? cur->argsinsert : cur->argsresult); list = (insert ? cur->argsinsert : cur->argsresult);
for (ptr = list; ptr != NULL; ptr = ptr->next) for (ptr = list; ptr != NULL; ptr = ptr->next)
{ {
char temp[20]; /* this should be sufficient unless you have 8 byte integers */ char temp[20];
char *original_var; char *original_var;
bool skip_set_var = false; bool skip_set_var = false;
@ -308,7 +312,7 @@ adjust_outofscope_cursor_vars(struct cursor *cur, bool insert)
sprintf(temp, "%d, &(", ecpg_internal_var++); sprintf(temp, "%d, &(", ecpg_internal_var++);
} }
/* create call to "ECPGset_var(<counter>, <pointer>, <line number>)" */ /* create call to "ECPGset_var(<counter>, <pointer>. <line number>)" */
if (!skip_set_var) if (!skip_set_var)
result = cat_str(5, result, make_str("ECPGset_var("), mm_strdup(temp), mm_strdup(original_var), make_str("), __LINE__);\n")); result = cat_str(5, result, make_str("ECPGset_var("), mm_strdup(temp), mm_strdup(original_var), make_str("), __LINE__);\n"));
@ -354,7 +358,7 @@ adjust_outofscope_cursor_vars(struct cursor *cur, bool insert)
sprintf(temp, "%d, &(", ecpg_internal_var++); sprintf(temp, "%d, &(", ecpg_internal_var++);
} }
/* create call to "ECPGset_var(<counter>, <pointer>, <line number>)" */ /* create call to "ECPGset_var(<counter>, <pointer>. <line number>)" */
result = cat_str(5, result, make_str("ECPGset_var("), mm_strdup(temp), mm_strdup(original_var), make_str("), __LINE__);\n")); result = cat_str(5, result, make_str("ECPGset_var("), mm_strdup(temp), mm_strdup(original_var), make_str("), __LINE__);\n"));
} }
@ -365,6 +369,7 @@ adjust_outofscope_cursor_vars(struct cursor *cur, bool insert)
cur->argsinsert_oos = newlist; cur->argsinsert_oos = newlist;
else else
cur->argsresult_oos = newlist; cur->argsresult_oos = newlist;
}
return result; return result;
} }

View File

@ -1,4 +1,4 @@
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.trailer,v 1.19 2010/01/26 09:07:31 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.trailer,v 1.20 2010/01/29 16:28:13 meskes Exp $ */
statements: /*EMPTY*/ statements: /*EMPTY*/
| statements statement | statements statement
@ -332,16 +332,11 @@ ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared
comment = cat_str(3, make_str("/*"), mm_strdup(this->command), make_str("*/")); comment = cat_str(3, make_str("/*"), mm_strdup(this->command), make_str("*/"));
if ((braces_open > 0) && INFORMIX_MODE) /* we're in a function */ if ((braces_open > 0) && INFORMIX_MODE) /* we're in a function */
$$ = cat_str(4, $$ = cat_str(3, adjust_outofscope_cursor_vars(this),
adjust_outofscope_cursor_vars(this, true),
adjust_outofscope_cursor_vars(this, false),
make_str("ECPG_informix_reset_sqlca();"), make_str("ECPG_informix_reset_sqlca();"),
comment); comment);
else else
$$ = cat_str(3, $$ = cat2_str(adjust_outofscope_cursor_vars(this), comment);
adjust_outofscope_cursor_vars(this, true),
adjust_outofscope_cursor_vars(this, false),
comment);
} }
; ;

View File

@ -287,9 +287,9 @@ if (sqlca.sqlcode < 0) exit (1);}
/* Dynamic cursorname test with INTO list in DECLARE stmt */ /* Dynamic cursorname test with INTO list in DECLARE stmt */
strcpy(msg, "declare"); strcpy(msg, "declare");
ECPGset_var( 3, &( curname2 ), __LINE__);\ ECPGset_var( 1, &( curname2 ), __LINE__);\
ECPGset_var( 1, ( t ), __LINE__);\ ECPGset_var( 2, ( t ), __LINE__);\
ECPGset_var( 2, &( id ), __LINE__);\ ECPGset_var( 3, &( id ), __LINE__);\
/* declare $0 cursor for select id , t from t1 */ /* declare $0 cursor for select id , t from t1 */
#line 100 "cursor.pgc" #line 100 "cursor.pgc"

View File

@ -305,25 +305,19 @@ if (sqlca.sqlcode < 0) exit (1);}
if (sqlca.sqlcode < 0) exit (1);} if (sqlca.sqlcode < 0) exit (1);}
#line 85 "outofscope.pgc" #line 85 "outofscope.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into a1 ( id , t , d1 , d2 , c ) values ( default , '\"a\"' , - 1.0 , 'nan' :: float8 , 'a' )", ECPGt_EOIT, ECPGt_EORT);
#line 86 "outofscope.pgc"
if (sqlca.sqlcode < 0) exit (1);}
#line 86 "outofscope.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into a1 ( id , t , d1 , d2 , c ) values ( default , 'b' , 2.0 , 3 , 'b' )", ECPGt_EOIT, ECPGt_EORT); { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into a1 ( id , t , d1 , d2 , c ) values ( default , 'b' , 2.0 , 3 , 'b' )", ECPGt_EOIT, ECPGt_EORT);
#line 87 "outofscope.pgc" #line 86 "outofscope.pgc"
if (sqlca.sqlcode < 0) exit (1);} if (sqlca.sqlcode < 0) exit (1);}
#line 87 "outofscope.pgc" #line 86 "outofscope.pgc"
strcpy(msg, "commit"); strcpy(msg, "commit");
{ ECPGtrans(__LINE__, NULL, "commit"); { ECPGtrans(__LINE__, NULL, "commit");
#line 90 "outofscope.pgc" #line 89 "outofscope.pgc"
if (sqlca.sqlcode < 0) exit (1);} if (sqlca.sqlcode < 0) exit (1);}
#line 90 "outofscope.pgc" #line 89 "outofscope.pgc"
/* Test out-of-scope DECLARE/OPEN/FETCH/CLOSE */ /* Test out-of-scope DECLARE/OPEN/FETCH/CLOSE */
@ -332,7 +326,7 @@ if (sqlca.sqlcode < 0) exit (1);}
open_cur1(); open_cur1();
/* exec sql whenever not found break ; */ /* exec sql whenever not found break ; */
#line 97 "outofscope.pgc" #line 96 "outofscope.pgc"
while (1) while (1)
@ -353,26 +347,26 @@ if (sqlca.sqlcode < 0) exit (1);}
strcpy(msg, "drop"); strcpy(msg, "drop");
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table a1", ECPGt_EOIT, ECPGt_EORT); { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table a1", ECPGt_EOIT, ECPGt_EORT);
#line 116 "outofscope.pgc" #line 115 "outofscope.pgc"
if (sqlca.sqlcode < 0) exit (1);} if (sqlca.sqlcode < 0) exit (1);}
#line 116 "outofscope.pgc" #line 115 "outofscope.pgc"
strcpy(msg, "commit"); strcpy(msg, "commit");
{ ECPGtrans(__LINE__, NULL, "commit"); { ECPGtrans(__LINE__, NULL, "commit");
#line 119 "outofscope.pgc" #line 118 "outofscope.pgc"
if (sqlca.sqlcode < 0) exit (1);} if (sqlca.sqlcode < 0) exit (1);}
#line 119 "outofscope.pgc" #line 118 "outofscope.pgc"
strcpy(msg, "disconnect"); strcpy(msg, "disconnect");
{ ECPGdisconnect(__LINE__, "CURRENT"); { ECPGdisconnect(__LINE__, "CURRENT");
#line 122 "outofscope.pgc" #line 121 "outofscope.pgc"
if (sqlca.sqlcode < 0) exit (1);} if (sqlca.sqlcode < 0) exit (1);}
#line 122 "outofscope.pgc" #line 121 "outofscope.pgc"
return (0); return (0);

View File

@ -26,19 +26,13 @@
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 85: OK: INSERT 0 1 [NO_PID]: ecpg_execute on line 85: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 86: query: insert into a1 ( id , t , d1 , d2 , c ) values ( default , '"a"' , - 1.0 , 'nan' :: float8 , 'a' ); with 0 parameter(s) on connection regress1 [NO_PID]: ecpg_execute on line 86: query: insert into a1 ( id , t , d1 , d2 , c ) values ( default , 'b' , 2.0 , 3 , 'b' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 86: using PQexec [NO_PID]: ecpg_execute on line 86: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 86: OK: INSERT 0 1 [NO_PID]: ecpg_execute on line 86: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 87: query: insert into a1 ( id , t , d1 , d2 , c ) values ( default , 'b' , 2.0 , 3 , 'b' ); with 0 parameter(s) on connection regress1 [NO_PID]: ECPGtrans on line 89: action "commit"; connection "regress1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 87: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 87: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 90: action "commit"; connection "regress1"
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 40: query: declare mycur cursor for select * from a1; with 0 parameter(s) on connection regress1 [NO_PID]: ecpg_execute on line 40: query: declare mycur cursor for select * from a1; with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
@ -86,22 +80,6 @@
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 49: RESULT: 3 offset: -1; array: yes [NO_PID]: ecpg_get_data on line 49: RESULT: 3 offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 49: RESULT: "a" offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 49: RESULT: -1.0 offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 49: RESULT: NaN offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 49: RESULT: a offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 49: query: fetch mycur; with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 49: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 49: correctly got 1 tuples with 5 fields
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 49: RESULT: 4 offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 49: RESULT: b offset: -1; array: yes [NO_PID]: ecpg_get_data on line 49: RESULT: b offset: -1; array: yes
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_get_data on line 49: RESULT: 2.0 offset: -1; array: yes [NO_PID]: ecpg_get_data on line 49: RESULT: 2.0 offset: -1; array: yes
@ -124,13 +102,13 @@
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 58: OK: CLOSE CURSOR [NO_PID]: ecpg_execute on line 58: OK: CLOSE CURSOR
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 116: query: drop table a1; with 0 parameter(s) on connection regress1 [NO_PID]: ecpg_execute on line 115: query: drop table a1; with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 116: using PQexec [NO_PID]: ecpg_execute on line 115: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 116: OK: DROP TABLE [NO_PID]: ecpg_execute on line 115: OK: DROP TABLE
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 119: action "commit"; connection "regress1" [NO_PID]: ECPGtrans on line 118: action "commit"; connection "regress1"
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_finish: connection regress1 closed [NO_PID]: ecpg_finish: connection regress1 closed
[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: sqlca: code: 0, state: 00000

View File

@ -1,4 +1,3 @@
id=1 t='a' d1=1.000000 d2=2.000000 c = 'a ' id=1 t='a' d1=1.000000 d2=2.000000 c = 'a '
id=2 t='' (NULL) d1=0.000000 (NULL) d2=0.000000 (NULL) c = '' (NULL) id=2 t='' (NULL) d1=0.000000 (NULL) d2=0.000000 (NULL) c = '' (NULL)
id=3 t='"a"' d1=-1.000000 d2=nan c = 'a ' id=3 t='b' d1=2.000000 d2=3.000000 c = 'b '
id=4 t='b' d1=2.000000 d2=3.000000 c = 'b '

View File

@ -83,7 +83,6 @@ main (void)
strcpy(msg, "insert"); strcpy(msg, "insert");
exec sql insert into a1(id, t, d1, d2, c) values (default, 'a', 1.0, 2, 'a'); exec sql insert into a1(id, t, d1, d2, c) values (default, 'a', 1.0, 2, 'a');
exec sql insert into a1(id, t, d1, d2, c) values (default, null, null, null, null); exec sql insert into a1(id, t, d1, d2, c) values (default, null, null, null, null);
exec sql insert into a1(id, t, d1, d2, c) values (default, '"a"', -1.0, 'nan'::float8, 'a');
exec sql insert into a1(id, t, d1, d2, c) values (default, 'b', 2.0, 3, 'b'); exec sql insert into a1(id, t, d1, d2, c) values (default, 'b', 2.0, 3, 'b');
strcpy(msg, "commit"); strcpy(msg, "commit");