]> granicus.if.org Git - postgresql/commitdiff
fix bug in getTime() with fractional seconds reported by Laurette Cisneros (laurette...
authorBarry Lind <barry@xythos.com>
Wed, 10 Jul 2002 00:51:36 +0000 (00:51 +0000)
committerBarry Lind <barry@xythos.com>
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 <dfields-pg-jdbc@pexicom.com> 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)
                {