PRAGMA foreign_keys = OFF; BEGIN; -- 1. Create a new table with BOOLEAN columns CREATE TABLE users_new ( id TEXT NOT NULL PRIMARY KEY, created_at DATETIME, username TEXT COLLATE NOCASE NOT NULL UNIQUE, email TEXT NOT NULL UNIQUE, first_name TEXT, last_name TEXT NOT NULL, display_name TEXT NOT NULL, is_admin BOOLEAN DEFAULT FALSE NOT NULL, ldap_id TEXT, locale TEXT, disabled BOOLEAN DEFAULT FALSE NOT NULL ); -- 2. Copy all existing data, converting numeric bools to real booleans INSERT INTO users_new ( id, created_at, username, email, first_name, last_name, display_name, is_admin, ldap_id, locale, disabled ) SELECT id, created_at, username, email, first_name, last_name, display_name, CASE WHEN is_admin != 0 THEN TRUE ELSE FALSE END, ldap_id, locale, CASE WHEN disabled != 0 THEN TRUE ELSE FALSE END FROM users; -- 3. Drop old table DROP TABLE users; -- 4. Rename new table to original name ALTER TABLE users_new RENAME TO users; -- 5. Recreate index CREATE UNIQUE INDEX users_ldap_id ON users (ldap_id); -- 6. Create temporary table with changed credential_id type to BLOB CREATE TABLE webauthn_credentials_dg_tmp ( id TEXT PRIMARY KEY, created_at DATETIME NOT NULL, name TEXT NOT NULL, credential_id BLOB NOT NULL UNIQUE, public_key BLOB NOT NULL, attestation_type TEXT NOT NULL, transport BLOB NOT NULL, user_id TEXT REFERENCES users ON DELETE CASCADE, backup_eligible BOOLEAN DEFAULT FALSE NOT NULL, backup_state BOOLEAN DEFAULT FALSE NOT NULL ); -- 7. Copy existing data into the temporary table INSERT INTO webauthn_credentials_dg_tmp ( id, created_at, name, credential_id, public_key, attestation_type, transport, user_id, backup_eligible, backup_state ) SELECT id, created_at, name, credential_id, public_key, attestation_type, transport, user_id, backup_eligible, backup_state FROM webauthn_credentials; -- 8. Drop old table DROP TABLE webauthn_credentials; -- 9. Rename temporary table to original name ALTER TABLE webauthn_credentials_dg_tmp RENAME TO webauthn_credentials; -- 10. Create temporary table with credential_params type changed to BLOB CREATE TABLE webauthn_sessions_dg_tmp ( id TEXT NOT NULL PRIMARY KEY, created_at DATETIME, challenge TEXT NOT NULL UNIQUE, expires_at DATETIME NOT NULL, user_verification TEXT NOT NULL, credential_params BLOB DEFAULT '[]' NOT NULL ); -- 11. Copy existing data into the temporary sessions table INSERT INTO webauthn_sessions_dg_tmp ( id, created_at, challenge, expires_at, user_verification, credential_params ) SELECT id, created_at, challenge, expires_at, user_verification, credential_params FROM webauthn_sessions; -- 12. Drop old table DROP TABLE webauthn_sessions; -- 13. Rename temporary sessions table to original name ALTER TABLE webauthn_sessions_dg_tmp RENAME TO webauthn_sessions; COMMIT; PRAGMA foreign_keys = ON;