Current multi-byte related codes have a bug with SQL_ASCII
authorBruce Momjian
Mon, 14 Dec 1998 04:59:58 +0000 (04:59 +0000)
committerBruce Momjian
Mon, 14 Dec 1998 04:59:58 +0000 (04:59 +0000)
support. Included patches will solve it and should be applied to
both trees.  Also, it fix the problem with \c command of psql when
switching different encoding databases.

Regression tests passed.
--
Tatsuo Ishii
[email protected]

src/backend/utils/mb/conv.c
src/bin/psql/psql.c

index ee9649f32d9fbec5caf9c31424821d4cc27261e0..1a4493c8e07dc395d729e63264e0335f9dc9b7db 100644 (file)
@@ -2,7 +2,7 @@
  * conversion between client encoding and server internal encoding
  * (currently mule internal code (mic) is used)
  * Tatsuo Ishii
- * $Id: conv.c,v 1.3 1998/09/01 04:33:21 momjian Exp $
+ * $Id: conv.c,v 1.4 1998/12/14 04:59:58 momjian Exp $
  */
 #include 
 #include 
@@ -487,7 +487,7 @@ mic2ascii(unsigned char *mic, unsigned char *p, int len)
 {
    int         c1;
 
-   while (len > 0 && (c1 = *mic))
+   while (len-- > 0 && (c1 = *mic))
    {
        if (c1 > 0x7f)
            printBogusChar(&mic, &p);
@@ -495,6 +495,7 @@ mic2ascii(unsigned char *mic, unsigned char *p, int len)
        {                       /* should be ASCII */
            *p++ = c1;
        }
+       mic++;
    }
    *p = '\0';
 }
index a340c0a25894582e982993b3e080515a2564b209..ace31f577c3085c1ea33aef95ce4a326ded1a0e7 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.164 1998/11/17 14:26:31 thomas Exp $
+ *   $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.165 1998/12/14 04:59:58 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -84,6 +84,11 @@ char    *__progname = "psql";
 
 #endif
 
+#ifdef MULTIBYTE
+/* flag to indicate if PGCLIENTENCODING has been set by a user */
+static int    has_client_encoding;
+#endif
+
 /* This prompt string is assumed to have at least 3 characters by code in MainLoop().
  * A character two characters from the end is replaced each time by a mode character.
  */
@@ -1485,6 +1490,18 @@ do_connect(const char *new_dbname,
        /* FIXME: if changing user, ought to prompt for a new password? */
        pwparam = PQpass(olddb);
 
+#ifdef MULTIBYTE
+       /* PGCLIENTENCODING may be set by the previous connection.
+          if a user does not explicitly set PGCLIENTENCODING,
+          we should discard PGCLIENTENCODING so that
+          libpq could get the backend encoding as the default
+          PGCLIENTENCODING value. -- 1998/12/12 Tatsuo Ishii */
+          
+       if (!has_client_encoding) {
+           unsetenv("PGCLIENTENCODING");
+       }
+#endif
+
        pset->db = PQsetdbLogin(PQhost(olddb), PQport(olddb),
                                NULL, NULL, dbparam, userparam, pwparam);
 
@@ -2754,6 +2771,10 @@ main(int argc, char **argv)
    settings.getPassword = 0;
 #endif
 
+#ifdef MUTIBYTE
+   has_client_encoding = getenv("PGCLIENTENCODING");
+#endif
+
    while ((c = getopt(argc, argv, "Aa:c:d:ef:F:lh:Hnso:p:qStT:ux")) != EOF)
    {
        switch (c)