Skip to content

Commit 893a99e

Browse files
authored
insert trigger bugs (#2913)
* insert trigger bugs * more bugs * delete debug line * [ga-format-pr] Run ./format_repo.sh to fix formatting * unused import --------- Co-authored-by: max-hoffman <max-hoffman@users.noreply.github.com>
1 parent 846cb71 commit 893a99e

File tree

3 files changed

+90
-1
lines changed

3 files changed

+90
-1
lines changed

Diff for: enginetest/queries/trigger_queries.go

+66
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,72 @@ var TriggerTests = []ScriptTest{
310310
},
311311
},
312312
},
313+
{
314+
Name: "issue #9039: trigger insert subquery error",
315+
SetUpScript: []string{
316+
"create table a (x int primary key, y int default 1, z int)",
317+
"create table b (x int primary key)",
318+
"create table c (x int primary key)",
319+
"create table d (x int primary key)",
320+
"insert into b values (1), (2)",
321+
"insert into d values (1), (2)",
322+
`
323+
create trigger insert_into_a
324+
after insert on a
325+
for each row replace into c
326+
select * from d join (select * from b where new.x = b.x) as e using (x)
327+
where d.x = new.x`,
328+
"insert into a (x,z) values (2,2)",
329+
},
330+
Query: "select x from c order by 1",
331+
Expected: []sql.Row{
332+
{2},
333+
},
334+
},
335+
{
336+
Name: "issue #9039: trigger insert join index error",
337+
SetUpScript: []string{
338+
"create table a (x int primary key, y int default 1, z int)",
339+
"create table b (x int primary key)",
340+
"create table c (x int primary key)",
341+
"create table d (x int primary key)",
342+
"insert into b values (1), (2)",
343+
"insert into d values (1), (2)",
344+
`
345+
create trigger insert_into_a
346+
after insert on a
347+
for each row replace into c
348+
select * from d join b using (x)
349+
where d.x = new.x`,
350+
"insert into a (x,z) values (2,2)",
351+
},
352+
Query: "select x from c order by 1",
353+
Expected: []sql.Row{
354+
{2},
355+
},
356+
},
357+
{
358+
Name: "issue #9039: trigger insert projection index error",
359+
SetUpScript: []string{
360+
"create table a (x int primary key, y int default 1, z int)",
361+
"create table b (x int primary key)",
362+
"create table c (x int primary key, y tinyint)",
363+
"create table d (x int primary key)",
364+
"insert into b values (1), (2)",
365+
"insert into d values (1), (2)",
366+
`
367+
create trigger insert_into_a
368+
after insert on a
369+
for each row replace into c
370+
select d.x+2, 0 from d join b using (x)
371+
where d.x = new.x`,
372+
"insert into a (x,z) values (2,2)",
373+
},
374+
Query: "select x, y from c order by 1",
375+
Expected: []sql.Row{
376+
{4, 0},
377+
},
378+
},
313379
{
314380
Name: "trigger before insert, alter inserted value",
315381
SetUpScript: []string{

Diff for: sql/analyzer/fix_exec_indexes.go

+5
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,11 @@ func (s *idxScope) visitChildren(n sql.Node) error {
312312
// join subquery aliases continue to enjoy full visibility.
313313
sqScope.parentScopes = sqScope.parentScopes[:0]
314314
sqScope.lateralScopes = sqScope.lateralScopes[:0]
315+
for _, p := range s.parentScopes {
316+
if p.triggerScope {
317+
sqScope.parentScopes = append(sqScope.parentScopes, p)
318+
}
319+
}
315320
}
316321
newC, cScope, err := assignIndexesHelper(n.Child, sqScope)
317322
if err != nil {

Diff for: sql/rowexec/dml_iters.go

+19-1
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ func prependRowInPlanForTriggerExecution(row sql.Row) func(c transform.Context)
193193
case *plan.Project:
194194
// Only prepend rows for projects that aren't the input to inserts and other triggers
195195
switch c.Parent.(type) {
196-
case *plan.InsertInto, *plan.Into, *plan.TriggerExecutor, *plan.DeclareCursor:
196+
case *plan.InsertInto, *plan.Into, *plan.TriggerExecutor, *plan.DeclareCursor, *plan.Project:
197197
return n, transform.SameTree, nil
198198
default:
199199
return plan.NewPrependNode(n, row), transform.NewTree, nil
@@ -209,6 +209,24 @@ func prependRowInPlanForTriggerExecution(row sql.Row) func(c transform.Context)
209209
return n, transform.SameTree, nil
210210
}
211211
return n.WithProcedure(newNode.(*plan.Procedure)), transform.NewTree, nil
212+
case *plan.InsertInto:
213+
newNode, same, err := transform.NodeWithCtx(n.Source, prependRowForTriggerExecutionSelector, prependRowInPlanForTriggerExecution(row))
214+
if err != nil {
215+
return nil, transform.SameTree, err
216+
}
217+
if same {
218+
return n, transform.SameTree, nil
219+
}
220+
return n.WithSource(newNode), transform.NewTree, nil
221+
case *plan.SubqueryAlias:
222+
newNode, same, err := transform.NodeWithCtx(n.Child, prependRowForTriggerExecutionSelector, prependRowInPlanForTriggerExecution(row))
223+
if err != nil {
224+
return nil, transform.SameTree, err
225+
}
226+
if same {
227+
return n, transform.SameTree, nil
228+
}
229+
return n.WithChild(newNode), transform.NewTree, nil
212230
default:
213231
return n, transform.SameTree, nil
214232
}

0 commit comments

Comments
 (0)