Skip to content

drivers(sql,turso): Unsupported aggregate function 两面都是裸 Error(code/status 皆 undefined),且三个 spec 已声明的聚合函数无任何 SQL 后端编译 #5907

Description

@os-zhuang

#5769 的实测中带出(该单只做条件层拒收闸;维护者在 #5769 正文点名同轮该看 remote-transport.ts:462,但实测发现它不是单面问题,单独修 remote 会制造一条 local/remote 叉,故按「明确说明不做及理由」拆出本单)。

事实一:同一条件,两处裸 Error

  • packages/drivers/driver-turso/src/remote-transport.ts:462
    throw new Error("Unsupported aggregate function: " + funcRaw)
  • packages/drivers/driver-sql/src/sql-driver.ts:6753(mapAggregateFunc,由 SqlDriver.aggregate:3103 调用)
    throw new Error("Unsupported aggregate function: " + func)

两处都不带 code / status。在 origin/main(5c94f833c)上实测 remote 面:

aggregate({ aggregations: [{ function: 'median' }] })
  → THREW code=undefined status=undefined msg="Unsupported aggregate function: median"

mapDataErrorerror.code / error.status 组装信封,两者皆无 → 落默认分支 →
只剩一个 error 字段装消息文本、没有 code,并按 500 一类记日志,而这本是 400 类
的调用方错误。这正是 #1116/#1117 给过滤器拒收补信封的同一个缺口,只是换了个入口。

只修 remote 会把事情变坏:remote 变成 INVALID_QUERY/400,local(SqlDriver,
Turso local 继承)仍是裸 Error —— 一个条件、两种线上身份、取决于 url,正是
#5769 花整单去关的那类叉,方向反过来而已。所以这单的落点是两面同改

事实二:三个 spec 已声明的聚合函数没有任何 SQL 后端编译

packages/spec/src/data/query.zod.ts:108 AggregationFunction 声明 8 个:

'count', 'sum', 'avg', 'min', 'max', 'count_distinct', 'array_agg', 'string_agg'

SqlDriver.mapAggregateFuncRemoteTransport.aggregate 各自只编译前 5 个,
后 3 个落同一句 Unsupported aggregate functiondriver-mongodb
(mongodb-aggregation.ts:139/144/147)和 driver-memory
(memory-analytics.ts:866,count_distinct)则实现了其中若干 —— 即声明 ≠ 实现,
且各后端实现的子集还不一样(Prime Directive #10)。

于是 :462 这一句今天同时承担两种性质不同的条件:

  1. 协议根本没声明的函数名(median)—— 调用方写错了,INVALID_QUERY / 400 一类;
  2. 协议声明了、这个后端编不出的函数(count_distinct / array_agg / string_agg)
    —— 不是调用方的错,是能力缺口。

driver-memoryfilter-refusal.ts 已经为过滤器算子画过这条线(#5345:
unknownFieldOperatorError 之于「协议没有这个算子」,对比「协议有、这个面降不下去」),
把两者合并成一句会告诉一个写 count_distinct 的看板作者说他打错字了。

建议落点(需要一次裁定,故不夹带在 #5769 里)

复现

// remote
const t = new RemoteTransport(); t.setClient(client);
await t.aggregate('deal', { aggregations: [{ function: 'median' }] });
// local
await new TursoDriver({ url: ':memory:' }).aggregate('deal', { aggregations: [{ function: 'count_distinct', field: 'stage', alias: 'n' }] });

两者都抛 Unsupported aggregate function: …,code / status 均为 undefined

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions