Commit a6944611 authored by Tatsuo Ishii's avatar Tatsuo Ishii

Fix copy to make it more robust against unexpected character

sequences. This is done by disabling multi-byte awareness when it's
not necessary. This is kind of a workaround, not a perfect solution.
However, there is no ideal way to parse broken multi-byte character
sequences. So I guess this is the best way what we could do right
now...
parent 4451ed3d
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.127 2001/01/03 20:04:10 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.128 2001/01/06 03:33:17 ishii Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -74,8 +74,8 @@ static bool fe_eof; ...@@ -74,8 +74,8 @@ static bool fe_eof;
static StringInfoData attribute_buf; static StringInfoData attribute_buf;
#ifdef MULTIBYTE #ifdef MULTIBYTE
static int encoding; static int client_encoding;
static int server_encoding;
#endif #endif
...@@ -297,7 +297,8 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe, ...@@ -297,7 +297,8 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
*/ */
initStringInfo(&attribute_buf); initStringInfo(&attribute_buf);
#ifdef MULTIBYTE #ifdef MULTIBYTE
encoding = pg_get_client_encoding(); client_encoding = pg_get_client_encoding();
server_encoding = GetDatabaseEncoding();
#endif #endif
if (from) if (from)
...@@ -1114,29 +1115,35 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_ ...@@ -1114,29 +1115,35 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_
} }
appendStringInfoCharMacro(&attribute_buf, c); appendStringInfoCharMacro(&attribute_buf, c);
#ifdef MULTIBYTE #ifdef MULTIBYTE
/* get additional bytes of the char, if any */ if (client_encoding != server_encoding)
s[0] = c;
mblen = pg_encoding_mblen(encoding, s);
for (j = 1; j < mblen; j++)
{ {
c = CopyGetChar(fp); /* get additional bytes of the char, if any */
if (c == EOF) s[0] = c;
goto endOfFile; mblen = pg_encoding_mblen(client_encoding, s);
appendStringInfoCharMacro(&attribute_buf, c); for (j = 1; j < mblen; j++)
{
c = CopyGetChar(fp);
if (c == EOF)
goto endOfFile;
appendStringInfoCharMacro(&attribute_buf, c);
}
} }
#endif #endif
} }
#ifdef MULTIBYTE #ifdef MULTIBYTE
cvt = (char *) pg_client_to_server((unsigned char *) attribute_buf.data, if (client_encoding != server_encoding)
attribute_buf.len);
if (cvt != attribute_buf.data)
{ {
/* transfer converted data back to attribute_buf */ cvt = (char *) pg_client_to_server((unsigned char *) attribute_buf.data,
attribute_buf.len = 0; attribute_buf.len);
attribute_buf.data[0] = '\0'; if (cvt != attribute_buf.data)
appendBinaryStringInfo(&attribute_buf, cvt, strlen(cvt)); {
pfree(cvt); /* transfer converted data back to attribute_buf */
attribute_buf.len = 0;
attribute_buf.data[0] = '\0';
appendBinaryStringInfo(&attribute_buf, cvt, strlen(cvt));
pfree(cvt);
}
} }
#endif #endif
...@@ -1163,15 +1170,22 @@ CopyAttributeOut(FILE *fp, char *server_string, char *delim) ...@@ -1163,15 +1170,22 @@ CopyAttributeOut(FILE *fp, char *server_string, char *delim)
#endif #endif
#ifdef MULTIBYTE #ifdef MULTIBYTE
string = (char *) pg_server_to_client((unsigned char *) server_string, if (client_encoding != server_encoding)
strlen(server_string)); {
string_start = string; string = (char *) pg_server_to_client((unsigned char *) server_string,
strlen(server_string));
string_start = string;
}
else
{
string = server_string;
}
#else #else
string = server_string; string = server_string;
#endif #endif
#ifdef MULTIBYTE #ifdef MULTIBYTE
for (; (mblen = pg_encoding_mblen(encoding, string)) && for (; (mblen = (server_encoding == client_encoding? 1 : pg_encoding_mblen(client_encoding, string))) &&
((c = *string) != '\0'); string += mblen) ((c = *string) != '\0'); string += mblen)
#else #else
for (; (c = *string) != '\0'; string++) for (; (c = *string) != '\0'; string++)
...@@ -1188,7 +1202,7 @@ CopyAttributeOut(FILE *fp, char *server_string, char *delim) ...@@ -1188,7 +1202,7 @@ CopyAttributeOut(FILE *fp, char *server_string, char *delim)
} }
#ifdef MULTIBYTE #ifdef MULTIBYTE
if (string_start != server_string) if (client_encoding != server_encoding)
pfree(string_start); /* pfree pg_server_to_client result */ pfree(string_start); /* pfree pg_server_to_client result */
#endif #endif
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment