5.0 KiB
自定义类型与预定义类型
本文描述 ChuSQL 当前实现。预定义类型是引擎已经支持的基础类型;自定义类型使用 DOMAIN 给基础类型命名,便于多个表列复用同一类型定义。
自定义类型 DOMAIN
DOMAIN 按数据库保存,保留名称并复用基础类型的校验与运算语义。可引用内置类型或当前库已有 DOMAIN;被列或其他 DOMAIN 引用时不能删除。
创建、使用、查询和删除的语法及限制见 SQL 语法。
预定义类型的含义
安装期间,引导程序将下列 18 个名称及别名登记到系统类型目录。大小写不影响识别。
| SQL 名称 | 含义与默认行为 | 目录中的默认 base_type |
接受参数 |
|---|---|---|---|
| INT、INTEGER | 整数,两种名称等价 | int |
否 |
| BIGINT | 大整数类型名称 | bigint |
否 |
| SMALLINT | 小整数类型名称 | smallint |
否 |
| VARCHAR | 可变长文本;省略长度时不设声明长度上限 | str |
是:VARCHAR(n) |
| CHAR | 有长度限制的文本,默认长度 1 | char(1) |
是:CHAR(n) |
| TEXT、STR | 文本,两种名称等价 | str |
否 |
| BOOLEAN、BOOL | 布尔值 TRUE / FALSE |
bool |
否 |
| FLOAT、REAL | 浮点数,两种名称等价 | float |
否 |
| DOUBLE | 双精度类型名称 | double |
否 |
| DECIMAL、NUMERIC | 指定精度和小数位的数值,默认 (10, 0) |
decimal(10,0) |
是:(p) 或 (p,s) |
| DATE | 日期,使用 YYYY-MM-DD 格式 |
date |
否 |
| TIMESTAMP | 日期与时间 | timestamp |
否 |
| BLOB | 二进制数据类型名称 | blob |
否 |
上述名称表达类型分类,不表示已经完整复刻 PostgreSQL 的存储和数值行为。当前整数类型共用整数值表示;浮点类型共用浮点值表示;CHAR(n) 检查字符长度,不自动补空格。DECIMAL(p,s) 要求 1 <= p <= 308、0 <= s <= p,使用有限浮点表示并按小数位舍入,恰好半值时取偶数;舍入后的绝对值达到 10^(p-s) 即报精度溢出。它不能视为精确十进制存储。
系统类型目录字段
全局预定义类型目录为 system.__system_types,每个名称或别名单独占一条记录。
| 字段 | 含义 |
|---|---|
id |
类型记录的持久化编号 |
name |
小写类型名称,例如 integer 或 varchar |
base_type |
不带显式参数时的规范基础表示;例如 integer 对应 int,varchar 对应 str |
parameterized |
该名称是否接受长度、精度等类型参数;不表示具体列已经指定了参数 |
例如,目录中的 varchar 记录表示支持 VARCHAR(n);实际列声明为 VARCHAR(32) 时,长度 32 保存在列结构中,而不是修改全局目录记录。
该目录是受保护的系统元数据,普通 SQL 不直接展示或修改它。类型执行语义由引擎实现,不能通过手工增加目录行获得新的基础类型。安装登记不会创建任何预定义 DOMAIN;DOMAIN 定义另存于各工作库的 catalog。
首次安装完成管理员初始化后登记类型。重复引导保留一致的记录并补齐缺失项;同名定义冲突会报错,停止安装启动流程,不覆盖现有定义。
DOMAIN 约束设计(尚未实现)
以下约束与 ALTER 能力是后续设计,当前 DOMAIN 仍只提供类型命名。实施依赖 bound IR,先固化类型、列身份与表达式求值规则。
约束与默认值语义
定义扩展为基础类型引用、可选 DEFAULT、NOT NULL、命名 CHECK 及定义版本。CHECK 只接受绑定的单值 VALUE 表达式和确定性内置函数,禁止子查询、表引用和自定义副作用函数;CHECK 的 false 拒绝,unknown 允许,NOT NULL 独立拒绝 NULL。嵌套领域从底层向外校验,约束取交集;显式列默认优先,否则使用最近外层有定义的领域默认,只在省略列值时使用,不替换显式 NULL。
引擎与存储校验
server/engine 负责绑定;Rust 存储根据版本化约束 IR 在全部写入口再次验证,包含批写、原始请求和迁移。两层必须共享运算符标识、类型及 NULL 规则并用相同测试向量验证;不能让 Rust 重新解析 SQL 或只依赖客户端验证。解析诊断不得吞错。
结构变更与持久化
首版仅支持 CREATE 带约束与 ALTER 添加经全量验证的约束、修改默认;不支持 NOT VALID 或 CASCADE。ALTER 在稳定 schema/数据视图中校验所有直接和间接使用列,短锁发布前复查版本;失败不改变定义。类型定义、依赖版本和受影响 schema 同一 WAL 组提交。现有 DOMAIN 空目录表升级为明确版本元数据,旧编码读入并转换,拒绝无法解析的定义。
验收条件
验收覆盖嵌套默认优先级、三值 CHECK、NULL、批写全回退、领域改变并发写、循环/间接依赖、内存事务提交与 WAL 重放。新约束加入既有事务后,提交必须按最新定义重新验证或报 schema 冲突。