db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dag H. Wanvik (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (DERBY-6670) Rollback to savepoint allows violation of deferrable constraints
Date Wed, 30 Jul 2014 18:00:48 GMT

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

Dag H. Wanvik updated DERBY-6670:

    Attachment: derby-6670-2-c.diff

Updating patch [^derby-6670-2-c.diff], which improves on version "b", by adding tests for
the drop / rollback to savepoint cases for all constraint types.

Also removed the release of violation information at a successful
change to immediate constraint mode as part of a SET CONSTRAINTS
statement, since a rollback to savepoint might re-introduce the
violations (new variant of this issue hitherto undetected). New test cases added for this,
too (#testDerby6670_b).

Re-running regressions.

> Rollback to savepoint allows violation of deferrable constraints
> ----------------------------------------------------------------
>                 Key: DERBY-6670
>                 URL: https://issues.apache.org/jira/browse/DERBY-6670
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions:
>            Reporter: Knut Anders Hatlen
>         Attachments: derby-6670-01-aa-forbidSavepointsWithDeferredConstraints.diff, derby-6670-2-a.diff,
derby-6670-2-a.status, derby-6670-2-b.diff, derby-6670-2-b.status, derby-6670-2-c.diff
> The bug is illustrated by the following code snippet:
> {code}
>         Connection c = DriverManager.getConnection("jdbc:derby:memory:db;create=true");
>         c.setAutoCommit(false);
>         Statement s = c.createStatement();
>         s.execute("create table t1(x int primary key initially deferred)");
>         s.execute("insert into t1 values 1,1,1,1");
>         Savepoint sp = c.setSavepoint();
>         s.execute("drop table t1");
>         c.rollback(sp);
>         // Since there are four identical rows in T1, this call should have
>         // failed because the primary key was violated.
>         c.commit();
>         // Instead, it succeeds, and all four rows are committed, as can
>         // be seen here:
>         ResultSet rs = s.executeQuery("select * from t1");
>         while (rs.next()) {
>             System.out.println(rs.getInt(1));
>         }
>         // Insert yet another row, so that we have five identical rows ...
>         s.execute("insert into t1 values 1");
>         // ... and now commit complains ...
>         c.commit();
> {code}
> With auto-commit off, add duplicates into a deferred primary key. Then set a savepoint,
drop the table, and roll back to the savepoint.
> Apparently, when you drop the table, information about any constraint violations seen
on that table is lost, and that information is not restored when the drop table operation
is undone by the rollback to savepoint.
> So when you commit the transaction after having rolled back the drop operation, no deferred
checking of constraints happens, and the duplicates you have inserted are committed.

This message was sent by Atlassian JIRA

View raw message