aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/copy.c95
-rw-r--r--src/bin/pg_dump/pg_dump.c8
2 files changed, 45 insertions, 58 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index f6815a3631f..e17100a0fb0 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -6,7 +6,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.2 1996/07/23 02:23:15 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.3 1996/08/14 05:33:04 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@@ -107,7 +107,7 @@ DoCopy(char *relname, bool binary, bool from, bool pipe, char *filename,
if (!pipe) {
fclose(fp);
}else if (!from && !binary) {
- fputs(".\n", fp);
+ fputs("\\.\n", fp);
if (IsUnderPostmaster) fflush(Pfout);
}
}
@@ -169,6 +169,9 @@ CopyTo(Relation rel, bool binary, FILE *fp, char *delim)
CopyAttributeOut(fp, string, delim);
pfree(string);
}
+ else
+ fputs("\\N", fp); /* null indicator */
+
if (i == attr_count - 1) {
fputc('\n', fp);
}else {
@@ -703,40 +706,22 @@ CopyReadAttribute(int attno, FILE *fp, bool *isnull, char *delim)
int done = 0;
int i = 0;
- if (feof(fp)) {
- *isnull = (bool) false;
+ *isnull = (bool) false; /* set default */
+ if (feof(fp))
return(NULL);
- }
while (!done) {
c = getc(fp);
- if (feof(fp)) {
- *isnull = (bool) false;
+ if (feof(fp))
return(NULL);
- }else if (reading_from_input && attno == 0 && i == 0 && c == '.') {
- attribute[0] = c;
- c = getc(fp);
- if (c == '\n') {
- *isnull = (bool) false;
- return(NULL);
- }else if (inString(c,delim)) {
- attribute[1] = 0;
- *isnull = (bool) false;
- return(&attribute[0]);
- }else {
- attribute[1] = c;
- i = 2;
- }
- }else if (c == '\\') {
+ else if (c == '\\') {
c = getc(fp);
#ifdef ESCAPE_PATCH
#define ISOCTAL(c) (((c) >= '0') && ((c) <= '7'))
#define VALUE(c) ((c) - '0')
- if (feof(fp)) {
- *isnull = (bool) false;
+ if (feof(fp))
return(NULL);
- }
switch (c) {
case '0':
case '1':
@@ -755,21 +740,17 @@ CopyReadAttribute(int attno, FILE *fp, bool *isnull, char *delim)
if (ISOCTAL(c)) {
val = (val<<3) + VALUE(c);
} else {
- if (feof(fp)) {
- *isnull = (bool) false;
+ if (feof(fp))
return(NULL);
- }
ungetc(c, fp);
}
} else {
- if (feof(fp)) {
- *isnull = (bool) false;
+ if (feof(fp))
return(NULL);
- }
ungetc(c, fp);
}
c = val & 0377;
- }
+ }
break;
case 'b':
c = '\b';
@@ -789,6 +770,16 @@ CopyReadAttribute(int attno, FILE *fp, bool *isnull, char *delim)
case 'v':
c = '\v';
break;
+ case 'N':
+ attribute[0] = '\0'; /* just to be safe */
+ *isnull = (bool) true;
+ break;
+ case '.':
+ c = getc(fp);
+ if (c != '\n')
+ elog(WARN, "CopyReadAttribute - end of record marker corrupted");
+ return(NULL);
+ break;
}
#endif
}else if (inString(c,delim) || c == '\n') {
@@ -799,13 +790,7 @@ CopyReadAttribute(int attno, FILE *fp, bool *isnull, char *delim)
elog(WARN, "CopyReadAttribute - attribute length too long");
}
attribute[i] = '\0';
- if (i == 0) {
- *isnull = (bool) true;
- return(NULL);
- }else {
- *isnull = (bool) false;
- return(&attribute[0]);
- }
+ return(&attribute[0]);
}
#ifdef ESCAPE_PATCH
@@ -817,26 +802,26 @@ CopyAttributeOut(FILE *fp, char *string, char *delim)
int len = strlen(string);
/* XXX - This is a kludge, we should check the data type */
- if (len && (string[0] == '{') && (string[len-1] == '}')) {
+ if (len && (string[0] == '{') && (string[len-1] == '}'))
is_array = true;
- }
for ( ; c = *string; string++) {
- if ((c == delim[0]) || (c == '\n')) {
+ if (c == delim[0] || c == '\n' ||
+ (c == '\\' && !is_array))
fputc('\\', fp);
- } else if ((c == '\\') && is_array) {
- if (*(string+1) == '\\') {
- /* translate \\ to \\\\ */
- fputc('\\', fp);
- fputc('\\', fp);
- fputc('\\', fp);
- string++;
- } else if (*(string+1) == '"') {
- /* translate \" to \\\" */
- fputc('\\', fp);
- fputc('\\', fp);
- }
- }
+ else
+ if (c == '\\' && is_array)
+ if (*(string+1) == '\\') {
+ /* translate \\ to \\\\ */
+ fputc('\\', fp);
+ fputc('\\', fp);
+ fputc('\\', fp);
+ string++;
+ } else if (*(string+1) == '"') {
+ /* translate \" to \\\" */
+ fputc('\\', fp);
+ fputc('\\', fp);
+ }
fputc(*string, fp);
}
}
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 85943a88b1f..98e2fa3fd8a 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -20,7 +20,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.5 1996/07/31 06:09:46 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.6 1996/08/14 05:33:11 scrappy Exp $
*
* Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
*
@@ -1394,7 +1394,9 @@ dumpClasses(TableInfo *tblinfo, int numTables, FILE *fout, char *onlytable)
while (!copydone) {
ret = PQgetline(res->conn, copybuf, COPYBUFSIZ);
- if (copybuf[0] == '.' && copybuf[1] =='\0') {
+ if (copybuf[0] == '\\' &&
+ copybuf[1] == '.' &&
+ copybuf[2] == '\0') {
copydone = true; /* don't print this... */
} else {
fputs(copybuf, stdout);
@@ -1410,7 +1412,7 @@ dumpClasses(TableInfo *tblinfo, int numTables, FILE *fout, char *onlytable)
}
}
}
- fprintf(fout, ".\n");
+ fprintf(fout, "\\.\n");
PQclear(res);
PQendcopy(res->conn);
} else {