[ http://issues.apache.org/jira/browse/DERBY-338?page=all ]
Rick Hillegas updated DERBY-338: -------------------------------- Urgency: Normal > 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 > Issue Type: Improvement > Components: SQL > Affects Versions: 10.0.2.1, 10.0.2.0, 10.1.1.0, 10.0.2.2 > Reporter: Andrew McIntyre > Assigned To: Jack Klebanoff > Fix For: 10.2.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