diff --git a/backend/app/engine/inquiry.py b/backend/app/engine/inquiry.py index b8944dcd..895cb9e3 100644 --- a/backend/app/engine/inquiry.py +++ b/backend/app/engine/inquiry.py @@ -40,7 +40,8 @@ 安全,宁可多遮;数个数要用 COUNT。按遮罩列分档的 CASE(CASE WHEN age < 30 THEN '30岁以下' …)同理,标签列整列遮, 标签文字也成了遮罩值,SQL 和回答正文里写着的同样的字一并换掉(换掉的标签不是数,不牵连阈值) - 「夹住某一个值」只在同一个条件里认(_pinned):把找值拆进子查询、CTE 的写法(WHERE age >= 25 AND id IN - (SELECT id FROM t WHERE age <= 25))认不出,两个边界都当阈值照原样留着 + (SELECT id FROM t WHERE age <= 25))认不出,两个边界都当阈值照原样留着;反过来,条件长到细看不过来(PIN_WORK)时, + 两边都隔开的一律按夹住算,会多遮几个阈值 - 遮罩值最多收 SECRETS_MAX 种写法,再多的按值认不出(按列遮照旧) """ from __future__ import annotations diff --git a/backend/tests/test_inquiry_masking.py b/backend/tests/test_inquiry_masking.py index 1bc8942a..365d9a8e 100644 --- a/backend/tests/test_inquiry_masking.py +++ b/backend/tests/test_inquiry_masking.py @@ -356,8 +356,8 @@ def test_a_range_that_pins_a_single_value_is_a_lookup(phones, sql, shown): "SELECT COUNT(*) FROM sales WHERE age >= 已遮罩 XOR age > 已遮罩"), ]) def test_a_value_pinned_within_one_condition_is_still_a_lookup(phones, kind, sql, shown): - """「夹住某一个值」只在同一个条件里认(从比较往上只越过且、或、非、括号),同一个条件里夹住的照样换:旁边还有 - 别的条件、写在 CASE WHEN 或 HAVING 里、整数的开区间。""" + """「夹住某一个值」只在同一个条件里认(从比较往上只越过且、或、非、异或、括号),同一个条件里夹住的照样换:旁边 + 还有别的条件、写在 CASE WHEN 里、整数的开区间、XOR。""" assert inquiry_mod._scrub_sql(sql, phones, {"buyer_phone", "age"}, kind) == shown @@ -411,6 +411,7 @@ def ages() -> inquiry_mod._Secrets: "COUNT(*) AS 人数 FROM sales GROUP BY 1", {"18", "30", "45"}), ]) def test_overlapping_age_bands_are_thresholds(ages, sql, shown): + """年龄段的两个 WHEN 分支共用边界 30:同上,是分档的界。""" assert inquiry_mod._scrub_sql(sql, ages, {"age"}, "sqlite") == sql assert inquiry_mod._shown_literals([(sql, "sqlite", {"age"})], ages) == shown