From: | webmaster(at)postgreSQL(dot)org |
---|---|
To: | pgsql-bugs(at)postgreSQL(dot)org |
Subject: | [Keystone Slip # 15] JDBC getTimestamp() aborts with some Locales |
Date: | 1999-07-26 16:41:21 |
Message-ID: | 199907261641.MAA10673@hub.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
---------------------------------------------------------------------------
Slip number -----: 15
Problem ---------: JDBC getTimestamp() aborts with some Locales
Opened by -------: rcoelho(at)px(dot)com(dot)br on 07/25/99 10:02
Assigned To -----: scrappy
---------------------------------------------------------------------------
Summary:
--------- Plataform Description
RedHat Linux 5.2 Intel
Postgresql 6.5
Blackdown Java 1.1.7
-------------- Simple description
If your locale is not supported by Java standard, SimpleDateFormat(in getTimestamp function)can't parse timezone ID. This problem has solution but the exception error messages is really strange.
------------------- To reproduce the problem
# first set RHLinux Timezone to EST with /usr/sbin/timeconfig. I'm using Brazil/East
export LANG=pt_BR # Portuguese (Brazil)
psql mydb
mydb> create table timetest(anyfield timestamp);
mydb> insert into timetest values (now());
mydb> q
java example.psql jdbc:postgresql..... # from pgsql/src/interfaces/jdbc
# The program will abort with error in MessageFormat. See in explanation.
--------------- Partial Solution
SimpleDateFormat support PGSql syntax for string timestamp's timezone (GMT offset, in my case -03).
I just cut the offset conversion to timezone ID in src/interfaces/jdbc/postgresql/jdbc1/ResultSet.java.
It works fine (with Daylight saving too).
434 public Timestamp getTimestamp(int columnIndex) throws SQLException
435 {
436 String s = getString(columnIndex);
437 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzz");
438
439 if (s != null)
440 {
441 //CUT int TZ = new Float(s.substring(19)).intValue();
442 //CUT TZ = TZ * 60 * 60 * 1000;
443 //CUT TimeZone zone = TimeZone.getDefault();
444 //CUT zone.setRawOffset(TZ);
445 //CUT String nm = zone.getID();
446 //CUT s = s.substring(0,19) + nm;
447 try {
448 java.util.Date d = df.parse(s);
449 return new Timestamp(d.getTime());
450 } catch (ParseException e) {
451 throw new PSQLException("postgresql.res.badtimestamp",new Integer(e.getErrorOffset()),s);
452 }
453 }
454 return null; // SQL NULL
455 }
456
--------------------- Explanation of the real problem
First problem: SimpleDateFormat was not parsing EST timezone ID if locale(pt_BR) is present.
I thought timezone's ID (EST, PST, etc.) was universal, not depending on locales.
Looking for Blackdown's classes source code (java/text/SimpleDateFormat.java,
java/util/TimeZone.java and java/util/Locale.java), I found that SimpleDateFormat works with
GMT+HH:MM, Locale timezone ID and RFC822 (just offset) and all locale's timezone was in
java/text/resources/DateFormatzoneData_*.java. So if the locale is not in resources (pt_BR, for example),it recognizes just GMT ID. Is it a Blackdown java classes bug ?
Second problem: But why programa aborts ? It has a message for this.
The abortion reason is:
java.lang.IllegalArgumentException: Argument # > Arg length
java.lang.IllegalArgumentException: Argument # > Arg length
at java.text.MessageFormat.format(MessageFormat.java)
at java.text.MessageFormat.format(MessageFormat.java)
at java.text.MessageFormat.format(MessageFormat.java)
at postgresql.util.PSQLException.translate(PSQLException.java:83)
at postgresql.util.PSQLException.<init>(PSQLException.java:57)
at postgresql.jdbc1.ResultSet.getTimestamp(ResultSet.java:451)
at postgresql.jdbc1.ResultSet.getObject(ResultSet.java:733)
at example.psql.displayResult(psql.java:122)
at example.psql.processLine(psql.java:88)
at example.psql.<init>(psql.java:58)
at example.psql.main(psql.java:204)
So, I put something like "System.out.println("message="+message+" NArgs="+args.length)" in
tranlate function of src/interfaces/jdbc/postgresql/util/PSQLException.java.
For my surprise, the result was: message=Bad Timestamp Format at {1} in {2} NArgs=2
The message just requires two args. FOR THIS, I HAVE NO SOLUTION.
Best Regards,
Ricardo Coelho.
---------------------------------------------------------------------------
Full information on this slip is available at:
http://www.postgresql.org/bugs/visitor.php3?sid=15&v_func=zoom
---------------------------------------------------------------------------
This message was generated automatically by Keystone at http://www.postgresql.org
From | Date | Subject | |
---|---|---|---|
Next Message | webmaster | 1999-07-26 16:42:01 | [Keystone Slip # 12] postmaster -oF crashes backend |
Previous Message | webmaster | 1999-07-26 16:40:39 | [Keystone Slip # 14] Building pristine source on RedHat Alpha 6.0 |