Current multi-byte related codes have a bug with SQL_ASCII
authorBruce Momjian <bruce@momjian.us>
Mon, 14 Dec 1998 04:51:34 +0000 (04:51 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 14 Dec 1998 04:51:34 +0000 (04:51 +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
t-ishii@sra.co.jp

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

index 27e31b538026343b78785e2c9fee2af0632beb7c..b925b478ca8929c100addb0bd757b5c0f758c829 100644 (file)
@@ -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 d0faef456966d85833efb9d398bb465ff159409d..39937495ef7c2ba95fed89007b32c11d0b2553fa 100644 (file)
@@ -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)