# ChuSQL 当前限制与风险
进度见 progress.txt，设计见 design-decisions.txt；仅记录未解决的限制。

## 事务、恢复与并发

### 事务快照与冲突

- SQL 工作行集仍整库物化，持久化行版本目录每次发布也会读取整库并写出文件。每会话一个事务，无嵌套事务，事务内禁止 DDL / USE；未提供按需版本读取和增量版本日志。
- BEGIN / COMMIT 仍有快照传输和修改表比较成本。SERIALIZABLE 写事务按表复查读依赖，可能因不同行的变化发生保守冲突；未提供谓词锁或 SSI。长期快照阻止旧版本和退役文件回收，增加内存、磁盘与 I/O 成本。旧版本的内存回收随事务结束完成，磁盘版本文件在后续发布时收缩。

### Web 编辑生命周期

- Web 首次加载业务表即固定编辑快照，同一登录会话只允许一个页面持有编辑事务；系统身份表只读，通过 SQL 管理。
- 页面关闭的回滚请求可能因断线未送达；此时按会话空闲 / 最长寿命过期清理，后台每分钟检查一次。编辑连接失效后必须重新登录，不能恢复旧快照。

### 提交与存储边界

- 行锁和唯一键锁跨请求保留到事务结束，保存点回滚不提前释放锁。总锁等待上限为 5 秒，死锁或超时中止事务；调用方须 ROLLBACK 后重做业务检查，无自动重试。缺少可用整数 id 或旧重复 id 时，物理提交可能整表替换，但合并与冲突使用内部行编号。
- 原始存储整表替换仍兼容旧重复 id；普通插入会在提交前拒绝 id 索引冲突。这不表示存储端已完整执行 SQL 的全部唯一性和类型约束，SQL 约束仍由引擎校验。

### 恢复与锁

- 逻辑 WAL 仍为 redo，逻辑重放范围按库检查点决定。页 LSN 与全页镜像用于修复撕裂页，不代表已经实现按页跳过任意逻辑操作；恢复需重建受影响表的派生索引，代价随数据量增长。库目录建删不走 WAL，删库用墓碑目录处理。
- recovery_required 期间除 Ping / SystemStatus 外请求被拒绝，需恢复后继续。
- 同库可并行准备不同行的修改；最终校验、WAL 发布和页刷盘仍按库串行。权限和 DDL 全局排序。管理员原始存储写入不取得 SQL 事务行锁，版本变化会使冲突的旧事务拒绝提交。未给出吞吐量或尾延迟保证。
- 权限变更只标记 TCP 连接失效，客户端下一次请求收到 unauthorized 后关闭，空闲连接不会立即断开；并发测试不证明性能提升。

## 查询与性能

### 行与索引容量

- 堆行的 JSON 编码必须放入单页（默认 4096 字节，含页头与槽位开销），尚无长行溢出页；TEXT 不表示可存任意长度正文。普通提交组会在写 WAL 前拒绝超页行。
- 标量索引键默认最多 128 字节，按页容量与分支数计算有效上限，密集旧配置可能仍只有 64 字节；字符串按 UTF-8 字节计数，普通写入与建索引在提交前拒绝超限。非索引文本仅受声明长度和整行容量限制；写入长键后不得降级到仅支持 64 字节的旧二进制。

### 成本估算与统计

- 基础成本及贪心连接重排，无动态规划或跨外连接重排；只在行序不可观察处重排。
- catalog 行数可能滞后，distinct 有上限；16 桶等宽直方图只统计数值并按闭区间估算，增量维护可能偏差，桶内分布仍为估算。
- 内存统计去重上限为 4096，暂不提供直方图或索引成本；派生表可从透明算子估计行数，含聚合或可能报错表达式时仍保守。投影下推保留所有计算项，不消除潜在错误。

### 子查询与并行执行

- 查询内物化只在内存保存结果，尚无容量预算或磁盘溢出；既有按绑定分组求值可能更早报告同一错误。
- CTE 解析期展开，不支持递归、写语句或 MATERIALIZED / NOT MATERIALIZED 指定；不同优化子树不能共享物化。只能引用前面定义的 CTE，前向引用按普通表名解析。
- 半连接重写尚未覆盖组合谓词、复杂相关条件、多键、相关聚合或排序截断；可能报错的相关投影继续走原执行路径。
- 并行只覆盖页区间扫描：schema 至少 1000 行、最多 8 线程，无页内并行，统计滞后可退回顺序扫描。
- 显式 compact 使用影子文件在线复制和 WAL 代次切换，但仍物化完整行集。最终追平与切换独占库门；并发变化较多时可能重写较长后缀，不能保证固定切换时延。中途失败的未发布代次在重启恢复后清理；启动隐藏列整理仍离线重写。

## 权限与兼容性

### 旧数据与对象身份

- 旧目录或历史行中的非法字段名不自动改名；原始扫描与旧 WAL 重放仍可用，但新写入或重写载荷须提供合法顶层字段名。迁移需显式整理字段，不能靠升级自动修正。
- 对象权限快照整体写入，鉴权会读取身份、成员和对象元数据；尚未针对大规模权限目录做性能基准。
- 对象高水位损坏或回退后无法恢复已删除对象的编号上限；旧二进制会丢弃新增目录字段，不应降级使用已升级的数据目录。

### 权限功能与迁移

- 无列级权限、所有权转移或角色 ADMIN OPTION。
- 旧授权缺少授予来源，迁移为管理来源；旧全局 * 只绑定迁移时现存表。没有身份改名命令；已有同名 public 身份在删除前不会解析为虚拟 PUBLIC。
- 尚无 CREATEDB / CREATEROLE、继承开关、口令到期、连接上限或 Web 专门的身份属性编辑界面。
- 旧账号与角色重名会阻止迁移；迁移后的身份目录与 DOMAIN 编码不支持旧二进制。更早的 __chusql_users 无自动迁移。
- 旧配置 host 不读取，web.static_dir / web.user 被忽略，升级需按 docs/config.md 调整。
- 引导不重设已有口令、不提升已降权身份；类型定义冲突需人工解决。

## 类型与语义

### 范式与类型能力

- 范式分析最多 12 列；领域原子性和依赖完整性由用户声明，信息不足时不认证高阶范式。分解建议仅一轮，不保证子关系已达 BCNF；尚无自动迁移。
- DOMAIN 尚无 CASCADE、改名、修改基础类型、NOT VALID 及显式事务内 DDL；ALTER DOMAIN 读取整库快照，尚无按依赖扫描或磁盘溢出；尚无 ENUM 或用户定义复合类型。内置目录不能靠增加行扩展基础类型。
- DECIMAL 仍使用浮点表示，不是精确十进制存储；整数类型共用整数表示，CHAR 不补空格。
- 少量接口设置仍用字符串类型名；Haskell 值语义和 Rust 索引键分开维护。旧 ColumnType / RelOp 仍是兼容桥，完整能力、转换及关系 IR 迁移待后续阶段。

### 绑定与执行隔离

- 多请求查询不提供整条查询的数据快照；旧目录无有效对象编号时无法证明历史对象身份。执行期外层行仍使用扁平布局，原始关系执行 API 仍允许名称引用；尚无独立作用域或来源编号。
- 引擎直接调用存储时，各次操作分别取门，尚无整条语句的数据快照或数据冲突检测。服务端会话已对数据写入及提交整体串行，但不提供自动提交语句在 I/O 失败后的整体回滚。来源/列缺少独立身份，不能视作完整写入 bound IR；建表、库及 DOMAIN 管理不在已有表写计划范围。
- CHECK 仍以表达式文本持久化；RENAME COLUMN 不自动改写依赖 CHECK，引用旧列名时拒绝改名。普通原始存储 DDL 不具有 Haskell 的完整表达式语义校验。

### 复合值与协议

- 内建运行时类型已提供 Eq / Ord / Hash 能力，尚无用户注册的运算实现或复合索引键编码；运行时类型的索引、UNIQUE / PRIMARY KEY 仍拒绝。复合字段在 Web 通过 SQL 修改，没有结构化单元格编辑器。
- 运行时协议使用版本 1，旧客户端不支持新增类型化值；Web 的 JSON 数值仍受 JavaScript 安全整数范围限制。
- 派生表输出取裸列名，重复名称报错；未定型 NULL 仅用于查询类型推导，不可声明为存储列类型。

## 构建、发行与安全

### 离线维护

- 离线 recover 依赖完整可用 WAL，不能保证修复损坏数据页或已截断的历史；未知系统表缺少结构时需备份或 reset。目录计数器损坏后无法还原已删除身份编号上限。
- 旧版进程不支持数据目录独占锁；维护前必须停止所有相关进程。

### 本机认证与平台验收

- sudo 本机认证需提升身份启动 server；当前只映射 Unix root / Windows 提升 Administrators 到一个显式配置身份，无任意 OS 用户映射或自动提权。异常退出留下的端口凭据目录须在确认停止后手工清理。
- sudo 的 Windows 提升成功路径、macOS 编译运行及 Linux 完整提升 server/CLI 链路仍待目标平台实机验收；Debian/WSL 已验证原生凭据安全边界。

### 构建与发行

- 直接构建独立 Stack 工程时可能复用旧注册库，必要时使用 --force-dirty 或全量门禁 -Full；Haskell 构建须串行。
- 存储协议变化后必须重建实际 cdylib，开发环境须配置 PATH / LD_LIBRARY_PATH；旧命名构建工件仍可能残留。
- 真实 server 测试须先引导并能找到 bootstrap；注释检查对部分多行语法可能误报。
- GitHub 在线安装、Linux $ORIGIN 与 macOS 发布仍需实机验证；无 Release 时在线安装无法取得预编译资源。
- SHA256 只能检测损坏，无发布签名；外部采集仍可能记录 SQL 原文。旧 CLI 历史不自动清理，任意业务字符串中的敏感数据不自动识别。

### 容器验收范围

- 容器仅验收 Linux amd64、本次工作区源码镜像及本机已有 ChuBlog 数据库镜像的升级；五分钟负载与 SIGKILL / 检查点 ENOSPC 回归不替代生产长期稳定性、真实断电或任意版本升级验证。
- 部分 Docker 代理的镜像源模式会返回 502，可显式设置 BASE_REGISTRY；构建器不自动继承 Engine 的镜像源。WSL 曾退出但原因未确认，仍须限额构建，或在构建机生成后导入。

## 博客接入边界

- examples/blog 提供数据库 schema、旧文件字段映射及真实驱动验收，不修改 ChuBlog 当前文件账户实现。生产账户迁移、HTTP / SSH 授权、会话与查阅凭据版本检查、哈希升级、限流、匿名身份合并及文件访问控制仍由 ChuBlog 配套实现。数据库或身份查询失败时应用必须拒绝受保护访问。
- 博客关联尚无数据库外键；双方写入及物理删除需采用 SERIALIZABLE 事务检查存在性和关联明细。评论按字数、UTF-8 字节、请求体和配额限制，整行仍须适配页容量，不提供长行 / 溢出存储。
- 本阶段没有重建 Docker 镜像；已验收镜像仍对应 progress.txt 中的可靠性阶段版本，不含当前事务及长键改动。腾讯云内网 Debian 源仅按要求修改，未执行网络或构建验证。

### 页格式与升级边界

- 新增 .pages（版本 1 页 LSN / 写序号）、.page-wal（CPW1 全页镜像）及临时 .pages.pending。停机备份和迁移必须复制整个数据目录，不得只复制 .db / .idx；首次写入页版本后禁止旧二进制写该目录。
- 全页镜像可修复镜像已完整同步后的撕裂写；可检测到的镜像或页元数据格式损坏会报错，不能检测或修复任意介质损坏。不提供真实断电、文件系统或硬件缓存丢失的保证。
