]> granicus.if.org Git - postgresql/commitdiff
Another round of portability hacking on ECPG regression tests.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 12 Oct 2018 22:08:47 +0000 (18:08 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 12 Oct 2018 22:08:47 +0000 (18:08 -0400)
Removing the separate Windows expected-files in commit f1885386f
turns out to have been too optimistic: on most (but not all!) of our
Windows buildfarm members, the tests still print floats with three
exponent digits, because they're invoking the native printf()
not snprintf.c.

But rather than put back the extra expected-files, let's hack
the three tests in question so that they adjust float formatting
the same way snprintf.c does.

Discussion: https://postgr.es/m/18890.1539374107@sss.pgh.pa.us

src/interfaces/ecpg/test/Makefile.regress
src/interfaces/ecpg/test/compat_informix/dec_test.pgc
src/interfaces/ecpg/test/expected/compat_informix-dec_test.c
src/interfaces/ecpg/test/expected/pgtypeslib-num_test.c
src/interfaces/ecpg/test/expected/pgtypeslib-num_test.stderr
src/interfaces/ecpg/test/expected/pgtypeslib-num_test.stdout
src/interfaces/ecpg/test/expected/pgtypeslib-num_test2.c
src/interfaces/ecpg/test/pgtypeslib/num_test.pgc
src/interfaces/ecpg/test/pgtypeslib/num_test2.pgc
src/interfaces/ecpg/test/printf_hack.h [new file with mode: 0644]

index 06c0461f667ab859eada1df5997a0e1eee2210aa..4da1bb8a03692f6a22dd75bffb5fa9fd62e09c86 100644 (file)
@@ -15,6 +15,7 @@ ECPG = ../../preproc/ecpg --regression -I$(srcdir)/../../include -I$(srcdir)
 # Files that most or all ecpg preprocessor test outputs depend on
 ECPG_TEST_DEPENDENCIES = ../../preproc/ecpg$(X) \
        $(srcdir)/../regression.h \
+       $(srcdir)/../printf_hack.h \
        $(srcdir)/../../include/sqlca.h \
        $(srcdir)/../../include/sqlda.h \
        $(srcdir)/../../include/sqltypes.h \
index c6a4ed85ee706a906a2d9ae2f29a9bf62335fe53..f6a9f425d6f1d052aba5c1cfc991fe0b29358c84 100644 (file)
@@ -7,14 +7,7 @@
 
 exec sql include ../regression;
 
-
-/*
-
-NOTE: This file has a different expect file for regression tests on MinGW32
-
-*/
-
-
+exec sql include ../printf_hack;
 
 
 /*
@@ -115,7 +108,9 @@ main(void)
                        /* this is a libc problem since we only call strtod() */
                        r = dectodbl(dec, &dbl);
                        if (r) check_errno();
-                       printf("dec[%d,10]: %g (r: %d)\n", i, r?0.0:dbl, r);
+                       printf("dec[%d,10]: ", i);
+                       print_double(r ? 0.0 : dbl);
+                       printf(" (r: %d)\n", r);
                }
 
                PGTYPESdecimal_free(din);
index 8951cdb227f1fb8efdd904e5b8d5c5e8522498a5..8586650e879befb0813d937cbb30a9269c31aac9 100644 (file)
 
 
 
+#line 1 "printf_hack.h"
 /*
+ * print_double(x) has the same effect as printf("%g", x), but is intended
+ * to produce the same formatting across all platforms.
+ */
+static void
+print_double(double x)
+{
+#ifdef WIN32
+       /* Change Windows' 3-digit exponents to look like everyone else's */
+       char            convert[128];
+       int                     vallen;
 
-NOTE: This file has a different expect file for regression tests on MinGW32
+       sprintf(convert, "%g", x);
+       vallen = strlen(convert);
 
-*/
+       if (vallen >= 6 &&
+               convert[vallen - 5] == 'e' &&
+               convert[vallen - 3] == '0')
+       {
+               convert[vallen - 3] = convert[vallen - 2];
+               convert[vallen - 2] = convert[vallen - 1];
+               convert[vallen - 1] = '\0';
+       }
+
+       printf("%s", convert);
+#else
+       printf("%g", x);
+#endif
+}
 
+#line 10 "dec_test.pgc"
 
 
 
@@ -135,7 +161,9 @@ main(void)
                        /* this is a libc problem since we only call strtod() */
                        r = dectodbl(dec, &dbl);
                        if (r) check_errno();
-                       printf("dec[%d,10]: %g (r: %d)\n", i, r?0.0:dbl, r);
+                       printf("dec[%d,10]: ", i);
+                       print_double(r ? 0.0 : dbl);
+                       printf(" (r: %d)\n", r);
                }
 
                PGTYPESdecimal_free(din);
index 1b1239eacad48354f9a857a94abc3c350a270fa9..bf312549b4fc4cbef9c0430cb3b0293880256545 100644 (file)
 
 
 
+#line 1 "printf_hack.h"
 /*
+ * print_double(x) has the same effect as printf("%g", x), but is intended
+ * to produce the same formatting across all platforms.
+ */
+static void
+print_double(double x)
+{
+#ifdef WIN32
+       /* Change Windows' 3-digit exponents to look like everyone else's */
+       char            convert[128];
+       int                     vallen;
+
+       sprintf(convert, "%g", x);
+       vallen = strlen(convert);
+
+       if (vallen >= 6 &&
+               convert[vallen - 5] == 'e' &&
+               convert[vallen - 3] == '0')
+       {
+               convert[vallen - 3] = convert[vallen - 2];
+               convert[vallen - 2] = convert[vallen - 1];
+               convert[vallen - 1] = '\0';
+       }
+
+       printf("%s", convert);
+#else
+       printf("%g", x);
+#endif
+}
 
-NOTE: This file has a different expect file for regression tests on MinGW32
+#line 8 "num_test.pgc"
 
-*/
 
 
 int
@@ -40,10 +68,10 @@ main(void)
                 
                /* = {0, 0, 0, 0, 0, NULL, NULL} ; */
        
-#line 22 "num_test.pgc"
+#line 17 "num_test.pgc"
  numeric * des ;
 /* exec sql end declare section */
-#line 24 "num_test.pgc"
+#line 19 "num_test.pgc"
 
        double d;
        long l1, l2;
@@ -51,27 +79,27 @@ main(void)
 
        ECPGdebug(1, stderr);
        /* exec sql whenever sqlerror  do sqlprint ( ) ; */
-#line 30 "num_test.pgc"
+#line 25 "num_test.pgc"
 
 
        { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); 
-#line 32 "num_test.pgc"
+#line 27 "num_test.pgc"
 
 if (sqlca.sqlcode < 0) sqlprint ( );}
-#line 32 "num_test.pgc"
+#line 27 "num_test.pgc"
 
 
        { ECPGsetcommit(__LINE__, "off", NULL);
-#line 34 "num_test.pgc"
+#line 29 "num_test.pgc"
 
 if (sqlca.sqlcode < 0) sqlprint ( );}
-#line 34 "num_test.pgc"
+#line 29 "num_test.pgc"
 
        { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table test ( text char ( 5 ) , num numeric ( 14 , 7 ) )", ECPGt_EOIT, ECPGt_EORT);
-#line 35 "num_test.pgc"
+#line 30 "num_test.pgc"
 
 if (sqlca.sqlcode < 0) sqlprint ( );}
-#line 35 "num_test.pgc"
+#line 30 "num_test.pgc"
 
 
        value1 = PGTYPESnumeric_new();
@@ -100,10 +128,10 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
        { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into test ( text , num ) values ( 'test' , $1  )", 
        ECPGt_numeric,&(des),(long)1,(long)0,sizeof(numeric), 
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
-#line 60 "num_test.pgc"
+#line 55 "num_test.pgc"
 
 if (sqlca.sqlcode < 0) sqlprint ( );}
-#line 60 "num_test.pgc"
+#line 55 "num_test.pgc"
 
 
        value2 = PGTYPESnumeric_from_asc("2369.7", NULL);
@@ -113,10 +141,10 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
        { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select num from test where text = 'test'", ECPGt_EOIT, 
        ECPGt_numeric,&(des),(long)1,(long)0,sizeof(numeric), 
        ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
-#line 66 "num_test.pgc"
+#line 61 "num_test.pgc"
 
 if (sqlca.sqlcode < 0) sqlprint ( );}
-#line 66 "num_test.pgc"
+#line 61 "num_test.pgc"
 
 
        PGTYPESnumeric_mul(res, des, res);
@@ -129,7 +157,9 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
        PGTYPESnumeric_div(res, value2, res);
        text = PGTYPESnumeric_to_asc(res, -1);
        PGTYPESnumeric_to_double(res, &d);
-       printf("div = %s %e\n", text, d);
+       printf("div = %s ", text);
+       print_double(d);
+       printf("\n");
 
        PGTYPESnumeric_free(value1);
        PGTYPESnumeric_free(value2);
@@ -145,16 +175,16 @@ if (sqlca.sqlcode < 0) sqlprint ( );}
        PGTYPESnumeric_free(res);
 
        { ECPGtrans(__LINE__, NULL, "rollback");
-#line 93 "num_test.pgc"
+#line 90 "num_test.pgc"
 
 if (sqlca.sqlcode < 0) sqlprint ( );}
-#line 93 "num_test.pgc"
+#line 90 "num_test.pgc"
 
        { ECPGdisconnect(__LINE__, "CURRENT");
-#line 94 "num_test.pgc"
+#line 91 "num_test.pgc"
 
 if (sqlca.sqlcode < 0) sqlprint ( );}
-#line 94 "num_test.pgc"
+#line 91 "num_test.pgc"
 
 
        return 0;
index d834c22aab9218b51016d99e529316a13574a148..a7d125402af90f89afee80c7d24673e33936894b 100644 (file)
@@ -2,31 +2,31 @@
 [NO_PID]: sqlca: code: 0, state: 00000
 [NO_PID]: ECPGconnect: opening database ecpg1_regression on <DEFAULT> port <DEFAULT>  
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ECPGsetcommit on line 34: action "off"; connection "ecpg1_regression"
+[NO_PID]: ECPGsetcommit on line 29: action "off"; connection "ecpg1_regression"
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_execute on line 35: query: create table test ( text char ( 5 ) , num numeric ( 14 , 7 ) ); with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: ecpg_execute on line 30: query: create table test ( text char ( 5 ) , num numeric ( 14 , 7 ) ); with 0 parameter(s) on connection ecpg1_regression
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_execute on line 35: using PQexec
+[NO_PID]: ecpg_execute on line 30: using PQexec
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_process_output on line 35: OK: CREATE TABLE
+[NO_PID]: ecpg_process_output on line 30: OK: CREATE TABLE
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_execute on line 60: query: insert into test ( text , num ) values ( 'test' , $1  ); with 1 parameter(s) on connection ecpg1_regression
+[NO_PID]: ecpg_execute on line 55: query: insert into test ( text , num ) values ( 'test' , $1  ); with 1 parameter(s) on connection ecpg1_regression
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_execute on line 60: using PQexecParams
+[NO_PID]: ecpg_execute on line 55: using PQexecParams
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_free_params on line 60: parameter 1 = 2369.7
+[NO_PID]: ecpg_free_params on line 55: parameter 1 = 2369.7
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_process_output on line 60: OK: INSERT 0 1
+[NO_PID]: ecpg_process_output on line 55: OK: INSERT 0 1
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_execute on line 66: query: select num from test where text = 'test'; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: ecpg_execute on line 61: query: select num from test where text = 'test'; with 0 parameter(s) on connection ecpg1_regression
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_execute on line 66: using PQexec
+[NO_PID]: ecpg_execute on line 61: using PQexec
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_process_output on line 66: correctly got 1 tuples with 1 fields
+[NO_PID]: ecpg_process_output on line 61: correctly got 1 tuples with 1 fields
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_get_data on line 66: RESULT: 2369.7000000 offset: -1; array: no
+[NO_PID]: ecpg_get_data on line 61: RESULT: 2369.7000000 offset: -1; array: no
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ECPGtrans on line 93: action "rollback"; connection "ecpg1_regression"
+[NO_PID]: ECPGtrans on line 90: action "rollback"; connection "ecpg1_regression"
 [NO_PID]: sqlca: code: 0, state: 00000
 [NO_PID]: ecpg_finish: connection ecpg1_regression closed
 [NO_PID]: sqlca: code: 0, state: 00000
index 52515ebde268e1c082f6e525a04d161036de6d24..204c3cf6c07ba6c514d71d8756fa1b3f11b864a4 100644 (file)
@@ -2,5 +2,5 @@ from int = 1407.0
 add = 2379.7
 sub = 2369.7
 mul = 13306998429.873000000
-div = 1330699.84298730000 1.330700e+06
+div = 1330699.84298730000 1.3307e+06
 to long(0) = 20000000 14
index aaab4ad7d70efaa18bd79f6acbfc6a6a6fcc42c0..9debc34e791dd0463a3b03b62a03159441c644e7 100644 (file)
 
 
 
+#line 1 "printf_hack.h"
 /*
+ * print_double(x) has the same effect as printf("%g", x), but is intended
+ * to produce the same formatting across all platforms.
+ */
+static void
+print_double(double x)
+{
+#ifdef WIN32
+       /* Change Windows' 3-digit exponents to look like everyone else's */
+       char            convert[128];
+       int                     vallen;
+
+       sprintf(convert, "%g", x);
+       vallen = strlen(convert);
+
+       if (vallen >= 6 &&
+               convert[vallen - 5] == 'e' &&
+               convert[vallen - 3] == '0')
+       {
+               convert[vallen - 3] = convert[vallen - 2];
+               convert[vallen - 2] = convert[vallen - 1];
+               convert[vallen - 1] = '\0';
+       }
+
+       printf("%s", convert);
+#else
+       printf("%g", x);
+#endif
+}
 
-NOTE: This file has a different expect file for regression tests on MinGW32
+#line 9 "num_test2.pgc"
 
-*/
 
 
 char* nums[] = { "2E394", "-2", ".794", "3.44", "592.49E21", "-32.84e4",
@@ -126,7 +154,9 @@ main(void)
 
                        r = PGTYPESnumeric_to_double(num, &d);
                        if (r) check_errno();
-                       printf("num[%d,10]: %g (r: %d)\n", i, r?0.0:d, r);
+                       printf("num[%d,10]: ", i);
+                       print_double(r ? 0.0 : d);
+                       printf(" (r: %d)\n", r);
                }
 
                /* do not test double to numeric because
index 98912704947acb69e5bd39cd0c0efe462ce007e9..254aeb4129bb28bb592a6f9cfcf91f9240ac81b8 100644 (file)
@@ -5,12 +5,7 @@
 
 exec sql include ../regression;
 
-
-/*
-
-NOTE: This file has a different expect file for regression tests on MinGW32
-
-*/
+exec sql include ../printf_hack;
 
 
 int
@@ -75,7 +70,9 @@ main(void)
        PGTYPESnumeric_div(res, value2, res);
        text = PGTYPESnumeric_to_asc(res, -1);
        PGTYPESnumeric_to_double(res, &d);
-       printf("div = %s %e\n", text, d);
+       printf("div = %s ", text);
+       print_double(d);
+       printf("\n");
 
        PGTYPESnumeric_free(value1);
        PGTYPESnumeric_free(value2);
index edc0c8c0578baae0959140cf2f434bad94b36404..8241d45ca519aafb712fcab274d7c2820d6e1ffb 100644 (file)
@@ -6,12 +6,7 @@
 
 exec sql include ../regression;
 
-
-/*
-
-NOTE: This file has a different expect file for regression tests on MinGW32
-
-*/
+exec sql include ../printf_hack;
 
 
 char* nums[] = { "2E394", "-2", ".794", "3.44", "592.49E21", "-32.84e4",
@@ -108,7 +103,9 @@ main(void)
 
                        r = PGTYPESnumeric_to_double(num, &d);
                        if (r) check_errno();
-                       printf("num[%d,10]: %g (r: %d)\n", i, r?0.0:d, r);
+                       printf("num[%d,10]: ", i);
+                       print_double(r ? 0.0 : d);
+                       printf(" (r: %d)\n", r);
                }
 
                /* do not test double to numeric because
diff --git a/src/interfaces/ecpg/test/printf_hack.h b/src/interfaces/ecpg/test/printf_hack.h
new file mode 100644 (file)
index 0000000..ef584c0
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * print_double(x) has the same effect as printf("%g", x), but is intended
+ * to produce the same formatting across all platforms.
+ */
+static void
+print_double(double x)
+{
+#ifdef WIN32
+       /* Change Windows' 3-digit exponents to look like everyone else's */
+       char            convert[128];
+       int                     vallen;
+
+       sprintf(convert, "%g", x);
+       vallen = strlen(convert);
+
+       if (vallen >= 6 &&
+               convert[vallen - 5] == 'e' &&
+               convert[vallen - 3] == '0')
+       {
+               convert[vallen - 3] = convert[vallen - 2];
+               convert[vallen - 2] = convert[vallen - 1];
+               convert[vallen - 1] = '\0';
+       }
+
+       printf("%s", convert);
+#else
+       printf("%g", x);
+#endif
+}