From 48eec484b7edf6d2725e14a20a5d496a167fa899 Mon Sep 17 00:00:00 2001 From: LIm1tZz7 <36764786+TheBadRoger@users.noreply.github.com> Date: Mon, 5 Oct 2026 00:15:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=80=A7=E8=83=BD=EF=BC=8C=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=B3=BB=E7=BB=9F=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=8D=B8=E8=BD=BD=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 14 + .github/workflows/gate.yml | 11 + .github/workflows/linux.yml | 44 +- .github/workflows/release.yml | 8 +- .gitignore | 15 +- AGENTS.md | 34 -- README.md | 11 +- .../benchmark4csql.cabal | 13 +- {chusql-benchmark => benchmark}/src/Main.hs | 197 ++++-- {chusql-benchmark => benchmark}/stack.yaml | 0 .../stack.yaml.lock | 0 chusql-bootstrap/app/Main.hs | 91 +-- chusql-bootstrap/chusql-bootstrap.cabal | 25 +- chusql-bootstrap/src/ChuSQL/Bootstrap.hs | 77 +++ chusql-bootstrap/test/Spec.hs | 134 +++++ chusql-cli/app/Main.hs | 24 +- chusql-cli/app/Repl.hs | 10 +- chusql-cli/chusql-cli.cabal | 14 +- chusql-cli/src/ChuSQL/CLI/History.hs | 21 + chusql-cli/src/ChuSQL/CLI/Password.hs | 14 + chusql-cli/src/ChuSQL/CLI/Session.hs | 5 - chusql-cli/stack.yaml | 1 + chusql-cli/test/Spec.hs | 79 ++- chusql-core/engine/chusql-core-engine.cabal | 7 +- chusql-core/engine/src/ChuSQL/Core/Engine.hs | 11 + .../src/ChuSQL/Core/Engine/Algebra/Eval.hs | 49 +- .../ChuSQL/Core/Engine/Algebra/JoinOrder.hs | 9 +- .../ChuSQL/Core/Engine/Algebra/Optimize.hs | 12 +- .../src/ChuSQL/Core/Engine/Algebra/Planner.hs | 16 +- .../engine/src/ChuSQL/Core/Engine/Error.hs | 4 + .../engine/src/ChuSQL/Core/Engine/Semantic.hs | 171 +++++- .../src/ChuSQL/Core/Engine/Storage/FFI.hs | 16 + .../src/ChuSQL/Core/Engine/Storage/Memory.hs | 22 + .../src/ChuSQL/Core/Engine/Syntax/AST.hs | 5 + .../src/ChuSQL/Core/Engine/Syntax/Parser.hs | 50 +- chusql-core/engine/test/Spec.hs | 218 ++++++- chusql-core/model/chusql-core-model.cabal | 9 +- chusql-core/model/src/ChuSQL/Core/Model.hs | 109 ++-- chusql-core/model/src/ChuSQL/Core/Protocol.hs | 17 +- .../storage/chusql-core-storage.toml.example | 7 +- chusql-core/storage/src/catalog.rs | 31 +- chusql-core/storage/src/config.rs | 23 +- chusql-core/storage/src/ffi.rs | 27 + chusql-core/storage/src/protocol.rs | 24 +- chusql-core/storage/src/runtime.rs | 559 +++++++++++++++++- chusql-core/storage/src/wal.rs | 36 +- chusql-core/storage/tests/catalog_test.rs | 30 + chusql-core/storage/tests/config_test.rs | 29 +- chusql-core/storage/tests/runtime_test.rs | 439 +++++++++++++- chusql-core/storage/tests/wal_test.rs | 25 + chusql-interface/chusql-interface.cabal | 11 +- .../src/ChuSQL/Interface/Config.hs | 31 +- .../src/ChuSQL/Interface/Settings.hs | 23 +- chusql-interface/src/ChuSQL/Interface/TOML.hs | 4 +- chusql-server/app/Main.hs | 30 +- chusql-server/chusql-server.cabal | 10 +- chusql-server/src/ChuSQL/Server/Accounts.hs | 130 ++-- chusql-server/src/ChuSQL/Server/Backend.hs | 188 +++++- chusql-server/src/ChuSQL/Server/Catalog.hs | 18 +- chusql-server/src/ChuSQL/Server/Privileges.hs | 27 +- chusql-server/src/ChuSQL/Server/Session.hs | 36 +- chusql-server/src/ChuSQL/Server/TCP.hs | 7 + chusql-server/test/Spec.hs | 289 ++++++++- chusql-web/app/Main.hs | 49 +- chusql-web/chusql-web.cabal | 10 +- chusql-web/src/ChuSQL/Web/API.hs | 4 +- chusql-web/src/ChuSQL/Web/UISettings.hs | 6 +- chusql-web/static/app.js | 2 +- chusql-web/test/Gates.hs | 31 +- chusql-web/test/Spec.hs | 33 +- docs/architecture.md | 127 ++-- docs/badges/README.md | 7 + docs/badges/build.svg | 6 + docs/badges/commit.svg | 6 + docs/badges/gate.svg | 6 + docs/badges/languages.svg | 6 + docs/badges/lines.svg | 6 + docs/badges/release.svg | 6 + docs/badges/tests.svg | 6 + docs/bootstrap.md | 41 ++ docs/commands.md | 115 +--- docs/config.md | 23 +- docs/install.md | 2 +- docs/performance.md | 134 +++++ docs/syntax.md | 155 +++++ docs/types.md | 48 ++ docs/users-and-roles.md | 68 +++ gate-check/README.md | 14 +- gate-check/comment-check.ps1 | 3 +- gate-check/comment-purity.ps1 | 4 +- gate-check/run-gate.ps1 | 6 +- gate-check/run-step.ps1 | 17 +- resources/settings.toml.linux | 73 +++ resources/settings.toml.windows | 73 +++ scripts/chusql.toml | 57 -- scripts/csql-web.ps1 | 18 +- scripts/csql-web.sh | 25 +- scripts/install.ps1 | 36 +- scripts/install.sh | 49 +- scripts/package.ps1 | 17 +- scripts/package.sh | 13 +- scripts/uninstall.ps1 | 6 +- scripts/uninstall.sh | 8 +- scripts/update-code-lines.ps1 | 55 ++ 104 files changed, 4127 insertions(+), 845 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/gate.yml delete mode 100644 AGENTS.md rename chusql-benchmark/chusql-benchmark.cabal => benchmark/benchmark4csql.cabal (54%) rename {chusql-benchmark => benchmark}/src/Main.hs (63%) rename {chusql-benchmark => benchmark}/stack.yaml (100%) rename {chusql-benchmark => benchmark}/stack.yaml.lock (100%) create mode 100644 chusql-bootstrap/src/ChuSQL/Bootstrap.hs create mode 100644 chusql-bootstrap/test/Spec.hs create mode 100644 chusql-cli/src/ChuSQL/CLI/History.hs create mode 100644 chusql-cli/src/ChuSQL/CLI/Password.hs delete mode 100644 chusql-cli/src/ChuSQL/CLI/Session.hs create mode 100644 docs/badges/README.md create mode 100644 docs/badges/build.svg create mode 100644 docs/badges/commit.svg create mode 100644 docs/badges/gate.svg create mode 100644 docs/badges/languages.svg create mode 100644 docs/badges/lines.svg create mode 100644 docs/badges/release.svg create mode 100644 docs/badges/tests.svg create mode 100644 docs/bootstrap.md create mode 100644 docs/performance.md create mode 100644 docs/syntax.md create mode 100644 docs/types.md create mode 100644 docs/users-and-roles.md create mode 100644 resources/settings.toml.linux create mode 100644 resources/settings.toml.windows delete mode 100644 scripts/chusql.toml create mode 100644 scripts/update-code-lines.ps1 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..7d31d1d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,14 @@ +# 构建状态:调用共用 Linux 构建流程。 +name: build +on: + push: + pull_request: + merge_group: + workflow_dispatch: +permissions: + contents: read +jobs: + build: + uses: ./.github/workflows/linux.yml + with: + phase: build diff --git a/.github/workflows/gate.yml b/.github/workflows/gate.yml new file mode 100644 index 0000000..ecbd986 --- /dev/null +++ b/.github/workflows/gate.yml @@ -0,0 +1,11 @@ +# 门禁状态:仅由所有者手动触发全量入口。 +name: gate +on: + workflow_dispatch: +permissions: + contents: read +jobs: + gate: + uses: ./.github/workflows/linux.yml + with: + phase: gate diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 9e822bb..591cf6c 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -1,19 +1,22 @@ -# Linux 流水线:Rust 存储 + Haskell 引擎/Web/CLI 的构建与测试。 -# -# 这里每条命令都在 WSL Debian(cargo 1.98 / GHC 9.10.3 / stack 3.11.1)上跑通过, -# 见仓库根 README 的「构建与测试」段。Haskell 这边链接并装入 libchusql_core_storage.so, -# 所以 Rust 先构建,LD_LIBRARY_PATH 指向它的输出目录,Haskell 用例才能真跑而不是 pending。 -# 打包和发版资源走 .github/workflows/release.yml(tag 触发,也可手动 dispatch)。 -name: linux +# Linux CI:构建 Rust 与 Haskell,运行各组件测试。 +name: tests on: push: - branches: [main] pull_request: + merge_group: workflow_dispatch: + workflow_call: + inputs: + phase: + type: string + default: tests + +permissions: + contents: read concurrency: - group: linux-${{ github.ref }} + group: linux-${{ inputs.phase || 'tests' }}-${{ github.ref }} cancel-in-progress: true env: @@ -22,7 +25,7 @@ env: jobs: linux: - name: build + test + name: ${{ inputs.phase || 'tests' }} runs-on: ubuntu-latest timeout-minutes: 90 steps: @@ -49,10 +52,12 @@ jobs: run: cargo build --release - name: cargo test + if: inputs.phase != 'build' && inputs.phase != 'gate' working-directory: chusql-core/storage run: cargo test --release - name: cargo clippy (-D warnings) + if: inputs.phase != 'build' && inputs.phase != 'gate' working-directory: chusql-core/storage run: cargo clippy --all-targets -- -D warnings @@ -78,6 +83,7 @@ jobs: chusql-server/.stack-work chusql-web/.stack-work chusql-cli/.stack-work + benchmark/.stack-work key: ${{ runner.os }}-stack-${{ hashFiles('**/stack.yaml', '**/stack.yaml.lock') }} restore-keys: ${{ runner.os }}-stack- @@ -89,19 +95,37 @@ jobs: working-directory: chusql-bootstrap run: stack build --fast + - name: benchmark4csql build + working-directory: benchmark + run: stack build benchmark4csql --fast + + - name: owner-triggered gate + if: inputs.phase == 'gate' + shell: pwsh + run: ./gate-check/run-gate.ps1 + - name: engine tests + if: inputs.phase != 'build' && inputs.phase != 'gate' working-directory: chusql-core/engine run: stack test --fast - name: server tests + if: inputs.phase != 'build' && inputs.phase != 'gate' working-directory: chusql-server run: stack test --fast - name: web tests + if: inputs.phase != 'build' && inputs.phase != 'gate' working-directory: chusql-web run: stack test --fast - name: cli tests + if: inputs.phase != 'build' && inputs.phase != 'gate' working-directory: chusql-cli run: stack test chusql-cli --fast + + - name: bootstrap tests + if: inputs.phase != 'build' && inputs.phase != 'gate' + working-directory: chusql-bootstrap + run: stack test chusql-bootstrap --fast diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 10b3e15..e20cc39 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -111,7 +111,7 @@ jobs: name="chusql-${{ matrix.platform }}" stage="dist/$name" rm -rf "$stage" - mkdir -p "$stage/bin" "$stage/scripts" + mkdir -p "$stage/bin" "$stage/resources" cp chusql-core/storage/target/release/libchusql_core_storage.* "$stage/bin/" @@ -143,7 +143,7 @@ jobs: cp "$lib" "$stage/bin/" done - cp scripts/chusql.toml "$stage/scripts/" + cp resources/settings.toml.* "$stage/resources/" cp scripts/install.ps1 scripts/install.sh "$stage/" cp scripts/uninstall.ps1 scripts/uninstall.sh "$stage/" mkdir -p "$stage/static" @@ -166,7 +166,7 @@ jobs: $name = "chusql-${{ matrix.platform }}" $stage = "dist/$name" if (Test-Path $stage) { Remove-Item -Recurse -Force $stage } - New-Item -ItemType Directory -Force -Path "$stage/bin", "$stage/scripts" | Out-Null + New-Item -ItemType Directory -Force -Path "$stage/bin", "$stage/resources" | Out-Null Copy-Item 'chusql-core/storage/target/release/chusql_core_storage.dll' "$stage/bin/" @@ -195,7 +195,7 @@ jobs: Where-Object { $_.Name -notlike 'chusql*' } | ForEach-Object { Copy-Item $_.FullName "$stage/bin/" } - Copy-Item 'scripts/chusql.toml' "$stage/scripts/" + Copy-Item 'resources/settings.toml.*' "$stage/resources/" Copy-Item 'scripts/install.ps1', 'scripts/install.sh' $stage Copy-Item 'scripts/uninstall.ps1', 'scripts/uninstall.sh' $stage New-Item -ItemType Directory -Force -Path "$stage/static" | Out-Null diff --git a/.gitignore b/.gitignore index 1e4bfdf..a6b55e9 100644 --- a/.gitignore +++ b/.gitignore @@ -38,17 +38,14 @@ target/ # 运行时数据(Rust 服务默认数据目录 CHUSQL_DATA_DIR=data/),不入库 chusql-core/storage/data/ -# 一键启动脚本的默认数据目录与日志,不入库 -localdata/ - -# 门禁运行时目录:脚本与 README 入库,临时目录与日志不入库 -gate-check/tmp/ +# 本地运行产物:一键启动的数据目录、门禁各车道日志与临时目录、打包产物,不入库 +logs/ # 本机打出来的发行包(scripts/package.sh / package.ps1 的产物),不入库 releases/ -# 前端 IDE 设置(字体等,由 /api/ui-settings 读写),本机专用,不入库 -scripts/chusql.ui.settings.json +# 前端 IDE 设置(字体等,由 /api/ui-settings 读写),本机专用,不入库;resources/ 不参与打包 +resources/chusql.ui.settings.json # Cargo.lock 要入库(本项目是要产出可执行程序的 crate,不是纯库) @@ -79,7 +76,8 @@ scripts/chusql.ui.settings.json *~ \#*\# .\#* -agent_credientials +AGENTS.md +agent-credientials .dsh # 注意:.zed/tasks.json 是本仓库共享的构建任务(stack build / run / test / repl), # 需要入库,所以这里不忽略 .zed/ @@ -97,4 +95,3 @@ plandocs/ Thumbs.db ehthumbs.db desktop.ini -AGENTS.md diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index d2f3c31..0000000 --- a/AGENTS.md +++ /dev/null @@ -1,34 +0,0 @@ -# AGENTS.md — ChuSQL 开发契约(简版) - -参考: -- 进度与待办:`project-plan.txt` -- 已知问题:`known-issues.txt` -- 设计依据:`design-decisions.txt` - -## 核心约束 -- project-plan.txt 是唯一进度来源。 -- 测试必须通过,禁止绕过检查。 -- 不吞错误,使用明确错误返回。 -- 表存在性以 catalog 为准。 -- 语义检查和优化只使用 schema。 -- 索引由存储层管理,优化器只判断可点查条件。 -- 优化不能改变结果语义。 - -## 注释规范 -- 文件级:外部引用语句(Haskell `import`、Rust `use`、JS `import`、HTML 的 ``/`