[ 
http://issues.apache.org/jira/browse/DERBY-1196?page=comments#action_12374119 ] 

A B commented on DERBY-1196:
----------------------------

The checkin for this issue is causing a new failure in the ODBC tests that I've 
been running--but I'm not sure if it's a "regression" or not.  Please keep 
reading for more details.

The ODBC test that is seeing the failure is attempting to execute a SELECT 
query with 5 sets of parameters in a batch-like fashion, where the middle set 
fails with an execution-time error.  Prior to the fix for this issue the ODBC 
client could retrieve the 1st and 2nd result sets, would see an "invalid cursor 
state" for the 3rd result set, and then attempts to retrieve the 4th and 5th 
result sets would result in a "statement is already closed" error.  After the 
fix, though, that same situation leads to an ASSERT failure in the Derby engine:

org.apache.derby.shared.common.sanity.AssertFailure: ASSERT FAILED 
ProjectRestrictResultSet already open
        at 
org.apache.derby.shared.common.sanity.SanityManager.ASSERT(SanityManager.java(Compiled
 Code))
        at 
org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.openCore(ProjectRestrictResultSet.java:154)
        at 
org.apache.derby.impl.sql.execute.SortResultSet.openCore(SortResultSet.java:251)
...

I wrote code to try to do the same thing using the PreparedStatement.addBatch() 
functionality with the Java clients, but both the Derby Client and the JCC 
client  throw client-side errors saying: "Batching of queries not allowed by 
J2EE compliance."  Derby embedded fails as well, but with an error saying 
"Statement.executeUpdate() cannot be called with a statement that returns a 
ResultSet."

It appears that, somehow, the ODBC client is able to get this batch-like 
behavior to work with the Network Server, even though there doesn't appear to 
be a way to do it from Java.  Or at least that's true based on my own little 
experiments: namely, if I remove the execution-time error from the above 
scenario, the server will correctly execute all five queries and return 5 
result sets, which the ODBC client can then retrieve and process as normal 
using the ODBC equivalent to "getMoreResults()" and "getResultSet()".

So I'm wondering if this constitutes a regression or not?  The apparent 
regressed behavior is not visible from Java because both clients (and Derby 
embedded) disallow the operation.  But the behavior does appear to have 
"regressed" for ODBC clients that allow batch-like execution of SELECT queries. 
 Of course, I'm not sure what the ODBC behavior is supposed to be in the case 
of a failed query--with DB2, the failed query simply won't return a result set, 
so only 4 result sets will be returned to the client.  Derby Network Server has 
never matched that behavior--before the fix for this issue we returned 2 result 
sets and then closed the prepared statement; after the fix we return 2 result 
sets and then fail with an assert.

So in short: is this a case of regressed behavior, or a case of functionality 
that has never technically worked (at least not correctly) failing in a 
different way?  If it's not a regression, then what's the best way to address 
this?

> Network server closes  prepared statements  prematurely if  exception occurs 
> during OPNQRY  and can cause "'Statement' already closed" exception on 
> reexecution
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>          Key: DERBY-1196
>          URL: http://issues.apache.org/jira/browse/DERBY-1196
>      Project: Derby
>         Type: Bug

>   Components: Network Server
>     Versions: 10.2.0.0
>     Reporter: Kathey Marsden
>     Assignee: Kathey Marsden
>     Priority: Minor
>      Fix For: 10.2.0.0

>
> There is a bug in  Network Server that it closes prepared statements if
> an error occurs during execution on OPNQRY (usually 
> PreparedStatement.execute())
> Basically the problem is this code in DRDAConnThread.java
> processCommands() which catches any exception that occurs during  OPNQRY
> and closes the prepared statement .  OPNQRY is just the statement execution 
> and any statement level exceptions should not cause the statement to be 
> closed.
> catch (SQLException e)
>                     {
>                         writer.clearDSSesBackToMark(writerMark);
>                         try {
>                             // Try to cleanup if we hit an error.
>                             if (ps != null)
>                                 ps.close();
>                             writeOPNQFLRM(e);
>                         }
>                         catch (SQLException pse) {}
>                         errorInChain(e);
>                     }
> There are cases in jdbcapi/setTransactionIsolation when run with JCC that 
> trigger this case and yield a 
> 'Statement' already closed message. 
> This was the core issue with DERBY-1047 but there were problems with the 
> DERBY-1047 Jira entry in that the description of the problem was wrong and 
> also the issue itself no longer occurs with the fix for DERBY-1158.
> DERBY-1047 will be closed invalid and this issue will be used to  track  the 
> fix.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to