]> granicus.if.org Git - postgresql/commitdiff
Remove infinite-loop hazards in ecpg test suite.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 24 Jan 2019 21:46:56 +0000 (16:46 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 24 Jan 2019 21:46:56 +0000 (16:46 -0500)
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

14 files changed:
src/interfaces/ecpg/test/compat_informix/test_informix.pgc
src/interfaces/ecpg/test/expected/compat_informix-test_informix.c
src/interfaces/ecpg/test/expected/pgtypeslib-nan_test.c
src/interfaces/ecpg/test/expected/preproc-autoprep.c
src/interfaces/ecpg/test/expected/preproc-outofscope.c
src/interfaces/ecpg/test/expected/preproc-variable.c
src/interfaces/ecpg/test/expected/sql-fetch.c
src/interfaces/ecpg/test/expected/sql-quote.c
src/interfaces/ecpg/test/pgtypeslib/nan_test.pgc
src/interfaces/ecpg/test/preproc/autoprep.pgc
src/interfaces/ecpg/test/preproc/outofscope.pgc
src/interfaces/ecpg/test/preproc/variable.pgc
src/interfaces/ecpg/test/sql/fetch.pgc
src/interfaces/ecpg/test/sql/quote.pgc

index 8b7692b0fdd1066e2b6d823a82c67cb482305ac8..82a7d45b7688ff5fe07b9d5fe4c132023783b4af 100644 (file)
@@ -11,7 +11,7 @@ static void dosqlprint(void) {
 
 int main(void)
 {
-       $int i = 14;
+       $int i = 14, loopcount;
        $decimal j, m, n;
        $string c[10];
 
@@ -52,7 +52,7 @@ int main(void)
 
        deccvint(0, &j);
 
-       while (1)
+       for (loopcount = 0; loopcount < 100; loopcount++)
        {
                $fetch forward c into :i, :j, :c;
                if (sqlca.sqlcode == 100) break;
index d357c77a436004fdec2128598fa7fef3229f829e..53a10207608cf0ca3de4217d68c5ad6f905c4d88 100644 (file)
@@ -33,7 +33,7 @@ int main(void)
 {
        
 #line 14 "test_informix.pgc"
- int i = 14 ;
+ int i = 14 , loopcount ;
 
 #line 14 "test_informix.pgc"
 
@@ -156,7 +156,7 @@ if (sqlca.sqlcode < 0) dosqlprint ( );}
 
        deccvint(0, &j);
 
-       while (1)
+       for (loopcount = 0; loopcount < 100; loopcount++)
        {
                { ECPGdo(__LINE__, 1, 1, NULL, 0, ECPGst_normal, "fetch forward c", ECPGt_EOIT, 
        ECPGt_int,&(i),(long)1,(long)1,sizeof(int), 
index 077c0beee6b63a573ab56c83378fcf118d5e48d2..a32895c4a30bab72a25db1815d75ab80bc459fe5 100644 (file)
@@ -34,13 +34,13 @@ int
 main(void)
 {
        /* exec sql begin declare section */
-               
+                
                
                
                
        
 #line 19 "nan_test.pgc"
- int id ;
+ int id , loopcount ;
  
 #line 20 "nan_test.pgc"
  double d ;
@@ -88,7 +88,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
 if (sqlca.sqlcode < 0) sqlprint ( );}
 #line 34 "nan_test.pgc"
 
-       while (1)
+       for (loopcount = 0; loopcount < 100; loopcount++)
        {
                { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT, 
        ECPGt_int,&(id),(long)1,(long)1,sizeof(int), 
@@ -143,7 +143,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
 if (sqlca.sqlcode < 0) sqlprint ( );}
 #line 50 "nan_test.pgc"
 
-       while (1)
+       for (loopcount = 0; loopcount < 100; loopcount++)
        {
                { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur", ECPGt_EOIT, 
        ECPGt_int,&(id),(long)1,(long)1,sizeof(int), 
@@ -227,7 +227,7 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
 if (sqlca.sqlcode < 0) sqlprint ( );}
 #line 76 "nan_test.pgc"
 
-       while (1)
+       for (loopcount = 0; loopcount < 100; loopcount++)
        {
                { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch from cur1", ECPGt_EOIT, 
        ECPGt_int,&(id),(long)1,(long)1,sizeof(int), 
index cf5c702e0652a6162d5be09570f4faa0e901b130..6bb457fcf261d4581bdfc19c99d381a64bf9b80d 100644 (file)
@@ -197,7 +197,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
 
 
   i = 0;
-  while (1)
+  while (i < 100)
   {
        { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur1", ECPGt_EOIT, 
        ECPGt_int,&(item1),(long)1,(long)1,sizeof(int), 
index 4db017cf2394c46f1643b54215d8d6b988f028b4..4ecd1a0836f35d0090085ff5802887ebe11e4323 100644 (file)
@@ -267,7 +267,7 @@ main (void)
 {
        MYTYPE          *myvar;
        MYNULLTYPE      *mynullvar;
-
+       int loopcount;
        char msg[128];
 
        ECPGdebug(1, stderr);
@@ -333,7 +333,7 @@ if (sqlca.sqlcode < 0) exit (1);}
 #line 96 "outofscope.pgc"
 
 
-       while (1)
+       for (loopcount = 0; loopcount < 100; loopcount++)
        {
                memset(myvar, 0, sizeof(MYTYPE));
                get_record1();
index a93af97063bba3c2432dfd6b8aa0e3f09a6a8405..9613f87722d2893e4f9c9995adc3144a2f563fab 100644 (file)
@@ -120,7 +120,7 @@ main (void)
 
 #line 37 "variable.pgc"
 
-
+       int loopcount;
        char msg[128];
 
         ECPGdebug(1, stderr);
@@ -204,7 +204,7 @@ if (sqlca.sqlcode < 0) exit (1);}
        p=&personal;
        i=&ind_personal;
        memset(i, 0, sizeof(ind_personal));
-       while (1) {
+       for (loopcount = 0; loopcount < 100; loopcount++) {
                strcpy(msg, "fetch");
                { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT, 
        ECPGt_varchar,&(p->name),(long)BUFFERSIZ,(long)-1,sizeof( struct birthinfo ), 
index c6be49ccb09a99e3e043923af855144e49b5d1c9..13a3af8ff445573630dc28bd2ed5d66295f4f2e4 100644 (file)
 int main() {
   /* exec sql begin declare section */
      
-      
+       
   
 #line 9 "fetch.pgc"
  char str [ 25 ] ;
  
 #line 10 "fetch.pgc"
- int i , count = 1 ;
+ int i , count = 1 , loopcount ;
 /* exec sql end declare section */
 #line 11 "fetch.pgc"
 
@@ -112,7 +112,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
   /* exec sql whenever not found  break ; */
 #line 30 "fetch.pgc"
 
-  while (1) {
+  for (loopcount = 0; loopcount < 100; loopcount++) {
        { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in C", ECPGt_EOIT, 
        ECPGt_int,&(i),(long)1,(long)1,sizeof(int), 
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
@@ -191,7 +191,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
   /* exec sql whenever not found  break ; */
 #line 48 "fetch.pgc"
 
-  while (1) {
+  for (loopcount = 0; loopcount < 100; loopcount++) {
        { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 in D", ECPGt_EOIT, 
        ECPGt_int,&(i),(long)1,(long)1,sizeof(int), 
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
index 43f1eeceb02a5df5bab1f1209f53eff1aaa64a39..7a0826fa360a14a2e6a97e646d214c969ec41248 100644 (file)
 int main() {
   /* exec sql begin declare section */
      
-     
+      
   
 #line 9 "quote.pgc"
  char var [ 25 ] ;
  
 #line 10 "quote.pgc"
- int i ;
+ int i , loopcount ;
 /* exec sql end declare section */
 #line 11 "quote.pgc"
 
@@ -176,7 +176,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
 #line 47 "quote.pgc"
 
 
-  while (true)
+  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), 
index a5cbe296a97d707ee0b0b51ab855011bd1b42779..5101ded85c7d829643f33c2f6547f45ce86d680f 100644 (file)
@@ -16,7 +16,7 @@ int
 main(void)
 {
        exec sql begin declare section;
-       int     id;
+       int     id, loopcount;
        double  d;
        numeric *num;
        char    val[16];
@@ -32,7 +32,7 @@ main(void)
 
        exec sql declare cur cursor for select id, d, d from nantest1;
        exec sql open cur;
-       while (1)
+       for (loopcount = 0; loopcount < 100; loopcount++)
        {
                exec sql fetch from cur into :id, :d, :val;
                if (sqlca.sqlcode)
@@ -48,7 +48,7 @@ main(void)
        exec sql close cur;
 
        exec sql open cur;
-       while (1)
+       for (loopcount = 0; loopcount < 100; loopcount++)
        {
                exec sql fetch from cur into :id, :d, :val;
                if (sqlca.sqlcode)
@@ -74,7 +74,7 @@ main(void)
 
        exec sql declare cur1 cursor for select id, d, d from nantest2;
        exec sql open cur1;
-       while (1)
+       for (loopcount = 0; loopcount < 100; loopcount++)
        {
                exec sql fetch from cur1 into :id, :num, :val;
                if (sqlca.sqlcode)
index 31c3ab7a56ec8f796405553409343082b862d812..d3d9305da5b92ba6360a853a381f81f7e7d23a9c 100644 (file)
@@ -50,7 +50,7 @@ static void test(void) {
   EXEC SQL WHENEVER NOT FOUND DO BREAK;
 
   i = 0;
-  while (1)
+  while (i < 100)
   {
        EXEC SQL FETCH cur1 INTO :item1:ind1;
        printf("item[%d] = %d\n", i, ind1 ? -1 : item1);
index 6322114729684b3701046cec7e3bb7e4b6bcb78b..642835400b2629efa809b71cd11db59ed8267538 100644 (file)
@@ -66,7 +66,7 @@ main (void)
 {
        MYTYPE          *myvar;
        MYNULLTYPE      *mynullvar;
-
+       int loopcount;
        char msg[128];
 
        ECPGdebug(1, stderr);
@@ -95,7 +95,7 @@ main (void)
 
        exec sql whenever not found do break;
 
-       while (1)
+       for (loopcount = 0; loopcount < 100; loopcount++)
        {
                memset(myvar, 0, sizeof(MYTYPE));
                get_record1();
index 05420afdb2c489296b6c589d65245d18197105cc..c75d8f49dbadebc380379c5754780b2c753acd88 100644 (file)
@@ -35,7 +35,7 @@ exec sql end declare section;
        exec sql char *married = NULL;
        exec sql long ind_married;
        exec sql ind children;
-
+       int loopcount;
        char msg[128];
 
         ECPGdebug(1, stderr);
@@ -67,7 +67,7 @@ exec sql end declare section;
        p=&personal;
        i=&ind_personal;
        memset(i, 0, sizeof(ind_personal));
-       while (1) {
+       for (loopcount = 0; loopcount < 100; loopcount++) {
                strcpy(msg, "fetch");
                exec sql fetch cur into :p:i, :married:ind_married, :children.integer:ind_children.smallint;
                printf("%8.8s", personal.name.arr);
index aade678efbef51603aa0f677089c4a2ac0e43f01..8a5d07994ab027cfb92a0116796b219983aab5e1 100644 (file)
@@ -7,7 +7,7 @@ EXEC SQL INCLUDE ../regression;
 int main() {
   EXEC SQL BEGIN DECLARE SECTION;
     char str[25];
-    int i, count=1;
+    int i, count=1, loopcount;
   EXEC SQL END DECLARE SECTION;
 
   ECPGdebug(1, stderr);
@@ -28,7 +28,7 @@ int main() {
   EXEC SQL OPEN C;
 
   EXEC SQL WHENEVER NOT FOUND DO BREAK;
-  while (1) {
+  for (loopcount = 0; loopcount < 100; loopcount++) {
        EXEC SQL FETCH 1 IN C INTO :i, :str;
        printf("%d: %s\n", i, str);
   }
@@ -46,7 +46,7 @@ int main() {
   EXEC SQL OPEN D using 1;
 
   EXEC SQL WHENEVER NOT FOUND DO BREAK;
-  while (1) {
+  for (loopcount = 0; loopcount < 100; loopcount++) {
        EXEC SQL FETCH 1 IN D INTO :i, :str;
        printf("%d: %s\n", i, str);
   }
index 9dd997323cc720f64b367af5661c940576e5b0e0..83efb034840005539dca025c30a0d13a3dfbe537 100644 (file)
@@ -7,7 +7,7 @@ EXEC SQL INCLUDE ../regression;
 int main() {
   EXEC SQL BEGIN DECLARE SECTION;
     char var[25];
-    int i;
+    int i, loopcount;
   EXEC SQL END DECLARE SECTION;
 
   ECPGdebug(1, stderr);
@@ -46,7 +46,7 @@ int main() {
 
   EXEC SQL WHENEVER NOT FOUND DO BREAK;
 
-  while (true)
+  for (loopcount = 0; loopcount < 100; loopcount++)
   {
        EXEC SQL FETCH C INTO :i, :var;
        printf("value: %d %s\n", i, var);