Repository navigation
feat(db_view): Auto 模式 SQL 编辑器粘性会话,支持跨执行数据库会话变量 - #404
Merged
Merged
Conversation
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 同型)。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概述
Closes #312
Auto(自动事务)模式下,每个 SQL 编辑器页签持有粘性会话(sticky session),跨执行复用同一条物理连接,使 MySQL
SET @var等连接级状态存活:修复前 Auto 管线每次执行 create_session → 执行 → close_session,跨执行丢连接级状态。
对齐参考
client_session_id参与 pool key + 每 tabmax_connections=1的 per-editor 专用连接实现要点
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 失效用 Immediateexecute_session的 pin 语义(in_flight不归零)使连接不被 idle 回收——粘性会话天然即 per-editor 专用物理连接,crates/db池代码零改动connection_lost,下次执行前丢弃重建(语义等同重连,@var不保证跨断连)cx.on_release);scope 变化静默重建符合 Auto 语义SessionSqlRun增加connection_lost信号字段,Manual 事务传None行为不变;EXPLAIN 按钮保留一次性会话旧路径测试
auto_session契约测试 4 项:建/复用/scope 切换重建/断连重建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 不挂备注
真机测试 fixture 注意点(已注释在代码中):UNION 子查询首行是 int 时整列被钉成 int 类型,日期比较失真,须用
DATE'...'字面量开头。