Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions enginetest/queries/trigger_queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -3389,6 +3389,38 @@ for each row
},
},
},

{
Name: "trigger with cursor",
SetUpScript: []string{
"create table t1 (i int, j int);",
"insert into t1 values (1, 2);",
"create table t2 (i int, j int);",
`
create trigger trig before insert on t2
for each row
begin
declare v1 int;
declare cur cursor for select i from t1;
open cur;
fetch cur into v1;
set new.j = v1;
end;
`,
},
Assertions: []ScriptTestAssertion{
{
Query: "insert into t2 values (1, 0);",
Expected: []sql.Row{
{types.NewOkResult(1)},
},
},
{
Query: "select * from t2;",
Expected: []sql.Row{{1, 1}},
},
},
},
}

var TriggerCreateInSubroutineTests = []ScriptTest{
Expand Down
7 changes: 6 additions & 1 deletion sql/analyzer/triggers.go
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,12 @@ func applyTrigger(ctx *sql.Context, a *Analyzer, originalNode, n sql.Node, scope
}
return n.WithSource(newSource), transform.NewTree, nil
case expression.ProcedureReferencable:
return n.WithParamReference(pRef), transform.NewTree, nil
newParamRef := n.WithParamReference(pRef)
newNode, _, err := transform.NodeWithOpaque(newParamRef, assignProcRef)
if err != nil {
return nil, transform.SameTree, err
}
return newNode, transform.NewTree, nil
default:
return assignProcRef(node)
}
Expand Down
2 changes: 1 addition & 1 deletion sql/rowexec/dml_iters.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ func prependRowInPlanForTriggerExecution(row sql.Row) func(c transform.Context)
case *plan.Project:
// Only prepend rows for projects that aren't the input to inserts and other triggers
switch c.Parent.(type) {
case *plan.InsertInto, *plan.Into, *plan.TriggerExecutor:
case *plan.InsertInto, *plan.Into, *plan.TriggerExecutor, *plan.DeclareCursor:
return n, transform.SameTree, nil
default:
return plan.NewPrependNode(n, row), transform.NewTree, nil
Expand Down
Loading