Skip to content

无 format 的 autonumber 字段两侧渲染不同:driver-sql 兜底成 {0000} 发出 0001,引擎兜底路径发出裸 1 —— 同一份元数据换驱动号形不同 #6555

Description

@baozhoutao

发现于 #6468 的实现(PR #6553)途中,未在该 PR 内顺手修 —— #6468 修的是播种时
怎么从已存值里读回计数器,本条是渲染兜底:两侧对「字段没写 format」这件事
给出的默认格式不同。机制不同、代码位置不同,按 Prime Directive #10 单独开单。

缺陷

autonumberFormat / format 在字段上是可选的。两侧对缺省的处理不一致:

  • driver-sql 把空格式兜底成 {0000}:
    packages/drivers/driver-sql/src/sql-driver.ts:4322:4404
    同一行 const fmt = rawFmt || '{0000}';(两处分别在 initObjects 与外部对象注册路径)。
    渲染结果是 4 位零填充 —— 00010002、…
  • 引擎兜底路径(驱动不声明 supports.autonumber 时)不兜底,直接用空格式:
    packages/objectql/src/engine.ts:2115
    const tokens = parseAutonumberFormat(typeof fmt === 'string' ? fmt : '');
    空 token 列表在 renderAutonumber 里走 width === null 分支
    (packages/spec/src/data/autonumber-format.ts:210-212),渲染出裸计数器 —— 12、…

实测

#6468 的工作树上,同一份元数据 { rec_no: { type: 'autonumber' } }(无 format),
库内已有 1 / 2 / 10 三行:

  • SqlDriver.create()rec_no = '0011'
  • 引擎兜底路径(InMemoryDriver,supports = {})⇒ rec_no = '11'

两侧的计数器都是 11(播种一致,#6468 已 pin 住这一点),分歧纯粹在渲染宽度。
PR #6553packages/drivers/driver-sql/src/sql-driver-autonumber-suffix.test.ts
里那条 legacy 用例已把 driver 侧的 '0011' 显式 pin 住,并在注释里点名这条分歧,
以免下一个读者把它误当成 #6468 的一部分。

可达性

不需要任何异常写法 —— 声明 { type: 'autonumber' } 且不写 format 即可。典型暴露面:
开发/测试跑 memory 驱动、生产跑 SQL 驱动,同一份元数据在两处发出的单号字面不同
(1 vs 0001),测试里断言的号形到了生产就不成立;数据迁移或换驱动时,同一对象
的历史号形也会在切换点前后突变。

供分诊参考(不预设结论)

三条路各有代价,需要先定「无 format 的 autonumber 该长什么样」这个契约问题:

  1. 引擎跟随 driver-sql,空格式也兜底成 {0000};
  2. driver-sql 跟随引擎,去掉 || '{0000}',无格式即裸计数器 —— 但这会改变已落地
    数据
    的号形(现存 0001 之后接 2),需要兼容判断;
  3. 在 spec 侧把默认写进契约(例如 FieldSchema 对 autonumber 给出 format
    声明式默认),让「declared = enforced」,两侧都没有自己的兜底。

⚠️#6468(PR #6553,播种解析)同区域但不同函数:#6468 动的是 seedAutonumber /
scanMaxNumericTail读回,本条在 applyAutonumbers / initObjects格式
兜底
#6468 落地后再动本条不会冲突。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions