Обсуждение: jdbc problem with time
Any ideas on this? We have a table: xyzzy=# select sched_id, tod_start, tod_end from schedule where sched_id=1; sched_id | tod_start | tod_end ----------+-----------+--------------- 1 | 00:00:00 | 23:59:59.9990 Notice the millisecond values set for tod_end. The jdbc driver barfs when trying to read the time from the result set using the java code: Time t = rs.getTime("tod_end"); The stack trace from here looks like: java.lang.StringIndexOutOfBoundsException: String index out of range: 19 at java.lang.String.substring(String.java:1522) at org.postgresql.jdbc2.ResultSet.toTime(ResultSet.java:1586) at org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:385) at org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:612) at COM.NextBus.signad.SelectScheduleDetails.getObject(SelectScheduleDetails.java:30) at Here is the offending piece of code. It fails in the case where the time string looks like: "HH:MM:SS:mmmm". The code assumes that anything longer than 8 characters is a timestamp and tries to get a substring accordingly. However, the substring call fails, since this is a "time without time zone" and not an SQL timestamp. Here is the code: public static Time toTime(String s) throws SQLException { if (s == null) return null; // SQL NULL // length == 8: SQL Time // length > 8: SQL Timestamp try { return java.sql.Time.valueOf((s.length() == 8) ? s : s.substring(11, 19)); } catch (NumberFormatException e) { throw new PSQLException("postgresql.res.badtime", s); } } Thanks for the help, --- Laurette Cisneros The Database Group (510) 420-3137 NextBus Information Systems, Inc. www.nextbus.com ---------------------------------- "Intelligence complicates. Wisdom simplifies." -- Mason Cooley
Laurette, What version are you using? Can you still reproduce the problem with the latest development drivers (which you can download from jdbc.postgresql.org)? thanks, --Barry Laurette Cisneros wrote: >Any ideas on this? > >We have a table: > >xyzzy=# select sched_id, tod_start, tod_end from schedule where sched_id=1; > > sched_id | tod_start | tod_end >----------+-----------+--------------- > 1 | 00:00:00 | 23:59:59.9990 > >Notice the millisecond values set for tod_end. The jdbc driver barfs when >trying to read the time from the result set using the java code: >Time t = rs.getTime("tod_end"); > >The stack trace from here looks like: > >java.lang.StringIndexOutOfBoundsException: String index out of range: 19 >at java.lang.String.substring(String.java:1522) at >org.postgresql.jdbc2.ResultSet.toTime(ResultSet.java:1586) at >org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:385) at >org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:612) at >COM.NextBus.signad.SelectScheduleDetails.getObject(SelectScheduleDetails.java:30) >at > >Here is the offending piece of code. It fails in the case where the time >string looks like: "HH:MM:SS:mmmm". The code assumes that anything longer >than 8 characters is a timestamp and tries to get a substring accordingly. >However, the substring call fails, since this is a "time without time >zone" and not an SQL timestamp. > >Here is the code: > >public static Time toTime(String s) throws SQLException >{ > if (s == null) > return null; // SQL NULL > // length == 8: SQL Time > // length > 8: SQL Timestamp > try > { > return java.sql.Time.valueOf((s.length() == 8) ? s : s.substring(11, 19)); > } > catch (NumberFormatException e) > { > throw new PSQLException("postgresql.res.badtime", s); > } >} > > >Thanks for the help, > >--- >Laurette Cisneros >The Database Group >(510) 420-3137 >NextBus Information Systems, Inc. >www.nextbus.com >---------------------------------- >"Intelligence complicates. Wisdom simplifies." > -- Mason Cooley > > >---------------------------(end of broadcast)--------------------------- >TIP 2: you can get off all lists at once with the unregister command > (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) > > >
Hi Barry, Oops, meant to include that...7.2.1 I'll download the latest development driver and try it out. Thanks! L. On Tue, 9 Jul 2002, Barry Lind wrote: > Laurette, > > What version are you using? Can you still reproduce the problem with > the latest development drivers (which you can download from > jdbc.postgresql.org)? > > thanks, > --Barry > > Laurette Cisneros wrote: > > >Any ideas on this? > > > >We have a table: > > > >xyzzy=# select sched_id, tod_start, tod_end from schedule where sched_id=1; > > > > sched_id | tod_start | tod_end > >----------+-----------+--------------- > > 1 | 00:00:00 | 23:59:59.9990 > > > >Notice the millisecond values set for tod_end. The jdbc driver barfs when > >trying to read the time from the result set using the java code: > >Time t = rs.getTime("tod_end"); > > > >The stack trace from here looks like: > > > >java.lang.StringIndexOutOfBoundsException: String index out of range: 19 > >at java.lang.String.substring(String.java:1522) at > >org.postgresql.jdbc2.ResultSet.toTime(ResultSet.java:1586) at > >org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:385) at > >org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:612) at > >COM.NextBus.signad.SelectScheduleDetails.getObject(SelectScheduleDetails.java:30) > >at > > > >Here is the offending piece of code. It fails in the case where the time > >string looks like: "HH:MM:SS:mmmm". The code assumes that anything longer > >than 8 characters is a timestamp and tries to get a substring accordingly. > >However, the substring call fails, since this is a "time without time > >zone" and not an SQL timestamp. > > > >Here is the code: > > > >public static Time toTime(String s) throws SQLException > >{ > > if (s == null) > > return null; // SQL NULL > > // length == 8: SQL Time > > // length > 8: SQL Timestamp > > try > > { > > return java.sql.Time.valueOf((s.length() == 8) ? s : s.substring(11, 19)); > > } > > catch (NumberFormatException e) > > { > > throw new PSQLException("postgresql.res.badtime", s); > > } > >} > > > > > >Thanks for the help, > > > >--- > >Laurette Cisneros > >The Database Group > >(510) 420-3137 > >NextBus Information Systems, Inc. > >www.nextbus.com > >---------------------------------- > >"Intelligence complicates. Wisdom simplifies." > > -- Mason Cooley > > > > > >---------------------------(end of broadcast)--------------------------- > >TIP 2: you can get off all lists at once with the unregister command > > (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) > > > > > > > > -- Laurette Cisneros The Database Group (510) 420-3137 NextBus Information Systems, Inc. www.nextbus.com ---------------------------------- "Intelligence complicates. Wisdom simplifies." -- Mason Cooley
Yes, the bug still exists in the latest development driver. Thanks, L. On Tue, 9 Jul 2002, Barry Lind wrote: > Laurette, > > What version are you using? Can you still reproduce the problem with > the latest development drivers (which you can download from > jdbc.postgresql.org)? > > thanks, > --Barry > > Laurette Cisneros wrote: > > >Any ideas on this? > > > >We have a table: > > > >xyzzy=# select sched_id, tod_start, tod_end from schedule where sched_id=1; > > > > sched_id | tod_start | tod_end > >----------+-----------+--------------- > > 1 | 00:00:00 | 23:59:59.9990 > > > >Notice the millisecond values set for tod_end. The jdbc driver barfs when > >trying to read the time from the result set using the java code: > >Time t = rs.getTime("tod_end"); > > > >The stack trace from here looks like: > > > >java.lang.StringIndexOutOfBoundsException: String index out of range: 19 > >at java.lang.String.substring(String.java:1522) at > >org.postgresql.jdbc2.ResultSet.toTime(ResultSet.java:1586) at > >org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:385) at > >org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:612) at > >COM.NextBus.signad.SelectScheduleDetails.getObject(SelectScheduleDetails.java:30) > >at > > > >Here is the offending piece of code. It fails in the case where the time > >string looks like: "HH:MM:SS:mmmm". The code assumes that anything longer > >than 8 characters is a timestamp and tries to get a substring accordingly. > >However, the substring call fails, since this is a "time without time > >zone" and not an SQL timestamp. > > > >Here is the code: > > > >public static Time toTime(String s) throws SQLException > >{ > > if (s == null) > > return null; // SQL NULL > > // length == 8: SQL Time > > // length > 8: SQL Timestamp > > try > > { > > return java.sql.Time.valueOf((s.length() == 8) ? s : s.substring(11, 19)); > > } > > catch (NumberFormatException e) > > { > > throw new PSQLException("postgresql.res.badtime", s); > > } > >} > > > > > >Thanks for the help, > > > >--- > >Laurette Cisneros > >The Database Group > >(510) 420-3137 > >NextBus Information Systems, Inc. > >www.nextbus.com > >---------------------------------- > >"Intelligence complicates. Wisdom simplifies." > > -- Mason Cooley > > > > > >---------------------------(end of broadcast)--------------------------- > >TIP 2: you can get off all lists at once with the unregister command > > (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) > > > > > > > > -- Laurette Cisneros The Database Group (510) 420-3137 NextBus Information Systems, Inc. www.nextbus.com ---------------------------------- "Intelligence complicates. Wisdom simplifies." -- Mason Cooley
Laurette, I have committed a fix for this bug. Please try the latest dev build on the website to see that it fixes your problem. thanks, --Barry Laurette Cisneros wrote: >Yes, the bug still exists in the latest development driver. > >Thanks, > >L. >On Tue, 9 Jul 2002, Barry Lind wrote: > > > >>Laurette, >> >>What version are you using? Can you still reproduce the problem with >>the latest development drivers (which you can download from >>jdbc.postgresql.org)? >> >>thanks, >>--Barry >> >>Laurette Cisneros wrote: >> >> >> >>>Any ideas on this? >>> >>>We have a table: >>> >>>xyzzy=# select sched_id, tod_start, tod_end from schedule where sched_id=1; >>> >>>sched_id | tod_start | tod_end >>>----------+-----------+--------------- >>> 1 | 00:00:00 | 23:59:59.9990 >>> >>>Notice the millisecond values set for tod_end. The jdbc driver barfs when >>>trying to read the time from the result set using the java code: >>>Time t = rs.getTime("tod_end"); >>> >>>The stack trace from here looks like: >>> >>>java.lang.StringIndexOutOfBoundsException: String index out of range: 19 >>>at java.lang.String.substring(String.java:1522) at >>>org.postgresql.jdbc2.ResultSet.toTime(ResultSet.java:1586) at >>>org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:385) at >>>org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:612) at >>>COM.NextBus.signad.SelectScheduleDetails.getObject(SelectScheduleDetails.java:30) >>>at >>> >>>Here is the offending piece of code. It fails in the case where the time >>>string looks like: "HH:MM:SS:mmmm". The code assumes that anything longer >>>than 8 characters is a timestamp and tries to get a substring accordingly. >>>However, the substring call fails, since this is a "time without time >>>zone" and not an SQL timestamp. >>> >>>Here is the code: >>> >>>public static Time toTime(String s) throws SQLException >>>{ >>> if (s == null) >>> return null; // SQL NULL >>> // length == 8: SQL Time >>> // length > 8: SQL Timestamp >>> try >>> { >>> return java.sql.Time.valueOf((s.length() == 8) ? s : s.substring(11, 19)); >>> } >>> catch (NumberFormatException e) >>> { >>> throw new PSQLException("postgresql.res.badtime", s); >>> } >>>} >>> >>> >>>Thanks for the help, >>> >>>--- >>>Laurette Cisneros >>>The Database Group >>>(510) 420-3137 >>>NextBus Information Systems, Inc. >>>www.nextbus.com >>>---------------------------------- >>>"Intelligence complicates. Wisdom simplifies." >>> -- Mason Cooley >>> >>> >>>---------------------------(end of broadcast)--------------------------- >>>TIP 2: you can get off all lists at once with the unregister command >>> (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) >>> >>> >>> >>> >>> >> >> > > >
Great. Thanks. P.S. We patched it here too...score one for open source. However, we will test your too. Thanks again, Laurette On Tue, 9 Jul 2002, Barry Lind wrote: > Laurette, > > I have committed a fix for this bug. Please try the latest dev build on > the website to see that it fixes your problem. > > thanks, > --Barry > > Laurette Cisneros wrote: > > >Yes, the bug still exists in the latest development driver. > > > >Thanks, > > > >L. > >On Tue, 9 Jul 2002, Barry Lind wrote: > > > > > > > >>Laurette, > >> > >>What version are you using? Can you still reproduce the problem with > >>the latest development drivers (which you can download from > >>jdbc.postgresql.org)? > >> > >>thanks, > >>--Barry > >> > >>Laurette Cisneros wrote: > >> > >> > >> > >>>Any ideas on this? > >>> > >>>We have a table: > >>> > >>>xyzzy=# select sched_id, tod_start, tod_end from schedule where sched_id=1; > >>> > >>>sched_id | tod_start | tod_end > >>>----------+-----------+--------------- > >>> 1 | 00:00:00 | 23:59:59.9990 > >>> > >>>Notice the millisecond values set for tod_end. The jdbc driver barfs when > >>>trying to read the time from the result set using the java code: > >>>Time t = rs.getTime("tod_end"); > >>> > >>>The stack trace from here looks like: > >>> > >>>java.lang.StringIndexOutOfBoundsException: String index out of range: 19 > >>>at java.lang.String.substring(String.java:1522) at > >>>org.postgresql.jdbc2.ResultSet.toTime(ResultSet.java:1586) at > >>>org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:385) at > >>>org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:612) at > >>>COM.NextBus.signad.SelectScheduleDetails.getObject(SelectScheduleDetails.java:30) > >>>at > >>> > >>>Here is the offending piece of code. It fails in the case where the time > >>>string looks like: "HH:MM:SS:mmmm". The code assumes that anything longer > >>>than 8 characters is a timestamp and tries to get a substring accordingly. > >>>However, the substring call fails, since this is a "time without time > >>>zone" and not an SQL timestamp. > >>> > >>>Here is the code: > >>> > >>>public static Time toTime(String s) throws SQLException > >>>{ > >>> if (s == null) > >>> return null; // SQL NULL > >>> // length == 8: SQL Time > >>> // length > 8: SQL Timestamp > >>> try > >>> { > >>> return java.sql.Time.valueOf((s.length() == 8) ? s : s.substring(11, 19)); > >>> } > >>> catch (NumberFormatException e) > >>> { > >>> throw new PSQLException("postgresql.res.badtime", s); > >>> } > >>>} > >>> > >>> > >>>Thanks for the help, > >>> > >>>--- > >>>Laurette Cisneros > >>>The Database Group > >>>(510) 420-3137 > >>>NextBus Information Systems, Inc. > >>>www.nextbus.com > >>>---------------------------------- > >>>"Intelligence complicates. Wisdom simplifies." > >>> -- Mason Cooley > >>> > >>> > >>>---------------------------(end of broadcast)--------------------------- > >>>TIP 2: you can get off all lists at once with the unregister command > >>> (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) > >>> > >>> > >>> > >>> > >>> > >> > >> > > > > > > > > -- Laurette Cisneros The Database Group (510) 420-3137 NextBus Information Systems, Inc. www.nextbus.com ---------------------------------- "Intelligence complicates. Wisdom simplifies." -- Mason Cooley
Hi Barry, Sorry for the delay...we tested with the latest dev build and it works great (your fix is better than our fix)! Thanks for the fast response to this problem! L. On Tue, 9 Jul 2002, Barry Lind wrote: > Laurette, > > I have committed a fix for this bug. Please try the latest dev build on > the website to see that it fixes your problem. > > thanks, > --Barry > > Laurette Cisneros wrote: > > >Yes, the bug still exists in the latest development driver. > > > >Thanks, > > > >L. > >On Tue, 9 Jul 2002, Barry Lind wrote: > > > > > > > >>Laurette, > >> > >>What version are you using? Can you still reproduce the problem with > >>the latest development drivers (which you can download from > >>jdbc.postgresql.org)? > >> > >>thanks, > >>--Barry > >> > >>Laurette Cisneros wrote: > >> > >> > >> > >>>Any ideas on this? > >>> > >>>We have a table: > >>> > >>>xyzzy=# select sched_id, tod_start, tod_end from schedule where sched_id=1; > >>> > >>>sched_id | tod_start | tod_end > >>>----------+-----------+--------------- > >>> 1 | 00:00:00 | 23:59:59.9990 > >>> > >>>Notice the millisecond values set for tod_end. The jdbc driver barfs when > >>>trying to read the time from the result set using the java code: > >>>Time t = rs.getTime("tod_end"); > >>> > >>>The stack trace from here looks like: > >>> > >>>java.lang.StringIndexOutOfBoundsException: String index out of range: 19 > >>>at java.lang.String.substring(String.java:1522) at > >>>org.postgresql.jdbc2.ResultSet.toTime(ResultSet.java:1586) at > >>>org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:385) at > >>>org.postgresql.jdbc2.ResultSet.getTime(ResultSet.java:612) at > >>>COM.NextBus.signad.SelectScheduleDetails.getObject(SelectScheduleDetails.java:30) > >>>at > >>> > >>>Here is the offending piece of code. It fails in the case where the time > >>>string looks like: "HH:MM:SS:mmmm". The code assumes that anything longer > >>>than 8 characters is a timestamp and tries to get a substring accordingly. > >>>However, the substring call fails, since this is a "time without time > >>>zone" and not an SQL timestamp. > >>> > >>>Here is the code: > >>> > >>>public static Time toTime(String s) throws SQLException > >>>{ > >>> if (s == null) > >>> return null; // SQL NULL > >>> // length == 8: SQL Time > >>> // length > 8: SQL Timestamp > >>> try > >>> { > >>> return java.sql.Time.valueOf((s.length() == 8) ? s : s.substring(11, 19)); > >>> } > >>> catch (NumberFormatException e) > >>> { > >>> throw new PSQLException("postgresql.res.badtime", s); > >>> } > >>>} > >>> > >>> > >>>Thanks for the help, > >>> > >>>--- > >>>Laurette Cisneros > >>>The Database Group > >>>(510) 420-3137 > >>>NextBus Information Systems, Inc. > >>>www.nextbus.com > >>>---------------------------------- > >>>"Intelligence complicates. Wisdom simplifies." > >>> -- Mason Cooley > >>> > >>> > >>>---------------------------(end of broadcast)--------------------------- > >>>TIP 2: you can get off all lists at once with the unregister command > >>> (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) > >>> > >>> > >>> > >>> > >>> > >> > >> > > > > > > > > -- Laurette Cisneros The Database Group (510) 420-3137 NextBus Information Systems, Inc. www.nextbus.com ---------------------------------- "Intelligence complicates. Wisdom simplifies." -- Mason Cooley