From 8ad4ab1dec16dd0be784357a1dbda5aae30d185a Mon Sep 17 00:00:00 2001 From: Bartok9 Date: Tue, 28 Jul 2026 02:03:23 -0400 Subject: [PATCH] fix(memory): reject non-list relationship models in seed queries Related to #2590. --- core/wren/src/wren/memory/seed_queries.py | 9 +++++++- core/wren/tests/unit/test_seed_queries.py | 26 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/core/wren/src/wren/memory/seed_queries.py b/core/wren/src/wren/memory/seed_queries.py index cfc8a2e26d..2528c38220 100644 --- a/core/wren/src/wren/memory/seed_queries.py +++ b/core/wren/src/wren/memory/seed_queries.py @@ -142,7 +142,14 @@ def _relationship_seed(rel: dict, model_layers: dict[str, str]) -> dict | None: # "condition": null in the manifest) does not slip a None past `.get()`'s # default and crash `len(None)` / `None.strip()`. Mirrors the defensive # `rel.get("condition") or ""` in `_relationship_key_columns`. - models = rel.get("models") or [] + models = rel.get("models") + if models is None: + models = [] + if not isinstance(models, list): + raise ValueError( + f"relationship {rel.get('name')!r}: 'models' must be a list, " + f"got {type(models).__name__}" + ) condition = (rel.get("condition") or "").strip() if len(models) < 2 or not condition: diff --git a/core/wren/tests/unit/test_seed_queries.py b/core/wren/tests/unit/test_seed_queries.py index 965bf2628a..a131d4798b 100644 --- a/core/wren/tests/unit/test_seed_queries.py +++ b/core/wren/tests/unit/test_seed_queries.py @@ -814,3 +814,29 @@ def test_skips_non_dict_columns(): sqls = [p["sql"] for p in pairs] assert "SELECT * FROM orders LIMIT 100" in sqls assert "SELECT SUM(amount) FROM orders" in sqls + + +@pytest.mark.unit +class TestRelationshipSeedModelsType: + def test_string_models_raises(self): + manifest = { + "models": [_model("orders", "id", [_col("id", "int")])], + "relationships": [ + { + "name": "bad", + "models": "orders", + "condition": "a.id = b.id", + } + ], + } + with pytest.raises(ValueError, match="models"): + generate_seed_queries(manifest) + + def test_dict_models_raises(self): + manifest = { + "relationships": [ + {"name": "bad", "models": {"a": 1}, "condition": "x = y"} + ] + } + with pytest.raises(ValueError, match="models"): + generate_seed_queries(manifest)