-- Verification script to check HTML entity cleaning migration results -- Run this after the migration to verify it worked correctly -- Check if the cleaning function exists SELECT 'clean_html_entities function: ' || CASE WHEN EXISTS ( SELECT 1 FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid WHERE p.proname = 'clean_html_entities' AND n.nspname = 'public' ) THEN '✓ EXISTS' ELSE '✗ MISSING' END as function_status; -- Count records that still have HTML entities (should be 0 after migration) SELECT 'Records with HTML tags in bulletins: ' || COUNT(*) as bulletin_html_tags FROM bulletins WHERE title ~ '<[^>]*>' OR sabbath_school ~ '<[^>]*>' OR divine_worship ~ '<[^>]*>' OR scripture_reading ~ '<[^>]*>' OR sunset ~ '<[^>]*>'; SELECT 'Records with HTML entities in bulletins: ' || COUNT(*) as bulletin_html_entities FROM bulletins WHERE title ~ '&(nbsp|amp|lt|gt|quot|#39);' OR sabbath_school ~ '&(nbsp|amp|lt|gt|quot|#39);' OR divine_worship ~ '&(nbsp|amp|lt|gt|quot|#39);' OR scripture_reading ~ '&(nbsp|amp|lt|gt|quot|#39);' OR sunset ~ '&(nbsp|amp|lt|gt|quot|#39);'; SELECT 'Records with HTML tags in events: ' || COUNT(*) as event_html_tags FROM events WHERE title ~ '<[^>]*>' OR description ~ '<[^>]*>' OR location ~ '<[^>]*>' OR location_url ~ '<[^>]*>' OR approved_from ~ '<[^>]*>'; SELECT 'Records with HTML entities in events: ' || COUNT(*) as event_html_entities FROM events WHERE title ~ '&(nbsp|amp|lt|gt|quot|#39);' OR description ~ '&(nbsp|amp|lt|gt|quot|#39);' OR location ~ '&(nbsp|amp|lt|gt|quot|#39);' OR location_url ~ '&(nbsp|amp|lt|gt|quot|#39);' OR approved_from ~ '&(nbsp|amp|lt|gt|quot|#39);'; -- Show some sample cleaned data SELECT 'Sample bulletin titles after cleaning:' as sample_data; SELECT SUBSTRING(title, 1, 50) || (CASE WHEN LENGTH(title) > 50 THEN '...' ELSE '' END) as cleaned_titles FROM bulletins WHERE title IS NOT NULL ORDER BY updated_at DESC LIMIT 5; SELECT 'Sample event descriptions after cleaning:' as sample_data; SELECT SUBSTRING(description, 1, 80) || (CASE WHEN LENGTH(description) > 80 THEN '...' ELSE '' END) as cleaned_descriptions FROM events WHERE description IS NOT NULL ORDER BY updated_at DESC LIMIT 3; -- Check when records were last updated (should show recent timestamps if migration ran) SELECT 'Recently updated bulletins: ' || COUNT(*) || ' (updated in last hour)' as recent_bulletins FROM bulletins WHERE updated_at > NOW() - INTERVAL '1 hour'; SELECT 'Recently updated events: ' || COUNT(*) || ' (updated in last hour)' as recent_events FROM events WHERE updated_at > NOW() - INTERVAL '1 hour'; -- Summary SELECT '===============================================' as summary; SELECT 'MIGRATION VERIFICATION COMPLETE' as summary; SELECT 'If all HTML tag/entity counts above are 0, the migration was successful!' as summary; SELECT '===============================================' as summary;