Change psql \copy stdin/stdout to read from command input/output.
authorBruce Momjian <bruce@momjian.us>
Mon, 12 Apr 2004 15:58:52 +0000 (15:58 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 12 Apr 2004 15:58:52 +0000 (15:58 +0000)
Add pstdin/pstdout to read from psql's stdin/stdout.

BACKWARD INCOMPATIBLE CHANGE

doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/copy.c

index e6bbcea60b17ccd9a7d75d32a95a2e966199c6b4..206fe2719bb4c174bf29f99b0923e94d41495167 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.109 2004/03/30 15:54:33 momjian Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.110 2004/04/12 15:58:52 momjian Exp $
 PostgreSQL documentation
 -->
 
@@ -706,7 +706,7 @@ testdb=>
         <term><literal>\copy <replaceable class="parameter">table</replaceable>
    [ ( <replaceable class="parameter">column_list</replaceable> ) ]
         { <literal>from</literal> | <literal>to</literal> }
-   { <replaceable class="parameter">filename</replaceable> | stdin | stdout | - }
+   { <replaceable class="parameter">filename</replaceable> | stdin | stdout | pstdin | pstdout }
         [ <literal>with</literal> ] 
             [ <literal>oids</literal> ] 
             [ <literal>delimiter [as] </literal> '<replaceable class="parameter">character</replaceable>' ]
@@ -736,18 +736,17 @@ testdb=>
    </para>
 
    <para>
-   For <literal>\copy <replaceable
+   <literal>\copy <replaceable
    class="parameter">table</replaceable> from <replaceable
-   class="parameter">filename</replaceable></literal> operations,
-   <application>psql</application> adds the option of using a
-   hyphen instead of <replaceable
-   class="parameter">filename</replaceable>.  This causes
-   <literal>\copy</literal> to read rows from the same source that
-   issued the command, continuing until <literal>\.</literal> is
-   read or the stream reaches <acronym>EOF</>.  This option is
-   useful for populating tables in-line within a SQL script file.
-   In contrast, <literal>\copy from stdin</> always reads from
-   <application>psql</application>'s standard input.
+   class="parameter">stdin | stdout</replaceable></literal>
+   reads/writes based on the command input and output respectively.
+   All rows are read from the same source that issued the command,
+   continuing until <literal>\.</literal> is read or the stream
+   reaches <acronym>EOF</>. Output is sent to the same place as
+   command output. To read/write from
+   <application>psql</application>'s standard input or output, use
+   <literal>pstdin</> or <literal>pstdout</>. This option is useful
+   for populating tables in-line within a SQL script file.
    </para>
 
         <tip>
@@ -759,20 +758,6 @@ testdb=>
         </para>
         </tip>
 
-        <note>
-        <para>
-        Note the difference in interpretation of
-        <literal>stdin</literal> and <literal>stdout</literal> between
-   <literal>\copy</literal> and <command>COPY</command>.
-   In <literal>\copy</literal> these always
-        refer to <application>psql</application>'s input and output
-        streams. In <command>COPY</command>, <literal>stdin</literal> comes
-   from wherever the <command>COPY</command> itself came from (for
-        example, a script run with the <option>-f</option> option), while
-        <literal>stdout</literal> refers to the query output stream (see
-        <command>\o</command> meta-command below).
-        </para>
-        </note>
         </listitem>
       </varlistentry>
 
index 9fb35f532defd0471e844268b47a3ababb9ee5df..49b8b8a064d6e0161589b1f34aa70e9aefe08a20 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.42 2004/01/29 12:34:59 neilc Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.43 2004/04/12 15:58:52 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "copy.h"
@@ -62,7 +62,7 @@ struct copy_options
    char       *table;
    char       *column_list;
    char       *file;           /* NULL = stdin/stdout */
-   bool        in_dash;        /* true = use src stream not true stdin */
+   bool        psql_inout;     /* true = use psql stdin/stdout */
    bool        from;
    bool        binary;
    bool        oids;
@@ -220,21 +220,18 @@ parse_slash_copy(const char *args)
    if (strcasecmp(token, "stdin") == 0 ||
        strcasecmp(token, "stdout") == 0)
    {
-       result->in_dash = false;
+       result->psql_inout = false;
        result->file = NULL;
    }
-   else if (strcmp(token, "-") == 0)
+   else if (strcasecmp(token, "pstdin") == 0 ||
+       strcasecmp(token, "pstdout") == 0)
    {
-       /* Can't do this on output */
-       if (!result->from)
-           goto error;
-
-       result->in_dash = true;
+       result->psql_inout = true;
        result->file = NULL;
    }
    else
    {
-       result->in_dash = false;
+       result->psql_inout = false;
        result->file = pg_strdup(token);
        expand_tilde(&result->file);
    }
@@ -394,7 +391,7 @@ do_copy(const char *args)
    {
        if (options->file)
            copystream = fopen(options->file, "r");
-       else if (options->in_dash)
+       else if (!options->psql_inout)
            copystream = pset.cur_cmd_source;
        else
            copystream = stdin;
@@ -403,6 +400,8 @@ do_copy(const char *args)
    {
        if (options->file)
            copystream = fopen(options->file, "w");
+       else if (!options->psql_inout)
+           copystream = pset.queryFout;
        else
            copystream = stdout;
    }