From ed6edd877dc00383c2458797e79f9a47723b6908 Mon Sep 17 00:00:00 2001 From: Helder Sousa Date: Fri, 20 Sep 2024 00:10:49 +0100 Subject: [PATCH] Improve logic to include originalUniqueKey in sharedUniqueKeys Until now, when building the list of SharedUniqueKeys, the code was selecting only the originalUniqueKeys that existed in ghostUniqueKeys list. However, as part of the alter table, it is possible to add more unique keys or even composed primary keys with multiple columns. The new logic keeps the old behaviour (it matches originalUniqueKey with exactly the same ghostUniqueKey) but also supports the cases where the originalUniqueKey is now a subset of one of the new ghostUniqueKeys. If such a case happens, we can still use the originalUniqueKey as normal because a new ghostUniqueKey with the columns of originalUniqueKey plus some new columns is inherently unique just by the columns in the originalUniqueKey, no matter the value in the new columns of the new unique key. --- go/logic/inspect.go | 3 ++- go/logic/inspect_test.go | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/go/logic/inspect.go b/go/logic/inspect.go index 9d414a43e..42aee7e73 100644 --- a/go/logic/inspect.go +++ b/go/logic/inspect.go @@ -736,8 +736,9 @@ func (this *Inspector) getSharedUniqueKeys(originalUniqueKeys, ghostUniqueKeys [ // the ALTER is on the name itself... for _, originalUniqueKey := range originalUniqueKeys { for _, ghostUniqueKey := range ghostUniqueKeys { - if originalUniqueKey.Columns.EqualsByNames(&ghostUniqueKey.Columns) { + if originalUniqueKey.Columns.IsSubsetOf(&ghostUniqueKey.Columns) { uniqueKeys = append(uniqueKeys, originalUniqueKey) + break } } } diff --git a/go/logic/inspect_test.go b/go/logic/inspect_test.go index 54bc48ff0..4fa1eec11 100644 --- a/go/logic/inspect_test.go +++ b/go/logic/inspect_test.go @@ -17,6 +17,7 @@ func TestInspectGetSharedUniqueKeys(t *testing.T) { origUniqKeys := []*sql.UniqueKey{ {Columns: *sql.NewColumnList([]string{"id", "item_id"})}, {Columns: *sql.NewColumnList([]string{"id", "org_id"})}, + {Columns: *sql.NewColumnList([]string{"id"})}, } ghostUniqKeys := []*sql.UniqueKey{ {Columns: *sql.NewColumnList([]string{"id", "item_id"})}, @@ -25,7 +26,8 @@ func TestInspectGetSharedUniqueKeys(t *testing.T) { } inspector := &Inspector{} sharedUniqKeys := inspector.getSharedUniqueKeys(origUniqKeys, ghostUniqKeys) - test.S(t).ExpectEquals(len(sharedUniqKeys), 2) + test.S(t).ExpectEquals(len(sharedUniqKeys), 3) test.S(t).ExpectEquals(sharedUniqKeys[0].Columns.String(), "id,item_id") test.S(t).ExpectEquals(sharedUniqKeys[1].Columns.String(), "id,org_id") + test.S(t).ExpectEquals(sharedUniqKeys[2].Columns.String(), "id") }