Skip to content

修复:Oracle 别名字段补全和 DIP 用户显示#4075

Merged
t8y2 merged 2 commits into
t8y2:mainfrom
zipg:codex/oracle-alias-column-completion
Jul 21, 2026
Merged

修复:Oracle 别名字段补全和 DIP 用户显示#4075
t8y2 merged 2 commits into
t8y2:mainfrom
zipg:codex/oracle-alias-column-completion

Conversation

@zipg

@zipg zipg commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

改动

  • Oracle 未限定 schema 的列补全改为复用当前 SQL 标签页的执行会话,确保 ALTER SESSION SET CURRENT_SCHEMA 后读取实际当前模式
  • 按标签页和会话上下文版本隔离列补全缓存;成功切换 CURRENT_SCHEMA 或重置会话后立即失效本地缓存,避免跨标签页、跨模式复用旧字段
  • 未限定 Oracle 补全绕过共享 metadata assistant 和全局列索引,显式 SCHEMA.TABLE 继续保留原有共享元数据路径
  • Oracle agent 优先读取 SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA'),失败或为空时回退 SESSION_USER
  • Oracle 不再固定过滤名为 DIP 的实际用户,并更新模式树缓存版本
  • 补充标签页会话透传、缓存隔离、模式切换、显式 schema、独立标签页及 DIP 用户显示回归测试

验证

  • pnpm check
  • pnpm build
  • cargo check -p dbx-core -p dbx-web
  • go test ./...agents/drivers/oracle-go
  • Oracle 11g 双 schema 同名表实测:标签页 A 按 A/B/A 切换后,未限定表字段立即对应切换;标签页 B 保持独立;显式 schema 查询结果正确

@t8y2 t8y2 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

request changes: 还有一个 Oracle schema 兼容性问题需要处理。

apps/desktop/src/stores/connectionStore.ts:4786 在未传入 schema 时固定使用连接配置中的登录用户名。但 Oracle 的 CURRENT_SCHEMA 可以通过 ALTER SESSION SET CURRENT_SCHEMA 与登录用户不同;此时未限定对象名实际解析到当前 schema,而 DBX 会向 ALL_TAB_COLUMNS 查询错误的 owner,导致别名字段补全漏项。

依据:Oracle ALTER SESSION 文档

“changes the current schema of the session”

依据:Oracle SYS_CONTEXT 文档

“may also change during the duration of a session”

建议在 agent 或连接元数据层读取 SYS_CONTEXT('USERENV','CURRENT_SCHEMA'),仅在无法读取时回退到配置用户名,并补充登录用户与 CURRENT_SCHEMA 不同的回归测试。

@zipg
zipg force-pushed the codex/oracle-alias-column-completion branch from e24733a to 9002ea7 Compare July 21, 2026 10:59
@zipg

zipg commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

已按审核建议调整,感谢指出这个兼容性问题。

  • 未传入 schema 时,前端不再固定使用连接用户名,而是向 Oracle agent 传递空 schema
  • agent 会优先读取 SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA'),仅在读取失败或结果为空时回退 SESSION_USER
  • 显式选择 schema 的原有路径保持不变
  • 补充了前端空 schema 传递测试,以及 CURRENT_SCHEMA=REPORTINGSESSION_USER=APP 和读取失败回退的 agent 测试

另外已在 Oracle 11g 实测:以 SYSTEM 登录后执行 ALTER SESSION SET CURRENT_SCHEMA = DBX_TEST,随后用空 schema 请求 ORDERS_10K 列元数据,成功返回 DBX_TEST.ORDERS_10K 的 9 个字段。

验证已通过:pnpm checkpnpm build、定向 Vitest、Oracle agent go test ./...。更新提交:9002ea7dd

@zipg
zipg requested a review from t8y2 July 21, 2026 11:09

@t8y2 t8y2 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

request changes: 之前的 CURRENT_SCHEMA blocker 还没有端到端解决。

apps/desktop/src/stores/connectionStore.ts:4818 的空 schema 补全仍走不带当前 tab clientSessionId 的 metadata API。查询编辑器在 apps/desktop/src/stores/queryStore.ts:3365 使用 tab-scoped session,而 core completion 在 crates/dbx-core/src/schema.rs:3582 使用 base metadata pool。

Oracle 11g 实测:tab 执行 ALTER SESSION SET CURRENT_SCHEMA = DBX 后,tab session 的 CURRENT_SCHEMADBX,但 metadata session 仍是 SYSTEM。因此未限定 schema 的别名字段补全仍可能查询错误 owner。

Oracle 文档也明确说明 ALTER SESSION 修改的是当前 session 的 schema:
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ALTER-SESSION.html

“changes the current schema of the session”

请让补全请求使用与当前 SQL tab/transaction 相同的 execution session,或显式同步并传递该 execution context 的 current schema;同时按 session/current schema 隔离或失效 completion cache。

建议补一个双 schema 同名表的端到端回归测试,验证切换 CURRENT_SCHEMA 后补全字段立即切换,并覆盖缓存命中、显式 schema、切换回来和独立 tab。

@zipg
zipg force-pushed the codex/oracle-alias-column-completion branch from 9002ea7 to 2937a42 Compare July 21, 2026 16:42
@zipg

zipg commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

已按本轮审核意见完成端到端修复,更新提交:2937a4212

处理内容:

  • getColumns 从前端到 Web/Tauri/Core 全链路支持 clientSessionId,Oracle 未限定 schema 时复用当前 SQL 标签页的 execution session
  • 未限定 Oracle 列补全跳过 base metadata assistant,不再写入共享全局列索引
  • 缓存键加入标签页 ID 和上下文版本;成功执行 ALTER SESSION SET CURRENT_SCHEMA、重置会话或切换标签页时失效本地缓存
  • 未限定 Oracle 表引用不再被全局表缓存补上 schema;显式 SCHEMA.TABLE 路径保持不变

Oracle 11g 使用两个 schema 的同名表做了真实验证:

  • DBX_CMP_A.SHARED_COMPLETION(A_ID, A_LABEL)
  • DBX_CMP_B.SHARED_COMPLETION(B_ID, B_TOTAL)
  • tab A 执行 A -> B -> A 后,空 schema 的列元数据依次返回 A 字段、B 字段、A 字段
  • tab B 保持 B,不受 tab A 切换影响
  • tab A 显式请求 DBX_CMP_B.SHARED_COMPLETION 仍返回 B 字段

自动化验证通过:pnpm checkpnpm build、定向 Vitest(26 项)、cargo check -p dbx-core -p dbx-web、Oracle agent go test ./...

@zipg

zipg commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

@t8y2 本轮审核意见已处理完毕,相关实现、双 schema 同名表实测结果和自动化验证已在上一条评论中说明,当前 CI 已全部通过。麻烦再审核一下,谢谢。

@zipg
zipg requested a review from t8y2 July 21, 2026 16:58
@t8y2
t8y2 merged commit 25e799c into t8y2:main Jul 21, 2026
8 checks passed
@t8y2

t8y2 commented Jul 21, 2026

Copy link
Copy Markdown
Owner

Thanks for the contribution! Merged in 25e799c, will be released in the next version.

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.

2 participants