[ 
https://issues.apache.org/jira/browse/DERBY-595?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12479234
 ] 

Mayuresh Nirhali commented on DERBY-595:
----------------------------------------

After some debugging, I found that the call to getString returns the Exception 
as a String and, more importantly, leaves the DVD in inconsistent state. Here 
is why.

The logging code calls the getTraceString to identify the data length. In case 
of Streams, such objects are fully read when getString is called populating a 
DVD object. So, after the statement logging is done, the object is treated as 
DVD itself and not a stream, So the expected exception would not occur. 
Now, currently In the current statement logging code, the exception is returned 
as a String so it is thrown properly to the user.

For the specific case of input stream having too few bytes (less bytes actually 
on stream than expected), the DVD that is populated is not in consistent state. 
This is because the java.io.DataInputStream will read until input data is 
available, end of file is detected, or an exception occurs. As the bytes 
available are fewer than expected the DIStream will believe that there are some 
more bytes to be read even after reading the available bytes. This next read 
call returns -1 and puts the DVD in invalid state.

So, eating up the Exception in the logging code does not seem to work.

Only 2 options come to my mind, at this point.

1. Handle the Exception properly in the statement logging code, so that any 
errors in the stream object will be properly notified to the user.
2. Defer full read of stream until statement logging is complete. During 
statement logging only provide expected length of the stream. This behavior 
will be exactly same as the behavior when logStatementText is FALSE in terms of 
when the stream is fully read.

I would appreciate experts' opinion here... and please let me know if there is 
any other way this bug can be fixed.

TIA
Mayuresh

> Using derby.language.logStatementText=true can mask certain exceptions and 
> lead to incorrect behavior in some cases
> -------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-595
>                 URL: https://issues.apache.org/jira/browse/DERBY-595
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.0.2.0, 10.0.2.1, 10.1.1.0
>         Environment: all
>            Reporter: Sunitha Kambhampati
>         Assigned To: Mayuresh Nirhali
>
> Using derby.language.logStatementText=true can mask certain exceptions and 
> lead to incorrect behavior.
> I observed this with tests using streams, where if valid (expected) 
> exceptions are raised when DVD.getString() is called, the exception gets 
> eaten up when this property is set. 
> See 
> 1)in GenericParameter.toString()
> try
> {
> return value.getString();
> }
> catch (StandardException se)
> {
> return "unexpected exception from getString() - " + se;
> }
> }
> 2)in GenericPreparedStatement.execute(), where pvs.toString() is called for 
> the parameters.
> ________
> Reproduction:   Run the test jdbcapi/resultsetStream.java , with 
> derby.language.logStatementText=true and  expected error exceptions wont be 
> thrown for the error cases.  
> I looked at the tests that use streams , only the store/streamingColumn.java  
> uses derby.language.logStatementText=true. I'll file another bug to resolve 
> this test.

-- 
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