fix-utf8-convertedbytes-calc.txt

text/plain

Filename: fix-utf8-convertedbytes-calc.txt
Type: text/plain
Part: 0
Message: Re: Perform COPY FROM encoding conversions in larger chunks
diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c
index 60dfebb0bd..1681efc7a0 100644
--- a/src/backend/commands/copyfromparse.c
+++ b/src/backend/commands/copyfromparse.c
@@ -397,6 +397,9 @@ CopyConvertBuf(CopyFromState cstate)
 												   (unsigned char *) cstate->raw_buf + cstate->raw_buf_len,
 												   dstlen,
 												   true);
+
+ereport(NOTICE, errmsg_internal("convertedbytes: %d", convertedbytes));
+
 	if (convertedbytes == 0)
 	{
 		/*
diff --git a/src/backend/utils/mb/conv.c b/src/backend/utils/mb/conv.c
index b83358bc7a..26600e68ee 100644
--- a/src/backend/utils/mb/conv.c
+++ b/src/backend/utils/mb/conv.c
@@ -497,7 +497,7 @@ UtfToLocal(const unsigned char *utf, int len,
 	int			l;
 	const pg_utf_to_local_combined *cp;
 	const unsigned char *start = utf;
-	const unsigned char *cur = utf;
+	unsigned char *cur = unconstify(unsigned char *, utf);
 
 	if (!PG_VALID_ENCODING(encoding))
 		ereport(ERROR,
@@ -511,8 +511,6 @@ UtfToLocal(const unsigned char *utf, int len,
 		unsigned char b3 = 0;
 		unsigned char b4 = 0;
 
-		cur = iso;
-
 		/* "break" cases all represent errors */
 		if (*utf == '\0')
 			break;
@@ -613,6 +611,7 @@ UtfToLocal(const unsigned char *utf, int len,
 				if (cp)
 				{
 					iso = store_coded_char(iso, cp->code);
+					cur += l;
 					continue;
 				}
 			}
@@ -631,6 +630,7 @@ UtfToLocal(const unsigned char *utf, int len,
 			if (converted)
 			{
 				iso = store_coded_char(iso, converted);
+				cur += l;
 				continue;
 			}
 		}
@@ -643,6 +643,7 @@ UtfToLocal(const unsigned char *utf, int len,
 			if (converted)
 			{
 				iso = store_coded_char(iso, converted);
+				cur += l;
 				continue;
 			}
 		}