diff --git a/homeassistant/components/recorder/purge.py b/homeassistant/components/recorder/purge.py index da865c750ad..368a6ccdf1c 100644 --- a/homeassistant/components/recorder/purge.py +++ b/homeassistant/components/recorder/purge.py @@ -111,9 +111,12 @@ def purge_old_data( _LOGGER.debug("Cleanup filtered data hasn't fully completed yet") return False - _purge_old_recorder_runs(instance, session, purge_before) + # This purge cycle is finished, clean up old event types and + # recorder runs if instance.event_type_manager.active: _purge_old_event_types(instance, session) + + _purge_old_recorder_runs(instance, session, purge_before) if repack: repack_database(instance) return True diff --git a/homeassistant/components/recorder/queries.py b/homeassistant/components/recorder/queries.py index 6420d285dca..9d50ff6b6cd 100644 --- a/homeassistant/components/recorder/queries.py +++ b/homeassistant/components/recorder/queries.py @@ -741,12 +741,15 @@ def find_event_types_to_purge() -> StatementLambdaElement: """Find event_type_ids to purge.""" return lambda_stmt( lambda: select(EventTypes.event_type_id, EventTypes.event_type).where( - EventTypes.event_type_id - == ( - select(distinct(EventTypes.event_type_id).label("unused_event_type_id")) - .filter(EventTypes.event_type_id.not_in(select(Events.event_type_id))) - .subquery() - ).c.unused_event_type_id + EventTypes.event_type_id.not_in( + select(EventTypes.event_type_id).join( + used_event_type_ids := select( + distinct(Events.event_type_id).label("used_event_type_id") + ).subquery(), + EventTypes.event_type_id + == used_event_type_ids.c.used_event_type_id, + ) + ) ) )