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

Knut Anders Hatlen commented on DERBY-4313:
-------------------------------------------

I tested this manually by making dropUsingDMD() public and use it to drop these 
three tables:

        s.execute("create table a(x int)");
        s.execute("create table b(x int primary key)");
        s.execute("create table c(x int references b(x))");

Using the embedded driver, all the tables were dropped after dropUsingDMD() had 
returned. Using the client driver, the table B was still there after 
dropUsingDMD().

The difference seems to be that the embedded driver stops executing the 
statements in the batch after the first failure and only returns the status for 
the succeeding statements, whereas the client driver continues executing 
statements after the first failure in the batch. I'll log a separate issue for 
the difference between client and embedded in handling errors in a batch. Only 
the bug in dropUsingDMD() will be handled in this issue.

> JDBC.dropUsingDMD() may skip dropping objects
> ---------------------------------------------
>
>                 Key: DERBY-4313
>                 URL: https://issues.apache.org/jira/browse/DERBY-4313
>             Project: Derby
>          Issue Type: Bug
>          Components: Test
>    Affects Versions: 10.6.0.0
>            Reporter: Knut Anders Hatlen
>            Assignee: Knut Anders Hatlen
>            Priority: Minor
>
> This loop in JDBC.dropUsingDMD() looks broken:
>         // Remove any statements from the list that succeeded.
>               boolean didDrop = false;
>               for (int i = 0; i < results.length; i++)
>               {
>                       int result = results[i];
>                       if (result == -3 /* Statement.EXECUTE_FAILED*/)
>                               hadError = true;
>                       else if (result == -2/*Statement.SUCCESS_NO_INFO*/)
>                               didDrop = true;
>                       else if (result >= 0)
>                               didDrop = true;
>                       else
>                               Assert.fail("Negative executeBatch status");
>             
>             if (didDrop)
>                 ddl.set(i, null);
>               }
> It is supposed to check the status of each individual statement executed in a 
> batch, and clear the successful ones from an ArrayList so that only the 
> unsuccessful ones are left.
> However, if one of the statements is reported to have failed, and one of the 
> proceeding statements has been successful, the failed statement will be 
> removed from the ArrayList because didDrop is true. This means that some of 
> the failed statements are not retried later. The statements normally fail 
> because some other object depends on the object being dropped, and they 
> usually succeed when they are retried after the other objects have been 
> dropped. By not retrying, some objects that were supposed to be dropped may 
> be left in the database.

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