From b32f73afbc0587c9d200a974b8a64713c5200584 Mon Sep 17 00:00:00 2001 From: Bob Bobs Date: Tue, 20 Jan 2026 18:30:43 -0700 Subject: [PATCH 1/2] fix: empty ORLists now return false --- src/tagstudio/core/library/alchemy/visitors.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/tagstudio/core/library/alchemy/visitors.py b/src/tagstudio/core/library/alchemy/visitors.py index 7f9fc7993..7bdc41303 100644 --- a/src/tagstudio/core/library/alchemy/visitors.py +++ b/src/tagstudio/core/library/alchemy/visitors.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, override import structlog -from sqlalchemy import ColumnElement, and_, distinct, func, or_, select +from sqlalchemy import ColumnElement, and_, distinct, false, func, or_, select, true from sqlalchemy.orm import Session from sqlalchemy.sql.operators import ilike_op @@ -48,9 +48,14 @@ def __init__(self, lib: Library) -> None: @override def visit_or_list(self, node: ORList) -> ColumnElement[bool]: # type: ignore + if len(node.elements) == 0: + return true() + tag_ids, bool_expressions = self.__separate_tags(node.elements, only_single=False) if len(tag_ids) > 0: bool_expressions.append(self.__entry_has_any_tags(tag_ids)) + if len(bool_expressions) == 0: + return false() return or_(*bool_expressions) @override From 38de398c850cfd1fe4e0992d0ff76288236c44b3 Mon Sep 17 00:00:00 2001 From: Bob Bobs Date: Wed, 21 Jan 2026 13:09:08 -0700 Subject: [PATCH 2/2] fix: replace invalid tags with false when building sql query --- src/tagstudio/core/library/alchemy/visitors.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/tagstudio/core/library/alchemy/visitors.py b/src/tagstudio/core/library/alchemy/visitors.py index 7bdc41303..088d4d591 100644 --- a/src/tagstudio/core/library/alchemy/visitors.py +++ b/src/tagstudio/core/library/alchemy/visitors.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, override import structlog -from sqlalchemy import ColumnElement, and_, distinct, false, func, or_, select, true +from sqlalchemy import ColumnElement, and_, distinct, false, func, or_, select from sqlalchemy.orm import Session from sqlalchemy.sql.operators import ilike_op @@ -48,14 +48,9 @@ def __init__(self, lib: Library) -> None: @override def visit_or_list(self, node: ORList) -> ColumnElement[bool]: # type: ignore - if len(node.elements) == 0: - return true() - tag_ids, bool_expressions = self.__separate_tags(node.elements, only_single=False) if len(tag_ids) > 0: bool_expressions.append(self.__entry_has_any_tags(tag_ids)) - if len(bool_expressions) == 0: - return false() return or_(*bool_expressions) @override @@ -168,6 +163,9 @@ def __separate_tags( continue case ConstraintType.Tag: ids = self.__get_tag_ids(term.value) + if len(ids) == 0: + bool_expressions.append(false()) + continue if not only_single: tag_ids.update(ids) continue