mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +03:00
Allow * as parameter for FORCE QUOTE for COPY CSV. Itagaki Takahiro.
This commit is contained in:
parent
8af12bca3b
commit
de7531a971
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$PostgreSQL: pgsql/doc/src/sgml/ref/copy.sgml,v 1.85 2009/02/06 21:22:49 tgl Exp $
|
$PostgreSQL: pgsql/doc/src/sgml/ref/copy.sgml,v 1.86 2009/07/25 00:07:10 adunstan Exp $
|
||||||
PostgreSQL documentation
|
PostgreSQL documentation
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ COPY { <replaceable class="parameter">tablename</replaceable> [ ( <replaceable c
|
|||||||
[ CSV [ HEADER ]
|
[ CSV [ HEADER ]
|
||||||
[ QUOTE [ AS ] '<replaceable class="parameter">quote</replaceable>' ]
|
[ QUOTE [ AS ] '<replaceable class="parameter">quote</replaceable>' ]
|
||||||
[ ESCAPE [ AS ] '<replaceable class="parameter">escape</replaceable>' ]
|
[ ESCAPE [ AS ] '<replaceable class="parameter">escape</replaceable>' ]
|
||||||
[ FORCE QUOTE <replaceable class="parameter">column</replaceable> [, ...] ]
|
[ FORCE QUOTE { <replaceable class="parameter">column</replaceable> [, ...] | * } ]
|
||||||
</synopsis>
|
</synopsis>
|
||||||
</refsynopsisdiv>
|
</refsynopsisdiv>
|
||||||
|
|
||||||
@ -248,7 +248,9 @@ COPY { <replaceable class="parameter">tablename</replaceable> [ ( <replaceable c
|
|||||||
<para>
|
<para>
|
||||||
In <literal>CSV</> <command>COPY TO</> mode, forces quoting to be
|
In <literal>CSV</> <command>COPY TO</> mode, forces quoting to be
|
||||||
used for all non-<literal>NULL</> values in each specified column.
|
used for all non-<literal>NULL</> values in each specified column.
|
||||||
<literal>NULL</> output is never quoted.
|
<literal>NULL</> output is never quoted. If <literal>*</> is specified,
|
||||||
|
non-<literal>NULL</> values for all columns of the table will be
|
||||||
|
quoted.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.312 2009/06/11 14:48:55 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.313 2009/07/25 00:07:11 adunstan Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -730,6 +730,9 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
|
|||||||
int num_phys_attrs;
|
int num_phys_attrs;
|
||||||
uint64 processed;
|
uint64 processed;
|
||||||
|
|
||||||
|
/* a dummy list that represents 'all-columns' */
|
||||||
|
List all_columns = { T_List };
|
||||||
|
|
||||||
/* Allocate workspace and zero all fields */
|
/* Allocate workspace and zero all fields */
|
||||||
cstate = (CopyStateData *) palloc0(sizeof(CopyStateData));
|
cstate = (CopyStateData *) palloc0(sizeof(CopyStateData));
|
||||||
|
|
||||||
@ -808,7 +811,11 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
|
|||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||||
errmsg("conflicting or redundant options")));
|
errmsg("conflicting or redundant options")));
|
||||||
force_quote = (List *) defel->arg;
|
|
||||||
|
if (IsA(defel->arg, A_Star))
|
||||||
|
force_quote = &all_columns;
|
||||||
|
else
|
||||||
|
force_quote = (List *) defel->arg;
|
||||||
}
|
}
|
||||||
else if (strcmp(defel->defname, "force_notnull") == 0)
|
else if (strcmp(defel->defname, "force_notnull") == 0)
|
||||||
{
|
{
|
||||||
@ -1092,7 +1099,14 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
|
|||||||
|
|
||||||
/* Convert FORCE QUOTE name list to per-column flags, check validity */
|
/* Convert FORCE QUOTE name list to per-column flags, check validity */
|
||||||
cstate->force_quote_flags = (bool *) palloc0(num_phys_attrs * sizeof(bool));
|
cstate->force_quote_flags = (bool *) palloc0(num_phys_attrs * sizeof(bool));
|
||||||
if (force_quote)
|
if (force_quote == &all_columns)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < num_phys_attrs; i++)
|
||||||
|
cstate->force_quote_flags[i] = true;
|
||||||
|
}
|
||||||
|
else if (force_quote)
|
||||||
{
|
{
|
||||||
List *attnums;
|
List *attnums;
|
||||||
ListCell *cur;
|
ListCell *cur;
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.671 2009/07/20 02:42:28 adunstan Exp $
|
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.672 2009/07/25 00:07:11 adunstan Exp $
|
||||||
*
|
*
|
||||||
* HISTORY
|
* HISTORY
|
||||||
* AUTHOR DATE MAJOR EVENT
|
* AUTHOR DATE MAJOR EVENT
|
||||||
@ -2028,6 +2028,10 @@ copy_opt_item:
|
|||||||
{
|
{
|
||||||
$$ = makeDefElem("force_quote", (Node *)$3);
|
$$ = makeDefElem("force_quote", (Node *)$3);
|
||||||
}
|
}
|
||||||
|
| FORCE QUOTE '*'
|
||||||
|
{
|
||||||
|
$$ = makeDefElem("force_quote", (Node *)makeNode(A_Star));
|
||||||
|
}
|
||||||
| FORCE NOT NULL_P columnList
|
| FORCE NOT NULL_P columnList
|
||||||
{
|
{
|
||||||
$$ = makeDefElem("force_notnull", (Node *)$4);
|
$$ = makeDefElem("force_notnull", (Node *)$4);
|
||||||
|
@ -191,6 +191,10 @@ COPY y TO stdout WITH CSV FORCE QUOTE col2 ESCAPE E'\\';
|
|||||||
"Jackson, Sam","\\h"
|
"Jackson, Sam","\\h"
|
||||||
"It is \"perfect\"."," "
|
"It is \"perfect\"."," "
|
||||||
"",
|
"",
|
||||||
|
COPY y TO stdout WITH CSV FORCE QUOTE *;
|
||||||
|
"Jackson, Sam","\h"
|
||||||
|
"It is ""perfect""."," "
|
||||||
|
"",
|
||||||
--test that we read consecutive LFs properly
|
--test that we read consecutive LFs properly
|
||||||
CREATE TEMP TABLE testnl (a int, b text, c int);
|
CREATE TEMP TABLE testnl (a int, b text, c int);
|
||||||
COPY testnl FROM stdin CSV;
|
COPY testnl FROM stdin CSV;
|
||||||
|
@ -128,6 +128,7 @@ INSERT INTO y VALUES ('', NULL);
|
|||||||
COPY y TO stdout WITH CSV;
|
COPY y TO stdout WITH CSV;
|
||||||
COPY y TO stdout WITH CSV QUOTE '''' DELIMITER '|';
|
COPY y TO stdout WITH CSV QUOTE '''' DELIMITER '|';
|
||||||
COPY y TO stdout WITH CSV FORCE QUOTE col2 ESCAPE E'\\';
|
COPY y TO stdout WITH CSV FORCE QUOTE col2 ESCAPE E'\\';
|
||||||
|
COPY y TO stdout WITH CSV FORCE QUOTE *;
|
||||||
|
|
||||||
--test that we read consecutive LFs properly
|
--test that we read consecutive LFs properly
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user