测试服 dry-run 实测翻车(未落库,水位未污染):
Missing columns: 'last_visit_time' 'patient_id' while processing query:
'SELECT patient_id, brand FROM dw_group.fact_complex_cases_out WHERE last_visit_time > …'
listPatientPairs 构造 UNION 分支时是第三处朴素正则 `/FROM\s+([\w.]+)/`:
① 主档 query 现在带 SELECT 列子查询 → 抓到子查询的 FROM,表名取成 fact_complex_cases_out,
cursor 列却仍是主档的 last_visit_time,两个错叠在一起
② 分支直查物理表 → 读不到 query 里的 `customer_id AS patient_id` 别名(该表物理列名是
customer_id),patient_id 根本不存在
改为**包裹 manifest 的 query**(复用已按顶层 FROM 解析的 injectIncrementalCursor):
SELECT <keys> FROM (SELECT … AS patient_id … FROM <表> WHERE <cursor> AND <业务过滤>)
别名在子查询里成立;顺带继承该 query 的业务过滤,与真实拉取同口径 —— 否则"游标之后但
会被业务条件过滤掉"的行会把无关患者拖进 cohort(同 extractBusinessFilters 那次的教训)。
解析不了则回退旧形态(表名改用顶层解析),不比改动前差。
补 2 项回归锁这两条,共 21 项。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>