fix bug in getTime() with fractional seconds reported by Laurette Cisneros (laurette...
authorBarry Lind
Wed, 10 Jul 2002 00:51:36 +0000 (00:51 +0000)
committerBarry Lind
Wed, 10 Jul 2002 00:51:36 +0000 (00:51 +0000)
src/interfaces/jdbc/org/postgresql/Driver.java.in
src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java
src/interfaces/jdbc/org/postgresql/jdbc2/Array.java
src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java

index 6cdae089c2ea10ff80e6f0401672f9004b710dbc..61f615c51473b9bf14b2a0485ebcde4a5430b0ae 100644 (file)
@@ -442,6 +442,6 @@ public class Driver implements java.sql.Driver
    }
 
         //The build number should be incremented for every new build
-        private static int m_buildNumber = 100;
+        private static int m_buildNumber = 101;
 
 }
index 1d640cebe49543903641d97876793e21ceb4ac94..b6e054a33689c76c74a6efc3c40b0caef255c776 100644 (file)
@@ -108,7 +108,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
    {
        if (rows == null)
        throw new PSQLException("postgresql.con.closed");
+
        if (++current_row >= rows.size())
            return false;
        this_row = (byte [][])rows.elementAt(current_row);
@@ -468,30 +468,42 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
    {
        String s = getString(columnIndex);
 
-       if (s != null)
+       if (s == null)
+           return null; // SQL NULL
+       try
        {
-           try
-           {
-               if (s.length() != 5 && s.length() != 8)
-                   throw new NumberFormatException("Wrong Length!");
-               int hr = Integer.parseInt(s.substring(0, 2));
-               int min = Integer.parseInt(s.substring(3, 5));
-               int sec = (s.length() == 5) ? 0 : Integer.parseInt(s.substring(6));
-               return new Time(hr, min, sec);
-           }
-           catch (NumberFormatException e)
-           {
-               throw new PSQLException ("postgresql.res.badtime", s);
-           }
+                   if (s.length() == 8) {
+                     //value is a time value
+                     return java.sql.Time.valueOf(s);
+                   } else if (s.indexOf(".") == 8) {
+                     //value is a time value with fractional seconds
+                     java.sql.Time l_time = java.sql.Time.valueOf(s.substring(0,8));
+                     String l_strMillis = s.substring(9);
+                     if (l_strMillis.length() > 3)
+                       l_strMillis = l_strMillis.substring(0,3);
+                     int l_millis = Integer.parseInt(l_strMillis);
+                     if (l_millis < 10) {
+                       l_millis = l_millis * 100;
+                     } else if (l_millis < 100) {
+                       l_millis = l_millis * 10;
+                     }
+                     return new java.sql.Time(l_time.getTime() + l_millis);
+                   } else {
+                     //value is a timestamp
+                     return new java.sql.Time(getTimestamp(columnIndex).getTime());
+                   }
+       }
+       catch (NumberFormatException e)
+       {
+           throw new PSQLException("postgresql.res.badtime", s);
        }
-       return null;        // SQL NULL
    }
 
    /*
     * Get the value of a column in the current row as a
     * java.sql.Timestamp object
     *
-    * The driver is set to return ISO date formated strings. We modify this 
+    * The driver is set to return ISO date formated strings. We modify this
     * string from the ISO format to a format that Java can understand. Java
     * expects timezone info as 'GMT+09:00' where as ISO gives '+09'.
     * Java also expects fractional seconds to 3 places where postgres
@@ -577,7 +589,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
        }
        else if (slen == 19)
        {
-           // No tz or fractional second info. 
+           // No tz or fractional second info.
            // if type is timestamptz then data is in GMT, else it is in local timezone
            if (fields[columnIndex - 1].getPGType().equals("timestamptz")) {
            sbuf.append(" GMT");
index 042a6f406975fd83dbcced9206409e7830f8b942..7cc842ec36e0ad7f30f617a770308031c7f5a9ee 100644 (file)
@@ -74,12 +74,12 @@ public class Array implements java.sql.Array
        Object retVal = null;
 
        ArrayList array = new ArrayList();
-       
+
        /* Check if the String is also not an empty array
                  * otherwise there will be an exception thrown below
                  * in the ResultSet.toX with an empty string.
                  * -- Doug Fields  Feb 20, 2002 */
-                
+
        if ( rawString != null && !rawString.equals("{}") )
        {
            char[] chars = rawString.toCharArray();
@@ -166,7 +166,7 @@ public class Array implements java.sql.Array
            case Types.TIME:
                retVal = new java.sql.Time[ count ];
                for ( ; count > 0; count-- )
-                   ((java.sql.Time[])retVal)[i++] = ResultSet.toTime( arrayContents[(int)index++] );
+                   ((java.sql.Time[])retVal)[i++] = ResultSet.toTime( arrayContents[(int)index++], rs, getBaseTypeName() );
                break;
            case Types.TIMESTAMP:
                retVal = new Timestamp[ count ];
index 43c5e3d2d861cdf742a6230cb3e7e23810bab0d1..f5489f4e9793aea143173a15de31e21639b9ed95 100644 (file)
@@ -388,7 +388,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
     */
    public Time getTime(int columnIndex) throws SQLException
    {
-       return toTime( getString(columnIndex) );
+       return toTime( getString(columnIndex), this, fields[columnIndex-1].getPGType() );
    }
 
    /*
@@ -1626,15 +1626,32 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
        }
    }
 
-   public static Time toTime(String s) throws SQLException
+   public static Time toTime(String s, ResultSet resultSet, String pgDataType) 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));
+                   if (s.length() == 8) {
+                     //value is a time value
+                     return java.sql.Time.valueOf(s);
+                   } else if (s.indexOf(".") == 8) {
+                     //value is a time value with fractional seconds
+                     java.sql.Time l_time = java.sql.Time.valueOf(s.substring(0,8));
+                     String l_strMillis = s.substring(9);
+                     if (l_strMillis.length() > 3)
+                       l_strMillis = l_strMillis.substring(0,3);
+                     int l_millis = Integer.parseInt(l_strMillis);
+                     if (l_millis < 10) {
+                       l_millis = l_millis * 100;
+                     } else if (l_millis < 100) {
+                       l_millis = l_millis * 10;
+                     }
+                     return new java.sql.Time(l_time.getTime() + l_millis);
+                   } else {
+                     //value is a timestamp
+                     return new java.sql.Time(toTimestamp(s, resultSet, pgDataType).getTime());
+                   }
        }
        catch (NumberFormatException e)
        {