diff --git a/user/manager_sqlite_schema.go b/user/manager_sqlite_schema.go index b659c140..fa8952d6 100644 --- a/user/manager_sqlite_schema.go +++ b/user/manager_sqlite_schema.go @@ -361,7 +361,9 @@ const ( PRIMARY KEY (user_id, phone_number), FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE ); - INSERT INTO user_phone SELECT * FROM user_phone_old; + INSERT INTO user_phone (user_id, phone_number) + SELECT user_id, phone_number FROM user_phone_old + WHERE user_id IN (SELECT id FROM user); -- Drop orphaned rows that the broken foreign key failed to cascade-delete DROP TABLE user_phone_old; ` ) diff --git a/user/manager_test.go b/user/manager_test.go index 48ad6f48..686ff903 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -1820,12 +1820,15 @@ func TestMigrationFrom4(t *testing.T) { `) require.Nil(t, err) - // Insert a few ACL entries + // Insert a few ACL entries, and phone numbers: one for a live user, one orphaned (its user + // is gone; the broken pre-v9 foreign key never cascade-deleted it) _, err = db.Exec(` BEGIN; INSERT INTO user_access (user_id, topic, read, write) values ('u_everyone', 'mytopic_', 1, 1); INSERT INTO user_access (user_id, topic, read, write) values ('u_everyone', 'up%', 1, 1); INSERT INTO user_access (user_id, topic, read, write) values ('u_everyone', 'down_%', 1, 1); + INSERT INTO user_phone (user_id, phone_number) VALUES ('u_everyone', '+12223334444'); + INSERT INTO user_phone (user_id, phone_number) VALUES ('u_gone', '+15556667777'); COMMIT; `) require.Nil(t, err) @@ -1876,6 +1879,18 @@ func TestMigrationFrom4(t *testing.T) { require.Nil(t, a.Authorize(nil, "up123", PermissionRead)) require.Nil(t, a.Authorize(nil, "up", PermissionRead)) // % matches 0 or more characters + // The 8 -> 9 repair kept the live user's phone number and dropped the orphaned row + phoneNumbers := make([]string, 0) + rows, err = db.Query(`SELECT phone_number FROM user_phone ORDER BY phone_number`) + require.Nil(t, err) + for rows.Next() { + var phoneNumber string + require.Nil(t, rows.Scan(&phoneNumber)) + phoneNumbers = append(phoneNumbers, phoneNumber) + } + require.Nil(t, rows.Close()) + require.Equal(t, []string{"+12223334444"}, phoneNumbers) + checkMigratedSqliteSchema(t, filename) }