修复bug
This commit is contained in:
1 parent
fc9bbc20e4
commit
e87c4ee6a8
90 files changed
+3828
-452
No files matched your search
@@ -117,7 +117,7 @@ TCP 连接在下一次请求时返回 unauthorized 并关闭;空闲连接不
|
||||
|
||||
## 查询引擎扩展设计(尚未实现)
|
||||
|
||||
按 bound IR → 子查询物化 / 递归 CTE 推进;DOMAIN 约束见[类型文档](types.md#domain-约束设计尚未实现)。以下设计尚未实施,当前能力见前文;实施状态以 agent-credientials/progress.txt 为准。
|
||||
按 bound IR → 子查询物化 / 递归 CTE 推进;DOMAIN 约束见[类型文档](types.md#domain-约束设计尚未实现)。以下设计尚未实施,当前能力见前文;实施状态以 .agents/context/progress.txt 为准。
|
||||
|
||||
### bound IR
|
||||
|
||||
|
||||
@@ -44,6 +44,8 @@ csql [options]
|
||||
| `-d, --database DB` | 登录后选择数据库 |
|
||||
| `-f, --format FORMAT` | 输出格式:`table`、`json` 或 `csv` |
|
||||
| `-e, --execute SQL` | 执行一条 SQL 后退出 |
|
||||
| `--normalize TABLE` | 只读分析表的范式;与 `--execute` 互斥,需 `--declaration` |
|
||||
| `--declaration FILE` | UTF-8 JSON 业务依赖声明;范式输出使用 `--format text` 或 `json` |
|
||||
| `--history FILE` | 指定历史记录文件 |
|
||||
| `--sudo` | 使用本机 root / 提升管理员身份认证;需配置映射并启用身份属性,见 [用户与角色](users-and-roles.md#本机-sudo-认证) |
|
||||
| `--config FILE` | 指定配置文件 |
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
# ChuSQL 技术总结与数据库课程答辩
|
||||
|
||||
完整学习与答辩材料已集中到仓库根目录的 `learnning/`:
|
||||
|
||||
- [分章节学习目录](../learnning/README.md)
|
||||
- [答辩总览](../learnning/00-defense-overview.md)
|
||||
- [关键函数导航](../learnning/17-function-atlas.md)
|
||||
- [现场演示与排练](../learnning/14-demonstration.md)
|
||||
@@ -105,6 +105,28 @@ csql-web
|
||||
|
||||
管理员使用安装时设置的口令登录。
|
||||
|
||||
## 更新
|
||||
|
||||
重新运行安装脚本,指定相同的安装目录和组件即可更新,也可用 `--version TAG` 选择版本:
|
||||
|
||||
```sh
|
||||
./install.sh --component both --install-dir "$HOME/.local/share/chusql" --version <tag>
|
||||
```
|
||||
|
||||
Linux 更新会先停止该安装目录中的 Web 和数据库进程,保留已有 `settings.toml`、数据库和管理员口令,再引导检查系统目录。修改数据位置须编辑配置并自行迁移数据;更新时不能用不同的 `--data-dir` 覆盖现有配置。安装默认重启数据库服务,Web 管理端需重新运行 `csql-web`。
|
||||
|
||||
Linux 安装目录中保留 `uninstall.sh`。卸载时指定安装目录,数据目录默认读取现有配置。
|
||||
|
||||
已构建的 Linux 包可用隔离验证脚本测试,不修改正常安装的配置或数据:
|
||||
|
||||
```sh
|
||||
python3 scripts/test-linux-lifecycle.py releases/chusql-linux-x86_64.tar.gz
|
||||
```
|
||||
|
||||
该验证需要 Python 3,使用真实数据库程序,覆盖安装、运行中更新、配置与 SQL 数据保留、保留数据卸载、重装和完全卸载;基础验证通过 `--no-service` 隔离 systemd 服务。
|
||||
|
||||
添加 `--systemd` 可验证真实用户服务的注册、启动、更新及卸载。此选项要求不存在已有的 `chusql-server.service`,并且当前用户能够启用 linger(或已由管理员启用);临时单元链接会在测试后清理。本机 HTTP 发行站夹具用于验证在线安装流程,不依赖 GitHub 上已有 Release。
|
||||
|
||||
## 卸载
|
||||
|
||||
Linux / macOS:
|
||||
|
||||
+36
-11
@@ -84,33 +84,58 @@ schema 类型不证明业务意义上的原子性。不满足 1NF 时更高范
|
||||
|
||||
建议只是一轮分解,子关系可能仍需继续分析,不承诺一次达到 BCNF。依赖不保持时需跨关系检查原约束。
|
||||
|
||||
## 第一阶段限制
|
||||
## 当前限制
|
||||
|
||||
- 最多接受 12 列,超过返回错误,避免指数枚举无界增长。
|
||||
- 仅提供 Haskell 只读 API。
|
||||
- CLI / Web 入口和自动迁移尚未实现。
|
||||
- 提供 Haskell 只读 API、TCP 专用请求、CLI 和 Web 结构入口;不执行数据迁移。
|
||||
- 输入与输出有预算,超过预算返回明确错误,不截断为完整报告。
|
||||
|
||||
## 后续入口设计(尚未实现)
|
||||
## TCP、CLI 与 Web 入口
|
||||
|
||||
以下 TCP、CLI 和 Web 接口尚未实现,拟议命令与端点目前不可用。实施状态以 agent-credientials/progress.txt 为准。
|
||||
以下只读入口已实现。分析只读取 schema,不能据此认定 SQL 数据满足声明或直接执行分解。实施状态以 .agents/context/progress.txt 为准。
|
||||
|
||||
### 协议与鉴权
|
||||
|
||||
在 `ChuSQL.Interface.Protocol` 增加专用客户端请求 `normalization_analyze`,由 server 调用 engine API;不经最高权限专用的原始 `ReqStorage` 入口。请求包含 `api_version=1`、数据库与表标识、声明,以及可选的预期对象编号和 schema 指纹。server 在现有权限读门内以 catalog 解析现存对象,检查 CONNECT 与 SELECT;系统对象拒绝访问。事务内取该连接的 schema 快照,返回视图来源和对象编号,不能混入其他连接的快照。
|
||||
`ChuSQL.Interface.Protocol` 的专用客户端请求 `normalization_analyze` 由 server 调用 engine API;不经最高权限专用的原始 `ReqStorage` 入口。请求包含 `api_version=1`、数据库与表标识、声明,以及可选的预期对象编号和 schema 指纹。server 在现有权限读门内以 catalog 解析现存对象,检查 CONNECT 与 SELECT;系统对象拒绝访问。事务内取该连接的 schema 快照,返回视图来源和对象编号,不能混入其他连接的快照。
|
||||
|
||||
声明字段固定为 `declared_keys`、`dependencies`(`lhs` / `rhs`)、`dependencies_complete`、`atomic_attributes`。完整性缺省 false,原子性缺省 null;不把 PRIMARY KEY、UNIQUE 或样本自动当作完整业务依赖。前端可以展示实际 schema 约束供用户选择,确认后才成为声明。候选键的 nullable 与 SQL UNIQUE 语义单独提示,不自动证明经典关系模型的键。
|
||||
|
||||
响应包含对象编号、schema 指纹、规范化声明、候选键、四项 findings 和一次分解建议。稳定标签使用 `1nf/2nf/3nf/bcnf`、`satisfied/violated/insufficient`;条件说明与机器字段分开。所有结论标明“以声明为条件”,无损连接标签不代表现有 SQL 数据或袋语义已经验证。
|
||||
|
||||
字段名称必须与返回 schema 的确切列名一致;对象名称使用现有标识符规则,数据库限定名必须与请求数据库一致。指纹只覆盖列名、类型和约束等语义结构,排除行数与直方图;定义确定性编码并同时绑定稳定对象编号,避免同名重建复用报告。
|
||||
字段名称必须与返回 schema 的确切列名一致;对象名称使用现有标识符规则,数据库限定名必须与请求数据库一致。`schema_fingerprint` 使用 SHA256,编码为 `[库/表编号字符串数组, 列结构数组]`;每列按名称、类型、nullable、default、auto_increment、primary_key、unique、check 排列。它排除行数、索引统计与直方图,并绑定稳定对象编号,避免同名重建复用报告。对象编号在报告中使用 UInt64 范围内的正整数十进制字符串,避免浏览器数值精度损失。
|
||||
|
||||
拒绝未知协议版本、未知字段、重复字段、空右部、非最小声明键、空 schema 和超过 12 列。拟定请求上限 64 KiB、依赖条数 256、键声明 256;预算超限返回明确错误,不截断后给出完整报告。分析在有界工作队列运行,取消或超时释放权限读门与会话资源;输出也受传输预算约束,超限返回错误。实施时用最坏 12 列声明确定默认时间预算。
|
||||
拒绝未知协议版本、未知字段、重复字段、空右部、非最小声明键、空 schema 和超过 12 列。请求 JSON 上限 64 KiB、嵌套深度上限 64;依赖与键声明分别最多 256 项。服务端最多接纳 8 个请求,最多 2 个同时执行;排队、权限门等待与计算合计最多 5 秒。完整报告超过 64000 字节即拒绝,预留协议外层开销;客户端请求也为外层协议预留空间。超限返回 too_large,队列满返回 too_busy,超时返回 timeout,不截断成完整报告。取消执行或超时均释放执行槽和权限读门;断线请求最多运行至预算到期。
|
||||
|
||||
请求外层形状:
|
||||
|
||||
```json
|
||||
{"method":"normalization_analyze","request":{"api_version":1,"database":"sales","table":"orders","declaration":{"declared_keys":[["id"]],"dependencies":[],"dependencies_complete":false,"atomic_attributes":null}}}
|
||||
```
|
||||
|
||||
成功响应的 `status` 为 `normalization`,`analysis` 保存完整报告;可选 `expected_object` 与 `expected_schema_fingerprint` 放在 `request` 中。数据库必须与该连接的工作库一致;表可使用裸名或同库限定名。没有登录返回 unauthorized,系统对象拒绝分析;不会通过另一个连接代取事务视图。
|
||||
|
||||
### CLI 与 Web
|
||||
|
||||
CLI 拟议元命令为 `\normalize TABLE --declaration FILE --format text|json`,通过当前登录连接和工作库请求。声明文件为 UTF-8 JSON,错误写 stderr;成功分析退出码 0,即使结论违反或信息不足;协议、权限、输入与运行错误退出非零。批处理增加独立 `--normalize` 模式,与 `--execute` 互斥,不把元命令发给 SQL 解析器。
|
||||
CLI 元命令为 `\normalize TABLE --declaration FILE --format text|json`,通过当前登录连接和工作库请求。声明文件为 UTF-8 JSON,错误写 stderr;成功分析退出码 0,即使结论违反或信息不足;协议、权限、输入与运行错误退出非零。批处理使用独立 `--normalize` 模式,与 `--execute` 互斥,不把元命令发给 SQL 解析器。
|
||||
|
||||
Web 拟议 `POST /api/normalization/analyze`,复用登录、CSRF 和 Cookie 串行规则。入口位于表结构页:展示 schema、编辑声明、提交分析、显示证据和分解字段列表。完整性与原子性不预先勾选;没有自动执行分解按钮。编辑页分析必须携带既有页面事务标识,不能自动开启另一事务。对象或 schema 改变返回冲突并要求重新分析。
|
||||
Web 使用 `POST /api/normalization/analyze`,复用登录、CSRF 和 Cookie 串行规则。入口位于资源管理器展开表后的结构区:展示 schema、编辑声明、提交分析、显示证据和分解字段列表。完整性与原子性不预先勾选;没有自动执行分解按钮。编辑页分析必须携带既有页面事务标识,不能自动开启另一事务;SQL 控制台有事务时,分析请求携带该控制台身份并使用其快照。对象或 schema 改变返回冲突并要求重新分析。
|
||||
|
||||
声明文件示例(不自动声明完整性或原子性):
|
||||
|
||||
```json
|
||||
{
|
||||
"declared_keys": [["student", "course"]],
|
||||
"dependencies": [{"lhs": ["student"], "rhs": ["name"]}],
|
||||
"dependencies_complete": true,
|
||||
"atomic_attributes": true
|
||||
}
|
||||
```
|
||||
|
||||
```sh
|
||||
csql -d school --normalize enrollment --declaration dependencies.json --format json
|
||||
```
|
||||
|
||||
交互模式:`\normalize enrollment --declaration "My Data/dependencies.json" --format text`。成功报告即使违反范式或信息不足也退出 0;输入、权限、协议或预算错误退出非零。文本输出保留与 JSON 输出相同的报告字段。Web 在资源管理器展开表后点击“范式分析”,输入声明 JSON;初始声明为空,完整性 false、原子性 null。报告给出候选键、违反证据和一次分解建议,只有分析按钮。
|
||||
|
||||
### 入口验收
|
||||
|
||||
@@ -118,7 +143,7 @@ Web 拟议 `POST /api/normalization/analyze`,复用登录、CSRF 和 Cookie
|
||||
|
||||
## 数据迁移设计(尚未实现)
|
||||
|
||||
先实现只读入口,再在 [DOMAIN 约束](types.md#domain-约束设计尚未实现)、依赖目录和原子结构发布具备后实施迁移。
|
||||
只读入口已具备;在 [DOMAIN 约束](types.md#domain-约束设计尚未实现)、依赖目录和原子结构发布具备后实施迁移。
|
||||
|
||||
### 规划条件
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 发布签名与验证设计
|
||||
|
||||
本文定义尚未实现的发行安全方案。当前操作见[安装文档](install.md),实施状态以 agent-credientials/progress.txt 为准。先实现离线验证,再接入在线安装;该工作可独立于查询和存储扩展推进。
|
||||
本文定义尚未实现的发行安全方案。当前操作见[安装文档](install.md),实施状态以 .agents/context/progress.txt 为准。先实现离线验证,再接入在线安装;该工作可独立于查询和存储扩展推进。
|
||||
|
||||
## 选择与信任入口
|
||||
|
||||
|
||||
@@ -55,11 +55,34 @@ Rust 的通用行、目录和 WAL 路径保存该表示,读取时由共享模
|
||||
`Runtime.Binding` 提供独立的 TypedExpression 和 TypedPlan,绑定只接受 catalog schema。
|
||||
表达式和计划构造器隐藏,调用者必须经过 Binder;执行使用已解析的 TypeId / FunctionId,并校验存储行。
|
||||
该 API 覆盖单行、表扫描、投影和过滤,可构造嵌套复合值及函数调用。
|
||||
列引用按当前输入 schema 的槽位绑定,列名保留用于诊断和位置校验。独立调用 `evaluateExpression`
|
||||
必须按绑定时的 schema 顺序提供行;位置不符或类型不符明确报错。`executePlan` 在扫描边界
|
||||
校验完整行并按 schema 排序,投影后的表达式重新绑定到子计划输出槽位。
|
||||
|
||||
SQL SELECT 通过 `Runtime.Query.bindQuery` 生成不可直接构造的 BoundQuery,再由 `executeQueryM` 执行。
|
||||
绑定计划保存输出 schema 与类型身份;现有 RelOp 作为关系执行和优化的兼容桥,输出按位置校验,保留重复别名。
|
||||
类型化函数和构造器节点也进入 INSERT、UPDATE、CHECK、聚合参数和子查询。
|
||||
日期、时间戳、Blob 等阶段 A 外的类型保留明确的 CompatibilityType。
|
||||
`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 版本校验。
|
||||
旧 ColumnType 和运算符实现尚未整体移除;统一 capability、cast 和 rewrite 将在后续阶段收拢。
|
||||
|
||||
测试覆盖稳定编码、kind / 参数校验、共享协议、SQL 调用和复合列、实际存储重载、HTTP/TCP 与客户端显示。
|
||||
+16
-1
@@ -17,9 +17,20 @@
|
||||
|
||||
- `SELECT` 支持 `WHERE`、`ORDER BY`、`LIMIT`、`JOIN` / `LEFT JOIN`、`GROUP BY` 与聚合,以及标量 / `IN` / `EXISTS` 子查询和量词比较(`op ANY` / `op ALL`)。
|
||||
- 来源可以是派生表:`SELECT d.name FROM (SELECT name FROM users) d`。派生表必须带别名,内层不能引用外层列;输出列取裸列名(内层写 `u.id`,外层用 `d.id` 引用)。
|
||||
- 投影列可以起别名:`SELECT count(*) AS total FROM orders ORDER BY total`,别名就是结果集的列名。`ORDER BY` 优先使用唯一的投影别名,再查来源列;重复的排序别名报歧义错误,来源列可以用限定名消除同名冲突。排序暂不接受任意表达式或列序号。
|
||||
- 投影列可以起别名:`SELECT count(*) AS total FROM orders ORDER BY total`,别名就是结果集的列名。`ORDER BY` 优先使用唯一的投影别名,再查来源列;重复的排序别名报歧义错误,来源列可以用限定名消除同名冲突。排序接受从 1 开始的输出列序号(例如 `ORDER BY 2 DESC`),在 `*` 展开后解析,零或越界序号报错;暂不接受任意表达式。
|
||||
- 鉴权覆盖整棵来源树:查派生表时内层表也要有权限,只有外层引用的表有权限不够。
|
||||
|
||||
### DISTINCT 与 ALL
|
||||
|
||||
`SELECT DISTINCT` 按完整输出值组合去重,保留首次出现的行,然后执行排序和 LIMIT。NULL 在去重时视为相同值;等值整数与整值浮点按既有数值语义合并。默认 SELECT 或显式 `SELECT ALL` 保留重复行。
|
||||
|
||||
```sql
|
||||
SELECT DISTINCT user_id FROM orders ORDER BY 1 LIMIT 10;
|
||||
SELECT DISTINCT user_id + 1 AS next_id FROM orders ORDER BY next_id;
|
||||
```
|
||||
|
||||
DISTINCT 的排序列必须出现在输出中;排序可使用输出别名、选出的来源列或输出列序号。缺少比较能力的 List / Maybe / Tuple 类型仍拒绝 DISTINCT。去重支持连接、聚合、子查询、CTE 和当前连接的事务快照。
|
||||
|
||||
### 比较运算符
|
||||
|
||||
- 支持 `=`、`<>`(也可写 `!=`)、`>`、`>=`、`<`、`<=`;`<>` 与 `!=` 是同一个运算符。
|
||||
@@ -115,6 +126,8 @@ ALTER ROLE analyst NOSUPERUSER;
|
||||
SHOW ROLES;
|
||||
```
|
||||
|
||||
`SHOW GRANTS` 允许登录身份查看自己的有效对象权限,输出 `identity`、`privilege`、`object` 和 `grant_option`。结果包含直接授权、启用角色继承、PUBLIC 默认 CONNECT 和所有权隐含权限;表范围授权按现存表展开,超级用户展示全部业务对象权限。系统对象不列出,不接受 `FOR` 查询他人身份。该命令不要求选中工作库;事务中也读取当前权限目录。
|
||||
|
||||
`SHOW ROLES` 展示全部身份的编号、名称、登录能力、最高权限标志、启用状态及创建时间,不返回口令。`ALTER USER` 与 `ALTER ROLE` 的属性和口令修改语法通用;同一属性不能重复指定。身份管理仅允许最高权限身份执行。
|
||||
|
||||
`SUPERUSER` 不依赖启动参数里的管理员名称(`--user`),也不会通过角色成员关系继承。禁用登录身份会拒绝登录;禁用权限角色会停止贡献继承权限。属性修改会使受影响的既有连接失效,下一次请求返回 `unauthorized` 后关闭。最后一个启用且可以登录的最高权限身份不能删除、禁用、取消登录或取消最高权限。
|
||||
@@ -152,6 +165,8 @@ REVOKE SELECT ON sales.orders FROM reviewer;
|
||||
|
||||
`GRANT ... WITH GRANT OPTION` 允许再转授;所有者也可授予自身对象的权限。普通授予者可撤销自己的授予,所有者及最高权限身份可撤销对象上的其他授予。撤销时收回相应 grant option,并级联清理失去合法来源的下游授权;仍有独立来源的授权保留。转授权能力随启用的角色继承,循环转授不能独立维持权限。REVOKE 不移除所有者的隐含权限。
|
||||
|
||||
`REVOKE GRANT OPTION FOR SELECT ON users FROM alice` 只移除指定授权来源的转授权能力,保留 alice 的 SELECT 权限;失去唯一支持来源的下游授权会级联撤销,独立来源继续有效。最高权限身份或对象所有者可撤销全部匹配来源,普通授予者只能撤销自己的来源;所有权自身的权限不受 REVOKE 影响。
|
||||
|
||||
系统目录访问还受目录管理属性控制,具体能力见 [用户与角色](users-and-roles.md)。
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user