From 8ca750d7ee0766e1db8210ba30a3e3d361afcac3 Mon Sep 17 00:00:00 2001 From: ThearchyHelios Date: Tue, 6 Oct 2026 12:32:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A1=E6=89=B9=E8=B4=A8=E8=AF=A2=E9=81=AE?= =?UTF-8?q?=E7=BD=A9=E6=94=B6=E5=8F=A3=EF=BC=9A=E8=AF=B4=E6=98=8E=E8=B7=9F?= =?UTF-8?q?=E4=B8=8A=E5=AE=9E=E7=8E=B0=E2=80=94=E2=80=94=E3=80=8C=E5=A4=B9?= =?UTF-8?q?=E4=BD=8F=E3=80=8D=E8=B6=8A=E8=BF=87=E7=9A=84=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E8=AF=8D=E5=90=AB=E5=BC=82=E6=88=96=E3=80=81=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E9=95=BF=E5=88=B0=E7=BB=86=E7=9C=8B=E4=B8=8D=E8=BF=87=E6=9D=A5?= =?UTF-8?q?=E6=97=B6=E5=A4=9A=E9=81=AE=E5=87=A0=E4=B8=AA=E9=98=88=E5=80=BC?= =?UTF-8?q?=E5=86=99=E8=BF=9B=E5=B7=B2=E7=9F=A5=E5=B1=80=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 模块说明的已知局限补一句:条件长到细看不过来(PIN_WORK)时,两边都隔开的一律按夹住算,会多遮几个阈值 - 测试说明对齐:同一个条件里夹住的那组用例越过的连接词含异或(XOR 用例),HAVING 的用例已挪到自己那条测试;年龄段那条 补上说明 --- backend/app/engine/inquiry.py | 3 ++- backend/tests/test_inquiry_masking.py | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) 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