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

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions