db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bryan Pendleton (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DERBY-6726) NPE from trigger
Date Sat, 01 Oct 2016 13:43:20 GMT

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

Bryan Pendleton commented on DERBY-6726:
----------------------------------------

It seems like another potential way to fix this problem is tied to Bernd's observation
that TriggerDescriptor's 'td' member is a lazy-initialize field, which is set when it
is first referenced by the getTableDescriptor() method.

But in the TriggerDescriptor code itself, we don't always go through getTableDescriptor();
sometimes we directly reference 'td'. Such code will fail if td is still NULL at that point,
which is precisely the description of the test case scenario.

So perhaps, instead of the initialization loop in TriggerEventActivator, we could
go through all of TriggerDescriptor, and every time we reference 'td', we instead
reference it by calling getTableDescriptor(), thus allowing 'td' to auto-initialize properly.

I'll give that a try and see how it behaves.

bryan


> 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, fixesRepro.diff
>
>
> 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/%3Cltq5hl$kps$1@ger.gmane.org%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)

Mime
View raw message