fix: owner-less document query passes bare False to SQLAlchemy filter() (#1281)

* fix: use SQL false() for owner-less document query (filter(False) raises in SQLAlchemy 2.x)

* test: owner-less document query doesn't pass a bare False to filter
This commit is contained in:
Afonso Coutinho
2026-06-02 17:20:43 +01:00
committed by GitHub
parent a3b3dbafde
commit 83aa35b83e
2 changed files with 36 additions and 1 deletions

View File

@@ -90,7 +90,11 @@ def get_active_document():
def _owned_document_query(query, Document, owner: Optional[str]): def _owned_document_query(query, Document, owner: Optional[str]):
if owner is None: if owner is None:
return query.filter(False) # A bare Python `False` is not a valid SQL expression — SQLAlchemy 1.4
# deprecates it and 2.0 raises ArgumentError. Use the SQL `false()`
# literal to return zero rows for an unscoped (owner-less) query.
from sqlalchemy import false
return query.filter(false())
return query.filter(Document.owner == owner) return query.filter(Document.owner == owner)

View File

@@ -0,0 +1,31 @@
"""Tests for _owned_document_query owner scoping (src/tool_implementations.py)."""
from src.tool_implementations import _owned_document_query
class _FakeQuery:
def __init__(self):
self.filter_args = []
def filter(self, *args):
self.filter_args.append(args)
return self
class _Doc:
owner = "owner-column-sentinel"
def test_owner_none_does_not_pass_python_false():
q = _FakeQuery()
_owned_document_query(q, _Doc, None)
arg = q.filter_args[-1][0]
# The old code passed the bare Python bool False, which SQLAlchemy 2.x
# rejects; the fix passes a SQL false() literal instead.
assert arg is not False
assert arg is not None
def test_owner_set_filters_by_owner():
q = _FakeQuery()
_owned_document_query(q, _Doc, "alice")
assert q.filter_args, "should apply an owner filter"