Alvaro Herrera írta: > Boszormenyi Zoltan wrote: > > >> Thanks for analyzing it, patch is attached. I downloaded >> and installed ICC, so I could reproduce the difference. >> > > Why not have a single function that does both things in a single call? > It doesn't look like there's any place that calls the function with only > one value for "insert" ... >
Okay, I tried this approach, patch is attached. This way it doesn't depend on the evaluation order of function parameters. > I happened to notice this misleading comment: > > char temp[20]; /* this should be sufficient unless you have 8 byte > integers */ > That comment was there before I touched that function, I deleted it now. There will be other problems before reaching 2^31-1 internal variables, like compiling the monster C file without the compiler going OOM... Best regards, Zoltán Böszörményi -- Bible has answers for everything. Proof: "But let your communication be, Yea, yea; Nay, nay: for whatsoever is more than these cometh of evil." (Matthew 5:37) - basics of digital technology. "May your kingdom come" - superficial description of plate tectonics ---------------------------------- Zoltán Böszörményi Cybertec Schönig & Schönig GmbH http://www.postgresql.at/
diff -dcrpN pgsql.orig/src/interfaces/ecpg/preproc/ecpg.addons pgsql/src/interfaces/ecpg/preproc/ecpg.addons *** pgsql.orig/src/interfaces/ecpg/preproc/ecpg.addons 2010-01-26 10:09:40.000000000 +0100 --- pgsql/src/interfaces/ecpg/preproc/ecpg.addons 2010-01-26 20:11:53.000000000 +0100 *************** ECPG: DeclareCursorStmtDECLAREcursor_nam *** 331,346 **** comment = cat_str(3, make_str("/*"), c1, make_str("*/")); if ((braces_open > 0) && INFORMIX_MODE) /* we're in a function */ ! $$ = cat_str(4, ! adjust_outofscope_cursor_vars(this, true), ! adjust_outofscope_cursor_vars(this, false), make_str("ECPG_informix_reset_sqlca();"), comment); else ! $$ = cat_str(3, ! adjust_outofscope_cursor_vars(this, true), ! adjust_outofscope_cursor_vars(this, false), ! comment); } ECPG: ClosePortalStmtCLOSEcursor_name block { --- 331,341 ---- comment = cat_str(3, make_str("/*"), c1, make_str("*/")); if ((braces_open > 0) && INFORMIX_MODE) /* we're in a function */ ! $$ = cat_str(3, adjust_outofscope_cursor_vars(this), make_str("ECPG_informix_reset_sqlca();"), comment); else ! $$ = cat2_str(adjust_outofscope_cursor_vars(this), comment); } ECPG: ClosePortalStmtCLOSEcursor_name block { diff -dcrpN pgsql.orig/src/interfaces/ecpg/preproc/ecpg.header pgsql/src/interfaces/ecpg/preproc/ecpg.header *** pgsql.orig/src/interfaces/ecpg/preproc/ecpg.header 2010-01-26 10:09:40.000000000 +0100 --- pgsql/src/interfaces/ecpg/preproc/ecpg.header 2010-01-26 20:25:06.000000000 +0100 *************** create_questionmarks(char *name, bool ar *** 227,233 **** } static char * ! adjust_outofscope_cursor_vars(struct cursor *cur, bool insert) { /* 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 --- 227,233 ---- } static char * ! adjust_outofscope_cursor_vars(struct cursor *cur) { /* 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 *************** adjust_outofscope_cursor_vars(struct cur *** 240,371 **** * instead of the variable. Do it only for local variables, not for globals. */ - struct arguments *list; - struct arguments *ptr; - struct arguments *newlist = NULL; - struct variable *newvar, *newind; char *result = make_str(""); ! list = (insert ? cur->argsinsert : cur->argsresult); ! ! for (ptr = list; ptr != NULL; ptr = ptr->next) { ! char temp[20]; /* this should be sufficient unless you have 8 byte integers */ ! char *original_var; ! bool skip_set_var = false; ! /* change variable name to "ECPGget_var(<counter>)" */ ! original_var = ptr->variable->name; ! sprintf(temp, "%d))", ecpg_internal_var); ! /* Don't emit ECPGset_var() calls for global variables */ ! if (ptr->variable->brace_level == 0) ! { ! newvar = ptr->variable; ! skip_set_var = true; ! } ! else if ((ptr->variable->type->type == ECPGt_char_variable) && (!strncmp(ptr->variable->name, "ECPGprepared_statement", strlen("ECPGprepared_statement")))) ! { ! newvar = ptr->variable; ! skip_set_var = true; ! } ! else if ((ptr->variable->type->type != ECPGt_varchar && ptr->variable->type->type != ECPGt_char && ptr->variable->type->type != ECPGt_unsigned_char && ptr->variable->type->type != ECPGt_string) && atoi(ptr->variable->type->size) > 1) ! { ! newvar = new_variable(cat_str(4, make_str("("), mm_strdup(ecpg_type_name(ptr->variable->type->u.element->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type, make_str("1"), ptr->variable->type->u.element->lineno), ptr->variable->type->size), 0); ! sprintf(temp, "%d, (", ecpg_internal_var++); ! } ! else if ((ptr->variable->type->type == ECPGt_varchar || ptr->variable->type->type == ECPGt_char || ptr->variable->type->type == ECPGt_unsigned_char || ptr->variable->type->type == ECPGt_string) && atoi(ptr->variable->type->size) > 1) ! { ! newvar = new_variable(cat_str(4, make_str("("), mm_strdup(ecpg_type_name(ptr->variable->type->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_simple_type(ptr->variable->type->type, ptr->variable->type->size, ptr->variable->type->lineno), 0); ! if (ptr->variable->type->type == ECPGt_varchar) ! sprintf(temp, "%d, &(", ecpg_internal_var++); ! else ! sprintf(temp, "%d, (", ecpg_internal_var++); ! } ! else if (ptr->variable->type->type == ECPGt_struct || ptr->variable->type->type == ECPGt_union) ! { ! sprintf(temp, "%d)))", ecpg_internal_var); ! newvar = new_variable(cat_str(4, make_str("(*("), mm_strdup(ptr->variable->type->type_name), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_struct_type(ptr->variable->type->u.members, ptr->variable->type->type, ptr->variable->type->type_name, ptr->variable->type->struct_sizeof), 0); ! sprintf(temp, "%d, &(", ecpg_internal_var++); ! } ! else if (ptr->variable->type->type == ECPGt_array) { ! if (ptr->variable->type->u.element->type == ECPGt_struct || ptr->variable->type->u.element->type == ECPGt_union) { ! sprintf(temp, "%d)))", ecpg_internal_var); ! newvar = new_variable(cat_str(4, make_str("(*("), mm_strdup(ptr->variable->type->u.element->type_name), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_struct_type(ptr->variable->type->u.element->u.members, ptr->variable->type->u.element->type, ptr->variable->type->u.element->type_name, ptr->variable->type->u.element->struct_sizeof), 0); sprintf(temp, "%d, (", ecpg_internal_var++); } ! else { ! newvar = new_variable(cat_str(4, make_str("("), mm_strdup(ecpg_type_name(ptr->variable->type->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type, ptr->variable->type->u.element->size, ptr->variable->type->u.element->lineno), ptr->variable->type->size), 0); ! sprintf(temp, "%d, &(", ecpg_internal_var++); } ! } ! else ! { ! newvar = new_variable(cat_str(4, make_str("*("), mm_strdup(ecpg_type_name(ptr->variable->type->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_simple_type(ptr->variable->type->type, ptr->variable->type->size, ptr->variable->type->lineno), 0); ! sprintf(temp, "%d, &(", ecpg_internal_var++); ! } ! ! /* create call to "ECPGset_var(<counter>, <pointer>. <linen number>)" */ ! if (!skip_set_var) ! result = cat_str(5, result, make_str("ECPGset_var("), mm_strdup(temp), mm_strdup(original_var), make_str("), __LINE__);\n")); ! ! /* now the indicator if there is one and it's not a global variable */ ! if ((ptr->indicator->type->type == ECPGt_NO_INDICATOR) || (ptr->indicator->brace_level == 0)) ! { ! newind = ptr->indicator; ! } ! else ! { ! /* change variable name to "ECPGget_var(<counter>)" */ ! original_var = ptr->indicator->name; ! sprintf(temp, "%d))", ecpg_internal_var); ! ! if (ptr->indicator->type->type == ECPGt_struct || ptr->indicator->type->type == ECPGt_union) { sprintf(temp, "%d)))", ecpg_internal_var); ! newind = new_variable(cat_str(4, make_str("(*("), mm_strdup(ptr->indicator->type->type_name), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_struct_type(ptr->indicator->type->u.members, ptr->indicator->type->type, ptr->indicator->type->type_name, ptr->indicator->type->struct_sizeof), 0); sprintf(temp, "%d, &(", ecpg_internal_var++); } ! else if (ptr->indicator->type->type == ECPGt_array) { ! if (ptr->indicator->type->u.element->type == ECPGt_struct || ptr->indicator->type->u.element->type == ECPGt_union) { sprintf(temp, "%d)))", ecpg_internal_var); ! newind = new_variable(cat_str(4, make_str("(*("), mm_strdup(ptr->indicator->type->u.element->type_name), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_struct_type(ptr->indicator->type->u.element->u.members, ptr->indicator->type->u.element->type, ptr->indicator->type->u.element->type_name, ptr->indicator->type->u.element->struct_sizeof), 0); sprintf(temp, "%d, (", ecpg_internal_var++); } else { ! newind = new_variable(cat_str(4, make_str("("), mm_strdup(ecpg_type_name(ptr->indicator->type->u.element->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_array_type(ECPGmake_simple_type(ptr->indicator->type->u.element->type, ptr->indicator->type->u.element->size, ptr->indicator->type->u.element->lineno), ptr->indicator->type->size), 0); sprintf(temp, "%d, &(", ecpg_internal_var++); } } - else if (atoi(ptr->indicator->type->size) > 1) - { - newind = new_variable(cat_str(4, make_str("("), mm_strdup(ecpg_type_name(ptr->indicator->type->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_simple_type(ptr->indicator->type->type, ptr->indicator->type->size, ptr->variable->type->lineno), 0); - sprintf(temp, "%d, (", ecpg_internal_var++); - } else { ! newind = new_variable(cat_str(4, make_str("*("), mm_strdup(ecpg_type_name(ptr->indicator->type->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_simple_type(ptr->indicator->type->type, ptr->indicator->type->size, ptr->variable->type->lineno), 0); sprintf(temp, "%d, &(", ecpg_internal_var++); } /* create call to "ECPGset_var(<counter>, <pointer>. <linen number>)" */ ! result = cat_str(5, result, make_str("ECPGset_var("), mm_strdup(temp), mm_strdup(original_var), make_str("), __LINE__);\n")); } ! add_variable_to_tail(&newlist, newvar, newind); } - if (insert) - cur->argsinsert_oos = newlist; - else - cur->argsresult_oos = newlist; - return result; } --- 240,376 ---- * 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 *ptr; ! struct arguments *newlist = NULL; ! struct variable *newvar, *newind; ! list = (insert ? cur->argsinsert : cur->argsresult); ! for (ptr = list; ptr != NULL; ptr = ptr->next) { ! char temp[20]; ! char *original_var; ! bool skip_set_var = false; ! ! /* change variable name to "ECPGget_var(<counter>)" */ ! original_var = ptr->variable->name; ! sprintf(temp, "%d))", ecpg_internal_var); ! ! /* Don't emit ECPGset_var() calls for global variables */ ! if (ptr->variable->brace_level == 0) { ! newvar = ptr->variable; ! skip_set_var = true; ! } ! else if ((ptr->variable->type->type == ECPGt_char_variable) && (!strncmp(ptr->variable->name, "ECPGprepared_statement", strlen("ECPGprepared_statement")))) ! { ! newvar = ptr->variable; ! skip_set_var = true; ! } ! else if ((ptr->variable->type->type != ECPGt_varchar && ptr->variable->type->type != ECPGt_char && ptr->variable->type->type != ECPGt_unsigned_char && ptr->variable->type->type != ECPGt_string) && atoi(ptr->variable->type->size) > 1) ! { ! newvar = new_variable(cat_str(4, make_str("("), mm_strdup(ecpg_type_name(ptr->variable->type->u.element->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type, make_str("1"), ptr->variable->type->u.element->lineno), ptr->variable->type->size), 0); sprintf(temp, "%d, (", ecpg_internal_var++); } ! else if ((ptr->variable->type->type == ECPGt_varchar || ptr->variable->type->type == ECPGt_char || ptr->variable->type->type == ECPGt_unsigned_char || ptr->variable->type->type == ECPGt_string) && atoi(ptr->variable->type->size) > 1) { ! newvar = new_variable(cat_str(4, make_str("("), mm_strdup(ecpg_type_name(ptr->variable->type->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_simple_type(ptr->variable->type->type, ptr->variable->type->size, ptr->variable->type->lineno), 0); ! if (ptr->variable->type->type == ECPGt_varchar) ! sprintf(temp, "%d, &(", ecpg_internal_var++); ! else ! sprintf(temp, "%d, (", ecpg_internal_var++); } ! else if (ptr->variable->type->type == ECPGt_struct || ptr->variable->type->type == ECPGt_union) { sprintf(temp, "%d)))", ecpg_internal_var); ! newvar = new_variable(cat_str(4, make_str("(*("), mm_strdup(ptr->variable->type->type_name), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_struct_type(ptr->variable->type->u.members, ptr->variable->type->type, ptr->variable->type->type_name, ptr->variable->type->struct_sizeof), 0); sprintf(temp, "%d, &(", ecpg_internal_var++); } ! else if (ptr->variable->type->type == ECPGt_array) { ! if (ptr->variable->type->u.element->type == ECPGt_struct || ptr->variable->type->u.element->type == ECPGt_union) { sprintf(temp, "%d)))", ecpg_internal_var); ! newvar = new_variable(cat_str(4, make_str("(*("), mm_strdup(ptr->variable->type->u.element->type_name), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_struct_type(ptr->variable->type->u.element->u.members, ptr->variable->type->u.element->type, ptr->variable->type->u.element->type_name, ptr->variable->type->u.element->struct_sizeof), 0); sprintf(temp, "%d, (", ecpg_internal_var++); } else { ! newvar = new_variable(cat_str(4, make_str("("), mm_strdup(ecpg_type_name(ptr->variable->type->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type, ptr->variable->type->u.element->size, ptr->variable->type->u.element->lineno), ptr->variable->type->size), 0); sprintf(temp, "%d, &(", ecpg_internal_var++); } } else { ! newvar = new_variable(cat_str(4, make_str("*("), mm_strdup(ecpg_type_name(ptr->variable->type->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_simple_type(ptr->variable->type->type, ptr->variable->type->size, ptr->variable->type->lineno), 0); sprintf(temp, "%d, &(", ecpg_internal_var++); } /* create call to "ECPGset_var(<counter>, <pointer>. <linen number>)" */ ! if (!skip_set_var) ! result = cat_str(5, result, make_str("ECPGset_var("), mm_strdup(temp), mm_strdup(original_var), make_str("), __LINE__);\n")); ! ! /* now the indicator if there is one and it's not a global variable */ ! if ((ptr->indicator->type->type == ECPGt_NO_INDICATOR) || (ptr->indicator->brace_level == 0)) ! { ! newind = ptr->indicator; ! } ! else ! { ! /* change variable name to "ECPGget_var(<counter>)" */ ! original_var = ptr->indicator->name; ! sprintf(temp, "%d))", ecpg_internal_var); ! ! if (ptr->indicator->type->type == ECPGt_struct || ptr->indicator->type->type == ECPGt_union) ! { ! sprintf(temp, "%d)))", ecpg_internal_var); ! newind = new_variable(cat_str(4, make_str("(*("), mm_strdup(ptr->indicator->type->type_name), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_struct_type(ptr->indicator->type->u.members, ptr->indicator->type->type, ptr->indicator->type->type_name, ptr->indicator->type->struct_sizeof), 0); ! sprintf(temp, "%d, &(", ecpg_internal_var++); ! } ! else if (ptr->indicator->type->type == ECPGt_array) ! { ! if (ptr->indicator->type->u.element->type == ECPGt_struct || ptr->indicator->type->u.element->type == ECPGt_union) ! { ! sprintf(temp, "%d)))", ecpg_internal_var); ! newind = new_variable(cat_str(4, make_str("(*("), mm_strdup(ptr->indicator->type->u.element->type_name), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_struct_type(ptr->indicator->type->u.element->u.members, ptr->indicator->type->u.element->type, ptr->indicator->type->u.element->type_name, ptr->indicator->type->u.element->struct_sizeof), 0); ! sprintf(temp, "%d, (", ecpg_internal_var++); ! } ! else ! { ! newind = new_variable(cat_str(4, make_str("("), mm_strdup(ecpg_type_name(ptr->indicator->type->u.element->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_array_type(ECPGmake_simple_type(ptr->indicator->type->u.element->type, ptr->indicator->type->u.element->size, ptr->indicator->type->u.element->lineno), ptr->indicator->type->size), 0); ! sprintf(temp, "%d, &(", ecpg_internal_var++); ! } ! } ! else if (atoi(ptr->indicator->type->size) > 1) ! { ! newind = new_variable(cat_str(4, make_str("("), mm_strdup(ecpg_type_name(ptr->indicator->type->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_simple_type(ptr->indicator->type->type, ptr->indicator->type->size, ptr->variable->type->lineno), 0); ! sprintf(temp, "%d, (", ecpg_internal_var++); ! } ! else ! { ! newind = new_variable(cat_str(4, make_str("*("), mm_strdup(ecpg_type_name(ptr->indicator->type->type)), make_str(" *)(ECPGget_var("), mm_strdup(temp)), ECPGmake_simple_type(ptr->indicator->type->type, ptr->indicator->type->size, ptr->variable->type->lineno), 0); ! sprintf(temp, "%d, &(", ecpg_internal_var++); ! } ! ! /* create call to "ECPGset_var(<counter>, <pointer>. <linen number>)" */ ! result = cat_str(5, result, make_str("ECPGset_var("), mm_strdup(temp), mm_strdup(original_var), make_str("), __LINE__);\n")); ! } ! ! add_variable_to_tail(&newlist, newvar, newind); } ! if (insert) ! cur->argsinsert_oos = newlist; ! else ! cur->argsresult_oos = newlist; } return result; } diff -dcrpN pgsql.orig/src/interfaces/ecpg/preproc/ecpg.trailer pgsql/src/interfaces/ecpg/preproc/ecpg.trailer *** pgsql.orig/src/interfaces/ecpg/preproc/ecpg.trailer 2010-01-26 10:09:40.000000000 +0100 --- pgsql/src/interfaces/ecpg/preproc/ecpg.trailer 2010-01-26 20:11:45.000000000 +0100 *************** ECPGCursorStmt: DECLARE cursor_name cur *** 332,347 **** comment = cat_str(3, make_str("/*"), mm_strdup(this->command), make_str("*/")); if ((braces_open > 0) && INFORMIX_MODE) /* we're in a function */ ! $$ = cat_str(4, ! adjust_outofscope_cursor_vars(this, true), ! adjust_outofscope_cursor_vars(this, false), make_str("ECPG_informix_reset_sqlca();"), comment); else ! $$ = cat_str(3, ! adjust_outofscope_cursor_vars(this, true), ! adjust_outofscope_cursor_vars(this, false), ! comment); } ; --- 332,342 ---- comment = cat_str(3, make_str("/*"), mm_strdup(this->command), make_str("*/")); if ((braces_open > 0) && INFORMIX_MODE) /* we're in a function */ ! $$ = cat_str(3, adjust_outofscope_cursor_vars(this), make_str("ECPG_informix_reset_sqlca();"), comment); else ! $$ = cat2_str(adjust_outofscope_cursor_vars(this), comment); } ; diff -dcrpN pgsql.orig/src/interfaces/ecpg/test/expected/preproc-cursor.c pgsql/src/interfaces/ecpg/test/expected/preproc-cursor.c *** pgsql.orig/src/interfaces/ecpg/test/expected/preproc-cursor.c 2010-01-26 10:09:40.000000000 +0100 --- pgsql/src/interfaces/ecpg/test/expected/preproc-cursor.c 2010-01-26 19:01:18.000000000 +0100 *************** if (sqlca.sqlcode < 0) exit (1);} *** 287,295 **** /* Dynamic cursorname test with INTO list in DECLARE stmt */ strcpy(msg, "declare"); ! ECPGset_var( 3, &( curname2 ), __LINE__);\ ! ECPGset_var( 1, ( t ), __LINE__);\ ! ECPGset_var( 2, &( id ), __LINE__);\ /* declare $0 cursor for select id , t from t1 */ #line 100 "cursor.pgc" --- 287,295 ---- /* Dynamic cursorname test with INTO list in DECLARE stmt */ strcpy(msg, "declare"); ! ECPGset_var( 1, &( curname2 ), __LINE__);\ ! ECPGset_var( 2, ( t ), __LINE__);\ ! ECPGset_var( 3, &( id ), __LINE__);\ /* declare $0 cursor for select id , t from t1 */ #line 100 "cursor.pgc" diff -dcrpN pgsql.orig/src/interfaces/ecpg/test/expected/preproc-outofscope.c pgsql/src/interfaces/ecpg/test/expected/preproc-outofscope.c *** pgsql.orig/src/interfaces/ecpg/test/expected/preproc-outofscope.c 2010-01-26 11:31:14.000000000 +0100 --- pgsql/src/interfaces/ecpg/test/expected/preproc-outofscope.c 2010-01-26 15:25:31.000000000 +0100 *************** if (sqlca.sqlcode < 0) exit (1);} *** 305,329 **** if (sqlca.sqlcode < 0) exit (1);} #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); - #line 87 "outofscope.pgc" - - if (sqlca.sqlcode < 0) exit (1);} - #line 87 "outofscope.pgc" - strcpy(msg, "commit"); { ECPGtrans(__LINE__, NULL, "commit"); ! #line 90 "outofscope.pgc" if (sqlca.sqlcode < 0) exit (1);} ! #line 90 "outofscope.pgc" /* Test out-of-scope DECLARE/OPEN/FETCH/CLOSE */ --- 305,323 ---- if (sqlca.sqlcode < 0) exit (1);} #line 85 "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); #line 86 "outofscope.pgc" if (sqlca.sqlcode < 0) exit (1);} #line 86 "outofscope.pgc" strcpy(msg, "commit"); { ECPGtrans(__LINE__, NULL, "commit"); ! #line 89 "outofscope.pgc" if (sqlca.sqlcode < 0) exit (1);} ! #line 89 "outofscope.pgc" /* Test out-of-scope DECLARE/OPEN/FETCH/CLOSE */ *************** if (sqlca.sqlcode < 0) exit (1);} *** 332,338 **** open_cur1(); /* exec sql whenever not found break ; */ ! #line 97 "outofscope.pgc" while (1) --- 326,332 ---- open_cur1(); /* exec sql whenever not found break ; */ ! #line 96 "outofscope.pgc" while (1) *************** if (sqlca.sqlcode < 0) exit (1);} *** 353,378 **** strcpy(msg, "drop"); { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table a1", ECPGt_EOIT, ECPGt_EORT); ! #line 116 "outofscope.pgc" if (sqlca.sqlcode < 0) exit (1);} ! #line 116 "outofscope.pgc" strcpy(msg, "commit"); { ECPGtrans(__LINE__, NULL, "commit"); ! #line 119 "outofscope.pgc" if (sqlca.sqlcode < 0) exit (1);} ! #line 119 "outofscope.pgc" strcpy(msg, "disconnect"); { ECPGdisconnect(__LINE__, "CURRENT"); ! #line 122 "outofscope.pgc" if (sqlca.sqlcode < 0) exit (1);} ! #line 122 "outofscope.pgc" return (0); --- 347,372 ---- strcpy(msg, "drop"); { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table a1", ECPGt_EOIT, ECPGt_EORT); ! #line 115 "outofscope.pgc" if (sqlca.sqlcode < 0) exit (1);} ! #line 115 "outofscope.pgc" strcpy(msg, "commit"); { ECPGtrans(__LINE__, NULL, "commit"); ! #line 118 "outofscope.pgc" if (sqlca.sqlcode < 0) exit (1);} ! #line 118 "outofscope.pgc" strcpy(msg, "disconnect"); { ECPGdisconnect(__LINE__, "CURRENT"); ! #line 121 "outofscope.pgc" if (sqlca.sqlcode < 0) exit (1);} ! #line 121 "outofscope.pgc" return (0); diff -dcrpN pgsql.orig/src/interfaces/ecpg/test/expected/preproc-outofscope.stderr pgsql/src/interfaces/ecpg/test/expected/preproc-outofscope.stderr *** pgsql.orig/src/interfaces/ecpg/test/expected/preproc-outofscope.stderr 2010-01-26 11:31:14.000000000 +0100 --- pgsql/src/interfaces/ecpg/test/expected/preproc-outofscope.stderr 2010-01-26 15:25:32.000000000 +0100 *************** *** 26,44 **** [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 85: OK: INSERT 0 1 [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]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 86: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 86: OK: INSERT 0 1 [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]: 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]: 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 --- 26,38 ---- [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 85: OK: INSERT 0 1 [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 , 'b' , 2.0 , 3 , 'b' ); with 0 parameter(s) on connection regress1 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 86: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 86: OK: INSERT 0 1 [NO_PID]: sqlca: code: 0, state: 00000 ! [NO_PID]: ECPGtrans on line 89: action "commit"; connection "regress1" [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]: sqlca: code: 0, state: 00000 *************** *** 86,107 **** [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_get_data on line 49: RESULT: 3 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_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]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_get_data on line 49: RESULT: 2.0 offset: -1; array: yes --- 80,85 ---- *************** *** 124,136 **** [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 58: OK: CLOSE CURSOR [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]: sqlca: code: 0, state: 00000 ! [NO_PID]: ecpg_execute on line 116: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 ! [NO_PID]: ecpg_execute on line 116: OK: DROP TABLE [NO_PID]: sqlca: code: 0, state: 00000 ! [NO_PID]: ECPGtrans on line 119: action "commit"; connection "regress1" [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_finish: connection regress1 closed [NO_PID]: sqlca: code: 0, state: 00000 --- 102,114 ---- [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 58: OK: CLOSE CURSOR [NO_PID]: sqlca: code: 0, state: 00000 ! [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]: ecpg_execute on line 115: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 ! [NO_PID]: ecpg_execute on line 115: OK: DROP TABLE [NO_PID]: sqlca: code: 0, state: 00000 ! [NO_PID]: ECPGtrans on line 118: action "commit"; connection "regress1" [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_finish: connection regress1 closed [NO_PID]: sqlca: code: 0, state: 00000 diff -dcrpN pgsql.orig/src/interfaces/ecpg/test/expected/preproc-outofscope.stdout pgsql/src/interfaces/ecpg/test/expected/preproc-outofscope.stdout *** pgsql.orig/src/interfaces/ecpg/test/expected/preproc-outofscope.stdout 2010-01-26 11:31:14.000000000 +0100 --- pgsql/src/interfaces/ecpg/test/expected/preproc-outofscope.stdout 2010-01-26 15:25:32.000000000 +0100 *************** *** 1,4 **** 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=3 t='"a"' d1=-1.000000 d2=nan c = 'a ' ! id=4 t='b' d1=2.000000 d2=3.000000 c = 'b ' --- 1,3 ---- 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=3 t='b' d1=2.000000 d2=3.000000 c = 'b ' diff -dcrpN pgsql.orig/src/interfaces/ecpg/test/preproc/outofscope.pgc pgsql/src/interfaces/ecpg/test/preproc/outofscope.pgc *** pgsql.orig/src/interfaces/ecpg/test/preproc/outofscope.pgc 2010-01-26 11:31:14.000000000 +0100 --- pgsql/src/interfaces/ecpg/test/preproc/outofscope.pgc 2010-01-26 15:23:51.000000000 +0100 *************** main (void) *** 83,89 **** 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, 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'); strcpy(msg, "commit"); --- 83,88 ----
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers