summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2004-04-12 15:58:52 +0000
committerBruce Momjian <bruce@momjian.us>2004-04-12 15:58:52 +0000
commitabdabeb99571a093af5b063c045a65d1c1b09038 (patch)
tree7a06266eadf19c7524a33f8655cdc44ac352a5e7
parent7b3189c18598e57045a09af5036fa2190165c49c (diff)
downloadpostgresql-abdabeb99571a093af5b063c045a65d1c1b09038.tar.gz
Change psql \copy stdin/stdout to read from command input/output.
Add pstdin/pstdout to read from psql's stdin/stdout. BACKWARD INCOMPATIBLE CHANGE
-rw-r--r--doc/src/sgml/ref/psql-ref.sgml39
-rw-r--r--src/bin/psql/copy.c21
2 files changed, 22 insertions, 38 deletions
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index e6bbcea60b..206fe2719b 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -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>
diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c
index 9fb35f532d..49b8b8a064 100644
--- a/src/bin/psql/copy.c
+++ b/src/bin/psql/copy.c
@@ -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;
}