Root cause:
- AgentDriverClient::kill() is called during Drop to clean up child processes
- Old implementation called child.wait() and ignored errors with let _
- When wait() fails (e.g., process already killed by signal), child is not reaped and becomes zombie
Fix:
- Use try_wait() non-blocking polling, up to 100ms timeout
- Avoid long blocking in Drop during async cleanup
- Still perform final blocking wait() as fallback after timeout
- Log all wait errors for debugging
Impact:
- All JDBC agents (Oracle/DB2/DM8/XuguDB etc.)
- Prevents zombie process accumulation during long-running sessions
- Add max-w-3xl to limit toast width (768px on desktop, 90vw on mobile)
- Use whitespace-pre-wrap to allow automatic line breaks
- Add break-words to prevent long words from overflowing
- Long error messages now wrap instead of extending off-screen
- Add sort mode toggle button (folder structure / date modified)
- Sort by date: flat list with all folders and files by updatedAt desc
- Most recently modified items appear at top for quick access
- Hide 'Unfiled' label when not dragging (only show as drop target)
- Remove excessive spacing between folder tree and unfiled section
- Remove from QuickOpenDialog list items for instant keyboard navigation
- Remove from DatabaseSearchDialog results for immediate click response
- Remove from CustomContextMenu items for instant menu interaction
- Support Ctrl/Cmd+click for multi-select toggle
- Support Shift+click for additive range selection across folders and files
- Add batch delete via right-click context menu with confirmation
- Add active/inactive visual states matching connection sidebar behavior
- Remove transition-colors for instant selection feedback
- Unified selection index system for cross-type range selection
Disable COM_RESET_CONNECTION for single-connection session pools
(max_connections == 1) so that MySQL session state such as TEMPORARY
TABLEs is not cleared when a connection is returned to the pool.
Closes#1509
- Empty commands show temporary error hint (1s) but not added to history
- Arrow key navigation skips empty command entries
- Add appendCommandOutput helper for transient feedback
- Press ↑ to recall previous command, ↓ for next command (terminal-like behavior)
- Press ↓ at end of history to clear input
- Use readonly instead of disabled to maintain cursor focus and blink state
- Semi-transparent visual feedback during command execution
When the user triggers SQL execution via shortcut/toolbar/context-menu
without a manual selection, a floating picker now surfaces the available
execution targets:
- "Current SQL" — the statement at the cursor
- "All SQL" — the entire editor content
Each candidate is highlighted as a preview decoration in the editor as
the user navigates the picker with arrow keys. Only a single entry is
shown when the cursor statement equals the full document.
前端 SQL 范围解析器 (sqlStatementRanges.ts) 按分号拆分语句,同时跳过
字符串、引号标识符、注释和美元引用体中的分隔符,与后端 dbx-core splitter
逻辑一致。选取器支持键盘导航、鼠标悬停高亮、Enter 确认、Esc/失焦取消。
Changes:
- sqlExecutionTarget.ts: add SqlExecutionCandidate, SqlExecutionOverride types
- sqlStatementRanges.ts: frontend SQL tokeniser (new, 848 lines)
- SqlExecutionTargetPicker.vue: accessible floating listbox (new, 109 lines)
- QueryEditor.vue: preview StateEffect/StateField; requestExecute() replaces
executeCurrentSql() to route through picker
- ContentArea.vue: expose requestQueryEditorExecute() to parent
- App.vue: toolbar + global shortcut → requestActiveEditorExecute()
- i18n: editor.executionPicker keys for all locales
- tests: 26 new unit tests for sqlStatementRanges (all 1121 tests pass)
* fix(postgre): Fix the data type syntax when creating tables in PostgreSQL
* fix(ui): Save the state when closing the SQL library through the close button