aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2009-07-25 00:07:14 +0000
committerAndrew Dunstan <andrew@dunslane.net>2009-07-25 00:07:14 +0000
commitde7531a971b2cc193dc1fc0f507a65263b23e4bc (patch)
tree8a15af04dd7997b0431c1a51024abac3f933f97f /src/backend
parent8af12bca3b19305e9219ce9c8230ed8003b870f6 (diff)
downloadpostgresql-de7531a971b2cc193dc1fc0f507a65263b23e4bc.tar.gz
postgresql-de7531a971b2cc193dc1fc0f507a65263b23e4bc.zip
Allow * as parameter for FORCE QUOTE for COPY CSV. Itagaki Takahiro.
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/commands/copy.c20
-rw-r--r--src/backend/parser/gram.y6
2 files changed, 22 insertions, 4 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index c464ed7f6ce..9048276c546 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -8,7 +8,7 @@
*
*
* 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;
uint64 processed;
+ /* a dummy list that represents 'all-columns' */
+ List all_columns = { T_List };
+
/* Allocate workspace and zero all fields */
cstate = (CopyStateData *) palloc0(sizeof(CopyStateData));
@@ -808,7 +811,11 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
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)
{
@@ -1092,7 +1099,14 @@ DoCopy(const CopyStmt *stmt, const char *queryString)
/* Convert FORCE QUOTE name list to per-column flags, check validity */
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;
ListCell *cur;
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7e6d55be712..c88073d33dd 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* 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
* AUTHOR DATE MAJOR EVENT
@@ -2028,6 +2028,10 @@ copy_opt_item:
{
$$ = makeDefElem("force_quote", (Node *)$3);
}
+ | FORCE QUOTE '*'
+ {
+ $$ = makeDefElem("force_quote", (Node *)makeNode(A_Star));
+ }
| FORCE NOT NULL_P columnList
{
$$ = makeDefElem("force_notnull", (Node *)$4);