diff --git a/enginetest/queries/trigger_queries.go b/enginetest/queries/trigger_queries.go index 9b5fb52508..5c75031fe6 100644 --- a/enginetest/queries/trigger_queries.go +++ b/enginetest/queries/trigger_queries.go @@ -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{ diff --git a/sql/analyzer/triggers.go b/sql/analyzer/triggers.go index 47286e38b1..4f9f62b64b 100644 --- a/sql/analyzer/triggers.go +++ b/sql/analyzer/triggers.go @@ -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) } diff --git a/sql/rowexec/dml_iters.go b/sql/rowexec/dml_iters.go index e9366649bf..9999f2ae64 100644 --- a/sql/rowexec/dml_iters.go +++ b/sql/rowexec/dml_iters.go @@ -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