Thread: Patch for JDBC fractional hour timezone offset bug

Patch for JDBC fractional hour timezone offset bug

From
Barry Lind
Date:
Attached is a patch to fix the problem Thomas mentions below.  The JDBC
driver now correctly handles timezones that are offset fractional hours
from GMT (ie. -06:30).

thanks,
--Barry

Thomas Lockhart wrote:

>> FYI, the reason I personally didn't want to apply this to 7.1.2 is
>> because we already added two new bugs in 7.1.1, and I didn't want to be
>> the one to add another.  Add that to the natural problems I have with
>> JDBC, and I ran.  :-)
>
>
> Understandable. You shouldn't *have* to take responsibility for every
> patch coming in, so feel free to leave some things for others. And if
> there is a problem with this one, I'll understand if you need to yell at
> me a little ;)
>
> As a (sort of) aside, by forcing me to inspect the code we have
> uncovered a problem with atypical time zones which we would not
> otherwise have noticed, at least until someone in Newfoundland or India
> stumbled on it. No patch yet, but at least we know it is there...
>
>                      - Thomas
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://www.postgresql.org/search.mpl
>
>

*** ./org/postgresql/jdbc1/ResultSet.java.orig    Fri May 25 16:23:19 2001
--- ./org/postgresql/jdbc1/ResultSet.java    Fri May 25 16:26:35 2001
***************
*** 472,484 ****
      //so this code strips off timezone info and adds on the GMT+/-...
      //as well as adds a third digit for partial seconds if necessary
      StringBuffer strBuf = new StringBuffer(s);
      char sub = strBuf.charAt(strBuf.length()-3);
      if (sub == '+' || sub == '-') {
        strBuf.setLength(strBuf.length()-3);
        if (subsecond)  {
!         strBuf = strBuf.append('0').append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
        } else {
!         strBuf = strBuf.append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
        }
      } else if (subsecond) {
        strBuf = strBuf.append('0');
--- 472,506 ----
      //so this code strips off timezone info and adds on the GMT+/-...
      //as well as adds a third digit for partial seconds if necessary
      StringBuffer strBuf = new StringBuffer(s);
+
+     //we are looking to see if the backend has appended on a timezone.
+     //currently postgresql will return +/-HH:MM or +/-HH for timezone offset
+     //(i.e. -06, or +06:30, note the expectation of the leading zero for the
+     //hours, and the use of the : for delimiter between hours and minutes)
+     //if the backend ISO format changes in the future this code will
+     //need to be changed as well
      char sub = strBuf.charAt(strBuf.length()-3);
      if (sub == '+' || sub == '-') {
        strBuf.setLength(strBuf.length()-3);
        if (subsecond)  {
!         strBuf.append('0').append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
!       } else {
!         strBuf.append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
!       }
!     } else if (sub == ':') {
!       //we may have found timezone info of format +/-HH:MM, or there is no
!       //timezone info at all and this is the : preceding the seconds
!       char sub2 = strBuf.charAt(strBuf.length()-5);
!       if (sub2 == '+' || sub2 == '-') {
!         //we have found timezone info of format +/-HH:MM
!         strBuf.setLength(strBuf.length()-5);
!         if (subsecond) {
!           strBuf.append('0').append("GMT").append(s.substring(s.length()-5));
          } else {
!           strBuf.append("GMT").append(s.substring(s.length()-5));
!         }
!       } else if (subsecond) {
!         strBuf.append('0');
        }
      } else if (subsecond) {
        strBuf = strBuf.append('0');
*** ./org/postgresql/jdbc2/ResultSet.java.orig    Fri May 25 16:23:34 2001
--- ./org/postgresql/jdbc2/ResultSet.java    Fri May 25 16:24:25 2001
***************
*** 484,497 ****
--- 484,519 ----
        sbuf.setLength(0);
        sbuf.append(s);

+       //we are looking to see if the backend has appended on a timezone.
+       //currently postgresql will return +/-HH:MM or +/-HH for timezone offset
+       //(i.e. -06, or +06:30, note the expectation of the leading zero for the
+       //hours, and the use of the : for delimiter between hours and minutes)
+       //if the backend ISO format changes in the future this code will
+       //need to be changed as well
        char sub = sbuf.charAt(sbuf.length()-3);
        if (sub == '+' || sub == '-') {
+         //we have found timezone info of format +/-HH
          sbuf.setLength(sbuf.length()-3);
          if (subsecond)  {
            sbuf.append('0').append("GMT").append(s.substring(s.length()-3)).append(":00");
          } else {
            sbuf.append("GMT").append(s.substring(s.length()-3)).append(":00");
          }
+       } else if (sub == ':') {
+         //we may have found timezone info of format +/-HH:MM, or there is no
+         //timezone info at all and this is the : preceding the seconds
+         char sub2 = sbuf.charAt(sbuf.length()-5);
+         if (sub2 == '+' || sub2 == '-') {
+           //we have found timezone info of format +/-HH:MM
+           sbuf.setLength(sbuf.length()-5);
+           if (subsecond)  {
+             sbuf.append('0').append("GMT").append(s.substring(s.length()-5));
+           } else {
+             sbuf.append("GMT").append(s.substring(s.length()-5));
+           }
+         } else if (subsecond) {
+           sbuf.append('0');
+         }
        } else if (subsecond) {
          sbuf.append('0');
        }

Re: Patch for JDBC fractional hour timezone offset bug

From
Bruce Momjian
Date:
Your patch has been added to the PostgreSQL unapplied patches list at:

    http://candle.pha.pa.us/cgi-bin/pgpatches

I will try to apply it withing the next 48 hours.

>
> Attached is a patch to fix the problem Thomas mentions below.  The JDBC
> driver now correctly handles timezones that are offset fractional hours
> from GMT (ie. -06:30).
>
> thanks,
> --Barry
>
> Thomas Lockhart wrote:
>
> >> FYI, the reason I personally didn't want to apply this to 7.1.2 is
> >> because we already added two new bugs in 7.1.1, and I didn't want to be
> >> the one to add another.  Add that to the natural problems I have with
> >> JDBC, and I ran.  :-)
> >
> >
> > Understandable. You shouldn't *have* to take responsibility for every
> > patch coming in, so feel free to leave some things for others. And if
> > there is a problem with this one, I'll understand if you need to yell at
> > me a little ;)
> >
> > As a (sort of) aside, by forcing me to inspect the code we have
> > uncovered a problem with atypical time zones which we would not
> > otherwise have noticed, at least until someone in Newfoundland or India
> > stumbled on it. No patch yet, but at least we know it is there...
> >
> >                      - Thomas
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 6: Have you searched our list archives?
> >
> > http://www.postgresql.org/search.mpl
> >
> >
>

> *** ./org/postgresql/jdbc1/ResultSet.java.orig    Fri May 25 16:23:19 2001
> --- ./org/postgresql/jdbc1/ResultSet.java    Fri May 25 16:26:35 2001
> ***************
> *** 472,484 ****
>       //so this code strips off timezone info and adds on the GMT+/-...
>       //as well as adds a third digit for partial seconds if necessary
>       StringBuffer strBuf = new StringBuffer(s);
>       char sub = strBuf.charAt(strBuf.length()-3);
>       if (sub == '+' || sub == '-') {
>         strBuf.setLength(strBuf.length()-3);
>         if (subsecond)  {
> !         strBuf = strBuf.append('0').append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
>         } else {
> !         strBuf = strBuf.append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
>         }
>       } else if (subsecond) {
>         strBuf = strBuf.append('0');
> --- 472,506 ----
>       //so this code strips off timezone info and adds on the GMT+/-...
>       //as well as adds a third digit for partial seconds if necessary
>       StringBuffer strBuf = new StringBuffer(s);
> +
> +     //we are looking to see if the backend has appended on a timezone.
> +     //currently postgresql will return +/-HH:MM or +/-HH for timezone offset
> +     //(i.e. -06, or +06:30, note the expectation of the leading zero for the
> +     //hours, and the use of the : for delimiter between hours and minutes)
> +     //if the backend ISO format changes in the future this code will
> +     //need to be changed as well
>       char sub = strBuf.charAt(strBuf.length()-3);
>       if (sub == '+' || sub == '-') {
>         strBuf.setLength(strBuf.length()-3);
>         if (subsecond)  {
> !         strBuf.append('0').append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
> !       } else {
> !         strBuf.append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
> !       }
> !     } else if (sub == ':') {
> !       //we may have found timezone info of format +/-HH:MM, or there is no
> !       //timezone info at all and this is the : preceding the seconds
> !       char sub2 = strBuf.charAt(strBuf.length()-5);
> !       if (sub2 == '+' || sub2 == '-') {
> !         //we have found timezone info of format +/-HH:MM
> !         strBuf.setLength(strBuf.length()-5);
> !         if (subsecond) {
> !           strBuf.append('0').append("GMT").append(s.substring(s.length()-5));
>           } else {
> !           strBuf.append("GMT").append(s.substring(s.length()-5));
> !         }
> !       } else if (subsecond) {
> !         strBuf.append('0');
>         }
>       } else if (subsecond) {
>         strBuf = strBuf.append('0');
> *** ./org/postgresql/jdbc2/ResultSet.java.orig    Fri May 25 16:23:34 2001
> --- ./org/postgresql/jdbc2/ResultSet.java    Fri May 25 16:24:25 2001
> ***************
> *** 484,497 ****
> --- 484,519 ----
>         sbuf.setLength(0);
>         sbuf.append(s);
>
> +       //we are looking to see if the backend has appended on a timezone.
> +       //currently postgresql will return +/-HH:MM or +/-HH for timezone offset
> +       //(i.e. -06, or +06:30, note the expectation of the leading zero for the
> +       //hours, and the use of the : for delimiter between hours and minutes)
> +       //if the backend ISO format changes in the future this code will
> +       //need to be changed as well
>         char sub = sbuf.charAt(sbuf.length()-3);
>         if (sub == '+' || sub == '-') {
> +         //we have found timezone info of format +/-HH
>           sbuf.setLength(sbuf.length()-3);
>           if (subsecond)  {
>             sbuf.append('0').append("GMT").append(s.substring(s.length()-3)).append(":00");
>           } else {
>             sbuf.append("GMT").append(s.substring(s.length()-3)).append(":00");
>           }
> +       } else if (sub == ':') {
> +         //we may have found timezone info of format +/-HH:MM, or there is no
> +         //timezone info at all and this is the : preceding the seconds
> +         char sub2 = sbuf.charAt(sbuf.length()-5);
> +         if (sub2 == '+' || sub2 == '-') {
> +           //we have found timezone info of format +/-HH:MM
> +           sbuf.setLength(sbuf.length()-5);
> +           if (subsecond)  {
> +             sbuf.append('0').append("GMT").append(s.substring(s.length()-5));
> +           } else {
> +             sbuf.append("GMT").append(s.substring(s.length()-5));
> +           }
> +         } else if (subsecond) {
> +           sbuf.append('0');
> +         }
>         } else if (subsecond) {
>           sbuf.append('0');
>         }

>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: Patch for JDBC fractional hour timezone offset bug

From
Bruce Momjian
Date:
Thanks.  Applied.


>
> Attached is a patch to fix the problem Thomas mentions below.  The JDBC
> driver now correctly handles timezones that are offset fractional hours
> from GMT (ie. -06:30).
>
> thanks,
> --Barry
>
> Thomas Lockhart wrote:
>
> >> FYI, the reason I personally didn't want to apply this to 7.1.2 is
> >> because we already added two new bugs in 7.1.1, and I didn't want to be
> >> the one to add another.  Add that to the natural problems I have with
> >> JDBC, and I ran.  :-)
> >
> >
> > Understandable. You shouldn't *have* to take responsibility for every
> > patch coming in, so feel free to leave some things for others. And if
> > there is a problem with this one, I'll understand if you need to yell at
> > me a little ;)
> >
> > As a (sort of) aside, by forcing me to inspect the code we have
> > uncovered a problem with atypical time zones which we would not
> > otherwise have noticed, at least until someone in Newfoundland or India
> > stumbled on it. No patch yet, but at least we know it is there...
> >
> >                      - Thomas
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 6: Have you searched our list archives?
> >
> > http://www.postgresql.org/search.mpl
> >
> >
>

> *** ./org/postgresql/jdbc1/ResultSet.java.orig    Fri May 25 16:23:19 2001
> --- ./org/postgresql/jdbc1/ResultSet.java    Fri May 25 16:26:35 2001
> ***************
> *** 472,484 ****
>       //so this code strips off timezone info and adds on the GMT+/-...
>       //as well as adds a third digit for partial seconds if necessary
>       StringBuffer strBuf = new StringBuffer(s);
>       char sub = strBuf.charAt(strBuf.length()-3);
>       if (sub == '+' || sub == '-') {
>         strBuf.setLength(strBuf.length()-3);
>         if (subsecond)  {
> !         strBuf = strBuf.append('0').append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
>         } else {
> !         strBuf = strBuf.append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
>         }
>       } else if (subsecond) {
>         strBuf = strBuf.append('0');
> --- 472,506 ----
>       //so this code strips off timezone info and adds on the GMT+/-...
>       //as well as adds a third digit for partial seconds if necessary
>       StringBuffer strBuf = new StringBuffer(s);
> +
> +     //we are looking to see if the backend has appended on a timezone.
> +     //currently postgresql will return +/-HH:MM or +/-HH for timezone offset
> +     //(i.e. -06, or +06:30, note the expectation of the leading zero for the
> +     //hours, and the use of the : for delimiter between hours and minutes)
> +     //if the backend ISO format changes in the future this code will
> +     //need to be changed as well
>       char sub = strBuf.charAt(strBuf.length()-3);
>       if (sub == '+' || sub == '-') {
>         strBuf.setLength(strBuf.length()-3);
>         if (subsecond)  {
> !         strBuf.append('0').append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
> !       } else {
> !         strBuf.append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
> !       }
> !     } else if (sub == ':') {
> !       //we may have found timezone info of format +/-HH:MM, or there is no
> !       //timezone info at all and this is the : preceding the seconds
> !       char sub2 = strBuf.charAt(strBuf.length()-5);
> !       if (sub2 == '+' || sub2 == '-') {
> !         //we have found timezone info of format +/-HH:MM
> !         strBuf.setLength(strBuf.length()-5);
> !         if (subsecond) {
> !           strBuf.append('0').append("GMT").append(s.substring(s.length()-5));
>           } else {
> !           strBuf.append("GMT").append(s.substring(s.length()-5));
> !         }
> !       } else if (subsecond) {
> !         strBuf.append('0');
>         }
>       } else if (subsecond) {
>         strBuf = strBuf.append('0');
> *** ./org/postgresql/jdbc2/ResultSet.java.orig    Fri May 25 16:23:34 2001
> --- ./org/postgresql/jdbc2/ResultSet.java    Fri May 25 16:24:25 2001
> ***************
> *** 484,497 ****
> --- 484,519 ----
>         sbuf.setLength(0);
>         sbuf.append(s);
>
> +       //we are looking to see if the backend has appended on a timezone.
> +       //currently postgresql will return +/-HH:MM or +/-HH for timezone offset
> +       //(i.e. -06, or +06:30, note the expectation of the leading zero for the
> +       //hours, and the use of the : for delimiter between hours and minutes)
> +       //if the backend ISO format changes in the future this code will
> +       //need to be changed as well
>         char sub = sbuf.charAt(sbuf.length()-3);
>         if (sub == '+' || sub == '-') {
> +         //we have found timezone info of format +/-HH
>           sbuf.setLength(sbuf.length()-3);
>           if (subsecond)  {
>             sbuf.append('0').append("GMT").append(s.substring(s.length()-3)).append(":00");
>           } else {
>             sbuf.append("GMT").append(s.substring(s.length()-3)).append(":00");
>           }
> +       } else if (sub == ':') {
> +         //we may have found timezone info of format +/-HH:MM, or there is no
> +         //timezone info at all and this is the : preceding the seconds
> +         char sub2 = sbuf.charAt(sbuf.length()-5);
> +         if (sub2 == '+' || sub2 == '-') {
> +           //we have found timezone info of format +/-HH:MM
> +           sbuf.setLength(sbuf.length()-5);
> +           if (subsecond)  {
> +             sbuf.append('0').append("GMT").append(s.substring(s.length()-5));
> +           } else {
> +             sbuf.append("GMT").append(s.substring(s.length()-5));
> +           }
> +         } else if (subsecond) {
> +           sbuf.append('0');
> +         }
>         } else if (subsecond) {
>           sbuf.append('0');
>         }

>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026