I have applied the following patch to 8.1beta and 8.0.X to return the
proper failure value for a psql -f filename open failure.

The bug was that process_file() was returning false for failure, while
the call site expected MainLoop() return values, meaning false/0 was
success.

---------------------------------------------------------------------------

Clark, Andrew wrote:
> Hi all,
> 
> I've found the when psql is used with the -f flag and the specified file
> doesn't exist the rc value is 0.
> 
> $ uname -a
> SunOS bld 5.8 Generic_108528-29 sun4u sparc SUNW,Sun-Fire-V440
> 
> $ psql -V
> psql (PostgreSQL) 8.0.2
> 
> $ ls foo
> foo: No such file or directory
> 
> $ psql -f foo
> foo: No such file or directory
>  
> $ echo $?
> 0
> 
> However, in the man page for psql it says:
> 
> EXIT STATUS
>      psql returns 0 to the shell if it finished normally, 1 if  a
>      fatal  error  of  its  own  (out  of memory, file not found)
>      occurs, ...
> 
> I'm assuming this is the same with other platforms, but I only use
> PostgreSQL on Solaris.
> 
> Has this been fix in 8.0.3?
> 
> Cheers,
> Andrew

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/bin/psql/command.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/command.c,v
retrieving revision 1.152
diff -c -c -r1.152 command.c
*** src/bin/psql/command.c      14 Aug 2005 18:49:30 -0000      1.152
--- src/bin/psql/command.c      20 Sep 2005 18:43:41 -0000
***************
*** 1314,1320 ****
   * process_file
   *
   * Read commands from filename and then them to the main processing loop
!  * Handler for \i, but can be used for other things as well.
   */
  int
  process_file(char *filename)
--- 1314,1321 ----
   * process_file
   *
   * Read commands from filename and then them to the main processing loop
!  * Handler for \i, but can be used for other things as well.  Returns
!  * MainLoop() error code.
   */
  int
  process_file(char *filename)
***************
*** 1324,1330 ****
        char       *oldfilename;
  
        if (!filename)
!               return false;
  
        canonicalize_path(filename);
        fd = fopen(filename, PG_BINARY_R);
--- 1325,1331 ----
        char       *oldfilename;
  
        if (!filename)
!               return EXIT_FAILURE;
  
        canonicalize_path(filename);
        fd = fopen(filename, PG_BINARY_R);
***************
*** 1332,1338 ****
        if (!fd)
        {
                psql_error("%s: %s\n", filename, strerror(errno));
!               return false;
        }
  
        oldfilename = pset.inputfile;
--- 1333,1339 ----
        if (!fd)
        {
                psql_error("%s: %s\n", filename, strerror(errno));
!               return EXIT_FAILURE;
        }
  
        oldfilename = pset.inputfile;
Index: src/bin/psql/startup.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/startup.c,v
retrieving revision 1.122
diff -c -c -r1.122 startup.c
*** src/bin/psql/startup.c      5 Sep 2005 18:05:13 -0000       1.122
--- src/bin/psql/startup.c      20 Sep 2005 18:43:41 -0000
***************
*** 690,698 ****
        sprintf(psqlrc, "%s-%s", filename, PG_VERSION);
  
        if (access(psqlrc, R_OK) == 0)
!               process_file(psqlrc);
        else if (access(filename, R_OK) == 0)
!               process_file(filename);
        free(psqlrc);
  }
  
--- 690,698 ----
        sprintf(psqlrc, "%s-%s", filename, PG_VERSION);
  
        if (access(psqlrc, R_OK) == 0)
!               (void)process_file(psqlrc);
        else if (access(filename, R_OK) == 0)
!               (void)process_file(filename);
        free(psqlrc);
  }
  
---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?

               http://archives.postgresql.org

Reply via email to