diff --git a/go.mod b/go.mod
index a03b4d52dc61cda17fd727b473286e62814b48b4..6c3c91afc4bde522c8d0c17ef3765c9686a59772 100644
--- a/go.mod
+++ b/go.mod
@@ -16,7 +16,7 @@ require (
 	github.com/gofrs/flock v0.8.0 // indirect
 	github.com/google/go-cmp v0.5.8
 	github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40
-	github.com/mattn/go-sqlite3 v1.14.7
+	github.com/mattn/go-sqlite3 v1.14.14
 	github.com/miscreant/miscreant.go v0.0.0-20200214223636-26d376326b75
 	github.com/prometheus/client_golang v1.12.2
 	github.com/russross/blackfriday/v2 v2.1.0
diff --git a/go.sum b/go.sum
index 14ab45000eed1178bfe6e052d9e9f0802aa2d0ef..2cc4a8895f29f46e55bf0b02a2ac81325a573bc4 100644
--- a/go.sum
+++ b/go.sum
@@ -554,6 +554,8 @@ github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lL
 github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA=
 github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
+github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw=
+github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo=
 github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
diff --git a/sqlutil/db_test.go b/sqlutil/db_test.go
index a91b7e2c66be6259070469890272ab512b888850..e6da51c8e485570aa61c488b7f51ca266bc0dd60 100644
--- a/sqlutil/db_test.go
+++ b/sqlutil/db_test.go
@@ -141,3 +141,41 @@ func TestOpenDB_Write(t *testing.T) {
 
 	checkTestValue(t, db)
 }
+
+func TestOpenDB_Migrations_Legacy(t *testing.T) {
+	dir, err := ioutil.TempDir("", "")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer os.RemoveAll(dir)
+
+	db, err := sql.Open("sqlite3", dir+"/test.db")
+	if err != nil {
+		t.Fatal(err)
+	}
+	for _, stmt := range []string{
+		"CREATE TABLE schema_migrations (version uint64,dirty bool)",
+		"INSERT INTO schema_migrations (version, dirty) VALUES (2, 0)",
+		"CREATE TABLE test (id INTEGER PRIMARY KEY NOT NULL, value TEXT)",
+		"CREATE INDEX idx_test_value ON test(value)",
+	} {
+		if _, err := db.Exec(stmt); err != nil {
+			t.Fatalf("statement '%s': %v", stmt, err)
+		}
+	}
+	db.Close()
+
+	migrations := []func(*sql.Tx) error{
+		Statement("CREATE TABLE test (id INTEGER PRIMARY KEY NOT NULL, value TEXT)"),
+		Statement("CREATE INDEX idx_test_value ON test(value)"),
+		Statement("INSERT INTO test (id, value) VALUES (1, 'test')"),
+	}
+
+	db, err = OpenDB(dir+"/test.db", WithMigrations(migrations))
+	if err != nil {
+		t.Fatal("first open: ", err)
+	}
+	defer db.Close()
+
+	checkTestValue(t, db)
+}