db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jack Klebanoff (JIRA)" <derby-...@db.apache.org>
Subject [jira] Closed: (DERBY-6) Trigger of the form: create trigger ... values myFunction(); has no effect.
Date Mon, 06 Jun 2005 15:32:45 GMT
     [ http://issues.apache.org/jira/browse/DERBY-6?page=all ]
     
Jack Klebanoff closed DERBY-6:
------------------------------


> Trigger of the form: create trigger ... values myFunction(); has no effect.
> ---------------------------------------------------------------------------
>
>          Key: DERBY-6
>          URL: http://issues.apache.org/jira/browse/DERBY-6
>      Project: Derby
>         Type: Bug
>   Components: SQL
>     Versions: 10.0.2.0
>     Reporter: Tulika Agrawal
>     Priority: Minor
>      Fix For: 10.0.2.0

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

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


Mime
View raw message