🐛 fix(tsl_syntax): repair lookup engine and reconcile reference facts
lookup.py: exempt code-anchored ASCII identifiers from the mixed zh/en gate so exact hits are no longer dropped; dedup parent/child sections in results; validate write-prelude anchors in --check. references: correct interpreter-verified facts (case-as-expression, control-flow semicolons, __line__/__stack_frame, tslObjects order, destroy timing, ErrDefine, truncated outputs), fix headings, scope qualifiers and reversed quotes; strip dead preamble metadata from all 24 pages. packaging: exclude __pycache__/*.pyc from playbook and bundle copies; update build test file-count assertion to match. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,15 +1,10 @@
|
||||
# TSL TS-SQL
|
||||
|
||||
文档类型:语法主线
|
||||
是否可直接用于生成代码:是
|
||||
是否含可直接照写示例:是
|
||||
是否含不可照写反例:是
|
||||
|
||||
这一篇是 TS-SQL 的唯一语法入口:内存数组查询、返回形态、字段访问、`where` / `group by` / `order by`、一维数组查询、多表 `join`(含 `left join`)、`insert` / `update` / `delete` 写回、`thisGroup`、`thisRowIndex`、`refMaxOf` / `refMinOf` 都在这里收拢。
|
||||
|
||||
## 本篇职责
|
||||
|
||||
回答”写 TS-SQL 查询和写回时,怎样从最小 `select ... from ... end` 骨架开始,逐步处理筛选、分组、排序、多表联接(含 LEFT JOIN)、组内子查询、极值引用,以及如何用 `insert`/`update`/`delete` 修改内存数组”。
|
||||
回答“写 TS-SQL 查询和写回时,怎样从最小 `select ... from ... end` 骨架开始,逐步处理筛选、分组、排序、多表联接(含 LEFT JOIN)、组内子查询、极值引用,以及如何用 `insert`/`update`/`delete` 修改内存数组”。
|
||||
|
||||
## 智能体 TS-SQL 判断流程
|
||||
|
||||
@@ -27,7 +22,7 @@
|
||||
- TS-SQL 是 TSL 自带的类 SQL 查询语法,不是金融业务函数库。
|
||||
- 基础查询文档骨架是:以 `select` / `sselect` / `vselect` / `mselect` 开始,以 `end` 收尾。
|
||||
- `from` 后面可以直接跟内存数组结果集。
|
||||
- 在内存二维结果集上,文档字段访问写法是 `["字段名"]`。
|
||||
- 在内存二维结果集上,文档字段访问写法是 `["字段名"]`;列没有名字(如直接来自数组)时用位置下标 `[0]`、`[1]` 访问。
|
||||
- 在一维数组上做 TS-SQL 时,优先使用 `thisRow` 和 `thisRowIndex`。
|
||||
- `select` 返回二维结果,`sselect` 返回一维结果,`vselect` 返回单值,`mselect` 返回 `Matrix`。
|
||||
- `where`、`group by`、`order by` 可以直接接在 `from` 后面继续使用;`order by` 支持 `asc`/`desc` 与多列逗号分隔。
|
||||
@@ -314,7 +309,7 @@ writeLn("(1,1):", result[1]["vb"]);
|
||||
- `on` 子句指定联接条件,用 `[1].["k"] = [2].["k"]` 匹配键
|
||||
- 其他联接类型:`right join`(保留右表)、`full join`(保留双方)、`cross join`(笛卡尔积)
|
||||
|
||||
### JOIN 家族其余形态
|
||||
### `right join` / `full join` / `cross join` 与逗号联接
|
||||
|
||||
`right join` / `full join` 的不匹配行同样用 `nil` 填充:
|
||||
|
||||
@@ -439,7 +434,7 @@ writeLn("(1,0):", a[1]["id"]);
|
||||
|
||||
- `insert into 数组变量` 直接修改原数组
|
||||
- `insertfields([字段列表])` 指定要插入的字段
|
||||
- `values(...)` 提供对应值,可以写多组 `values`、`values` 实现批量插入
|
||||
- `values(...)` 提供对应值,可以连续写多组 `values(...)` 实现批量插入
|
||||
|
||||
批量插入可以直接跟一个同结构数组,`insertfields` 也支持一次给多字段赋值:
|
||||
|
||||
@@ -573,11 +568,13 @@ writeLn(mrows(a));
|
||||
代码块身份:可直接照写示例
|
||||
|
||||
```tsl
|
||||
a := array(("cls": "A", "en": 90), ("cls": "A", "en": 80), ("cls": "B", "en": 85));
|
||||
a := array(("cls": "A", "en": 90), ("cls": "A", "en": 80), ("cls": "A", "en": 90), ("cls": "B", "en": 85));
|
||||
distinct_rows := select distinct ["cls"] from a end;
|
||||
distinct_sum := vselect sumof(distinct ["en"]) from a end;
|
||||
plain_sum := vselect sumof(["en"]) from a end;
|
||||
writeLn(mrows(distinct_rows));
|
||||
writeLn(distinct_sum);
|
||||
writeLn(plain_sum);
|
||||
```
|
||||
|
||||
代码块身份:输出片段
|
||||
@@ -585,12 +582,13 @@ writeLn(distinct_sum);
|
||||
```text
|
||||
2
|
||||
255
|
||||
345
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- `select distinct [字段]` 折叠重复行
|
||||
- `sumof(distinct [字段])` 只对不同值求和:`90 + 80 + 85 = 255`
|
||||
- `sumof(distinct [字段])` 只对不同值求和:`90 + 80 + 85 = 255`;不加 `distinct` 时重复的 `90` 计两次,得 `345`
|
||||
|
||||
### `as` 别名、`as nil` 与字段区间
|
||||
|
||||
@@ -805,10 +803,7 @@ integer
|
||||
|
||||
### `aggof` 自定义聚集扩展
|
||||
|
||||
> 代码块身份:仅服务端可执行示例
|
||||
> 本地 `TSL.exe` 会报 `AggOf Init Error`;下例在服务端(pyTSL)验证通过。
|
||||
|
||||
`aggof('名称', 表达式)` 调用一个自定义回调函数做聚集:
|
||||
`aggof('名称', 表达式)` 调用一个自定义回调函数做聚集。本地 `TSL.exe` 会报 `AggOf Init Error`;下例在服务端(pyTSL)验证通过:
|
||||
|
||||
代码块身份:仅服务端可执行示例
|
||||
|
||||
@@ -855,6 +850,7 @@ TS-SQL 的最短默认骨架如下:
|
||||
代码块身份:可直接照写示例
|
||||
|
||||
```tsl
|
||||
source_rows := array((1, 10), (2, 20));
|
||||
query_result := select * from source_rows end;
|
||||
```
|
||||
|
||||
@@ -894,7 +890,7 @@ query_result := select A from source_rows end;
|
||||
query_result := select [0] from values end;
|
||||
```
|
||||
|
||||
这种对一维数组直接用 `[0]` 的写法虽然返回长度为 `3` 的结果,但取到的值是 `nil`,不能当成可靠入口。对一维数组应改用 `thisRow` 和 `thisRowIndex`。
|
||||
这种对一维数组直接用 `[0]` 的写法虽然能返回与源数组等长的结果,但取到的值是 `nil`,不能当成可靠入口。对一维数组应改用 `thisRow` 和 `thisRowIndex`。
|
||||
|
||||
代码块身份:反例 / 不可照写
|
||||
|
||||
|
||||
Reference in New Issue
Block a user