-- Rename 'preview' to 'enabled' in apps, inverting the boolean value -- preview=false (can be used) becomes enabled=true, preview=true becomes enabled=false UPDATE apps_marketplace SET json = (json - 'preview') || jsonb_build_object( 'enabled', CASE WHEN json -> 'preview' = 'null'::jsonb THEN true WHEN (json -> 'preview')::boolean = true THEN false ELSE true END ) WHERE jsonb_exists(json, 'preview'); UPDATE installed_apps SET json = (json - 'preview') || jsonb_build_object( 'enabled', CASE WHEN json -> 'preview' = 'null'::jsonb THEN true WHEN (json -> 'preview')::boolean = true THEN false ELSE true END ) WHERE jsonb_exists(json, 'preview'); -- Rename 'preview' to 'enabled' in event_subscription_entity config.app -- The App JSON is stored as an escaped JSON string inside config.app, so we need string replacement UPDATE event_subscription_entity SET json = jsonb_set( json, '{config,app}', to_jsonb( replace( replace( json->'config'->>'app', '"preview":false', '"enabled":true' ), '"preview":true', '"enabled":false' ) ) ) WHERE json->'config'->>'app' LIKE '%"preview"%'; -- Clean up QRTZ tables to remove stale persisted job data that may contain old App JSON with 'preview' -- Delete FK children first, then parents. Using DELETE (not TRUNCATE) to respect FK constraints. DELETE FROM QRTZ_SIMPLE_TRIGGERS; DELETE FROM QRTZ_CRON_TRIGGERS; DELETE FROM QRTZ_SIMPROP_TRIGGERS; DELETE FROM QRTZ_BLOB_TRIGGERS; DELETE FROM QRTZ_TRIGGERS; DELETE FROM QRTZ_JOB_DETAILS; DELETE FROM QRTZ_FIRED_TRIGGERS; DELETE FROM QRTZ_LOCKS; DELETE FROM QRTZ_SCHEDULER_STATE;