#2745·WrenAI

[错误] wren-core 在 transform_sql 期间默默丢弃显式的 ROWS 窗口框架

作者: qiboyu301-crypto创建于 2026年9月15日更新于 2026年9月15日
标签bug

** 描述错误**

恶作剧 SessionContext.transform sql ()"可以默默地放下一个明确规定的"ROWS"窗口框架,当框架是:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? UNBODED PREBEDING和当前成长之间的道路


例如:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
独立
编号,
SUM(五) 结束(
按k顺序排列
UNBODED PREBEDING和当前成长之间的道路
) AS 运行   sum
从t

在SQL规划/解析期间,可以省略明确的`UNBOUNDED PRECEDING和当前ROW之间的ROWS BETW'条款。

这并不总是保留语义。

对DuckDB来说,当“ORDER BY”出现且未指定明确的窗口框架时,默认行为使用“UNBOUNDED PRECEDING和当前ROW之间”的RANGE BETW。

ROWS ' 和RANGE ' 当`ORDER BY ' 表示包含重复值(同行)时行为不同。

因此,Wren可以生成成功执行但返回与原SQL不同的结果的SQL.

这对分析/代理生成的SQL特别危险,因为没有任何语法或执行错误表明计算语义发生变化.

** 废除**

使用 :

  • "wrenai ==:0.14.0"
  • `恶搞-py=-0.7.6'
  • DuckDB / 本地文件数据源

创建一个最小的列表 :

zz
导入基数64
导入 json

从 wren.mdl 导入获取 session context

显示={
"目录":"恶",".
"史记":"主",".
""模型": [
{
"名":"t","t".
"表格参考":{
"史记":"主",".
"表"曰:"t",""".
{\fn华文楷体\fs16\1cHE0E0E0}
"列传": [
{"姓名":"id","类型":"BIGINT"},,
{"名称":"k","类型":"BIGINT"},,
{"名称":"v","类型":"BIGINT"},,
[
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
[
"相会":[.
"观": [],.
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

显示 str = base64.b64encode ()
json.dumps(明显). encode () () (中文(简体) ).
.decode () (中文(简体) ).

ctx = 获取 session 上下文(
显示( S)
无
无
蠢货
(中文(简体) ).

sql = "" (中文(简体) ).
独立
编号,
SUM(五) 结束(
按k顺序排列
UNBODED PREBEDING和当前成长之间的道路
) AS 运行   sum
从t
"" "" ""

已规划  sql = ctx. transform  sql( sql)

打印 ("INPUT SQL:")
打印( sql)

打印 ("PLAND SQL:")
打印( 计划中的  sql)

投入明确包括:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? UNBODED PREBEDING和当前成长之间的道路


但计划中的 SQL 放弃了这个明确框架。

语义差异可以用下列方法证明:

页:1
页:1
---+--+--+--+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、导 言
2 | 1 | 20
页:1

以明确的`ROWS ' 框架:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 独立 编号, SUM(五) 结束( 按k顺序排列 UNBODED PREBEDING和当前成长之间的道路 ) AS 运行 sum 从t;


预期成果是:

页:1
id QQ 运行  sum
---+---+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、导 言
                                       
3 | 60

如果省略了明确的框架,而后端应用了"RANGE"语义,则前两行是同位素,因为两者都有"k = 1":

页:1 id QQ 运行 sum ---+---+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 一、导 言

3 | 60


SQL依然有效,但其语义已经改变.
. . . . . . .