[ 
https://issues.apache.org/jira/browse/DERBY-5866?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13846308#comment-13846308
 ] 

Knut Anders Hatlen commented on DERBY-5866:
-------------------------------------------

If we only care about the case where two timestamps are identical because the 
system clock is too coarse-grained, the fix should be rather simple. We could 
just make CreateTriggerConstantAction cache the latest creation timestamp (for 
example in a field in DataDictionaryImpl) and add 1 nanosecond if a collision 
is detected.

But there are more cases to consider if we want to solve the general problem:

- What if a database is copied from one computer to another, and their clocks 
are not synchronized?

- What if a trigger is created during the last hour of daylight saving time? 
Since Derby doesn't store the time zone of a timestamp, a new trigger created 
within the next hour may appear to have been created before the first trigger.

- Similar case: What if the time zone on the computer is changed so that the 
old timestamps appear to be newer than they actually are?

I suppose we could solve this by making the first CREATE TRIGGER statement 
after boot fetch the highest CREATIONTIMESTAMP from SYSTRIGGERS for comparison 
with new timestamps, and if the new timestamp is lower than the highest one in 
SYSTRIGGERS, create a new timestamp that points far enough into the future. It 
won't be pretty though, and we'll have to pay attention to corner cases, 
especially around DST switchover.

I guess what we'd really want, is SYSTRIGGERS to have an identity column so 
that we could have a monotonically increasing value independent of the system 
clock, but that requires format changes in hard upgrade. Still, it sounds much 
cleaner to implement a sequence number using an identity column, than faking it 
with a data type where you don't even know if incrementing a value by one will 
result in a smaller or bigger value than the original...

>  
> testFiringConstraintOrder(org.apache.derbyTesting.functionTests.tests.lang.TriggerTest)junit.framework.AssertionFailedError:
>  matching triggers need to be fired in order creation:1,NO CASCADE 
> BEFORE,DELETE,ROW
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-5866
>                 URL: https://issues.apache.org/jira/browse/DERBY-5866
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.10.1.1, 10.10.1.3
>         Environment: Windows IBM 1.6 10.10.0.0 alpha - (1361856)
>            Reporter: Kathey Marsden
>            Assignee: Knut Anders Hatlen
>              Labels: derby_triage10_11
>             Fix For: 10.8.3.1, 10.9.2.2, 10.10.1.3, 10.11.0.0
>
>         Attachments: error-stacktrace.out, fail1.zip, fail2.zip
>
>
> I saw this failure in the IBM nightlies on 7/15. The subsequent night did not 
> fail, so appears intermittent
> http://cloudsoft.usca.ibm.com/intranet/nightlies/derbywinvm/JarResults.2012-07-15/ibm16_suites.All/suites.All.out
> 1) 
> testFiringConstraintOrder(org.apache.derbyTesting.functionTests.tests.lang.TriggerTest)junit.framework.AssertionFailedError:
>  matching triggers need to be fired in order creation:1,NO CASCADE 
> BEFORE,DELETE,ROW
>       at 
> org.apache.derbyTesting.functionTests.tests.lang.TriggerTest.assertFiringOrder(TriggerTest.java:560)
>       at 
> org.apache.derbyTesting.functionTests.tests.lang.TriggerTest.testFiringConstraintOrder(TriggerTest.java:500)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
>       at 
> org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:117)
>       at 
> org.apache.derbyTesting.junit.BaseJDBCTestCase.runBareOverridable(BaseJDBCTestCase.java:424)
>       at 
> org.apache.derbyTesting.junit.BaseJDBCTestCase.runBare(BaseJDBCTestCase.java:441)
>       at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
>       at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
>       at junit.extensions.TestSetup.run(TestSetup.java:25)
>       at 
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)



--
This message was sent by Atlassian JIRA
(v6.1.4#6159)

Reply via email to