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

Deepa Remesh commented on DERBY-498:
------------------------------------

Thanks Army for reviewing the patch. The use of "newDrdaRs.withHoldCursor" is 
intentional. Reasoning is:

With this change, the result set(s) generated by a callable statement can have 
different holdabilities. So the SQLCSRHLD value in OPNQRYRM reply message can 
be different for each result set. Hence I cannot use the holdability of 
statement in general but need to get it for each result set . For this, I am 
using the variable "withHoldCursor" in DRDAResultSet. This variable existed 
before but was not being used anywhere. Now it is used in DRDAConnThread's 
writeOPNQRYRM and set in DRDAStatement's addResultSet  method:

check in writeOPNQRYRM before:
        //pass the SQLCSRHLD codepoint only if statement has hold cursors over 
commit set
        if (stmt.withHoldCursor == JDBC30Translation.HOLD_CURSORS_OVER_COMMIT)
                writer.writeScalar1Byte(CodePoint.SQLCSRHLD, CodePoint.TRUE);

check in writeOPNQRYRM after:
        //pass the SQLCSRHLD codepoint only if statement producing the 
ResultSet has 
        //hold cursors over commit set. In case of stored procedures which use 
server-side
        //JDBC, the holdability of the ResultSet will be the holdability of the 
statement 
        //in the stored procedure, not the holdability of the calling statement.
        if (stmt.getCurrentDrdaResultSet().withHoldCursor == 
JDBC30Translation.HOLD_CURSORS_OVER_COMMIT)
                writer.writeScalar1Byte(CodePoint.SQLCSRHLD, CodePoint.TRUE);
                
call to addResultSet execute method in DRDAStatement:
        ...
        //For callable statement, get holdability of statement generating the 
result set
        if(isCallable)
                addResultSet(rs,getResultSetHoldability(rs));
        else
                addResultSet(rs,withHoldCursor);
        ...

For callable statements, I set "withHoldCursor" in DRDAResultSet with the 
holdability of statement within procedure which generated the result set. For 
other statements, I set it to the holdability of the DRDAStatement (same as 
what was being checked in writeOPNQRYRM before this change). 




> Result set holdability defined inside stored procedures is ignored by 
> server/client
> -----------------------------------------------------------------------------------
>
>          Key: DERBY-498
>          URL: http://issues.apache.org/jira/browse/DERBY-498
>      Project: Derby
>         Type: Bug
>   Components: Network Client, Network Server
>     Versions: 10.1.2.0, 10.2.0.0
>     Reporter: A B
>     Assignee: Deepa Remesh
>  Attachments: d498.java, derby-498.diff, derby-498.status
>
> Assume I have a Java stored procedure that returns one or more result sets, 
> and the holdability of those result sets is specified as part of the 
> createStatement() method within the procedure definition (see below for an 
> example).
> If I execute this procedure against Derby embedded, the holdability of each 
> result set matches that of the statement-specific holdability that is defined 
> within the stored procedure.  However, if I run the procedure against the 
> Network Server using the Derby client, the holdability of _all_ result sets 
> is the same, and it is based on the holdability of the statement that 
> _executed_ the procedure--i.e. the statement-specific holdability that is 
> defined within the procedure is ignored.
> Ex: If I create a stored procedure that corresponds to the following method:
> public static void p2(ResultSet[] rs1, ResultSet[] rs2,
>     ResultSet[] rs3) throws Exception
> {
>     Connection conn = DriverManager.getConnection(
>         "jdbc:default:connection");
>     Statement st1 = conn.createStatement(
>         ResultSet.TYPE_FORWARD_ONLY,
>         ResultSet.CONCUR_READ_ONLY,
>         ResultSet.HOLD_CURSORS_OVER_COMMIT);
>     rs1[0] = st1.executeQuery("select * from testtable1");
>     Statement st2 = conn.createStatement(
>         ResultSet.TYPE_FORWARD_ONLY,
>         ResultSet.CONCUR_READ_ONLY,
>         ResultSet.CLOSE_CURSORS_AT_COMMIT);
>     rs2[0] = st2.executeQuery("select * from testtable2");
>     Statement st3 = conn.createStatement(
>         ResultSet.TYPE_FORWARD_ONLY,
>         ResultSet.CONCUR_READ_ONLY,
>         ResultSet.HOLD_CURSORS_OVER_COMMIT);
>     rs3[0] = st3.executeQuery("select * from testtable3");
>     return;
>     }
> }
> Then with Derby embedded, if I have a JDBC Statement that executes a call to 
> this procedure, rs1 and rs3 will behave with HOLD_CURSORS holdability and rs2 
> will behave with CLOSE_CURSORS holdability--and that will be the case 
> regardless of the holdability on the Statement that executed the call.  That 
> seems correct to me.
> But if I do the same thing with Network Server, all of the result sets (rs1, 
> rs2, and rs3) will have the same holdability as the JDBC Statement that 
> executed the call.  It doesn't matter what the holdabilities used within the 
> procedure definition are: they will all be over-ridden by the holdability of 
> the Statement that made the call.

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