[ 
http://issues.apache.org/jira/browse/DERBY-1204?page=comments#action_12449433 ] 
            
Yip Ng commented on DERBY-1204:
-------------------------------

The following statement fails with the exception:

create trigger tgood after insert on x
referencing new as n
for each row mode db2sql insert into x values (n.x), (999), (333); 

because the bindReferencesClause() method in CreateTriggerNode did not filter 
those column references that are not relevent to the conversion processing for 
OLD/NEW transition variables.  The above trigger action will have the following 
parse tree:  (roughly)

                      InsertNode
                                |
                       UnionNode
                      /                     \
            UnionNode      RowRSNode
            /                   \                          |
RowRSNode  RowRSNode     NumericConstantNode
      |                          |                                              
     |
 ColRef    NumericConstantNode                      333
      |                         |
     n.i                    999

Note that the CollectNodesVisitor collects *ALL* the ColumnReferences in the 
trigger action.  In the above case, it returned 3 column references nodes.  One 
in the top level Union node, one in top level Union Node's
left child which it is also an UnionNode and the last one is found in the 
RowResultSetNode. 

The UnionNodes will have a copy of the CRs from its left child and those CRs 
will not have its beginOffset set which indicates they are not relevant for the 
conversion processing here, so the corrective action here is to skip these 
entries.



> CREATE TRIGGER with an INSERT action statement with multiple rows and a 
> referenced column throws a StringIndexOutOfBoundsException
> ----------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-1204
>                 URL: http://issues.apache.org/jira/browse/DERBY-1204
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.2.1.6, 10.1.2.1
>            Reporter: Daniel John Debrunner
>         Assigned To: Yip Ng
>
> These triggers succeed
> create trigger tgood after insert on x
> for each statement mode db2sql insert into x values (666), (999), (333);
> create trigger tgood after insert on x
> referencing new as n
> for each row mode db2sql insert into x values (n.x);
> create trigger tgood after insert on x
> referencing new as n
> for each row mode db2sql insert into x values (333), (999), (333)
> This one fails
> create trigger tgood after insert on x
> referencing new as n
> for each row mode db2sql insert into x values (n.x), (999), (333);
> Test cases will be added to triggerGeneral under this bug number.
> java.lang.StringIndexOutOfBoundsException: String index out of range: -3
>       at java.lang.String.substring(String.java:1444)
>       at 
> org.apache.derby.impl.sql.compile.CreateTriggerNode.bindReferencesClause(CreateTriggerNode.java:421)
>       at 
> org.apache.derby.impl.sql.compile.CreateTriggerNode.bind(CreateTriggerNode.java:258)
>       at 
> org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:344)
>       at 
> org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:118)
>       at 
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:713)
>       at 
> org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:560)
>       at 
> org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:507)
>       at org.apache.derby.impl.tools.ij.ij.executeImmediate(ij.java:313)
>       at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:433)
>       at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:310)
>       at org.apache.derby.impl.tools.ij.Main.go(Main.java:203)
>       at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:169)
>       at org.apache.derby.impl.tools.ij.Main14.main(Main14.java:55)
>       at org.apache.derby.tools.ij.main(ij.java:60)

-- 
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

        

Reply via email to