From a793ebdd2022efef6607c4835d0c2c513ed1102a Mon Sep 17 00:00:00 2001 From: Max Hoffman Date: Tue, 16 Jan 2024 12:43:02 -0800 Subject: [PATCH 1/2] Insert VALUES statements with subqueries index correctly --- enginetest/queries/insert_queries.go | 19 +++++++++++++++++++ sql/analyzer/inserts.go | 6 ++++++ 2 files changed, 25 insertions(+) diff --git a/enginetest/queries/insert_queries.go b/enginetest/queries/insert_queries.go index 107f8ebbbe..3681d09367 100644 --- a/enginetest/queries/insert_queries.go +++ b/enginetest/queries/insert_queries.go @@ -831,6 +831,25 @@ 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: "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 From f5730bb6adb7f39ff74da78c767b4cd16c37e26d Mon Sep 17 00:00:00 2001 From: Max Hoffman Date: Tue, 16 Jan 2024 13:20:27 -0800 Subject: [PATCH 2/2] error test --- enginetest/queries/insert_queries.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/enginetest/queries/insert_queries.go b/enginetest/queries/insert_queries.go index 3681d09367..9fd17e23a5 100644 --- a/enginetest/queries/insert_queries.go +++ b/enginetest/queries/insert_queries.go @@ -844,6 +844,10 @@ var InsertScripts = []ScriptTest{ 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}},