[ http://issues.apache.org/jira/browse/DERBY-338?page=all ]
Jack Klebanoff updated DERBY-338:
---------------------------------
Attachment: refConstraint2005-06-08.diff
[PATCH] This patch fixes the problems that Dan observed in my previous patch:
it restores messages in messages_en.properties that are used in soft upgraded
databases. It also changes the SQLState thrown when a triggered action conflict
is detected during DML execution. The SQLState specified by the SQL2003
standard (27000) is used.
The patch has passed the derbyall suite.
svn status is
M java/engine/org/apache/derby/impl/sql/execute/DeleteCascadeResultSet.java
M java/engine/org/apache/derby/impl/sql/execute/DMLWriteResultSet.java
M java/engine/org/apache/derby/impl/sql/execute/UpdateResultSet.java
M java/engine/org/apache/derby/iapi/sql/dictionary/DDUtils.java
M java/engine/org/apache/derby/iapi/reference/SQLState.java
M java/engine/org/apache/derby/loc/messages_en.properties
M
java/testing/org/apache/derbyTesting/functionTests/tests/lang/refActions2.sql
M java/testing/org/apache/derbyTesting/functionTests/master/refActions2.out
M java/testing/org/apache/derbyTesting/upgradeTests/phaseTester.java
> Move checks for referential constraints from DDL execution time to DML
> execution time
> -------------------------------------------------------------------------------------
>
> Key: DERBY-338
> URL: http://issues.apache.org/jira/browse/DERBY-338
> Project: Derby
> Type: Improvement
> Components: SQL
> Versions: 10.0.2.1, 10.0.2.0, 10.1.0.0, 10.0.2.2
> Reporter: Andrew McIntyre
> Assignee: Jack Klebanoff
> Fix For: 10.1.0.0
> Attachments: refConstraint2005-06-07.diff, refConstraint2005-06-08.diff
>
> Description for this bug from Jack Klebanoff:
> The attached patch fixes a problem that Derby had with conflicting
> referential constraints. Consider the following DDL:
> create table t2( ref1 int references t1(id) on delete cascade,
> ref2 int references t1(id) on delete set null)
> If both the ref1 and ref2 columns of the same t2 row refer to the same t1 row
> and that t1 row is deleted then the two referential constraint actions
> conflict. One says that the t2 row should be deleted, the other says that the
> ref2 column should be set to null. According to the SQL2003 spec an exception
> should be thrown when the t1 row is deleted. That is what Derby does after
> the attached patch is applied.
> Without the patch Derby disallows the DDL statement that creates a constraint
> whose action may conflict with other constraint actions. This is a mistake.
> Derby cannot tell at DDL time whether there will actually be a conflict.
> Derby rejects the DDL statement in the example above. However if none of the
> t2 rows refer to the same t1 row then there is no conflict. Derby rejects
> some DDL that will work perfectly well. As, I said above this is contrary to
> the SQL standard which requires that the checks be made at DML execution time
> not at DDL execution time.
> The patch changes iapi/sql/dictionary/DDUtils.java to remove the DDL time
> checks and changes impl/sql/execute/DeleteCascadeResultSet.java,
> DMLWriteResultSet.java, and UpdateResultSet.java to add the DML execution
> time checks. The execution time checks are implemented by building a hash
> table of all the rows that are changed as the result of referential
> constraint actions. An exception is thrown if any row is entered into the
> hash table twice with different actions. The hash table is implemented with
> BackingStoreHashtable in case it is too large to fit into memory.
--
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