From 242e353f1843914a9de561369729dada1d0bf124 Mon Sep 17 00:00:00 2001 From: Timothy Messier Date: Fri, 5 Nov 2021 14:57:10 -0400 Subject: [PATCH] fix(schema): Prevent duplicate versions per edition (#1670) This should help prevent issues like the one fixed in f2ad4de554d5e10365bd39c110f29f9a4c481fa5. A version for a particular edition should only exist once, previously which ever file was read last for a version would be included, which would lead to some migrations not running. --- internal/db/schema/internal/edition/edition.go | 3 +++ internal/db/schema/internal/edition/edition_test.go | 6 ++++++ .../testdata/invalid/duplicate-versions/0/01_initial.up.sql | 5 +++++ .../invalid/duplicate-versions/0/01_initial_also.up.sql | 5 +++++ 4 files changed, 19 insertions(+) create mode 100644 internal/db/schema/internal/edition/testdata/invalid/duplicate-versions/0/01_initial.up.sql create mode 100644 internal/db/schema/internal/edition/testdata/invalid/duplicate-versions/0/01_initial_also.up.sql diff --git a/internal/db/schema/internal/edition/edition.go b/internal/db/schema/internal/edition/edition.go index ba84d5c9f..f4a717281 100644 --- a/internal/db/schema/internal/edition/edition.go +++ b/internal/db/schema/internal/edition/edition.go @@ -121,6 +121,9 @@ func New(name string, dialect Dialect, m embed.FS, priority int) Edition { } contents = strings.TrimSpace(contents) + if _, exists := migrations[fullV]; exists { + panic(fmt.Sprintf("migration file for version %d already exists", fullV)) + } migrations[fullV] = []byte(contents) return nil diff --git a/internal/db/schema/internal/edition/edition_test.go b/internal/db/schema/internal/edition/edition_test.go index d0e6810f4..d28a7cffc 100644 --- a/internal/db/schema/internal/edition/edition_test.go +++ b/internal/db/schema/internal/edition/edition_test.go @@ -74,6 +74,8 @@ var ( noMinorVersion embed.FS //go:embed testdata/invalid/no-major-version noMajorVersion embed.FS + //go:embed testdata/invalid/duplicate-versions + duplicateVersions embed.FS ) func TestNewPanics(t *testing.T) { @@ -103,6 +105,10 @@ func TestNewPanics(t *testing.T) { "noMajorVersion", noMajorVersion, }, + { + "duplicateVersions", + duplicateVersions, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/db/schema/internal/edition/testdata/invalid/duplicate-versions/0/01_initial.up.sql b/internal/db/schema/internal/edition/testdata/invalid/duplicate-versions/0/01_initial.up.sql new file mode 100644 index 000000000..cda8bcced --- /dev/null +++ b/internal/db/schema/internal/edition/testdata/invalid/duplicate-versions/0/01_initial.up.sql @@ -0,0 +1,5 @@ +begin; + create table one ( + id bigint primary key + ); +commit; diff --git a/internal/db/schema/internal/edition/testdata/invalid/duplicate-versions/0/01_initial_also.up.sql b/internal/db/schema/internal/edition/testdata/invalid/duplicate-versions/0/01_initial_also.up.sql new file mode 100644 index 000000000..90f0b5fbd --- /dev/null +++ b/internal/db/schema/internal/edition/testdata/invalid/duplicate-versions/0/01_initial_also.up.sql @@ -0,0 +1,5 @@ +begin; + create table one_also ( + id bigint primary key + ); +commit;