When app restarts, table data shows "data unavailable" but Mod+R didn't
work because the DataGrid component wasn't mounted. Fixed by handling
the reload emit directly in handleModRTarget. Also added kbd-styled
shortcut hint (⌘R / Ctrl+R) on the data-unavailable placeholder.
OpenGauss is based on PostgreSQL 9.2 and does not support WITH ORDINALITY
(PG 9.4+). When the native pg_get_tabledef() path fails, the fallback DDL
builder calls list_indexes() which previously only had two SQL variants, both
using WITH ORDINALITY — causing "syntax error at or near 'WITH'" on OpenGauss.
Add POSTGRES_INDEXES_OPENGAUSS_SQL as a third fallback that uses generate_series
and array_length instead, both available since PG 8.0.
Previously map_column_type mapped all text types (longtext, mediumtext) to
TEXT (64KB max) and all blob types (longblob, mediumblob) to BLOB (64KB
max). This caused "Data too long" errors when transferring large data from
MariaDB to MySQL.
Also improved INSERT error messages to include the table name and absolute
row number (offset + MySQL row) instead of just chunk index.
Fixes#796
Time-related column types (DATE, DATETIME, TIMESTAMP, TIME, etc.) need
their literal default values wrapped in single quotes. Previously, the
normalize_default function returned values verbatim, so a DATETIME
default like "2024-01-01 00:00:00" would generate invalid SQL:
DEFAULT 2024-01-01 00:00:00
instead of:
DEFAULT '2024-01-01 00:00:00'
SQL expressions (CURRENT_TIMESTAMP, NOW(), etc.) are correctly left
unquoted. Non-temporal types (INT, VARCHAR, etc.) are unaffected.
When a cell is in edit mode, the native paste event was bubbling up to
the grid root's @paste handler, which called preventDefault() and wrote
values directly to the data model instead of the edit input. This caused
the "Pasted!" toast to appear but the input content remained unchanged.
Adding @paste.stop on edit inputs allows the browser's default paste
behavior to insert text into the input field, properly updating editValue
via v-model.
The toolbar refresh, rollback, and post-save reload were passing only
the manual WHERE input to the reload event, discarding structured filter
conditions added via the filter builder popover. Changed all three call
sites to use currentWhereInput() which combines both filter sources.
- Add "Fetch All" button alongside "Load More" to continuously SCAN until all keys loaded
- Add stop button and scan progress display during fetch-all
- Implement mergeKeysIntoRedisKeyTree for incremental namespace tree building
- Add toast notifications for empty form validation in key detail panel
- Add i18n translations for new UI elements (zh-CN, zh-TW, en, es)
- Add unit tests for incremental tree merge covering 6 scenarios
Generates a Redis insert command (SET/RPUSH/SADD/ZADD/HSET/XADD/JSON.SET) from
the current key's value and copies it to clipboard. Supports TTL, pagination
hints, and binary value handling.
Setting unmountOnHide to false on the Tabs component avoids re-mounting
RedisValueViewer and its heavy async initialisation (API calls + Shiki
highlighting) each time the user switches back from the CLI panel.
- Add accessCapabilities based on UCanAccess DDL support testing
- CREATE TABLE, ADD COLUMN, CREATE INDEX are supported
- DROP COLUMN, ALTER COLUMN, RENAME COLUMN, DROP INDEX are not supported
- Use H2 SQL dialect for generated DDL
When parseFilterValue converts numeric strings to JS Number, integers
exceeding Number.MAX_SAFE_INTEGER lose precision (e.g. 2062449923745665025
becomes 2062449923745665024). Keep them as strings so the Rust backend can
parse them exactly via serde_json::Number.
Many JDBC drivers depend on SLF4J and commons-lang3 at runtime but
don't shade them. Bundling these in the plugin JAR avoids
NoClassDefFoundError when users import driver JARs.
Previously, cancelling a DuckDB query only dropped the tokio CancellationToken,
but the actual DuckDB C call continued running in spawn_blocking. This caused
the UI to show "正在停止..." until timeout silently expired.
Now, RunningQueries stores per-execution interrupt callbacks. For DuckDB and
ExternalTabular branches, an InterruptHandle is registered on query start so
cancel() calls duckdb_interrupt() at the C level, truly stopping the query.
- table_structure_sql: merge separate MODIFY statements for type, nullability,
and default into a single MODIFY statement. This fixes Dameng's requirement
that MODIFY includes the full column definition.
- DbxJdbcPlugin: move DATA_DEFAULT to first SELECT position and read it first
in the ResultSet loop (LONG columns must be read before other columns).
Add an "SRV (MongoDB Atlas)" toggle in the MongoDB connection form.
When enabled, the backend uses mongodb+srv:// scheme and omits the
port, matching the behavior of pasting a mongodb+srv:// URL directly.
Previously execute_batch always used the hardcoded 30s default timeout,
ignoring the user's query_timeout_secs connection setting. This caused
long-running ALTER TABLE statements on large tables to time out even
when the user configured a longer timeout or disabled it entirely.
Add a configurable option in Settings > Navigation to reuse an existing data
tab instead of creating a new one each time a table is clicked in the sidebar.
pgvector's vector(N) type uses a custom binary format (4-byte header
+ N×4-byte f32 array) that tokio-postgres doesn't natively support.
Add a PgRawBytes adapter and decoder so vector columns render as
JSON float arrays instead of null.