change for stdin/stdout for \copy - Mailing list pgsql-patches

From Bruce Momjian
Subject change for stdin/stdout for \copy
Date
Msg-id 200404121559.i3CFxYU04678@candle.pha.pa.us
Whole thread Raw
List pgsql-patches
I have applied the following patch:

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

Change psql \copy stdin/stdout to read from command input/output.

Add pstdin/pstdout to read from psql's stdin/stdout.

BACKWARD INCOMPATIBLE CHANGE

--
  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: doc/src/sgml/ref/psql-ref.sgml
===================================================================
RCS file: /cvsroot/pgsql-server/doc/src/sgml/ref/psql-ref.sgml,v
retrieving revision 1.109
diff -c -c -r1.109 psql-ref.sgml
*** doc/src/sgml/ref/psql-ref.sgml    30 Mar 2004 15:54:33 -0000    1.109
--- doc/src/sgml/ref/psql-ref.sgml    10 Apr 2004 15:18:58 -0000
***************
*** 706,712 ****
          <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 | - }
          [ <literal>with</literal> ]
              [ <literal>oids</literal> ]
              [ <literal>delimiter [as] </literal> '<replaceable class="parameter">character</replaceable>' ]
--- 706,712 ----
          <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 | pstdin | pstdout }
          [ <literal>with</literal> ]
              [ <literal>oids</literal> ]
              [ <literal>delimiter [as] </literal> '<replaceable class="parameter">character</replaceable>' ]
***************
*** 736,753 ****
      </para>

      <para>
!     For <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.
      </para>

          <tip>
--- 736,752 ----
      </para>

      <para>
!     <literal>\copy <replaceable
      class="parameter">table</replaceable> from <replaceable
!     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,778 ****
          </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>

--- 758,763 ----
Index: src/bin/psql/copy.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/psql/copy.c,v
retrieving revision 1.42
diff -c -c -r1.42 copy.c
*** src/bin/psql/copy.c    29 Jan 2004 12:34:59 -0000    1.42
--- src/bin/psql/copy.c    10 Apr 2004 15:19:05 -0000
***************
*** 62,68 ****
      char       *table;
      char       *column_list;
      char       *file;            /* NULL = stdin/stdout */
!     bool        in_dash;        /* true = use src stream not true stdin */
      bool        from;
      bool        binary;
      bool        oids;
--- 62,68 ----
      char       *table;
      char       *column_list;
      char       *file;            /* NULL = stdin/stdout */
!     bool        psql_inout;        /* true = use psql stdin/stdout */
      bool        from;
      bool        binary;
      bool        oids;
***************
*** 220,240 ****
      if (strcasecmp(token, "stdin") == 0 ||
          strcasecmp(token, "stdout") == 0)
      {
!         result->in_dash = false;
          result->file = NULL;
      }
!     else if (strcmp(token, "-") == 0)
      {
!         /* Can't do this on output */
!         if (!result->from)
!             goto error;
!
!         result->in_dash = true;
          result->file = NULL;
      }
      else
      {
!         result->in_dash = false;
          result->file = pg_strdup(token);
          expand_tilde(&result->file);
      }
--- 220,237 ----
      if (strcasecmp(token, "stdin") == 0 ||
          strcasecmp(token, "stdout") == 0)
      {
!         result->psql_inout = false;
          result->file = NULL;
      }
!     else if (strcasecmp(token, "pstdin") == 0 ||
!         strcasecmp(token, "pstdout") == 0)
      {
!         result->psql_inout = true;
          result->file = NULL;
      }
      else
      {
!         result->psql_inout = false;
          result->file = pg_strdup(token);
          expand_tilde(&result->file);
      }
***************
*** 394,400 ****
      {
          if (options->file)
              copystream = fopen(options->file, "r");
!         else if (options->in_dash)
               copystream = pset.cur_cmd_source;
          else
               copystream = stdin;
--- 391,397 ----
      {
          if (options->file)
              copystream = fopen(options->file, "r");
!         else if (!options->psql_inout)
               copystream = pset.cur_cmd_source;
          else
               copystream = stdin;
***************
*** 403,408 ****
--- 400,407 ----
      {
          if (options->file)
              copystream = fopen(options->file, "w");
+         else if (!options->psql_inout)
+              copystream = pset.queryFout;
          else
              copystream = stdout;
      }

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: COPY for CSV documentation
Next
From: Bruce Momjian
Date:
Subject: Re: New socket code for win32