[ 
https://issues.apache.org/jira/browse/DERBY-268?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Rick Hillegas updated DERBY-268:
--------------------------------

    Attachment: TruncateConcurrency.java

Thanks, Knut. Your theory about the hang sounds good to me. Not sure about 
DERBY-979. I'm seeing a different stack trace than what's recorded on that 
issue (see below). I do see the same stack trace regardless of whether the 
truncating operation is TRUNCATE TABLE or DROP TABLE. As you note, TRUNCATE 
TABLE is behaving like DROP TABLE, which makes some sense since they are both 
implemented using the DDL machinery. Attaching a new rev of 
TruncateConcurrency.java. This compares the behavior of TRUNCATE TABLE to DROP 
TABLE and DELETE FROM.


---------


Here's how to run the new rev of the program:

   java TruncateConcurrency $resetOperation $transaction $sensitivity [ $commit 
]*

   where

   $resetOperation = truncate | drop | delete (whether the re-initialization 
operation should be TRUNCATE TABLE, DROP TABLE, or DELETE
   $transaction  =    same | different (whether the reader and truncator do 
their work in the same transaction)
   $sensitivity    =    sensitive | insensitive (whether the reader should use 
a sensitive or insensitive cursor)
   $commit       =    commitSelector | commitTruncator

   If commitSelector is specified, then the Selector commits after
   reading a row but before the truncation.

   If commitTruncator is specified, then the Truncator commits
   immediately after truncation.

   E.g.:

   java TruncateConcurrency different sensitive commitTruncator commitSelector

-----------

As previously, I see the following behavior for TRUNCATE TABLE:

1) In the following experiments, the TRUNCATE TABLE raises "Operation 'TRUNCATE 
TABLE' cannot be performed on object 'T' because there is an open ResultSet 
dependent on that object.":

java TruncateConcurrency truncate same sensitive
java TruncateConcurrency truncate same sensitive commitTruncator
java TruncateConcurrency truncate same sensitive commitSelector
java TruncateConcurrency truncate same sensitive commitTruncator commitSelector
java TruncateConcurrency truncate same insensitive
java TruncateConcurrency truncate same insensitive commitTruncator
java TruncateConcurrency truncate same insensitive commitSelector
java TruncateConcurrency truncate same insensitive commitTruncator 
commitSelector



2) When the Selector and Truncator are DIFFERENT transactions, then Derby 
misbehaves. There are two kinds of misbehavior here. The sub-cases are 
distinguished by whether the Truncator committed immediately after truncating 
the table. Whether the Selector committed after reading its first row is also 
irrelevant.

2a) In the following experiments, the Selector triggers an NPE when calling 
ResultSet.next():

java TruncateConcurrency truncate different sensitive commitTruncator
java TruncateConcurrency truncate different sensitive commitTruncator 
commitSelector
java TruncateConcurrency truncate different insensitive commitTruncator
java TruncateConcurrency truncate different insensitive commitTruncator 
commitSelector

This is the NPE:

java.lang.NullPointerException
        at 
org.apache.derby.impl.store.access.conglomerate.GenericController.setEstimatedRowCount(GenericController.java:224)
        at 
org.apache.derby.impl.sql.execute.TableScanResultSet.setRowCountIfPossible(TableScanResultSet.java:1325)
        at 
org.apache.derby.impl.sql.execute.BulkTableScanResultSet.getNextRowCore(BulkTableScanResultSet.java:311)
        at 
org.apache.derby.impl.sql.execute.ScrollInsensitiveResultSet.getNextRowFromSource(ScrollInsensitiveResultSet.java:801)
        at 
org.apache.derby.impl.sql.execute.ScrollInsensitiveResultSet.getNextRowCore(ScrollInsensitiveResultSet.java:518)
        at 
org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(BasicNoPutResultSetImpl.java:477)
        at 
org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:429)
        at 
org.apache.derby.impl.jdbc.EmbedResultSet.next(EmbedResultSet.java:373)
        at TruncateConcurrency.printRow(TruncateConcurrency.java:188)
        at TruncateConcurrency.justDoIt(TruncateConcurrency.java:97)
        at TruncateConcurrency.main(TruncateConcurrency.java:49)



2b) The following experiments hang the Selector when calling ResultSet.next():

java TruncateConcurrency truncate different sensitive
java TruncateConcurrency truncate different sensitive commitSelector
java TruncateConcurrency truncate different insensitive
java TruncateConcurrency truncate different insensitive commitSelector

-----------

I see the following behavior for DROP TABLE:

1') In the following experiments, the DROP TABLE raises "DROP TABLE' cannot be 
performed on object 'T' because there is an open ResultSet dependent on that 
object.":

java TruncateConcurrency drop same sensitive
java TruncateConcurrency drop same sensitive commitTruncator
java TruncateConcurrency drop same sensitive commitSelector
java TruncateConcurrency drop same sensitive commitTruncator commitSelector
java TruncateConcurrency drop same insensitive
java TruncateConcurrency drop same insensitive commitTruncator
java TruncateConcurrency drop same insensitive commitSelector
java TruncateConcurrency drop same insensitive commitTruncator commitSelector


2') When the Selector and Truncator are DIFFERENT transactions, then Derby 
misbehaves. There are two kinds of misbehavior here. The sub-cases are 
distinguished by whether the Truncator committed immediately after truncating 
the table. Whether the Selector committed after reading its first row is also 
irrelevant.

2a') In the following experiments, the Selector triggers an NPE when calling 
ResultSet.next():

java TruncateConcurrency drop different sensitive commitTruncator
java TruncateConcurrency drop different sensitive commitTruncator commitSelector
java TruncateConcurrency drop different insensitive commitTruncator
java TruncateConcurrency drop different insensitive commitTruncator 
commitSelector

This is the NPE:

java.lang.NullPointerException
        at 
org.apache.derby.impl.store.access.conglomerate.GenericController.setEstimatedRowCount(GenericController.java:224)
        at 
org.apache.derby.impl.sql.execute.TableScanResultSet.setRowCountIfPossible(TableScanResultSet.java:1325)
        at 
org.apache.derby.impl.sql.execute.BulkTableScanResultSet.getNextRowCore(BulkTableScanResultSet.java:311)
        at 
org.apache.derby.impl.sql.execute.ScrollInsensitiveResultSet.getNextRowFromSource(ScrollInsensitiveResultSet.java:801)
        at 
org.apache.derby.impl.sql.execute.ScrollInsensitiveResultSet.getNextRowCore(ScrollInsensitiveResultSet.java:518)
        at 
org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(BasicNoPutResultSetImpl.java:477)
        at 
org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:429)
        at 
org.apache.derby.impl.jdbc.EmbedResultSet.next(EmbedResultSet.java:373)
        at TruncateConcurrency.printRow(TruncateConcurrency.java:188)
        at TruncateConcurrency.justDoIt(TruncateConcurrency.java:97)
        at TruncateConcurrency.main(TruncateConcurrency.java:49)



2b') The following experiments hang the Selector when calling ResultSet.next():

java TruncateConcurrency drop different sensitive
java TruncateConcurrency drop different sensitive commitSelector
java TruncateConcurrency drop different insensitive
java TruncateConcurrency drop different insensitive commitSelector



-----------

I see the following behavior for DELETE FROM: All of the test cases terminate 
without errors. The Selector is able to read the second row regardless of the 
sensitivity of the cursor and regardless of whether the read takes place in the 
same transaction as DELETE FROM.

java TruncateConcurrency delete same sensitive
java TruncateConcurrency delete same sensitive commitTruncator
java TruncateConcurrency delete same sensitive commitSelector
java TruncateConcurrency delete same sensitive commitTruncator commitSelector
java TruncateConcurrency delete same insensitive
java TruncateConcurrency delete same insensitive commitTruncator
java TruncateConcurrency delete same insensitive commitSelector
java TruncateConcurrency delete same insensitive commitTruncator commitSelector
java TruncateConcurrency delete different sensitive
java TruncateConcurrency delete different sensitive commitTruncator
java TruncateConcurrency delete different sensitive commitSelector
java TruncateConcurrency delete different sensitive commitTruncator 
commitSelector
java TruncateConcurrency delete different insensitive
java TruncateConcurrency delete different insensitive commitTruncator
java TruncateConcurrency delete different insensitive commitSelector
java TruncateConcurrency delete different insensitive commitTruncator 
commitSelector


> Add Support for truncate table
> ------------------------------
>
>                 Key: DERBY-268
>                 URL: https://issues.apache.org/jira/browse/DERBY-268
>             Project: Derby
>          Issue Type: Improvement
>          Components: SQL
>            Reporter: Lance Andersen
>            Assignee: Eranda Sooriyabandara
>            Priority: Minor
>         Attachments: derby-268-01-ab-enableForInsaneBuilds.diff, 
> derby-268-02-aa-permsTest.diff, Derby-268.diff, tests.diff, 
> TruncateConcurrency.java, TruncateConcurrency.java
>
>
> Adding support for truncate table command will aid to portability

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