Files
ChuSQL/.agents/context/known-issues.txt
T
ChuNa7a 6996e19694
build / build (push) Blocked by required conditions
tests / build (push) Waiting to run
tests / tests (push) Waiting to run
修bug,完善功能
2026-10-16 23:52:12 +08:00

122 lines
11 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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;首次写入页版本后禁止旧二进制写该目录。
- 全页镜像可修复镜像已完整同步后的撕裂写;可检测到的镜像或页元数据格式损坏会报错,不能检测或修复任意介质损坏。不提供真实断电、文件系统或硬件缓存丢失的保证。