fix: reject an empty column set in insert_sql
`insert_sql(backend, [])` 此前返回 `INSERT OR IGNORE INTO llm_calls () VALUES ()` 与 `INSERT INTO llm_calls () VALUES () ON CONFLICT DO NOTHING`,两条都语法非法。 入参正来自数据库列探测(遇到一张与本库毫无共同列的同名表,裁剪结果就是空), 把"非空"押在调用方的不变量上不成立——共享构造器自己拒,与它既有的"未知 backend""非 COLUMNS 子集"两道校验同款。 连带风险已实测确认: 两个 recorder 的空集回落都发生在调用 `insert_sql` **之前**, 故新增的 raise 不会逃出 SQLite 的 `__init__`(遥测初始化失败必须静默降级)或 PG 的准备期(`_prepare_schema` 里那次调用在 try 之外,异常会一路冒给业务调用方)。 新增 SQLite 空探测结果用例: 构造成功、写入照常、只有 warning。 同时补 PG 侧"探测结果与 COLUMNS 无交集"的回落用例(此前只有 SQLite 侧有), 并把承认缺口的那段测试注释改成断言拒绝。
This commit is contained in:
@@ -183,9 +183,10 @@ class PostgresRecorder:
|
||||
|
||||
裁剪是关掉 ALTER 的**前提**而非增强: 旧表缺列时仍发全量 INSERT,每一行
|
||||
都会因未知列被拒 → 遥测彻底丢失,比自动 ALTER 更严重地违反"遥测必录"。
|
||||
探测结果与 `COLUMNS` 毫无交集时视同探测异常保守回落全量: 空列集会构造出
|
||||
`INSERT INTO llm_calls () VALUES ()` 这种语法非法的语句(`insert_sql` 拦
|
||||
不住——空集技术上是子集),必须在交给它之前拦下。
|
||||
探测结果与 `COLUMNS` 毫无交集时视同探测异常保守回落全量: 空列集拼不出合法
|
||||
INSERT,`insert_sql` 会 ValueError,而 `_prepare_schema` 里那次调用在 try
|
||||
**之外**,异常会顺着 `record_llm_call` 一路冒给业务调用方(遥测绝不冒泡)
|
||||
——回落必须发生在把空列集交给它之前。
|
||||
"""
|
||||
effective = tuple(column for column in COLUMNS if column in existing)
|
||||
if not effective:
|
||||
|
||||
Reference in New Issue
Block a user