You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by de...@db.apache.org on 2004/09/28 02:38:32 UTC
[jira] Created: (DERBY-6) Trigger of the form: create trigger ... values myFunction(); has no effect.
Message:
A new issue has been created in JIRA.
---------------------------------------------------------------------
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: Unassigned
Priority: Minor
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: Mon, 27 Sep 2004 5:37 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
[jira] Closed: (DERBY-6) Trigger of the form: create trigger ... values myFunction(); has no effect.
Posted by "Jack Klebanoff (JIRA)" <de...@db.apache.org>.
[ 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
[jira] Resolved: (DERBY-6) Trigger of the form: create trigger ... values myFunction(); has no effect.
Posted by de...@db.apache.org.
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