fix(plex): NULL-safe orphan-people prune (review)
Guard the prune's NOT IN against the classic NULL trap: a JSON-null cast array element would surface as SQL NULL in the referenced set, making name NOT IN (…, NULL) evaluate NULL for every row → silently prune nothing. Filter NULLs out of the subquery. (Plex cast-explore S4 review)
This commit is contained in:
@@ -159,8 +159,14 @@ _REFERENCED_PEOPLE_SQL = """
|
||||
def prune_orphan_people(db: Session) -> int:
|
||||
"""Delete plex_people (headshot cache) rows whose name no longer appears in any movie/show cast or
|
||||
directors — orphaned by a library removal. Returns the number pruned. Commits its own work."""
|
||||
# `WHERE ref IS NOT NULL` matters: a JSON-null array element would surface as a SQL NULL in the
|
||||
# referenced set, and `name NOT IN (…, NULL)` is NULL (never TRUE) for every row — the classic
|
||||
# NOT IN trap that would silently prune nothing. Filtering NULLs out keeps the delete correct.
|
||||
res = db.execute(
|
||||
text(f"DELETE FROM plex_people WHERE name NOT IN ({_REFERENCED_PEOPLE_SQL})")
|
||||
text(
|
||||
"DELETE FROM plex_people WHERE name NOT IN "
|
||||
f"(SELECT ref FROM ({_REFERENCED_PEOPLE_SQL}) AS refs(ref) WHERE ref IS NOT NULL)"
|
||||
)
|
||||
)
|
||||
db.commit()
|
||||
return res.rowcount or 0
|
||||
|
||||
Reference in New Issue
Block a user