Tom Lane wrote: > "Hiroshi Saito" <[EMAIL PROTECTED]> writes: > > This is very strange.!! > > boolean ... ok > > char ... diff command failed with status 1: "diff -w > > "./expected/char.out" > > "./results/char.out" >"./results/char.diff"" > > server stopped > > Yes, I believe the problem is that our Windows versions of the > WIFEXITED/WEXITSTATUS macros are wrong. pg_regress is trying to verify > that the diff call didn't fail entirely (eg, diff not there or failed > to read one of the files), but the status code diff is returning for > "files not the same" is confusing it. > > Can anyone check into what the result status conventions really are on > Windows? I am tempted to change the macros to just swap the bytes, > but I dunno what that will do to their existing usages to check the > result of pclose() or win32_waitpid().
I checked on MinGW and system() just returns the value returned by the application. There isn't any special two-values-in-one layering like is done on Unix for wait() and the return value from system(). It seems if the child dies from a signal, the parent dies too, at least in my C tests. I propose the following patch which just makes Win32 behave as returning a single value from system(), and cleans up pg_regress.c. We don't call wait() or pipe() on Win32. Though this is clearly a bug fix, I am hesitant to backpatch it to 8.1 or 8.0 because of no problem reports. -- Bruce Momjian [EMAIL PROTECTED] EnterpriseDB http://www.enterprisedb.com + If your life is a hard drive, Christ can be your backup. +
Index: src/include/port/win32.h =================================================================== RCS file: /cvsroot/pgsql/src/include/port/win32.h,v retrieving revision 1.53 diff -c -c -r1.53 win32.h *** src/include/port/win32.h 16 Jul 2006 20:17:04 -0000 1.53 --- src/include/port/win32.h 28 Jul 2006 19:01:07 -0000 *************** *** 109,120 **** /* ! * Signal stuff */ ! #define WEXITSTATUS(w) (((w) >> 8) & 0xff) ! #define WIFEXITED(w) (((w) & 0xff) == 0) ! #define WIFSIGNALED(w) (((w) & 0x7f) > 0 && (((w) & 0x7f) < 0x7f)) ! #define WTERMSIG(w) ((w) & 0x7f) #define sigmask(sig) ( 1 << ((sig)-1) ) --- 109,125 ---- /* ! * Signal stuff ! * WIN32 doesn't have wait(), so the return value for children ! * is simply the return value specified by the child, without ! * any additional information on whether the child terminated ! * on its own or via a signal. These macros are also used ! * to interpret the return value of system(). */ ! #define WEXITSTATUS(w) (w) ! #define WIFEXITED(w) (true) ! #define WIFSIGNALED(w) (false) ! #define WTERMSIG(w) (0) #define sigmask(sig) ( 1 << ((sig)-1) ) Index: src/test/regress/pg_regress.c =================================================================== RCS file: /cvsroot/pgsql/src/test/regress/pg_regress.c,v retrieving revision 1.16 diff -c -c -r1.16 pg_regress.c *** src/test/regress/pg_regress.c 27 Jul 2006 15:37:19 -0000 1.16 --- src/test/regress/pg_regress.c 28 Jul 2006 19:01:12 -0000 *************** *** 813,823 **** * work for inspecting the results of system(). For the moment, * hard-wire the check on Windows. */ - #ifndef WIN32 if (!WIFEXITED(r) || WEXITSTATUS(r) > 1) - #else - if (r != 0 && r != 1) - #endif { fprintf(stderr, _("diff command failed with status %d: %s\n"), r, cmd); exit_nicely(2); --- 813,819 ----
---------------------------(end of broadcast)--------------------------- TIP 3: Have you checked our extensive FAQ? http://www.postgresql.org/docs/faq