Make psql -1 < file behave as expected.
authorRobert Haas
Thu, 9 Aug 2012 13:59:45 +0000 (09:59 -0400)
committerRobert Haas
Thu, 9 Aug 2012 14:02:50 +0000 (10:02 -0400)
Previously, the -1 option was silently ignored.

Also, emit an error if -1 is used in a context where it won't be
respected, to avoid user confusion.

Original patch by Fabien COELHO, but this version is quite different
from the original submission.

doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/command.c
src/bin/psql/help.c
src/bin/psql/startup.c

index 1ba5ea8dabc04d3c4a700323fcb951f4a9d0f009..340328f4b569bd74a6552c46c96766e38592b6fb 100644 (file)
@@ -512,11 +512,11 @@ PostgreSQL documentation
       
       
        
-        When psql executes a script with the
-        
-        BEGIN/COMMIT around the script to execute it
-        as a single transaction.  This ensures that either all the commands
-        complete successfully, or no changes are applied.
+        When psql executes a script, adding
+        this option wraps BEGIN/COMMIT around the
+        script to execute it as a single transaction.  This ensures that
+        either all the commands complete successfully, or no changes are
+        applied.
        
 
        
index 8abadb26c4965520c04b5c324713204a04f443cc..6ead800aeb1324c1078359dc00813ee8b5116fd7 100644 (file)
@@ -2043,9 +2043,11 @@ process_file(char *filename, bool single_txn, bool use_relative_path)
    PGresult   *res;
 
    if (!filename)
-       return EXIT_FAILURE;
-
-   if (strcmp(filename, "-") != 0)
+   {
+       fd = stdin;
+       filename = NULL;
+   }
+   else if (strcmp(filename, "-") != 0)
    {
        canonicalize_path(filename);
 
index 3ebf7cc52622fd7619787f08326a57b78f247a5e..8793201570d99274b9d8a331f079da7cd767fd9d 100644 (file)
@@ -97,7 +97,7 @@ usage(void)
    printf(_("  -V, --version            output version information, then exit\n"));
    printf(_("  -X, --no-psqlrc          do not read startup file (~/.psqlrc)\n"));
    printf(_("  -1 (\"one\"), --single-transaction\n"
-            "                           execute command file as a single transaction\n"));
+            "                           execute as a single transaction (if non-interactive)\n"));
    printf(_("  -?, --help               show this help, then exit\n"));
 
    printf(_("\nInput and output options:\n"));
index 9a6306b8cf2479039c1b3982a9c018eadbff04b0..8ba8f7042182ab880b44c0b30221b8dcef06d797 100644 (file)
@@ -150,6 +150,27 @@ main(int argc, char *argv[])
 
    parse_psql_options(argc, argv, &options);
 
+   /*
+    * If no action was specified and we're in non-interactive mode, treat
+    * it as if the user had specified "-f -".  This lets single-transaction
+    * mode work in this case.
+    */
+   if (options.action == ACT_NOTHING && pset.notty)
+   {
+       options.action = ACT_FILE;
+       options.action_string = NULL;
+   }
+
+   /* Bail out if -1 was specified but will be ignored. */
+   if (options.single_txn && options.action != ACT_FILE)
+   {
+       if (options.action == ACT_NOTHING)
+           fprintf(stderr,_("%s: -1 can only be used in non-interactive mode\n"), pset.progname);
+       else
+           fprintf(stderr,_("%s: -1 is incompatible with -c and -l\n"), pset.progname);
+       exit(EXIT_FAILURE);
+   }
+
    if (!pset.popt.topt.fieldSep.separator &&
        !pset.popt.topt.fieldSep.separator_zero)
    {
@@ -309,11 +330,9 @@ main(int argc, char *argv[])
            process_psqlrc(argv[0]);
 
        connection_warnings(true);
-       if (!pset.quiet && !pset.notty)
+       if (!pset.quiet)
            printf(_("Type \"help\" for help.\n\n"));
-       if (!pset.notty)
-           initializeInput(options.no_readline ? 0 : 1);
-
+       initializeInput(options.no_readline ? 0 : 1);
        successResult = MainLoop(stdin);
    }