Skip to content

Turso remote:带 id/conflictKeys 但没匹配上的 upsert 仍会静默写入 NULL 自增号(#6944 拒绝闸门覆盖不到的那条腿) #7099

Description

@os-zhuang

一句话说明

#6944(PR #7089)让 Turso remote 面上带 auto_number 的写入明确拒绝(NOT_IMPLEMENTED / 501),消除了"静默写 NULL"。但有一条腿没被覆盖:一个携带 id 或显式 conflictKeysupsert,若实际没有匹配到任何行,就会走 insert,而自增号槽位仍然被静默写成 NULL

#6944 的 dev 在实现中测得并主动申报,已在该 PR 的测试里钉成 [known residue, not fixed] 断言。本卡只负责让它在 #6944 关闭后不被埋掉。

为什么 #6944 没有一起修

拒绝闸门刻意在构建语句之前触发 —— 这正是它的价值之一:被拒绝的写入不消耗一次往返(#6944 已断言零 execute 调用)。

而"这次 upsert 到底会 merge 还是 insert",在发出语句之前无法判定:需要先去问一次数据库。要覆盖这条腿,就得引入拒绝闸门本身要避免的那次往返。这是一个真实的取舍,不是遗漏。

影响范围(承接 #6944 的实测)

remote 面上已被覆盖、会明确拒绝的路径:createbulkCreate、以及无 idupsert(其新鲜 nanoid 永远匹配不上,所以恒为 insert)、以及匹配上并合并upsert

未覆盖的只有这一条:带 id / conflictKeys未匹配的 upsert。它的结果与 #6944 修复前一致 —— 行落地,自增号列为 NULL,调用方无从得知。

可能的处置(不预设结论)

关联

未认领,仅作记录,定级交分诊。

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions