]> granicus.if.org Git - postgresql/commitdiff
Backed out:
authorBruce Momjian <bruce@momjian.us>
Sat, 13 Jan 2001 18:52:42 +0000 (18:52 +0000)
committerBruce Momjian <bruce@momjian.us>
Sat, 13 Jan 2001 18:52:42 +0000 (18:52 +0000)
---------------------------------------------------------------------------

Attached is a set of patches for a couple of bugs dealing with
timestamps in JDBC.

Bug#1) Incorrect timestamp stored in DB if client timezone different
than DB.

src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java
src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java
src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java
src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java

index 6db05e698a898ef9e682e9481952bd261e6fde0a..51cb64d5a218e9893990c864da73dac9c14705fe 100644 (file)
@@ -310,11 +310,12 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta
         * @param x the parameter value
         * @exception SQLException if a database access error occurs
         */
-        private static final SimpleDateFormat DF1 = new SimpleDateFormat("yyyy-MM-dd");
        public void setDate(int parameterIndex, java.sql.Date x) throws SQLException
        {
-         set(parameterIndex, DF1.format(x));
-
+         SimpleDateFormat df = new SimpleDateFormat("''yyyy-MM-dd''");
+         
+         set(parameterIndex, df.format(x));
+         
          // The above is how the date should be handled.
          //
          // However, in JDK's prior to 1.1.6 (confirmed with the
@@ -348,17 +349,9 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta
         * @param x the parameter value
         * @exception SQLException if a database access error occurs
         */
-        private static SimpleDateFormat DF2 = getDF2();
-        private static SimpleDateFormat getDF2() {
-          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-          sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
-          return sdf;
-        }
        public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException
-        {
-            StringBuffer strBuf = new StringBuffer("'");
-            strBuf.append(DF2.format(x)).append('.').append(x.getNanos()/10000000).append("+00'");
-           set(parameterIndex, strBuf.toString());
+       {
+               set(parameterIndex, "'" + x.toString() + "'");
        }
 
        /**
index a91ba440f395a0fd8531cbc7e3056c7c5bf7a543..3010ed59a3fbc98e478686d352dc5217e579e419 100644 (file)
@@ -412,8 +412,9 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
     String s = getString(columnIndex);
     if(s==null)
       return null;
+    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
     try {
-      return new java.sql.Date(DF5.parse(s).getTime());
+      return new java.sql.Date(df.parse(s).getTime());
     } catch (ParseException e) {
       throw new PSQLException("postgresql.res.baddate",new Integer(e.getErrorOffset()),s);
     }
@@ -456,59 +457,30 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
    * @return the column value; null if SQL NULL
    * @exception SQLException if a database access error occurs
    */
-  private static final SimpleDateFormat DF1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSzzzzzzzzz");
-  private static final SimpleDateFormat DF2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzzzzzzzz");
-  private static final SimpleDateFormat DF3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
-  private static final SimpleDateFormat DF4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-  private static final SimpleDateFormat DF5 = new SimpleDateFormat("yyyy-MM-dd");
   public Timestamp getTimestamp(int columnIndex) throws SQLException
   {
     String s = getString(columnIndex);
     if(s==null)
        return null;
-
-    boolean subsecond;
-    //if string contains a '.' we have fractional seconds
-    if (s.indexOf('.') == -1) {
-      subsecond = false;
-    } else {
-      subsecond = true;
-    }
-
-    //here we are modifying the string from ISO format to a format java can understand
-    //java expects timezone info as 'GMT-08:00' instead of '-08' in postgres ISO format
-    //and java expects three digits if fractional seconds are present instead of two for postgres
-    //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');
-    }
-
-    s = strBuf.toString();
-
+    
+    // This works, but it's commented out because Michael Stephenson's
+    // solution is better still:
+    //SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    
+    // Michael Stephenson's solution:
     SimpleDateFormat df = null;
-
-    if (s.length()>23 && subsecond) {
-      df = DF1;
-    } else if (s.length()>23 && !subsecond) {
-      df = DF2;
-    } else if (s.length()>10 && subsecond) {
-      df = DF3;
-    } else if (s.length()>10 && !subsecond) {
-      df = DF4;
+    if (s.length()>21 && s.indexOf('.') != -1) {
+       df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSzzz");
+    } else if (s.length()>19 && s.indexOf('.') == -1) {
+       df = new SimpleDateFormat("yyyy-MM-dd HH:MM:sszzz");
+    } else if (s.length()>19 && s.indexOf('.') != -1) {
+       df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss.SS");
+    } else if (s.length()>10 && s.length()<=18) {
+       df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
     } else {
-      df = DF5;
+       df = new SimpleDateFormat("yyyy-MM-dd");
     }
-
+    
     try {
        return new Timestamp(df.parse(s).getTime());
     } catch(ParseException e) {
index 24e21c32b84556eb84e97b0a83814af7b94f323a..1e8ec1138ea8f10da6a51c5ed024deafb4f09520 100644 (file)
@@ -310,11 +310,12 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta
         * @param x the parameter value
         * @exception SQLException if a database access error occurs
         */
-        private static final SimpleDateFormat DF1 = new SimpleDateFormat("yyyy-MM-dd");
        public void setDate(int parameterIndex, java.sql.Date x) throws SQLException
        {
-         set(parameterIndex, DF1.format(x));
-
+         SimpleDateFormat df = new SimpleDateFormat("''yyyy-MM-dd''");
+         
+         set(parameterIndex, df.format(x));
+         
          // The above is how the date should be handled.
          //
          // However, in JDK's prior to 1.1.6 (confirmed with the
@@ -348,17 +349,9 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta
         * @param x the parameter value
         * @exception SQLException if a database access error occurs
         */
-        private static SimpleDateFormat DF2 = getDF2();
-        private static SimpleDateFormat getDF2() {
-          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-          sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
-          return sdf;
-        }
        public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException
-        {
-            StringBuffer strBuf = new StringBuffer("'");
-            strBuf.append(DF2.format(x)).append('.').append(x.getNanos()/10000000).append("+00'");
-           set(parameterIndex, strBuf.toString());
+       {
+               set(parameterIndex, "'" + x.toString() + "'");
        }
 
        /**
index d0a578d761b2d4c0acdceee0b17e5221b645fa5e..f1f333d6d2fb42307e07a99d544d349a5a0f211d 100644 (file)
@@ -415,8 +415,9 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
     String s = getString(columnIndex);
     if(s==null)
       return null;
+    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
     try {
-      return new java.sql.Date(DF5.parse(s).getTime());
+      return new java.sql.Date(df.parse(s).getTime());
     } catch (ParseException e) {
       throw new PSQLException("postgresql.res.baddate",new Integer(e.getErrorOffset()),s);
     }
@@ -459,66 +460,47 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
    * @return the column value; null if SQL NULL
    * @exception SQLException if a database access error occurs
    */
-  private static final SimpleDateFormat DF1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSzzzzzzzzz");
-  private static final SimpleDateFormat DF2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzzzzzzzz");
-  private static final SimpleDateFormat DF3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
-  private static final SimpleDateFormat DF4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-  private static final SimpleDateFormat DF5 = new SimpleDateFormat("yyyy-MM-dd");
   public Timestamp getTimestamp(int columnIndex) throws SQLException
   {
     String s = getString(columnIndex);
     if(s==null)
        return null;
-
-    boolean subsecond;
-    //if string contains a '.' we have fractional seconds
-    if (s.indexOf('.') == -1) {
-      subsecond = false;
-    } else {
-      subsecond = true;
-    }
-
-    //here we are modifying the string from ISO format to a format java can understand
-    //java expects timezone info as 'GMT-08:00' instead of '-08' in postgres ISO format
-    //and java expects three digits if fractional seconds are present instead of two for postgres
-    //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');
+    
+    // This works, but it's commented out because Michael Stephenson's
+    // solution is better still:
+    //SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+// Modification by Jan Thomae
+    String sub = s.substring(s.length() - 3, s.length()-2);
+    if (sub.equals("+") || sub.equals("-")) {
+            s = s.substring(0, s.length()-3) + "GMT"+ s.substring(s.length()-3, s.length())+":00";
     }
-
-    s = strBuf.toString();
-
+// -------
+       // Michael Stephenson's solution:
     SimpleDateFormat df = null;
 
-    if (s.length()>23 && subsecond) {
-      df = DF1;
-    } else if (s.length()>23 && !subsecond) {
-      df = DF2;
-    } else if (s.length()>10 && subsecond) {
-      df = DF3;
-    } else if (s.length()>10 && !subsecond) {
-      df = DF4;
+// Modification by Jan Thomae
+    if (s.length()>27) {
+    df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzzzzzzzz");  
+    } else              
+// -------
+    if (s.length()>21 && s.indexOf('.') != -1) {
+       df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSzzz");
+    } else if (s.length()>19 && s.indexOf('.') == -1) {
+       df = new SimpleDateFormat("yyyy-MM-dd HH:MM:sszzz");
+    } else if (s.length()>19 && s.indexOf('.') != -1) {
+       df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss.SS");
+    } else if (s.length()>10 && s.length()<=18) {
+       df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
     } else {
-      df = DF5;
+       df = new SimpleDateFormat("yyyy-MM-dd");
     }
-
+    
     try {
        return new Timestamp(df.parse(s).getTime());
     } catch(ParseException e) {
        throw new PSQLException("postgresql.res.badtimestamp",new Integer(e.getErrorOffset()),s);
     }
   }
-
   
   /**
    * A column value can be retrieved as a stream of ASCII characters