[ 
https://issues.apache.org/jira/browse/DERBY-3304?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12565435#action_12565435
 ] 

Mamta A. Satoor commented on DERBY-3304:
----------------------------------------

Based on the research/comments on this issue and Dan's comment in DERBY-3037 
"What is the purpose of commit() closing the language result sets? If it's to 
close JDBC ResultSets that are marked close at commit then a possibility is to 
only close language result sets that return rows (returnRows() returns true). 
That would leave language result sets that do not return rows open, but by 
definition (I think) those are the ones that are actively executing and the 
very ones we don't want to close. :-) ", I thought of keeping the language 
resultsets that do not return rows open when BaseActivation.reset() is trying 
to decide what resultsets to close. This will ensure that we do not close the 
CallStatementResultSet(since it does not return rows) while it is still being 
constructed when the java procedure issues commit/rollback. The change involved 
is as follows
$ svn stat -q
M      java\engine\org\apache\derby\impl\sql\execute\BaseActivation.java
$ svn diff
Index: java/engine/org/apache/derby/impl/sql/execute/BaseActivation.java
===================================================================
--- java/engine/org/apache/derby/impl/sql/execute/BaseActivation.java   
(revision 617013)
+++ java/engine/org/apache/derby/impl/sql/execute/BaseActivation.java   
(working copy)
@@ -334,7 +334,8 @@
        {
                // if resultset holdability after commit is false, close it
                if (resultSet != null) {
-                       if (!resultSetHoldability || !resultSet.returnsRows()) {

+                       //Do not close resultsets that do not return any rows.
+                       if ((!resultSetHoldability && 
resultSet.returnsRows()==true)){
                                // would really like to check if it is open,
                                // this is as close as we can approximate that.
                                resultSet.close();

So, as can be seen from diff above, rather than always closing the resultsets 
that do not return rows, we want to leave them alone. 

This works good for CallStatementResultSet but this is causing a problem for 
DML like update for instance below. 

The following ij script demonstrates the problem with the patch. The script 
creates 2 tables with foreign key relationship. Then it tries to violate the 
foreign key by doing an update. With my changes, Derby fails to generate any 
statistics for update. This is because the statistics collection happens in the 
language resultset close method but since with my patch, we do not close the 
resultset if it does not return row, we do not get a chance to collect the 
statistics. Without my patch, the statistics get collected in language 
resultset close which is called by BaseActivation.reset 

connect 'jdbc:derby:c:/dellater/db;create=true';
drop table basic;
drop table p;
create table p (ccharForBitData char(1) for bit data not null, unindexed 
smallint, cchar char(10) not null, 
                constraint pk1 primary key (cchar, ccharForBitData));
insert into p values (x'22', 33, '22');
create table basic (cint int, cchar char(10),  ccharForBitData char(1) for bit 
data, unindexed int);
insert into basic values (22, '22', x'22', 22);
alter table basic add constraint fk1 foreign key (cchar, ccharForBitData) 
references p;
maximumdisplaywidth 2000;
call SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(1);
update p set ccharForBitData = x'22', cchar = CAST(unindexed as CHAR(10));
values SYSCS_UTIL.SYSCS_GET_RUNTIMESTATISTICS();

To avoid this statistics collection problem, we could change language resultset 
close criteria in BaseActivation.reset to follow Dag's suggestion "Maybe the 
test in BaseActivation.reset can test for CallStatementResultSet?' but like Dag 
said, "Not OO, though". Will like to hear if anyone has any comments?


> Explicit commit inside a java procedure makes a dynamic result sets passed 
> out unavailable
> ------------------------------------------------------------------------------------------
>
>                 Key: DERBY-3304
>                 URL: https://issues.apache.org/jira/browse/DERBY-3304
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.4.0.0
>            Reporter: Daniel John Debrunner
>            Assignee: Mamta A. Satoor
>         Attachments: Main.java
>
>
> Repro (Main.java) that shows changed behavior after svn 602991
> (the patch committed for this issue). It seems a regression: (originally from 
> Dag H. Wanvik attached to DERBY-1585)
> An explicit commit inside a stored procedure makes a dynamic result sets 
> passed out unavailable, even if the commit is executed *prior* to the result 
> set; as in the repro.

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