Skip to content

feat(db_view): Auto 模式 SQL 编辑器粘性会话,支持跨执行数据库会话变量 - #404

Merged
feigeCode merged 3 commits into
mainfrom
pr/db-session-variables-312
Oct 15, 2026
Merged

feigeCode merged 3 commits into
mainfrom
pr/db-session-variables-312

Conversation

@feigeCode

Copy link
Copy Markdown
Owner

概述

Closes #312

Auto(自动事务)模式下,每个 SQL 编辑器页签持有粘性会话(sticky session),跨执行复用同一条物理连接,使 MySQL SET @var 等连接级状态存活:

SET @startdates = '2026-1-1', @enddates = '2026-2-1';   -- 单独执行
SELECT count(1) FROM test
WHERE create_date BETWEEN @startdates AND @enddates;    -- 变量存活

修复前 Auto 管线每次执行 create_session → 执行 → close_session,跨执行丢连接级状态。

对齐参考

  • dbx:client_session_id 参与 pool key + 每 tab max_connections=1 的 per-editor 专用连接
  • DBeaver:默认 "Open separate connection for each editor"(Always/Default/Never)

实现要点

  • 新增 auto_session 模块:AutoExecutionSession(session_id + scope + connection_lost 信号)与 auto_session_action_for 纯决策函数(无会话→StartSession;scope 匹配且连接健康→RunInstalledSession;否则重建)
  • run_auto_sql_text 改走 handle_run_query_with_session 会话管线,复用现有取消/流式结果/DDL 失效逻辑;DDL 失效用 Immediate
  • execute_session 的 pin 语义(in_flight 不归零)使连接不被 idle 回收——粘性会话天然即 per-editor 专用物理连接,crates/db 池代码零改动
  • 失效重建:执行返回连接级错误时置位 connection_lost,下次执行前丢弃重建(语义等同重连,@var 不保证跨断连)
  • 释放点全覆盖:切连接 / 切库 / 切 schema / 切事务模式 / 连接删除(不重复 close)/ tab 关闭(cx.on_release);scope 变化静默重建符合 Auto 语义
  • SessionSqlRun 增加 connection_lost 信号字段,Manual 事务传 None 行为不变;EXPLAIN 按钮保留一次性会话旧路径

测试

  • auto_session 契约测试 4 项:建/复用/scope 切换重建/断连重建
  • MySQL 8.0 真机验证(crates/db/tests/real_databases/mysql/sticky_session.rs,复刻编辑器管线调用序列 create_session_direct → 多次独立 execute_session → close_session_direct):
    • SET @var 与 SELECT @var 分开执行,变量存活 ✅
    • 多次跨执行存活,CONNECTION_ID() 不变(同一物理连接)✅
    • 变量参与 WHERE ... BETWEEN @startdates AND @enddates(issue 原始查询形态)✅
    • 关会话再开新会话,变量不跨会话(重连语义,@var 为 NULL)✅
    • 无 ONETCLI_TEST_MYSQL_PASSWORD 时按仓库约定自动跳过,CI 不挂
  • 回归:db lib 1349 全过、db_view lib 940 全过、real_mysql 全套 6 过、workspace check 零错误

备注

真机测试 fixture 注意点(已注释在代码中):UNION 子查询首行是 int 时整列被钉成 int 类型,日期比较失真,须用 DATE'...' 字面量开头。

issue #312。MySQL `SET @var` 后单独执行 `SELECT @var` 之前丢变量,
根因是 Auto 管线每次执行 create_session → 执行 → close_session。

方案:Auto 模式给每个编辑器页签配粘性会话(对齐 dbx 的
client_session_id 机制与 DBeaver 默认的 per-editor 专用连接):

- 新增 auto_session 模块:AutoExecutionSession(session_id + scope +
  connection_lost 信号)与 auto_session_action_for 纯决策函数
- run_auto_sql_text 改走 handle_run_query_with_session 会话管线,
  复用现有取消/流式结果/DDL 失效逻辑;DDL 失效用 Immediate
- execute_session 的 pin 语义(in_flight 不归零)使连接不被 idle
  回收,粘性会话即 per-editor 专用物理连接
- 失效重建:执行返回连接级错误时置位 connection_lost,下次执行前
  丢弃重建(语义等同重连,@var 不保证跨断连)
- 释放点:切连接/切库/切 schema/切事务模式/连接删除/tab 关闭
  (on_release),切 scope 时静默重建符合 Auto 语义
- SessionSqlRun 增加 connection_lost 信号字段,Manual 事务传 None
  行为不变

验证:auto_session 契约测试 4 项;db_view lib 测试 940 全过;
workspace check 零错误。
复刻编辑器管线调用序列(create_session_direct → 多次独立
execute_session → close_session_direct),在真实 MySQL 8.0 上验证:

- SET @startdates/@enddates 与 SELECT 分开执行,变量存活
- 多次跨执行变量仍存活,CONNECTION_ID 不变(同一物理连接)
- 变量参与 WHERE BETWEEN 过滤(issue 原始查询形态)
- 关会话再开新会话,变量不跨会话(@var 为 NULL)

无 ONETCLI_TEST_MYSQL_PASSWORD 时按仓库约定自动跳过。
fixture 注:UNION 子查询首行 int 会把整列钉成 int,必须用
DATE 字面量开头。
引入 auto_session 模块时误删了相邻的 cfg 属性:非 test 构建也编进
测试模块,rustc 剔除 #[test] 函数体后模块顶部 use 全变 unused,
CI -D warnings 环境直接编译失败(与 d25dc96 同型)。
@feigeCode
feigeCode merged commit 930787f into main Oct 15, 2026
8 checks passed
@feigeCode
feigeCode deleted the pr/db-session-variables-312 branch October 22, 2026 02:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: 希望支持数据库变量

1 participant