Tom Lane wrote:
> Bruce Momjian <[EMAIL PROTECTED]> writes:
> >> Tom Lane wrote:
> >>> The cases that I think we most need to defend against are
> >>> (A) diff program not found
> 
> > In summary, on MinGW, files differ or 'diff' not found, returns 1.  If
> > one of the files to be compared does not exist, it returns 2.  And of
> > course, if the files are the same, it returns zero.
> 
> OK.  The problem here is that pg_regress is coded to assume that
> zero-length output file represents success.  Given the above Windows
> behavior that is *clearly* not good enough, because that's probably
> exactly what we will see after diff-not-found (if the Windows shell
> acts like a Unix shell does and creates the ">" target first).
> 
> I'd suggest modifying the logic so that zero-length output file with a
> nonzero return from the child be treated as a fatal condition (not just
> a difference, but bail out).

I modified pg_regress.c to use just the return code to determine if the
diff worked, but I added in a WIN32-specific test for the file size.  I
think that is the cleanest solution.  Attached.

-- 
  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	29 Jul 2006 02:21:57 -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	29 Jul 2006 02:22:23 -0000
***************
*** 799,827 ****
  }
  
  /*
!  * Run a "diff" command and check that it didn't crash
   */
! static void
! run_diff(const char *cmd)
  {
  	int r;
  
  	r = system(cmd);
- 	/*
- 	 * XXX FIXME: it appears that include/port/win32.h's definitions of
- 	 * WIFEXITED and related macros may be wrong.  They certainly don't
- 	 * 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);
  	}
  }
  
  /*
--- 799,826 ----
  }
  
  /*
!  * Run a "diff" command and also check that it didn't crash
   */
! static int
! run_diff(const char *cmd, const char *filename)
  {
  	int r;
  
  	r = system(cmd);
  	if (!WIFEXITED(r) || WEXITSTATUS(r) > 1)
  	{
  		fprintf(stderr, _("diff command failed with status %d: %s\n"), r, cmd);
  		exit_nicely(2);
  	}
+ #ifdef WIN32
+ 	if (WEXITSTATUS(r) == 1 && file_size(filename) == 0)
+ 	{
+ 		fprintf(stderr, _("diff command not found: %s\n"), cmd);
+ 		exit_nicely(2);
+ 	}
+ #endif
+ 	
+ 	return WEXITSTATUS(r);
  }
  
  /*
***************
*** 844,850 ****
  	int best_line_count;
  	int i;
  	int l;
! 
  	/* Check in resultmap if we should be looking at a different file */
  	expectname = testname;
  	for (rm = resultmap; rm != NULL; rm = rm->next)
--- 843,849 ----
  	int best_line_count;
  	int i;
  	int l;
! 	
  	/* Check in resultmap if we should be looking at a different file */
  	expectname = testname;
  	for (rm = resultmap; rm != NULL; rm = rm->next)
***************
*** 872,883 ****
  	snprintf(cmd, sizeof(cmd),
  			 SYSTEMQUOTE "diff %s \"%s\" \"%s\" > \"%s\"" SYSTEMQUOTE,
  			 basic_diff_opts, expectfile, resultsfile, diff);
- 	run_diff(cmd);
  
  	/* Is the diff file empty? */
! 	if (file_size(diff) == 0)
  	{
- 		/* No diff = no changes = good */
  		unlink(diff);
  		return false;
  	}
--- 871,880 ----
  	snprintf(cmd, sizeof(cmd),
  			 SYSTEMQUOTE "diff %s \"%s\" \"%s\" > \"%s\"" SYSTEMQUOTE,
  			 basic_diff_opts, expectfile, resultsfile, diff);
  
  	/* Is the diff file empty? */
! 	if (run_diff(cmd, diff) == 0)
  	{
  		unlink(diff);
  		return false;
  	}
***************
*** 896,906 ****
  		snprintf(cmd, sizeof(cmd),
  				 SYSTEMQUOTE "diff %s \"%s\" \"%s\" > \"%s\"" SYSTEMQUOTE,
  				 basic_diff_opts, expectfile, resultsfile, diff);
- 		run_diff(cmd);
  
! 		if (file_size(diff) == 0)
  		{
- 			/* No diff = no changes = good */
  			unlink(diff);
  			return false;
  		}
--- 893,901 ----
  		snprintf(cmd, sizeof(cmd),
  				 SYSTEMQUOTE "diff %s \"%s\" \"%s\" > \"%s\"" SYSTEMQUOTE,
  				 basic_diff_opts, expectfile, resultsfile, diff);
  
! 		if (run_diff(cmd, diff) == 0)
  		{
  			unlink(diff);
  			return false;
  		}
***************
*** 921,927 ****
  	snprintf(cmd, sizeof(cmd),
  			 SYSTEMQUOTE "diff %s \"%s\" \"%s\" >> \"%s\"" SYSTEMQUOTE,
  			 pretty_diff_opts, best_expect_file, resultsfile, difffilename);
! 	run_diff(cmd);
  
  	/* And append a separator */
  	difffile = fopen(difffilename, "a");
--- 916,922 ----
  	snprintf(cmd, sizeof(cmd),
  			 SYSTEMQUOTE "diff %s \"%s\" \"%s\" >> \"%s\"" SYSTEMQUOTE,
  			 pretty_diff_opts, best_expect_file, resultsfile, difffilename);
! 	run_diff(cmd, difffilename);
  
  	/* And append a separator */
  	difffile = fopen(difffilename, "a");
---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to