[ 
https://issues.apache.org/jira/browse/DERBY-1816?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

A B updated DERBY-1816:
-----------------------

    Attachment: d1816_recycleCleanup_v1.patch

While looking into this issue I noticed that there are several methods in 
client/am/DateTime.java which do the following two things:

  1) Take a "recyclable" Time, Timestamp, or Date object with the apparent
     intent of avoiding repeated creation of corresponding java.sql.* objects.

  2) Make use of "setXXX" methods that have been deprecated as of JDK 1.1.

As an example, see client/am/DateTime.timeBytesToTime(...).

That said, it looks like the "recyclable" objects are always null which makes 
the #1 code pretty meaningless (this is confirmed by the fact that the code 
coverage results show the relevant code is never executed).

I believe I have a fix for this Jira (DERBY-1816), but before working more with 
it I'm posting d1816_recycleCleanup_v1.patch, which is a pre-patch that does 
the following:

  1) Replaces each of the recyclable Date, Time, and Timestamp arguments with
     a recyclable java.util.Calendar object.

  2) Modifies the relevant code to call methods on the recyclable Calendar 
object
     instead of on Date, Time, and Timestamp objects.  The benefit to doing this
     is that we are now using non-deprecated methods. 

Note that even with this patch we are still creating a new instance of 
Time/Timestamp/Date for each method--the cleanup patch does not change that.  
Instead, the cleanup patch adds the instantiation of a new Calendar object (one 
per client/am/Cursor) and then (re-)uses that object to replace the deprecated 
calls.  The goal here is not just to replace the deprecated calls, though; I 
think that having a Calendar object will help resolve this particular Jira (and 
maybe others), as well.

That said, I was reading through the comments on DERBY-889 and one thing I'm 
unsure about is how/if timezones need to be handled in this code.  When writing 
the cleanup patch I took a look at the embedded classes and, as far as I can 
tell, embedded creates a new instance of GregorianCalendar (no timezone info 
specified) and creates the appropriate date/time object from that (see for 
example the "newTimestamp()" method in iapi/types/SQLTimestamp, or the 
"getTimeInMillis()" second in iapi/types/SQLDate).  The changes in 
d1816_recycleCleanup_v1.patch are intended to mimic that behavior in client.

But it's quite possible that I've overlooked something, so I would appreciate 
any reviews/feedback that anyone might have on this "cleanup" patch.

Note that d1816_recycleCleanup_v1.patch is not intended to change any 
functionality of the client.  The hope for this patch is to keep all behavior 
the same (even the behavior that is currently wrong) but to make it easier to 
fix the incorrect behavior with a subsequent patch.

I ran suites.All and derbyall on SUSE Linux with ibm142 and there were no 
failures.

> Client's ResultSet.getTime() on a SQL TIMESTAMP column loses the sub-second 
> resolution and always has a milli-second value of zero.
> -----------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-1816
>                 URL: https://issues.apache.org/jira/browse/DERBY-1816
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC, Network Client
>    Affects Versions: 10.1.1.0, 10.1.2.1, 10.1.3.1, 10.2.1.6, 10.3.0.0
>            Reporter: Daniel John Debrunner
>            Priority: Minor
>         Attachments: d1816_recycleCleanup_v1.patch
>
>
> In embedded the java.sql.Time object returned from ResultSet.getTime() for a 
> SQL TIMESTAMP object has its millisecond value for the time portion equal to 
> that for the java.sql.Timestamp value.
> In client the millisecond time value for such a value is always set to zero.
> Note a Derby SQL TIME value has by definition resolution of only a second so 
> its millisecond  value is always zero,
> but java.sql.Time  is not a direct mapping to the SQL Type, it's a JDBC type, 
> so when converting from a SQL TIMESTAMP
> it should retain the precision.
> The new test lang.TimeHandlingTest has this assert code that shows the 
> problem, one of its calls will be commented out
> with a comment with this bug number.
>     private void assertTimeEqual(Time tv, Timestamp tsv)
>     {
>         cal.clear();
>         cal.setTime(tv);
>                 
>         int hour = cal.get(Calendar.HOUR_OF_DAY);
>         int min = cal.get(Calendar.MINUTE);
>         int sec = cal.get(Calendar.SECOND);
>         int ms = cal.get(Calendar.MILLISECOND);
>                         
>         // Check the time portion is set to the same as tv
>         cal.clear();
>         cal.setTime(tsv);
>         assertEquals(hour, cal.get(Calendar.HOUR_OF_DAY));
>         assertEquals(min, cal.get(Calendar.MINUTE));
>         assertEquals(sec, cal.get(Calendar.SECOND));
>         assertEquals(ms, cal.get(Calendar.MILLISECOND));      <<<<<<<<<<<<< 
> FAILS HERE
>     }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to