mirror of
https://github.com/postgres/postgres.git
synced 2025-05-11 05:41:32 +03:00
A report from Andrew Dunstan showed that an ecpglib breakage that causes repeated query failures could lead to infinite loops in some ecpg test scripts, because they contain "while(1)" loops with no exit condition other than successful test completion. That might be all right for manual testing, but it seems entirely unacceptable for automated test environments such as our buildfarm. We don't want buildfarm owners to have to intervene manually when a test goes wrong. To fix, just change all those while(1) loops to exit after at most 100 iterations (which is more than any of them expect to iterate). This seems sufficient since we'd see discrepancies in the test output if any loop executed the wrong number of times. I tested this by dint of intentionally breaking ecpg_do_prologue to always fail, and verifying that the tests still got to completion. Back-patch to all supported branches, since the whole point of this exercise is to protect the buildfarm against future mistakes. Discussion: https://postgr.es/m/18693.1548302004@sss.pgh.pa.us
231 lines
5.4 KiB
C
231 lines
5.4 KiB
C
/* 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 "quote.pgc"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
|
|
#line 1 "regression.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#line 5 "quote.pgc"
|
|
|
|
|
|
int main() {
|
|
/* exec sql begin declare section */
|
|
|
|
|
|
|
|
#line 9 "quote.pgc"
|
|
char var [ 25 ] ;
|
|
|
|
#line 10 "quote.pgc"
|
|
int i , loopcount ;
|
|
/* exec sql end declare section */
|
|
#line 11 "quote.pgc"
|
|
|
|
|
|
ECPGdebug(1, stderr);
|
|
{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); }
|
|
#line 14 "quote.pgc"
|
|
|
|
|
|
{ ECPGsetcommit(__LINE__, "on", NULL);}
|
|
#line 16 "quote.pgc"
|
|
|
|
/* exec sql whenever sql_warning sqlprint ; */
|
|
#line 17 "quote.pgc"
|
|
|
|
/* exec sql whenever sqlerror sqlprint ; */
|
|
#line 18 "quote.pgc"
|
|
|
|
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table \"My_Table\" ( Item1 int , Item2 text )", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 20 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 20 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 20 "quote.pgc"
|
|
|
|
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "set standard_conforming_strings to off", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 22 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 22 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 22 "quote.pgc"
|
|
|
|
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "show standard_conforming_strings", ECPGt_EOIT,
|
|
ECPGt_char,(var),(long)25,(long)1,(25)*sizeof(char),
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
|
|
#line 24 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 24 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 24 "quote.pgc"
|
|
|
|
printf("Standard conforming strings: %s\n", var);
|
|
|
|
/* this is a\\b actually */
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into \"My_Table\" values ( 1 , 'a\\\\\\\\b' )", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 28 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 28 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 28 "quote.pgc"
|
|
|
|
/* this is a\\b */
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into \"My_Table\" values ( 1 , E'a\\\\\\\\b' )", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 30 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 30 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 30 "quote.pgc"
|
|
|
|
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "set standard_conforming_strings to on", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 32 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 32 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 32 "quote.pgc"
|
|
|
|
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "show standard_conforming_strings", ECPGt_EOIT,
|
|
ECPGt_char,(var),(long)25,(long)1,(25)*sizeof(char),
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
|
|
#line 34 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 34 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 34 "quote.pgc"
|
|
|
|
printf("Standard conforming strings: %s\n", var);
|
|
|
|
/* this is a\\\\b actually */
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into \"My_Table\" values ( 2 , 'a\\\\\\\\b' )", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 38 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 38 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 38 "quote.pgc"
|
|
|
|
/* this is a\\b */
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into \"My_Table\" values ( 2 , E'a\\\\\\\\b' )", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 40 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 40 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 40 "quote.pgc"
|
|
|
|
|
|
{ ECPGtrans(__LINE__, NULL, "begin");
|
|
#line 42 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 42 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 42 "quote.pgc"
|
|
|
|
/* declare C cursor for select * from \"My_Table\" */
|
|
#line 43 "quote.pgc"
|
|
|
|
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare C cursor for select * from \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 45 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 45 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 45 "quote.pgc"
|
|
|
|
|
|
/* exec sql whenever not found break ; */
|
|
#line 47 "quote.pgc"
|
|
|
|
|
|
for (loopcount = 0; loopcount < 100; loopcount++)
|
|
{
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch C", ECPGt_EOIT,
|
|
ECPGt_int,&(i),(long)1,(long)1,sizeof(int),
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L,
|
|
ECPGt_char,(var),(long)25,(long)1,(25)*sizeof(char),
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
|
|
#line 51 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
|
|
#line 51 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 51 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 51 "quote.pgc"
|
|
|
|
printf("value: %d %s\n", i, var);
|
|
}
|
|
|
|
{ ECPGtrans(__LINE__, NULL, "rollback");
|
|
#line 55 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 55 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 55 "quote.pgc"
|
|
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table \"My_Table\"", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 56 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 56 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 56 "quote.pgc"
|
|
|
|
|
|
{ ECPGdisconnect(__LINE__, "ALL");
|
|
#line 58 "quote.pgc"
|
|
|
|
if (sqlca.sqlwarn[0] == 'W') sqlprint();
|
|
#line 58 "quote.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) sqlprint();}
|
|
#line 58 "quote.pgc"
|
|
|
|
|
|
return 0;
|
|
}
|