mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
fix bug in getTime() with fractional seconds reported by Laurette Cisneros (laurette@nextbus.com)
This commit is contained in:
@ -442,6 +442,6 @@ public class Driver implements java.sql.Driver
|
|||||||
}
|
}
|
||||||
|
|
||||||
//The build number should be incremented for every new build
|
//The build number should be incremented for every new build
|
||||||
private static int m_buildNumber = 100;
|
private static int m_buildNumber = 101;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
|
|||||||
{
|
{
|
||||||
if (rows == null)
|
if (rows == null)
|
||||||
throw new PSQLException("postgresql.con.closed");
|
throw new PSQLException("postgresql.con.closed");
|
||||||
|
|
||||||
if (++current_row >= rows.size())
|
if (++current_row >= rows.size())
|
||||||
return false;
|
return false;
|
||||||
this_row = (byte [][])rows.elementAt(current_row);
|
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);
|
String s = getString(columnIndex);
|
||||||
|
|
||||||
if (s != null)
|
if (s == null)
|
||||||
|
return null; // SQL NULL
|
||||||
|
try
|
||||||
{
|
{
|
||||||
try
|
if (s.length() == 8) {
|
||||||
{
|
//value is a time value
|
||||||
if (s.length() != 5 && s.length() != 8)
|
return java.sql.Time.valueOf(s);
|
||||||
throw new NumberFormatException("Wrong Length!");
|
} else if (s.indexOf(".") == 8) {
|
||||||
int hr = Integer.parseInt(s.substring(0, 2));
|
//value is a time value with fractional seconds
|
||||||
int min = Integer.parseInt(s.substring(3, 5));
|
java.sql.Time l_time = java.sql.Time.valueOf(s.substring(0,8));
|
||||||
int sec = (s.length() == 5) ? 0 : Integer.parseInt(s.substring(6));
|
String l_strMillis = s.substring(9);
|
||||||
return new Time(hr, min, sec);
|
if (l_strMillis.length() > 3)
|
||||||
}
|
l_strMillis = l_strMillis.substring(0,3);
|
||||||
catch (NumberFormatException e)
|
int l_millis = Integer.parseInt(l_strMillis);
|
||||||
{
|
if (l_millis < 10) {
|
||||||
throw new PSQLException ("postgresql.res.badtime", s);
|
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
|
* Get the value of a column in the current row as a
|
||||||
* java.sql.Timestamp object
|
* 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
|
* 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'.
|
* expects timezone info as 'GMT+09:00' where as ISO gives '+09'.
|
||||||
* Java also expects fractional seconds to 3 places where postgres
|
* 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)
|
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 type is timestamptz then data is in GMT, else it is in local timezone
|
||||||
if (fields[columnIndex - 1].getPGType().equals("timestamptz")) {
|
if (fields[columnIndex - 1].getPGType().equals("timestamptz")) {
|
||||||
sbuf.append(" GMT");
|
sbuf.append(" GMT");
|
||||||
|
@ -74,12 +74,12 @@ public class Array implements java.sql.Array
|
|||||||
Object retVal = null;
|
Object retVal = null;
|
||||||
|
|
||||||
ArrayList array = new ArrayList();
|
ArrayList array = new ArrayList();
|
||||||
|
|
||||||
/* Check if the String is also not an empty array
|
/* Check if the String is also not an empty array
|
||||||
* otherwise there will be an exception thrown below
|
* otherwise there will be an exception thrown below
|
||||||
* in the ResultSet.toX with an empty string.
|
* in the ResultSet.toX with an empty string.
|
||||||
* -- Doug Fields <dfields-pg-jdbc@pexicom.com> Feb 20, 2002 */
|
* -- Doug Fields <dfields-pg-jdbc@pexicom.com> Feb 20, 2002 */
|
||||||
|
|
||||||
if ( rawString != null && !rawString.equals("{}") )
|
if ( rawString != null && !rawString.equals("{}") )
|
||||||
{
|
{
|
||||||
char[] chars = rawString.toCharArray();
|
char[] chars = rawString.toCharArray();
|
||||||
@ -166,7 +166,7 @@ public class Array implements java.sql.Array
|
|||||||
case Types.TIME:
|
case Types.TIME:
|
||||||
retVal = new java.sql.Time[ count ];
|
retVal = new java.sql.Time[ count ];
|
||||||
for ( ; count > 0; 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;
|
break;
|
||||||
case Types.TIMESTAMP:
|
case Types.TIMESTAMP:
|
||||||
retVal = new Timestamp[ count ];
|
retVal = new Timestamp[ count ];
|
||||||
|
@ -388,7 +388,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
|
|||||||
*/
|
*/
|
||||||
public Time getTime(int columnIndex) throws SQLException
|
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)
|
if (s == null)
|
||||||
return null; // SQL NULL
|
return null; // SQL NULL
|
||||||
// length == 8: SQL Time
|
|
||||||
// length > 8: SQL Timestamp
|
|
||||||
try
|
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)
|
catch (NumberFormatException e)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user