Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita694461

Browse files
committed
Fix copy to make it more robust against unexpected character
sequences. This is done by disabling multi-byte awareness when it'snot necessary. This is kind of a workaround, not a perfect solution.However, there is no ideal way to parse broken multi-byte charactersequences. So I guess this is the best way what we could do rightnow...
1 parent4451ed3 commita694461

File tree

1 file changed

+39
-25
lines changed

1 file changed

+39
-25
lines changed

‎src/backend/commands/copy.c

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.127 2001/01/03 20:04:10 tgl Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.128 2001/01/06 03:33:17 ishii Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -74,8 +74,8 @@ static bool fe_eof;
7474
staticStringInfoDataattribute_buf;
7575

7676
#ifdefMULTIBYTE
77-
staticintencoding;
78-
77+
staticintclient_encoding;
78+
staticintserver_encoding;
7979
#endif
8080

8181

@@ -297,7 +297,8 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
297297
*/
298298
initStringInfo(&attribute_buf);
299299
#ifdefMULTIBYTE
300-
encoding=pg_get_client_encoding();
300+
client_encoding=pg_get_client_encoding();
301+
server_encoding=GetDatabaseEncoding();
301302
#endif
302303

303304
if (from)
@@ -1114,29 +1115,35 @@ CopyReadAttribute(FILE *fp, bool *isnull, char *delim, int *newline, char *null_
11141115
}
11151116
appendStringInfoCharMacro(&attribute_buf,c);
11161117
#ifdefMULTIBYTE
1117-
/* get additional bytes of the char, if any */
1118-
s[0]=c;
1119-
mblen=pg_encoding_mblen(encoding,s);
1120-
for (j=1;j<mblen;j++)
1118+
if (client_encoding!=server_encoding)
11211119
{
1122-
c=CopyGetChar(fp);
1123-
if (c==EOF)
1124-
gotoendOfFile;
1125-
appendStringInfoCharMacro(&attribute_buf,c);
1120+
/* get additional bytes of the char, if any */
1121+
s[0]=c;
1122+
mblen=pg_encoding_mblen(client_encoding,s);
1123+
for (j=1;j<mblen;j++)
1124+
{
1125+
c=CopyGetChar(fp);
1126+
if (c==EOF)
1127+
gotoendOfFile;
1128+
appendStringInfoCharMacro(&attribute_buf,c);
1129+
}
11261130
}
11271131
#endif
11281132
}
11291133

11301134
#ifdefMULTIBYTE
1131-
cvt= (char*)pg_client_to_server((unsignedchar*)attribute_buf.data,
1132-
attribute_buf.len);
1133-
if (cvt!=attribute_buf.data)
1135+
if (client_encoding!=server_encoding)
11341136
{
1135-
/* transfer converted data back to attribute_buf */
1136-
attribute_buf.len=0;
1137-
attribute_buf.data[0]='\0';
1138-
appendBinaryStringInfo(&attribute_buf,cvt,strlen(cvt));
1139-
pfree(cvt);
1137+
cvt= (char*)pg_client_to_server((unsignedchar*)attribute_buf.data,
1138+
attribute_buf.len);
1139+
if (cvt!=attribute_buf.data)
1140+
{
1141+
/* transfer converted data back to attribute_buf */
1142+
attribute_buf.len=0;
1143+
attribute_buf.data[0]='\0';
1144+
appendBinaryStringInfo(&attribute_buf,cvt,strlen(cvt));
1145+
pfree(cvt);
1146+
}
11401147
}
11411148
#endif
11421149

@@ -1163,15 +1170,22 @@ CopyAttributeOut(FILE *fp, char *server_string, char *delim)
11631170
#endif
11641171

11651172
#ifdefMULTIBYTE
1166-
string= (char*)pg_server_to_client((unsignedchar*)server_string,
1167-
strlen(server_string));
1168-
string_start=string;
1173+
if (client_encoding!=server_encoding)
1174+
{
1175+
string= (char*)pg_server_to_client((unsignedchar*)server_string,
1176+
strlen(server_string));
1177+
string_start=string;
1178+
}
1179+
else
1180+
{
1181+
string=server_string;
1182+
}
11691183
#else
11701184
string=server_string;
11711185
#endif
11721186

11731187
#ifdefMULTIBYTE
1174-
for (; (mblen=pg_encoding_mblen(encoding,string))&&
1188+
for (; (mblen=(server_encoding==client_encoding?1 :pg_encoding_mblen(client_encoding,string)))&&
11751189
((c=*string)!='\0');string+=mblen)
11761190
#else
11771191
for (; (c=*string)!='\0';string++)
@@ -1188,7 +1202,7 @@ CopyAttributeOut(FILE *fp, char *server_string, char *delim)
11881202
}
11891203

11901204
#ifdefMULTIBYTE
1191-
if (string_start!=server_string)
1205+
if (client_encoding!=server_encoding)
11921206
pfree(string_start);/* pfree pg_server_to_client result */
11931207
#endif
11941208
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp