db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From derby-...@db.apache.org
Subject [jira] Resolved: (DERBY-6) Trigger of the form: create trigger ... values myFunction(); has no effect.
Date Thu, 07 Oct 2004 03:42:51 GMT
Message:

   The following issue has been resolved as FIXED.

   Resolver: Samuel Andrew McIntyre
       Date: Wed, 6 Oct 2004 8:41 PM

svn commit 53829
---------------------------------------------------------------------
View the issue:
  http://issues.apache.org/jira/browse/DERBY-6

Here is an overview of the issue:
---------------------------------------------------------------------
        Key: DERBY-6
    Summary: Trigger of the form: create trigger ... values myFunction(); has no effect.
       Type: Bug

     Status: Resolved
   Priority: Minor
 Resolution: FIXED

    Project: Derby
 Components: 
             SQL
   Fix Fors:
             10.0.2.0
   Versions:
             10.0.2.0

   Assignee: 
   Reporter: Tulika Agrawal

    Created: Mon, 27 Sep 2004 5:37 PM
    Updated: Wed, 6 Oct 2004 8:41 PM

Description:
Reporting for Jack Klebanoff, filed on derby-dev list.

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


---------------------------------------------------------------------
JIRA INFORMATION:
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

If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


Mime
View raw message