Daniel John Debrunner wrote:

Jack Klebanoff wrote:

| I would like to submit a fix for a bug in triggers.
|
| The bug is that a trigger of the form:
|  create trigger ... values myFunction();
| has no effect. MyFunction is not called even if the trigger is fired.
| Side effects of myFunction do not happen. Derby does not allow a "CALL"
| statement inside a trigger action so a values statement is the only way
| to call a function/procedure in a trigger action.
|
| The cause of the bug is that since the values are not actually used by
| the trigger, the trigger code does not fetch the row(s) returned by the
| trigger action. The fix is simple: change class
| org.apache.derby.impl.sql.execute.GenericTriggerExecutor to fetch (and
| discard) the rows returned by a trigger action.
|
| Please review the change. The diff file is attached.


I think you need to close the ResultSet (rs). Other locations in the code where a ResultSet is processed terminate with an rs.close(). Eg. see DeleteCascadeResultSet, ConstraintConstantAction.

Dan.

I changed the code to close the ResultSet. The diff file is attached.

Jack
Index: java/engine/org/apache/derby/impl/sql/execute/GenericTriggerExecutor.java
===================================================================
--- java/engine/org/apache/derby/impl/sql/execute/GenericTriggerExecutor.java   
(revision 37092)
+++ java/engine/org/apache/derby/impl/sql/execute/GenericTriggerExecutor.java   
(working copy)
@@ -157,7 +157,18 @@
                        */
                        try
                        {
-                               ps.execute(spsActivation, false, false, false);
+                               ResultSet rs = ps.execute(spsActivation, false, 
false, false);
+                if( rs.returnsRows())
+                {
+                    // Fetch all the data to ensure that functions in the 
select list or values statement will
+                    // be evaluated and side effects will happen. Why else 
would the trigger action return
+                    // rows, but for side effects?
+                    // The result set was opened in ps.execute()
+                    while( rs.getNextRow() != null)
+                    {
+                    }
+                }
+                rs.close();
                        } 
                        catch (StandardException e)
                        {

Reply via email to