Thread: pgsql 8.0 beta1 patch for token and timezone

pgsql 8.0 beta1 patch for token and timezone

From
"Zhong Jacky"
Date:
Hi pgsql-bugs,

   I'm a Chinese and I am using WinXp Chs to compile pgsql 8.0 beta 1
in the MinGW environment. I found 2 bugs and fix them, maybe you can
merge the patch into the offical release, thanks.

   Part A) Below is the two bugs occur when we run initdb under WinXp Chs.

   1) FATAL:  syntax error in file "E:/Unix/Sys/Pgsql/data/postgresql.conf"

line 261, near token "s"

      Reason: the string 'Chinese_People's Republic of China.936' should be
'Chinese_People\'s Republic of China.936', otherwise token mismatch. Plese
remember the regular expression like sed and awk under Unix.

      Patch: I wrote a function to detect ' in string and insert a \ symbol

   2) WARNING:  could not find a match for Windows timezone "Öйú±ê׼ʱ¼ä"

      Reason: "Öйú±ê׼ʱ¼ä" is the string stands for "China Standard
Time",
which shows in Chinese language.

      Patch: use a scanzone() function to find and convert timezone to the
English string in win32_tzmap[]. I can fix only Chinese because I only have
WinXp Chs operating system, people can fix others in similar way.

   Part B) You can visit these 2 websites for more detail and get patch.
   1) http://blog.csdn.net/chaoyuebetter/archive/2004/08/13/73785.aspx
   2) http://www.smth.edu.cn/bbsgcon.php?board=NewSoftware&num=2548

   Part C) The patch is based on snap0812, but can work on snap0825, etc.

Regards,
Jacky

_________________________________________________________________
Ãâ·ÑÏÂÔØ MSN Explorer:   http://explorer.msn.com/lccn/

Re: pgsql 8.0 beta1 patch for token and timezone

From
Bruce Momjian
Date:
I do not see a patch.  Did you forget to attach it?

---------------------------------------------------------------------------

Zhong Jacky wrote:
> Hi pgsql-bugs,
>
>    I'm a Chinese and I am using WinXp Chs to compile pgsql 8.0 beta 1
> in the MinGW environment. I found 2 bugs and fix them, maybe you can
> merge the patch into the offical release, thanks.
>
>    Part A) Below is the two bugs occur when we run initdb under WinXp Chs.
>
>    1) FATAL:  syntax error in file "E:/Unix/Sys/Pgsql/data/postgresql.conf"
>
> line 261, near token "s"
>
>       Reason: the string 'Chinese_People's Republic of China.936' should be
> 'Chinese_People\'s Republic of China.936', otherwise token mismatch. Plese
> remember the regular expression like sed and awk under Unix.
>
>       Patch: I wrote a function to detect ' in string and insert a \ symbol
>
>    2) WARNING:  could not find a match for Windows timezone "??????"
>
>       Reason: "??????" is the string stands for "China Standard
> Time",
> which shows in Chinese language.
>
>       Patch: use a scanzone() function to find and convert timezone to the
> English string in win32_tzmap[]. I can fix only Chinese because I only have
> WinXp Chs operating system, people can fix others in similar way.
>
>    Part B) You can visit these 2 websites for more detail and get patch.
>    1) http://blog.csdn.net/chaoyuebetter/archive/2004/08/13/73785.aspx
>    2) http://www.smth.edu.cn/bbsgcon.php?board=NewSoftware&num=2548
>
>    Part C) The patch is based on snap0812, but can work on snap0825, etc.
>
> Regards,
> Jacky
>
> _________________________________________________________________
> ???? MSN Explorer:   http://explorer.msn.com/lccn/
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: pgsql 8.0 beta1 patch for token and timezone

From
Bruce Momjian
Date:
I have reviewed your patch.  I found that the first patch was definitely
needed.  Your code adds escapes for single quotes in locale names placed
in postgresql.conf.  I also added code to escape a literal backslash as
well.  I re-factored your code and applied the attached patch.

Your second patch to pgtz.c is not needed anymore because we have a more
general solution added on September 1:

    /*
     * Localized Windows versions return localized names for the
     * timezone. Scan the registry to find the English name,
     * and then try matching against our table again.
     */
    memset(localtzname, 0, sizeof(localtzname));
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                     "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones",
                     0,
                     KEY_READ,
                     &rootKey) != ERROR_SUCCESS)

Thanks.

---------------------------------------------------------------------------

Zhong Jacky wrote:
> Hi pgsql-bugs,
>
>    I'm a Chinese and I am using WinXp Chs to compile pgsql 8.0 beta 1
> in the MinGW environment. I found 2 bugs and fix them, maybe you can
> merge the patch into the offical release, thanks.
>
>    Part A) Below is the two bugs occur when we run initdb under WinXp Chs.
>
>    1) FATAL:  syntax error in file "E:/Unix/Sys/Pgsql/data/postgresql.conf"
>
> line 261, near token "s"
>
>       Reason: the string 'Chinese_People's Republic of China.936' should be
> 'Chinese_People\'s Republic of China.936', otherwise token mismatch. Plese
> remember the regular expression like sed and awk under Unix.
>
>       Patch: I wrote a function to detect ' in string and insert a \ symbol
>
>    2) WARNING:  could not find a match for Windows timezone "??????"
>
>       Reason: "??????" is the string stands for "China Standard
> Time",
> which shows in Chinese language.
>
>       Patch: use a scanzone() function to find and convert timezone to the
> English string in win32_tzmap[]. I can fix only Chinese because I only have
> WinXp Chs operating system, people can fix others in similar way.
>
>    Part B) You can visit these 2 websites for more detail and get patch.
>    1) http://blog.csdn.net/chaoyuebetter/archive/2004/08/13/73785.aspx
>    2) http://www.smth.edu.cn/bbsgcon.php?board=NewSoftware&num=2548
>
>    Part C) The patch is based on snap0812, but can work on snap0825, etc.
>
> Regards,
> Jacky
>
> _________________________________________________________________
> ???? MSN Explorer:   http://explorer.msn.com/lccn/
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/bin/initdb/initdb.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/initdb/initdb.c,v
retrieving revision 1.56
diff -c -c -r1.56 initdb.c
*** src/bin/initdb/initdb.c    6 Oct 2004 09:13:10 -0000    1.56
--- src/bin/initdb/initdb.c    7 Oct 2004 16:45:32 -0000
***************
*** 181,186 ****
--- 181,187 ----
  static void make_template0(void);
  static void trapsig(int signum);
  static void check_ok(void);
+ static void escape_locale(char **locale);
  static bool chklocale(const char *locale);
  static void setlocales(void);
  static void usage(const char *progname);
***************
*** 1099,1114 ****
      snprintf(repltok, sizeof(repltok), "shared_buffers = %d", n_buffers);
      conflines = replace_token(conflines, "#shared_buffers = 1000", repltok);

      snprintf(repltok, sizeof(repltok), "lc_messages = '%s'", lc_messages);
      conflines = replace_token(conflines, "#lc_messages = 'C'", repltok);

      snprintf(repltok, sizeof(repltok), "lc_monetary = '%s'", lc_monetary);
      conflines = replace_token(conflines, "#lc_monetary = 'C'", repltok);

      snprintf(repltok, sizeof(repltok), "lc_numeric = '%s'", lc_numeric);
-
      conflines = replace_token(conflines, "#lc_numeric = 'C'", repltok);

      snprintf(repltok, sizeof(repltok), "lc_time = '%s'", lc_time);
      conflines = replace_token(conflines, "#lc_time = 'C'", repltok);

--- 1100,1119 ----
      snprintf(repltok, sizeof(repltok), "shared_buffers = %d", n_buffers);
      conflines = replace_token(conflines, "#shared_buffers = 1000", repltok);

+
+     escape_locale(&lc_messages);
      snprintf(repltok, sizeof(repltok), "lc_messages = '%s'", lc_messages);
      conflines = replace_token(conflines, "#lc_messages = 'C'", repltok);

+     escape_locale(&lc_monetary);
      snprintf(repltok, sizeof(repltok), "lc_monetary = '%s'", lc_monetary);
      conflines = replace_token(conflines, "#lc_monetary = 'C'", repltok);

+     escape_locale(&lc_numeric);
      snprintf(repltok, sizeof(repltok), "lc_numeric = '%s'", lc_numeric);
      conflines = replace_token(conflines, "#lc_numeric = 'C'", repltok);

+     escape_locale(&lc_time);
      snprintf(repltok, sizeof(repltok), "lc_time = '%s'", lc_time);
      conflines = replace_token(conflines, "#lc_time = 'C'", repltok);

***************
*** 1896,1906 ****
      }
  }


  /*
   * check if given string is a valid locale specifier
-  * based on some code given to me by Peter Eisentraut
-  * (but I take responsibility for it :-)
   */
  static bool
  chklocale(const char *locale)
--- 1901,1927 ----
      }
  }

+ /*
+  * Escape any single quotes or backslashes in locale
+  */
+ static void
+ escape_locale(char **locale)
+ {
+     int            len = strlen(*locale),
+                 i, j;
+     char        *loc_temp = xmalloc(len * 2);
+
+     for (i = 0, j = 0; i < len; i++)
+     {
+         if ((*locale)[i] == '\'' || (*locale)[i] == '\\')
+             loc_temp[j++] = '\\';
+         loc_temp[j++] = (*locale)[i];
+     }
+     *locale = loc_temp;
+ }

  /*
   * check if given string is a valid locale specifier
   */
  static bool
  chklocale(const char *locale)

Re: pgsql 8.0 beta1 patch for token and timezone

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> + /*
> +  * Escape any single quotes or backslashes in locale
> +  */
> + static void
> + escape_locale(char **locale)
> + {
> +     int            len = strlen(*locale),
> +                 i, j;
> +     char        *loc_temp = xmalloc(len * 2);
> +
> +     for (i = 0, j = 0; i < len; i++)
> +     {
> +         if ((*locale)[i] == '\'' || (*locale)[i] == '\\')
> +             loc_temp[j++] = '\\';
> +         loc_temp[j++] = (*locale)[i];
> +     }
> +     *locale = loc_temp;
> + }

Surely this is quite broken.  You need to xmalloc one more byte and
add a '\0'.

            regards, tom lane

Re: pgsql 8.0 beta1 patch for token and timezone

From
Bruce Momjian
Date:
OK, fixed.

---------------------------------------------------------------------------

Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > + /*
> > +  * Escape any single quotes or backslashes in locale
> > +  */
> > + static void
> > + escape_locale(char **locale)
> > + {
> > +     int            len = strlen(*locale),
> > +                 i, j;
> > +     char        *loc_temp = xmalloc(len * 2);
> > +
> > +     for (i = 0, j = 0; i < len; i++)
> > +     {
> > +         if ((*locale)[i] == '\'' || (*locale)[i] == '\\')
> > +             loc_temp[j++] = '\\';
> > +         loc_temp[j++] = (*locale)[i];
> > +     }
> > +     *locale = loc_temp;
> > + }
>
> Surely this is quite broken.  You need to xmalloc one more byte and
> add a '\0'.
>
>             regards, tom lane
>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
>                http://www.postgresql.org/docs/faqs/FAQ.html
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073