Issue Details (XML | Word | Printable)

Key: DERBY-3945
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Rick Hillegas
Reporter: Rick Hillegas
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Derby

Generation clauses which mention user-coded functions may produce different resuls depending on who performs the triggering INSERT/UPDATE

Created: 11/Nov/08 08:44 PM   Updated: 04/May/09 06:21 PM
Component/s: SQL
Affects Version/s: 10.5.1.1
Fix Version/s: 10.5.1.1

Time Tracking:
Not Specified

File Attachments:
  Size
File Licensed for inclusion in ASF works derby-3945-01-aa-functionSchema.diff 2008-11-19 07:38 PM Rick Hillegas 12 kB
File Licensed for inclusion in ASF works derby-3945-02-aa-javadoc.diff 2008-12-01 07:01 PM Rick Hillegas 0.7 kB
File Licensed for inclusion in ASF works zz.sql 2008-11-19 04:49 PM Rick Hillegas 1.0 kB
Issue Links:
Incorporates
 
Reference
 

Issue & fix info: Patch Available
Resolution Date: 20/Nov/08 05:05 PM


 Description  « Hide
This is similar to DERBY-3944. The compiler uses the current schema in order to resolve unqualifed function names when preparing INSERT/UPDATE statement. This means that a generation clause may evaluate differently depending on who invokes the triggering INSERT/UPDATE statement. This violates the requirement that generation clause should be deterministic (see part 2 of the ANSI/ISO standard, section 4.16.

Hopefully, the same patch will fix both DERBY-3944 and this issue.

 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Rick Hillegas added a comment - 19/Nov/08 04:49 PM
Attaching zz.sql, a script which demonstrates the problem.

Rick Hillegas added a comment - 19/Nov/08 07:38 PM
Attaching derby-3945-01-aa-functionSchema.diff. This patch forces Derby to use the current schema at DDL time (rather than DML time) to resolve unqualified function references in generation clauses. Running tests now.

There are two pieces to this fix:

1) The persisted default descriptor now stores the current schema which was in effect when the generation clause was defined.

2) At INSERT/UPDATE time, that saved schema temporarily becomes the current schema when we bind the generation clause.

A similar approach could be used for the related bugs having to do with unqualified function names in CHECK constraints (DERBY-3944) and VIEWS (DERBY-3953). Note that this approach does not address the related issues with dblook (DERBY-3954).


Touches the following files:

M java/engine/org/apache/derby/catalog/DefaultInfo.java
M java/engine/org/apache/derby/catalog/types/DefaultInfoImpl.java

Adds the DDL-time current schema to the default descriptor.


M java/engine/org/apache/derby/impl/sql/compile/TableElementList.java

Stuffs the current schema into the default descriptor at CREATE/ALTER time.


M java/engine/org/apache/derby/impl/sql/compile/DMLModStatementNode.java

Temporarily sets the current schema to the schema stored in the default when we bind generation clauses.


M java/testing/org/apache/derbyTesting/functionTests/tests/lang/GeneratedColumnsPermsTest.java

Adds tests.

Rick Hillegas added a comment - 19/Nov/08 11:15 PM
Regression tests ran cleanly for me except for two errors which look like they were introduced by someone else's checkin today. Committed at subversion revision revision 719123. The two errors were:

There were 2 errors:
1) testDefaultValues(org.apache.derbyTesting.unitTests.junit.CharacterStreamDescriptorTest)java.lang.NoClassDefFoundError: org/apache/derby/iapi/jdbc/CharacterStreamDescriptor$Builder
at org.apache.derbyTesting.unitTests.junit.CharacterStreamDescriptorTest.testDefaultValues(CharacterStreamDescriptorTest.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:105)
2) testSetValues(org.apache.derbyTesting.unitTests.junit.CharacterStreamDescriptorTest)java.lang.NoClassDefFoundError: org/apache/derby/iapi/jdbc/CharacterStreamDescriptor$Builder
at org.apache.derbyTesting.unitTests.junit.CharacterStreamDescriptorTest.testSetValues(CharacterStreamDescriptorTest.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:105)

FAILURES!!!
Tests run: 8900, Failures: 0, Errors: 2

Dag H. Wanvik added a comment - 22/Nov/08 12:27 AM
Similar problem and possibly solution as DERBY-3270, linking.

Dag H. Wanvik added a comment - 22/Nov/08 12:32 AM
Patch looks good!
Note: The constructor of DefaultInfoImpl now lacks some @params in its javadoc.

Rick Hillegas added a comment - 01/Dec/08 07:01 PM
Thanks for the review, Dag. Attaching derby-3945-02-aa-javadoc.diff, which address the javadoc issue. Committed at subversion revision 722177.