Skip to content

drivers(turso): 聚合函数名的大小写归一化 local/remote 不一致 —— COUNT 在 remote 编得出、在 local 被拒(同一个 TursoDriver,取决于 url) #6203

Description

@os-zhuang

#5907(聚合函数拒收信封,两面同改)的落点实测中带出。不在该单的信封面内(该单只改拒收的 code/status 与措辞,不动「什么能编译」),按 Prime Directive #10 单独记一笔。

观察类:仓内没有活体发送方,协议门也表达不出这个输入 —— 严重度请分诊时判定。

事实

两个面对聚合函数名的归一化不一样:

  • packages/drivers/driver-turso/src/remote-transport.tsaggregate().toLowerCase() 再查自己的编译表;
  • packages/drivers/driver-sql/src/sql-driver.tsmapAggregateFunc() 拿到什么查什么,不归一化。

TursoDriverurl 选面(本地/副本继承 SqlDriver,远程委派 RemoteTransport),于是同一个驱动、同一条查询,答案取决于连接串。在 origin/main @ 80f7dc6a3 实测(一条 aggregations: [{ function, field: 'stage', alias: 'n' }]):

COUNT           REMOTE -> RESOLVED  "SELECT count(\"stage\") AS \"n\" FROM \"deal\""
COUNT           LOCAL  -> THREW     "Unsupported aggregate function: COUNT"

COUNT_DISTINCT  REMOTE -> THREW     "Unsupported aggregate function: count_distinct"   (注意:回显的是归一化后的名字)
COUNT_DISTINCT  LOCAL  -> THREW     "Unsupported aggregate function: COUNT_DISTINCT"

Median          REMOTE -> THREW     "Unsupported aggregate function: median"
Median          LOCAL  -> THREW     "Unsupported aggregate function: Median"

第一行是分叉本身:一个面返回行,另一个面抛错。后两行是同一归一化的影子 —— 拒收消息回显的名字不是调用方写的那个。

为什么记一笔

为什么今天没人撞上(=> 观察类)

  • 全仓搜 function: 'COUNT' / 'SUM' / 'AVG' / 'MIN' / 'MAX'(大写)零命中,没有活体发送方;
  • 经 REST/协议门进来的查询过 AggregationNodeSchema,大写拼写在到达任何驱动之前就被拒;
  • 只有绕过 spec 校验的进程内调用方才够得着。

修法(供分诊,两个方向相反)

  1. 收紧 remote(契约优先,倾向这个):删掉 .toLowerCase(),两面都只认协议声明的小写拼写,COUNT 在两面都落 drivers(sql,turso): Unsupported aggregate function 两面都是裸 Error(code/status 皆 undefined),且三个 spec 已声明的聚合函数无任何 SQL 后端编译 #5907 的第 1 类拒收(INVALID_QUERY / 400,「不是已声明的聚合函数」)。与本仓两次同形先例一致(RemoteTransport.findOne 的未声明 string-id 分支、FilterArray 的第二套编译器,都是删掉后收敛到一种拼写)。代价:任何今天靠大写拼写工作的进程外调用方会开始拿到 400 —— 但那本来就不是协议表达得出的输入。
  2. 放宽 local:给 mapAggregateFunc 也加 .toLowerCase()。两面同样收敛,但方向是把方言固化成第二套事实上的契约,PD#12 明确反对。

已经钉住的部分

#5907 的 PR 在 remote-transport-aggregate-function-refusal.test.ts 里留了一条如实记录现状的用例([filed, not fixed] COUNT still compiles HERE while the local driver refuses it),这样下一个读者是读到它、而不是重新踩一遍;同一 PR 也把两面的拒收分类改为按调用方写的原始拼写判定,免得归一化差异顺着信封扩散(否则 COUNT_DISTINCT 会在 remote 拿 501、在 local 拿 400)。所以本单剩下的只有「什么能编译」这一半。

相关:#5907(带出本单)、#5769(同族 local/remote 叉)、#6188(那三个已声明未实现的函数按 ADR-0049 的去留)。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions