diff options
author | Peter Eisentraut <peter@eisentraut.org> | 2022-01-28 09:22:53 +0100 |
---|---|---|
committer | Peter Eisentraut <peter@eisentraut.org> | 2022-01-28 09:44:47 +0100 |
commit | 43f33dc018a4b77ced78a0a6df8ed5d450cfe5f4 (patch) | |
tree | f372e2f7e3f37ee968c08f6cc6220b6657f90394 /src | |
parent | 5553cbd4fe3eb177b3266ca4a7e80159323608c2 (diff) | |
download | postgresql-43f33dc018a4b77ced78a0a6df8ed5d450cfe5f4.tar.gz postgresql-43f33dc018a4b77ced78a0a6df8ed5d450cfe5f4.zip |
Add HEADER support to COPY text format
The COPY CSV format supports the HEADER option to output a header
line. This patch adds the same option to the default text format. On
input, the HEADER option causes the first line to be skipped, same as
with CSV.
Author: Rémi Lapeyre <remi.lapeyre@lenstra.fr>
Discussion: https://www.postgresql.org/message-id/flat/CAF1-J-0PtCWMeLtswwGV2M70U26n4g33gpe1rcKQqe6wVQDrFA@mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/commands/copy.c | 4 | ||||
-rw-r--r-- | src/backend/commands/copyto.c | 5 | ||||
-rw-r--r-- | src/include/commands/copy.h | 2 | ||||
-rw-r--r-- | src/test/regress/expected/copy.out | 8 | ||||
-rw-r--r-- | src/test/regress/sql/copy.sql | 12 |
5 files changed, 27 insertions, 4 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index bb9c21bc6b4..7da7105d44b 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -555,10 +555,10 @@ ProcessCopyOptions(ParseState *pstate, errmsg("COPY delimiter cannot be \"%s\"", opts_out->delim))); /* Check header */ - if (!opts_out->csv_mode && opts_out->header_line) + if (opts_out->binary && opts_out->header_line) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY HEADER available only in CSV mode"))); + errmsg("cannot specify HEADER in BINARY mode"))); /* Check quote */ if (!opts_out->csv_mode && opts_out->quote != NULL) diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c index 20bfd49112a..e793b64bdab 100644 --- a/src/backend/commands/copyto.c +++ b/src/backend/commands/copyto.c @@ -863,8 +863,11 @@ DoCopyTo(CopyToState cstate) colname = NameStr(TupleDescAttr(tupDesc, attnum - 1)->attname); - CopyAttributeOutCSV(cstate, colname, false, + if (cstate->opts.csv_mode) + CopyAttributeOutCSV(cstate, colname, false, list_length(cstate->attnumlist) == 1); + else + CopyAttributeOutText(cstate, colname); } CopySendEndOfRow(cstate); diff --git a/src/include/commands/copy.h b/src/include/commands/copy.h index c01cf42bcd1..8694da5004c 100644 --- a/src/include/commands/copy.h +++ b/src/include/commands/copy.h @@ -32,7 +32,7 @@ typedef struct CopyFormatOptions bool binary; /* binary format? */ bool freeze; /* freeze rows on loading? */ bool csv_mode; /* Comma Separated Value format? */ - bool header_line; /* CSV header line? */ + bool header_line; /* header line? */ char *null_print; /* NULL marker string (server encoding!) */ int null_print_len; /* length of same */ char *null_print_client; /* same converted to file encoding */ diff --git a/src/test/regress/expected/copy.out b/src/test/regress/expected/copy.out index 931e7b2e699..851b9a4a2d8 100644 --- a/src/test/regress/expected/copy.out +++ b/src/test/regress/expected/copy.out @@ -120,6 +120,14 @@ copy copytest3 to stdout csv header; c1,"col with , comma","col with "" quote" 1,a,1 2,b,2 +create temp table copytest4 ( + c1 int, + "colname with tab: " text); +copy copytest4 from stdin (header); +copy copytest4 to stdout (header); +c1 colname with tab: \t +1 a +2 b -- test copy from with a partitioned table create table parted_copytest ( a int, diff --git a/src/test/regress/sql/copy.sql b/src/test/regress/sql/copy.sql index 15e26517ecb..016fedf6753 100644 --- a/src/test/regress/sql/copy.sql +++ b/src/test/regress/sql/copy.sql @@ -160,6 +160,18 @@ this is just a line full of junk that would error out if parsed copy copytest3 to stdout csv header; +create temp table copytest4 ( + c1 int, + "colname with tab: " text); + +copy copytest4 from stdin (header); +this is just a line full of junk that would error out if parsed +1 a +2 b +\. + +copy copytest4 to stdout (header); + -- test copy from with a partitioned table create table parted_copytest ( a int, |