Skip to content

Commit 2e51a70

Browse files
committed
Merge branch 'main' into max/stats-iter-change
2 parents b42963c + f61a772 commit 2e51a70

File tree

15 files changed

+24239
-22661
lines changed

15 files changed

+24239
-22661
lines changed

enginetest/queries/foreign_key_queries.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,22 @@ var ForeignKeyTests = []ScriptTest{
380380
},
381381
},
382382
},
383+
{
384+
Name: "DROP TABLE, with multiple tables, sorts by foreign key dependencies",
385+
SetUpScript: []string{
386+
"create table grandparent1 (pk int primary key);",
387+
"create table parent1 (pk int primary key, c1 int references grandparent(pk));",
388+
"create table parent2 (pk int primary key);",
389+
"create table child1 (pk int primary key, c1 int, c2 int, foreign key (c1) references parent1(pk), foreign key (c2) references parent2(pk));",
390+
"create table selfref (pk int primary key, c1 int, foreign key (c1) references selfref(pk));",
391+
},
392+
Assertions: []ScriptTestAssertion{
393+
{
394+
Query: "DROP TABLE grandparent1, parent1, parent2, selfref, child1;",
395+
Expected: []sql.Row{{types.NewOkResult(0)}},
396+
},
397+
},
398+
},
383399
{
384400
Name: "Indexes used by foreign keys can't be dropped",
385401
SetUpScript: []string{

enginetest/queries/imdb_plans.go

Lines changed: 23788 additions & 22572 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

enginetest/queries/integration_plans.go

Lines changed: 182 additions & 44 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

enginetest/queries/queries.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10171,6 +10171,18 @@ from typestable`,
1017110171
{2},
1017210172
},
1017310173
},
10174+
{
10175+
Query: "select ''",
10176+
Expected: []sql.Row{
10177+
{""},
10178+
},
10179+
},
10180+
{
10181+
Query: "select '' from dual",
10182+
Expected: []sql.Row{
10183+
{""},
10184+
},
10185+
},
1017410186

1017510187
{
1017610188
Query: "select @@sql_mode = 1",

enginetest/queries/trigger_queries.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,37 @@ END;`,
931931
},
932932
},
933933
},
934+
{
935+
Name: "trigger before update with table alias",
936+
SetUpScript: []string{
937+
"CREATE TABLE test (i INT, j INT);",
938+
"INSERT INTO test VALUES (1, 1);",
939+
`
940+
CREATE TRIGGER before_test_update BEFORE UPDATE ON test
941+
FOR EACH ROW
942+
BEGIN
943+
SET new.j = new.i * 100;
944+
END;`,
945+
},
946+
Assertions: []ScriptTestAssertion{
947+
{
948+
Query: "update test t set test.i = 2 where test.i = 1;",
949+
ExpectedErr: sql.ErrTableNotFound,
950+
},
951+
{
952+
Query: "update test t set t.i = 2 where t.i = 1;",
953+
Expected: []sql.Row{
954+
{types.OkResult{RowsAffected: 1, Info: plan.UpdateInfo{Matched: 1, Updated: 1}}},
955+
},
956+
},
957+
{
958+
Query: "select * from test;",
959+
Expected: []sql.Row{
960+
{2, 200},
961+
},
962+
},
963+
},
964+
},
934965

935966
// DELETE triggers
936967
{

sql/analyzer/apply_foreign_keys.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,12 @@ func getForeignKeyReferences(ctx *sql.Context, a *Analyzer, tbl sql.ForeignKeyTa
273273
if err != nil {
274274
return nil, err
275275
}
276+
277+
typeConversions, err := plan.GetForeignKeyTypeConversions(parentTbl.Schema(), tblSch, fk, plan.ChildToParent)
278+
if err != nil {
279+
return nil, err
280+
}
281+
276282
var selfCols map[string]int
277283
if fk.IsSelfReferential() {
278284
selfCols = make(map[string]int)
@@ -284,11 +290,12 @@ func getForeignKeyReferences(ctx *sql.Context, a *Analyzer, tbl sql.ForeignKeyTa
284290
ForeignKey: fk,
285291
SelfCols: selfCols,
286292
RowMapper: plan.ForeignKeyRowMapper{
287-
Index: parentIndex,
288-
Updater: parentUpdater,
289-
SourceSch: tblSch,
290-
IndexPositions: indexPositions,
291-
AppendTypes: appendTypes,
293+
Index: parentIndex,
294+
Updater: parentUpdater,
295+
SourceSch: tblSch,
296+
TargetTypeConversions: typeConversions,
297+
IndexPositions: indexPositions,
298+
AppendTypes: appendTypes,
292299
},
293300
}
294301
}
@@ -379,6 +386,11 @@ func getForeignKeyRefActions(ctx *sql.Context, a *Analyzer, tbl sql.ForeignKeyTa
379386
return nil, err
380387
}
381388

389+
typeConversions, err := plan.GetForeignKeyTypeConversions(tblSch, childTblSch, fk, plan.ParentToChild)
390+
if err != nil {
391+
return nil, err
392+
}
393+
382394
childEditor, err := getForeignKeyEditor(ctx, a, childTbl, cache, fkChain.AddForeignKey(fk.Name), checkRows)
383395
if err != nil {
384396
return nil, err
@@ -402,11 +414,12 @@ func getForeignKeyRefActions(ctx *sql.Context, a *Analyzer, tbl sql.ForeignKeyTa
402414
}
403415
fkEditor.RefActions[i] = plan.ForeignKeyRefActionData{
404416
RowMapper: &plan.ForeignKeyRowMapper{
405-
Index: childIndex,
406-
Updater: childUpdater,
407-
SourceSch: tblSch,
408-
IndexPositions: indexPositions,
409-
AppendTypes: appendTypes,
417+
Index: childIndex,
418+
Updater: childUpdater,
419+
SourceSch: tblSch,
420+
TargetTypeConversions: typeConversions,
421+
IndexPositions: indexPositions,
422+
AppendTypes: appendTypes,
410423
},
411424
Editor: childEditor,
412425
ForeignKey: fk,

sql/analyzer/optimization_rules.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ package analyzer
1717
import (
1818
"strings"
1919

20+
"github.com/dolthub/go-mysql-server/memory"
21+
2022
"github.com/dolthub/go-mysql-server/sql"
2123
"github.com/dolthub/go-mysql-server/sql/expression"
2224
"github.com/dolthub/go-mysql-server/sql/plan"
@@ -43,7 +45,9 @@ func eraseProjection(ctx *sql.Context, a *Analyzer, node sql.Node, scope *plan.S
4345
return transform.Node(node, func(node sql.Node) (sql.Node, transform.TreeIdentity, error) {
4446
project, ok := node.(*plan.Project)
4547
if ok {
46-
if project.Schema().CaseSensitiveEquals(project.Child.Schema()) {
48+
projSch := project.Schema()
49+
childSch := project.Child.Schema()
50+
if projSch.CaseSensitiveEquals(childSch) && !childSch.Equals(memory.DualTableSchema.Schema) {
4751
a.Log("project erased")
4852
return project.Child, transform.NewTree, nil
4953
}

0 commit comments

Comments
 (0)