一句话说明
#6944(PR #7089)让 Turso remote 面上带 auto_number 的写入明确拒绝(NOT_IMPLEMENTED / 501),消除了"静默写 NULL"。但有一条腿没被覆盖:一个携带 id 或显式 conflictKeys 的 upsert,若实际没有匹配到任何行,就会走 insert,而自增号槽位仍然被静默写成 NULL。
由 #6944 的 dev 在实现中测得并主动申报,已在该 PR 的测试里钉成 [known residue, not fixed] 断言。本卡只负责让它在 #6944 关闭后不被埋掉。
拒绝闸门刻意在构建语句之前触发 —— 这正是它的价值之一:被拒绝的写入不消耗一次往返(#6944 已断言零 execute 调用)。
而"这次 upsert 到底会 merge 还是 insert",在发出语句之前无法判定:需要先去问一次数据库。要覆盖这条腿,就得引入拒绝闸门本身要避免的那次往返。这是一个真实的取舍,不是遗漏。
影响范围(承接 #6944 的实测)
remote 面上已被覆盖、会明确拒绝的路径:create、bulkCreate、以及无 id 的 upsert(其新鲜 nanoid 永远匹配不上,所以恒为 insert)、以及匹配上并合并的 upsert。
未覆盖的只有这一条:带 id / conflictKeys 且未匹配的 upsert。它的结果与 #6944 修复前一致 —— 行落地,自增号列为 NULL,调用方无从得知。
可能的处置(不预设结论)
关联
未认领,仅作记录,定级交分诊。
一句话说明
#6944(PR #7089)让 Turso remote 面上带
auto_number的写入明确拒绝(NOT_IMPLEMENTED/ 501),消除了"静默写 NULL"。但有一条腿没被覆盖:一个携带id或显式conflictKeys的upsert,若实际没有匹配到任何行,就会走 insert,而自增号槽位仍然被静默写成 NULL。由 #6944 的 dev 在实现中测得并主动申报,已在该 PR 的测试里钉成
[known residue, not fixed]断言。本卡只负责让它在 #6944 关闭后不被埋掉。为什么 #6944 没有一起修
拒绝闸门刻意在构建语句之前触发 —— 这正是它的价值之一:被拒绝的写入不消耗一次往返(#6944 已断言零
execute调用)。而"这次 upsert 到底会 merge 还是 insert",在发出语句之前无法判定:需要先去问一次数据库。要覆盖这条腿,就得引入拒绝闸门本身要避免的那次往返。这是一个真实的取舍,不是遗漏。
影响范围(承接 #6944 的实测)
remote 面上已被覆盖、会明确拒绝的路径:
create、bulkCreate、以及无id的upsert(其新鲜 nanoid 永远匹配不上,所以恒为 insert)、以及匹配上并合并的upsert。未覆盖的只有这一条:带
id/conflictKeys且未匹配的 upsert。它的结果与 #6944 修复前一致 —— 行落地,自增号列为 NULL,调用方无从得知。可能的处置(不预设结论)
关联
[known residue, not fixed]Unsupported aggregate function两面都是裸Error(code/status 皆 undefined),且三个 spec 已声明的聚合函数无任何 SQL 后端编译 #5907 ——NOT_IMPLEMENTED/ 501 的二类拒绝分类未认领,仅作记录,定级交分诊。