]> granicus.if.org Git - postgresql/commitdiff
Improve "invalid byte sequence for encoding" message
authorPeter Eisentraut <peter_e@gmx.net>
Mon, 5 Sep 2011 20:36:06 +0000 (23:36 +0300)
committerPeter Eisentraut <peter_e@gmx.net>
Mon, 5 Sep 2011 20:38:27 +0000 (23:38 +0300)
It used to say

ERROR:  invalid byte sequence for encoding "UTF8": 0xdb24

Change this to

ERROR:  invalid byte sequence for encoding "UTF8": 0xdb 0x24

to make it clear that this is a byte sequence and not a code point.

Also fix the adjacent "character has no equivalent" message that has
the same issue.

src/backend/utils/mb/wchar.c

index 5b0cf628fe9a470ce450d2f34c0de421352e7c43..f23732f01e59d2fb5c64d12e4128ecd4fc947271 100644 (file)
@@ -1595,7 +1595,7 @@ void
 report_invalid_encoding(int encoding, const char *mbstr, int len)
 {
        int                     l = pg_encoding_mblen(encoding, mbstr);
-       char            buf[8 * 2 + 1];
+       char            buf[8 * 5 + 1];
        char       *p = buf;
        int                     j,
                                jlimit;
@@ -1604,11 +1604,15 @@ report_invalid_encoding(int encoding, const char *mbstr, int len)
        jlimit = Min(jlimit, 8);        /* prevent buffer overrun */
 
        for (j = 0; j < jlimit; j++)
-               p += sprintf(p, "%02x", (unsigned char) mbstr[j]);
+       {
+               p += sprintf(p, "0x%02x", (unsigned char) mbstr[j]);
+               if (j < jlimit - 1)
+                       p += sprintf(p, " ");
+       }
 
        ereport(ERROR,
                        (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
-                        errmsg("invalid byte sequence for encoding \"%s\": 0x%s",
+                        errmsg("invalid byte sequence for encoding \"%s\": %s",
                                        pg_enc2name_tbl[encoding].name,
                                        buf)));
 }
@@ -1624,7 +1628,7 @@ report_untranslatable_char(int src_encoding, int dest_encoding,
                                                   const char *mbstr, int len)
 {
        int                     l = pg_encoding_mblen(src_encoding, mbstr);
-       char            buf[8 * 2 + 1];
+       char            buf[8 * 5 + 1];
        char       *p = buf;
        int                     j,
                                jlimit;
@@ -1633,11 +1637,15 @@ report_untranslatable_char(int src_encoding, int dest_encoding,
        jlimit = Min(jlimit, 8);        /* prevent buffer overrun */
 
        for (j = 0; j < jlimit; j++)
-               p += sprintf(p, "%02x", (unsigned char) mbstr[j]);
+       {
+               p += sprintf(p, "0x%02x", (unsigned char) mbstr[j]);
+               if (j < jlimit - 1)
+                       p += sprintf(p, " ");
+       }
 
        ereport(ERROR,
                        (errcode(ERRCODE_UNTRANSLATABLE_CHARACTER),
-         errmsg("character 0x%s of encoding \"%s\" has no equivalent in \"%s\"",
+         errmsg("character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"",
                         buf,
                         pg_enc2name_tbl[src_encoding].name,
                         pg_enc2name_tbl[dest_encoding].name)));