aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2006-02-03 12:41:07 +0000
committerBruce Momjian <bruce@momjian.us>2006-02-03 12:41:07 +0000
commiteb7bd06983bcbd4c178bba0e78214e8fb76ae8c3 (patch)
tree2a9e65921bc9abf42b93addd95a7d5e538d771aa /src
parent890707a5372f20f8395816b9268d53cb1d5d95cd (diff)
downloadpostgresql-eb7bd06983bcbd4c178bba0e78214e8fb76ae8c3.tar.gz
postgresql-eb7bd06983bcbd4c178bba0e78214e8fb76ae8c3.zip
Prevent COPY from using newline or carriage return as delimiter or null.
Disallow backslash as the delimiter in non-CVS mode. David Fetter
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/copy.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index f97aafc2034..af3df4a6899 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.257 2005/12/28 03:25:32 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.258 2006/02/03 12:41:07 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -856,6 +856,25 @@ DoCopy(const CopyStmt *stmt)
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("COPY delimiter must be a single character")));
+ /* Disallow end-of-line characters */
+ if (strchr(cstate->delim, '\r') != NULL ||
+ strchr(cstate->delim, '\n') != NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("COPY delimiter cannot be newline or carriage return")));
+
+ if (strchr(cstate->null_print, '\r') != NULL ||
+ strchr(cstate->null_print, '\n') != NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("COPY null cannot use newline or carriage return")));
+
+ /* Disallow backslash in non-CSV mode */
+ if (!cstate->csv_mode && strchr(cstate->delim, '\\') != NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("COPY delimiter cannot be backslash")));
+
/* Check header */
if (!cstate->csv_mode && cstate->header_line)
ereport(ERROR,