Files
ChuBlog/docs/runtime-types.md
T

88 lines
6.4 KiB
Markdown
Raw Normal View History

2026-10-05 22:22:23 +08:00
# 运行时类型与函数基础
阶段 A 提供固定身份的内建类型、函数注册表、schema 驱动的绑定和类型化查询入口。
完整 capability、运算符注册、转换、用户 ADT 与 Extension 留在后续阶段。
## SQL 使用
```sql
CREATE TABLE typed_values (
id Int,
name String,
numbers [Int],
label Maybe String,
pair (Int, String)
);
INSERT INTO typed_values (id, name, numbers, label, pair)
VALUES (1, 'abc', LIST<Int>(1, 2), MAYBE<String>(), TUPLE<Int, String>(3, 'x'));
SELECT length(name), numbers, label, pair FROM typed_values;
UPDATE typed_values SET numbers = LIST<Int>(9), label = MAYBE<String>('ready') WHERE id = 1;
SELECT LIST<Maybe Int>(MAYBE<Int>(), MAYBE<Int>(42));
SELECT not(TRUE), length('你好');
```
类型语法支持 `Int`、`Double`、`Bool`、`String`、`[a]` / `List a`、`Maybe a` 和 `(a, b, ...)`。
构造器中的类型参数是完整逻辑类型;空列表和 Nothing 也有确定类型。
`MAYBE<a>()` 表示 Nothing,`MAYBE<a>(value)` 表示 Just;不能用 SQL NULL 代替复合值内部的 Nothing。
SQL 可空列仍接受 NULL,和 Maybe 的 Nothing 保持区别。
构造器按完整类型校验,不隐式转换 List 的元素类型。
内建签名为 `length :: String -> Int` 和 `not :: Bool -> Bool`,名称不区分大小写。
SQL 参数为 NULL 时结果为 NULL;具体非空参数仍校验类型。
尚无运行时 Eq / Ord / Hash 字典,复合类型的比较、排序、分组、极值和索引不会自动取得能力。
Web 显示复合值及 SQL 构造器预览,复合字段通过 SQL 控制台修改。
## 身份与编码
`ChuSQL.Core.Runtime` 是共享模型中的权威定义;Engine 模块导出同一组身份。
内建构造器编号固定为 Int=1、Double=2、Bool=3、String=4、List=5、Maybe=6、Tuple=7。
TypeId 包含已校验的完整构造器应用,比较和恢复不依赖注册顺序或随机哈希。
FunctionId 固定为 length=1、not=2;内建元数据可直接重建注册表。
逻辑 TypeExpr 与 PhysicalType 分开;List、Maybe、Tuple 使用递归 sequence、optional、product 表示。
schema 保存版本化的 TypeId,协议值保存版本、类型身份和 payload;包括 String 在内的运行时值共用编码。
Rust 的通用行、目录和 WAL 路径保存该表示,读取时由共享模型验证版本、类型、元素和字段个数。
未知版本、身份溢出、类型不符、非有限浮点数及损坏 payload 明确返回错误。
内建类型不可删除,复合类型的依赖完整包含在 TypeExpr 中。
旧标量 schema 和协议继续读取;包含运行时类型的数据不能交给不支持该编码的旧客户端。
## 绑定与执行
`Runtime.Binding` 提供独立的 TypedExpression 和 TypedPlan,绑定只接受 catalog schema。
表达式和计划构造器隐藏,调用者必须经过 Binder;执行使用已解析的 TypeId / FunctionId,并校验存储行。
该 API 覆盖单行、表扫描、投影和过滤,可构造嵌套复合值及函数调用。
2026-10-11 17:32:12 +08:00
列引用按当前输入 schema 的槽位绑定,列名保留用于诊断和位置校验。独立调用 `evaluateExpression`
必须按绑定时的 schema 顺序提供行;位置不符或类型不符明确报错。`executePlan` 在扫描边界
校验完整行并按 schema 排序,投影后的表达式重新绑定到子计划输出槽位。
2026-10-05 22:22:23 +08:00
SQL SELECT 通过 `Runtime.Query.bindQuery` 生成不可直接构造的 BoundQuery,再由 `executeQueryM` 执行。
绑定计划保存输出 schema 与类型身份;现有 RelOp 作为关系执行和优化的兼容桥,输出按位置校验,保留重复别名。
类型化函数和构造器节点也进入 INSERT、UPDATE、CHECK、聚合参数和子查询。
日期、时间戳、Blob 等阶段 A 外的类型保留明确的 CompatibilityType。
2026-10-11 17:32:12 +08:00
`queryTypes` 用 `DomainType 名称 基础类型` 保留每一层 DOMAIN 引用,包括嵌套领域和兼容类型。
直接列引用及派生表别名保留该身份;函数结果使用函数声明的返回类型,不继承参数的 DOMAIN。
领域名称来自当前库 schema 的解析结果;定义版本与约束绑定仍待完整 bound IR 实现。
SQL 计划在优化完成后由 `Runtime.Relation` 将投影、过滤、计算、聚合参数和连接条件中的列引用
绑定为 `ColumnSlot`。扫描、点查和范围查询在存储边界按算子布局排列返回行;相关子查询
按自己的局部布局和外层行布局绑定槽位。局部引用使用 ColumnSlot,外层引用使用 OuterColumnSlot,
保存局部布局宽度与外层相对位置;重新绑定时外层引用只在外层布局中查找,防止同名局部列捕获。
执行槽位不接受语义层再次推导,语义输入必须使用未绑定列。哈希/索引连接仍使用列名识别等值键。
投影单向转换为已有 Compute 算子,使用绑定列槽位取值;保留输出顺序、重复列及空投影的行数。
排序转换为 BoundSort,分组转换为 BoundAggregate;键使用绑定槽位,列名保留为输出标签和诊断。
排序每行计算一次键并保留同键行序,分组保留首次出现顺序及空输入全局聚合行为。
该步骤仍复用 Expr/RelOp 和扁平化外层行;多级词法作用域/来源编号及 schema 版本尚未引入。
绑定后的计划用于执行;结构改写必须在绑定前完成,或重新按新布局绑定。
执行前重新取得存储 schema,比较查询依赖表的完整列定义;依赖收集覆盖来源树、连接条件、
投影和过滤表达式里的嵌套查询,并递归追踪来源列使用的 DOMAIN 定义。缺表、列定义变化或 schema
读取失败明确返回错误,行数据、统计及无关表、无关 DOMAIN 的结构变化不使绑定失效。
Table 与 TableInfo 保留 catalog 的库编号和对象编号;执行前比较身份,可识别同名同结构的对象替换。
内存 Server 目录和存储快照同样保留身份。TableInfo 输出十进制字符串编号,读取兼容数字编号,
校验无符号 64 位范围;旧响应缺少编号或原始目录对象编号为零时,以列定义校验作为兼容路径。
身份与列定义校验不能替代服务端读写门或未来的原子 schema 版本校验。
2026-10-05 22:22:23 +08:00
旧 ColumnType 和运算符实现尚未整体移除;统一 capability、cast 和 rewrite 将在后续阶段收拢。
测试覆盖稳定编码、kind / 参数校验、共享协议、SQL 调用和复合列、实际存储重载、HTTP/TCP 与客户端显示。