[
https://issues.apache.org/jira/browse/DERBY-6726?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15536466#comment-15536466
]
Bernd Ruehlicke commented on DERBY-6726:
----------------------------------------
Looks like the rabbit hole goes deeper ... looks like the core of the problem
is hidden way deeper but hard to pin down not knowing the code. I debugged the
test and found that the TriggerEventActivator seem to do its job correctly. It
finds both triggers and executes both after each other. Going up the stack
trace it become more blurry. I will try to debug, below what I have found so
far ... maybe someone has a light bulb going on after seeing this ... for me it
is still deep darkness what is going on.
TriggerDescriptor.getSPS fails because the TableDescriptor is null
it worked in 7.1.1 as no TableDescriptor was needed
TriggerEventActivator correctly identified both triggers as eventNumber = 5
with i=0 the first trigger and i=2 the second.
.notifyEvent(..) line 272 though calls the fireTrigger with
"colsReadFromTable" which is null and which should contain the columns required
from the Trigger Table
UpdateResultSet.fireAfterTriggers() calls the TriggerEventActivator passing
down "constants.getBaseRowReadMap()" which is null
"constants" is a UpdateConstantAction which is a WriteCursorConstantAction
which is a ConstantAction (Interface) and is passed into the class as an
ConstantAction from a GenericResultSetFactory.getUpdateResultSet it gets
created new UpdateResultSet(source, generationClauses, checkGM, activation);
UpdateResultSet constructor will call its this with the activation as well as
activation.getConstantAction() as "passedInConstantAction" which will be the
"constants" which returns null when called on getBaseRowReadMap().
> NPE from trigger
> ----------------
>
> Key: DERBY-6726
> URL: https://issues.apache.org/jira/browse/DERBY-6726
> Project: Derby
> Issue Type: Bug
> Components: SQL
> Affects Versions: 10.10.1.1
> Reporter: Tim Dudgeon
> Attachments: TriggerTest.diff, derbytrig.zip
>
>
> Saw this strange exception when doing an insert to a table with a trigger
> {code}
> Tue Sep 02 13:39:09 BST 2014 Thread[SQLExecution,1,system] (XID = 62693),
> (SESSIONID = 1), (DATABASE =
> C:/Users/timbo/Documents/IJCProjects/mini-regs/Vanilla
> Oracle/.config/derby-minireg-01-sep/db), (DRDAID = null), Failed Statement
> is: UPDATE samples SET sample_code = 'S123456' WHERE sample_id = CAST
> (org.apache.derby.iapi.db.Factory::getTriggerExecutionContext().getNewRow().getObject(1)
> AS INTEGER)
> java.lang.NullPointerException
> at
> org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getTriggerActionString(Unknown
> Source)
> at
> org.apache.derby.iapi.sql.dictionary.TriggerDescriptor.getActionSPS(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.GenericTriggerExecutor.getAction(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.RowTriggerExecutor.fireTrigger(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.TriggerEventActivator.notifyEvent(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.UpdateResultSet.fireAfterTriggers(Unknown
> Source)
> at org.apache.derby.impl.sql.execute.UpdateResultSet.open(Unknown Source)
> at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown
> Source)
> at
> org.apache.derby.impl.sql.GenericPreparedStatement.executeSubStatement(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.GenericTriggerExecutor.executeSPS(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.RowTriggerExecutor.fireTrigger(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.TriggerEventActivator.notifyEvent(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.InsertResultSet.normalInsertCore(Unknown
> Source)
> at org.apache.derby.impl.sql.execute.InsertResultSet.open(Unknown Source)
> at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown
> Source)
> at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
> at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
> {code}
> The trigger definition is this:
> {code}
> CREATE TRIGGER samples_code_trg
> AFTER INSERT ON samples
> REFERENCING NEW AS newrow FOR EACH ROW MODE DB2SQL
> UPDATE samples SET sample_code = 'S123456'
> WHERE samples.sample_id = newrow.sample_id;
> {code}
> As mentioned here:
> http://mail-archives.apache.org/mod_mbox/db-derby-user/201408.mbox/%[email protected]%3E
> it could be that its caused by another AFTER UPDATE trigger that's on the
> table.
> Unfortunately I rebuilt all the tables and triggers and not the problem
> doesn't happen, so I can't provide a test case.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)