diff --git a/enginetest/queries/insert_queries.go b/enginetest/queries/insert_queries.go index 107f8ebbbe..9fd17e23a5 100644 --- a/enginetest/queries/insert_queries.go +++ b/enginetest/queries/insert_queries.go @@ -831,6 +831,29 @@ var SpatialInsertQueries = []WriteQueryTest{ } var InsertScripts = []ScriptTest{ + { + // https://github.com/dolthub/dolt/issues/7322 + Name: "issue 7322: values expression is subquery", + SetUpScript: []string{ + "create table xy (x int auto_increment primary key, y varchar(50) not null)", + "create table uv (u int auto_increment primary key, v varchar(50) not null, x_id int, constraint u_x_fk foreign key (x_id) references xy (x))", + "insert into xy values (1,'admin'), (2, 'standard')", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "INSERT INTO uv(v, x_id) VALUES ('test', (SELECT x FROM xy WHERE y = 'admin'));", + Expected: []sql.Row{{types.OkResult{RowsAffected: 1, InsertID: 1}}}, + }, + { + Query: "INSERT INTO uv(v, x_id) VALUES ('test', (SELECT x FROM xy WHERE x > 0));", + ExpectedErr: sql.ErrExpectedSingleRow, + }, + { + Query: "select * from uv", + Expected: []sql.Row{{1, "test", 1}}, + }, + }, + }, { // https://github.com/dolthub/dolt/issues/6675 Name: "issue 6675: on duplicate rearranged getfield indexes from select source", diff --git a/sql/analyzer/inserts.go b/sql/analyzer/inserts.go index d5db279548..a94c8557cc 100644 --- a/sql/analyzer/inserts.go +++ b/sql/analyzer/inserts.go @@ -65,6 +65,12 @@ func resolveInsertRows(ctx *sql.Context, a *Analyzer, n sql.Node, scope *plan.Sc // TriggerExecutor has already been analyzed if _, ok := insert.Source.(*plan.TriggerExecutor); !ok { // Analyze the source of the insert independently + if _, ok := insert.Source.(*plan.Values); ok { + scope = scope.NewScope(plan.NewProject( + expression.SchemaToGetFields(insert.Source.Schema()[:len(insert.ColumnNames)]), + plan.NewSubqueryAlias("dummy", "", insert.Source), + )) + } source, _, err = a.analyzeWithSelector(ctx, insert.Source, scope, SelectAllBatches, newInsertSourceSelector(sel)) if err != nil { return nil, transform.SameTree, err