Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
ad30a9c
fix(grid): omit generated columns on INSERT and enable SQLite WAL
ZhuchkaTriplesix Sep 20, 2026
f208d3a
Merge pull request #820 from QueryaHub/issue/792-810-801-insert-wal
ZhuchkaTriplesix Sep 20, 2026
2caa38b
fix(mongo): keep session auth after scrubCredentials
ZhuchkaTriplesix Sep 20, 2026
70f1507
Merge pull request #821 from QueryaHub/issue/780-mongo-session-uri
ZhuchkaTriplesix Sep 20, 2026
ca5562e
fix(postgres): execute Save DML as separate statements
ZhuchkaTriplesix Sep 20, 2026
1d22b74
Merge pull request #822 from QueryaHub/issue/784-postgres-statement-tx
ZhuchkaTriplesix Sep 20, 2026
f5212c6
fix(mysql): cap SELECT on the server and drain rowsStream
ZhuchkaTriplesix Sep 20, 2026
da0a1f6
Merge pull request #823 from QueryaHub/issue/808-mysql-select-limit
ZhuchkaTriplesix Sep 20, 2026
acf3656
fix(redis): keep existing TTL when saving a string key
ZhuchkaTriplesix Sep 20, 2026
5cc4ce9
Merge pull request #824 from QueryaHub/issue/811-redis-keepttl
ZhuchkaTriplesix Sep 20, 2026
059dedc
fix(grid): confirm before discarding Table Browser edits on navigate
ZhuchkaTriplesix Sep 20, 2026
de206c5
Merge pull request #825 from QueryaHub/issue/771-unsaved-nav-guard
ZhuchkaTriplesix Sep 20, 2026
44827f6
fix(grid): treat 0-row DML as a failed save
ZhuchkaTriplesix Sep 20, 2026
ce461f3
Merge pull request #826 from QueryaHub/issue/773-zero-row-dml
ZhuchkaTriplesix Sep 20, 2026
6379aad
fix(mongo): round-trip BSON types through Extended JSON
ZhuchkaTriplesix Sep 20, 2026
7442018
Merge pull request #827 from QueryaHub/issue/779-mongo-ejson
ZhuchkaTriplesix Sep 20, 2026
21a1b63
fix(mongo): round-trip inspector fields by BSON type
ZhuchkaTriplesix Sep 20, 2026
f35f724
Merge pull request #828 from QueryaHub/issue/777-mongo-field-codec
ZhuchkaTriplesix Sep 20, 2026
318dcff
fix(mongo): persist inspector Apply and Ctrl+Enter
ZhuchkaTriplesix Sep 20, 2026
dedad25
Merge pull request #829 from QueryaHub/issue/775-mongo-inspector-apply
ZhuchkaTriplesix Sep 20, 2026
843cd52
fix(postgres): isolate Table Browser from the SQL-editor socket
ZhuchkaTriplesix Sep 20, 2026
9adcd26
Merge pull request #830 from QueryaHub/issue/785-postgres-table-brows…
ZhuchkaTriplesix Sep 20, 2026
57c6cd3
fix(sqlite): isolate Table Browser from the SQL-editor Database
ZhuchkaTriplesix Sep 20, 2026
d8fb59a
Merge pull request #831 from QueryaHub/issue/794-sqlite-table-browser…
ZhuchkaTriplesix Sep 20, 2026
8bca69c
fix(mysql): isolate Table Browser from the SQL-editor socket
ZhuchkaTriplesix Sep 20, 2026
97dac37
Merge pull request #832 from QueryaHub/issue/802-mysql-table-browser-…
ZhuchkaTriplesix Sep 20, 2026
5ca923a
fix(redis): keep Overview and Explorer on separate sockets
ZhuchkaTriplesix Sep 20, 2026
54d3bba
Merge pull request #833 from QueryaHub/issue/812-redis-overview-socket
ZhuchkaTriplesix Sep 20, 2026
9fb8351
fix(postgres): SQL-grid Save uses PK and column types
ZhuchkaTriplesix Sep 20, 2026
9760ff5
Merge pull request #834 from QueryaHub/issue/786-postgres-sql-grid-save
ZhuchkaTriplesix Sep 20, 2026
743523f
fix(sqlite): SQL-grid Save uses PK, types, and a transaction
ZhuchkaTriplesix Sep 20, 2026
b20c3da
Merge pull request #835 from QueryaHub/issue/795-sqlite-sql-grid-save
ZhuchkaTriplesix Sep 20, 2026
8e330e1
fix(mysql): SQL-grid Save uses PK, types, and a transaction
ZhuchkaTriplesix Sep 20, 2026
bf7391c
Merge pull request #836 from QueryaHub/issue/804-mysql-sql-grid-save
ZhuchkaTriplesix Sep 20, 2026
c0fda9e
fix(mysql): do not overwrite the editor with START TRANSACTION
ZhuchkaTriplesix Sep 20, 2026
f282292
Merge pull request #837 from QueryaHub/issue/809-mysql-tx-toolbar
ZhuchkaTriplesix Sep 20, 2026
317d6a4
fix(sqlite): honor form and session read-only on Table Browser
ZhuchkaTriplesix Sep 20, 2026
af1a694
Merge pull request #838 from QueryaHub/issue/793-sqlite-table-browser…
ZhuchkaTriplesix Sep 20, 2026
a6c50e5
fix(redis): honor title-bar read-only in the key browser
ZhuchkaTriplesix Sep 20, 2026
4dd7f73
Merge pull request #839 from QueryaHub/issue/813-redis-readonly
ZhuchkaTriplesix Sep 20, 2026
958ce89
fix(mongo): confirm before drop database, collection, or document
ZhuchkaTriplesix Sep 20, 2026
e308267
Merge pull request #840 from QueryaHub/issue/781-mongo-confirm-drop
ZhuchkaTriplesix Sep 20, 2026
49e4134
fix(redis): confirm before deleting a key or field
ZhuchkaTriplesix Sep 20, 2026
4be3062
Merge pull request #841 from QueryaHub/issue/814-redis-confirm-delete
ZhuchkaTriplesix Sep 20, 2026
8aeedee
fix(redis): parse URI host and TLS for Test and sidebar
ZhuchkaTriplesix Sep 20, 2026
d636c20
Merge pull request #842 from QueryaHub/issue/815-redis-uri-probe
ZhuchkaTriplesix Sep 20, 2026
c04d7ad
fix(redis): page hashes, lists, sets, and zsets in the key editor
ZhuchkaTriplesix Sep 20, 2026
5696eae
fix(ui): wrap SQL toolbar so Execute does not overflow at 700px
ZhuchkaTriplesix Sep 20, 2026
ce92d99
Merge pull request #843 from QueryaHub/issue/816-redis-collection-page
ZhuchkaTriplesix Sep 20, 2026
21ecdf0
fix(redis): do not GET or SET stream and unknown keys as strings
ZhuchkaTriplesix Sep 20, 2026
5a0e401
Merge pull request #844 from QueryaHub/issue/817-redis-stream-unknown
ZhuchkaTriplesix Sep 20, 2026
f5570a3
fix(redis): keep binary bulk values as bytes, not UTF-8 toString
ZhuchkaTriplesix Sep 20, 2026
09df8cb
Merge pull request #845 from QueryaHub/issue/818-redis-binary-values
ZhuchkaTriplesix Sep 20, 2026
c13a880
fix(redis): keep pasted redis/rediss URIs on connectionString
ZhuchkaTriplesix Sep 20, 2026
021b578
Merge pull request #846 from QueryaHub/issue/819-redis-url-paste
ZhuchkaTriplesix Sep 20, 2026
0048ec6
fix(mysql): ORDER BY PK on Table Browser and skip COUNT(*)
ZhuchkaTriplesix Sep 20, 2026
6da850e
Merge pull request #847 from QueryaHub/issue/807-mysql-browse-order
ZhuchkaTriplesix Sep 20, 2026
2a2d6c4
fix(mysql): round-trip BOOLEAN, BIT, BLOB, and JSON in the grid
ZhuchkaTriplesix Sep 20, 2026
3ed1721
Merge pull request #848 from QueryaHub/issue/806-mysql-grid-types
ZhuchkaTriplesix Sep 20, 2026
37d7f8e
fix(mysql): treat ssl-mode=prefer as TLS and fail closed on verify_*
ZhuchkaTriplesix Sep 20, 2026
a64f099
Merge pull request #849 from QueryaHub/issue/805-mysql-ssl-mode
ZhuchkaTriplesix Sep 20, 2026
f72411e
fix(mysql): honor title-bar lock on Table Browser browse/save
ZhuchkaTriplesix Sep 20, 2026
df238bf
Merge pull request #850 from QueryaHub/issue/803-mysql-browse-readonly
ZhuchkaTriplesix Sep 20, 2026
cd498e0
fix(sqlite): show BLOB as hex and keep TEXT affinity on Save
ZhuchkaTriplesix Sep 20, 2026
c9115fa
chore: keep postgres convert-job test name on one line
ZhuchkaTriplesix Sep 20, 2026
d60d501
Merge pull request #851 from QueryaHub/issue/800-sqlite-grid-types
ZhuchkaTriplesix Sep 20, 2026
df73654
fix(sqlite): ORDER BY PK/rowid on Table Browser and skip COUNT(*)
ZhuchkaTriplesix Sep 20, 2026
2f1c517
Merge pull request #852 from QueryaHub/issue/799-sqlite-browse-order
ZhuchkaTriplesix Sep 20, 2026
0b40bc4
fix(sqlite): do not create an empty database when the file is missing
ZhuchkaTriplesix Sep 20, 2026
00d3a6a
Merge pull request #853 from QueryaHub/issue/798-sqlite-missing-file
ZhuchkaTriplesix Sep 20, 2026
e64bb16
fix(sqlite): classify WITH / PRAGMA by first statement, not prefix
ZhuchkaTriplesix Sep 20, 2026
165cb69
Merge pull request #854 from QueryaHub/issue/797-sqlite-with-pragma
ZhuchkaTriplesix Sep 20, 2026
bb45769
fix(sqlite): bind getObjectDdl with ? not :name plus a List
ZhuchkaTriplesix Sep 20, 2026
4b061a5
Merge pull request #855 from QueryaHub/issue/796-sqlite-get-object-ddl
ZhuchkaTriplesix Sep 20, 2026
67bd5ff
fix(postgres): classify Table Browser SQL by first statement, not con…
ZhuchkaTriplesix Sep 20, 2026
4e46e7c
fix(sqlite): drop dangling library doc comment on sqlite_sql.dart
ZhuchkaTriplesix Sep 20, 2026
bdd0fb1
Merge pull request #856 from QueryaHub/issue/791-postgres-custom-sql-…
ZhuchkaTriplesix Sep 20, 2026
00e6c17
fix(postgres): host/port SSL uses verify-full when a Root CA is set
ZhuchkaTriplesix Sep 20, 2026
16f3aa6
Merge pull request #857 from QueryaHub/issue/790-postgres-ssl-verify
ZhuchkaTriplesix Sep 20, 2026
d311cac
fix(postgres): round-trip timestamptz / bytea / jsonb / arrays in the…
ZhuchkaTriplesix Sep 20, 2026
89e86f9
Merge pull request #858 from QueryaHub/issue/789-postgres-grid-types
ZhuchkaTriplesix Sep 20, 2026
0b7c86f
fix(postgres): ORDER BY PK on Table Browser and skip COUNT(*)
ZhuchkaTriplesix Sep 20, 2026
5b1a317
Merge pull request #859 from QueryaHub/issue/788-postgres-browse-order
ZhuchkaTriplesix Sep 20, 2026
8a65252
fix(postgres): detect BEGIN without an assigned XID
ZhuchkaTriplesix Sep 20, 2026
945cb2f
Merge pull request #860 from QueryaHub/issue/787-postgres-txid
ZhuchkaTriplesix Sep 20, 2026
8b0c227
fix(mongo): parse Extended JSON and hex _id in the document filter
ZhuchkaTriplesix Sep 20, 2026
e63a575
Merge pull request #861 from QueryaHub/issue/783-mongo-json-filter
ZhuchkaTriplesix Sep 20, 2026
d706661
fix(mongo): confirm before discarding a dirty document editor
ZhuchkaTriplesix Sep 20, 2026
9e786c2
Merge pull request #862 from QueryaHub/issue/782-mongo-dirty-editor-back
ZhuchkaTriplesix Sep 20, 2026
b7dbe95
fix(mongo): replace full-document Save instead of $set merge
ZhuchkaTriplesix Sep 20, 2026
7f7097c
Merge pull request #863 from QueryaHub/issue/778-mongo-replace-one
ZhuchkaTriplesix Sep 20, 2026
47e53b3
fix(mongo): fail update/delete when 0 documents match
ZhuchkaTriplesix Sep 20, 2026
0e8d53b
Merge pull request #864 from QueryaHub/issue/776-mongo-zero-match
ZhuchkaTriplesix Sep 20, 2026
334ef36
fix(sqlite): edit Table Browser rows via implicit rowid
ZhuchkaTriplesix Sep 20, 2026
14eca20
Merge pull request #865 from QueryaHub/issue/774-sqlite-implicit-rowid
ZhuchkaTriplesix Sep 20, 2026
b41402f
fix(grid): distinguish schema load failure from missing PK
ZhuchkaTriplesix Sep 20, 2026
e5758e1
Merge pull request #866 from QueryaHub/issue/772-schema-load-vs-missi…
ZhuchkaTriplesix Sep 20, 2026
20da778
chore(release): open the 0.4.17 cut
ZhuchkaTriplesix Sep 20, 2026
4a12634
Merge pull request #881 from QueryaHub/issue/880-0417-plan
ZhuchkaTriplesix Sep 20, 2026
cdba838
chore(release): freeze CHANGELOG for Querya Desktop 0.4.17
ZhuchkaTriplesix Sep 20, 2026
73bcadd
merge: main into 0.4.17 release (keep pubspec 0.4.17+1)
ZhuchkaTriplesix Sep 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,67 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Planned

- Hidden bugs pass 2 — data-loss / fail-open: [#867](https://github.com/QueryaHub/Querya-Desktop/issues/867)–[#873](https://github.com/QueryaHub/Querya-Desktop/issues/873)
- Algorithm / first paint / 120 Hz: [#874](https://github.com/QueryaHub/Querya-Desktop/issues/874)–[#879](https://github.com/QueryaHub/Querya-Desktop/issues/879)

## [0.4.17] - 2026-09-20

Driver and grid correctness after 0.4.16: Table Browser schema vs missing PK, SQLite implicit `rowid`, Mongo write/filter/discard, and Postgres / MySQL / SQLite / Redis session, type, and Save fixes.

### Fixed

- **Table Browser schema load vs missing PK (#772)** — A failed `getTableSchema` (permissions, disconnect) is no longer shown as “Cannot edit: no primary key detected”. Status is “schema unavailable” plus the real error and Refresh retries schema. Editing stays off until schema loads. Genuine missing PKs still use the old copy. SQLite implicit `rowid` is applied only after a successful schema load.
- **SQLite implicit rowid Table Browser (#774)** — Tables with no declared PRIMARY KEY (`CREATE TABLE t (name TEXT)`) use implicit `rowid` as the DML key. Browse `SELECT` projects `"rowid", *` so Save can `UPDATE … WHERE rowid`. Status is no longer “no primary key”. `WITHOUT ROWID` tables keep their declared PK.
- **Mongo 0-match write (#776)** — `updateOne` / `replaceOne` / `deleteOne` throw when `nMatched` / `nRemoved` is 0 (wrong `_id` type, deleted doc). Inspector and JSON editor surface Save Failed instead of a success toast. An identical `$set` (`nModified == 0`) still counts as a match.
- **Mongo full-document Save (#778)** — JSON editor Save uses `replaceOne` (whole document, `_id` locked) instead of `$set`, so fields deleted in JSON — including nested keys — are removed on the server.
- **Mongo document editor Back (#782)** — Dirty JSON in `MongoDocumentEditor` is registered with `UnsavedWorkRegistry`. Breadcrumb Back, Home, Close, and tree navigation confirm before discarding; Cancel keeps the editor.
- **Mongo JSON filter ObjectId / DateTime (#783)** — Document list filter parses Extended JSON (`$oid`, `$date`) and wraps a 24-character hex `_id` as `ObjectId`. A leftover string `_id` with zero matches shows how to write `{ "_id": { "$oid": "…" } }`.
- **Postgres open-transaction probe (#787)** — `BEGIN` + `SELECT` does not assign an XID, so `pg_current_xact_id_if_assigned` stayed NULL (SQL-tab badge off; autocommit-off prepended a second `BEGIN`). The session tracks BEGIN/COMMIT/ROLLBACK and otherwise probes `pg_stat_activity.xact_start` (PG 9+). Implicit BEGIN when autocommit is off stays a separate `execute`.
- **Postgres Table Browser paging (#788)** — Browse stays on `PgSessionMode.readOnly`. `SELECT` uses `ORDER BY` primary-key columns when a PK exists. Row totals come from `pg_class.reltuples` instead of a blocking `COUNT(*)` before first paint (stale estimates below the current page are ignored so Next still works). Save / REFRESH stay on `tableWrite`.
- **Postgres timestamptz / bytea / jsonb / arrays (#789)** — Table Browser and SQL results encode cells as PG literals (ISO timestamps, `\x` hex for bytea, JSON text for jsonb, `{1,2,3}` for arrays) instead of `Object.toString`. Schema uses `udt_name` so `ARRAY` / `USER-DEFINED` round-trip through `formatLiteral`.
- **Postgres host/port SSL (#790)** — Host/port Use SSL/TLS stays `sslmode=require` (encrypt, no CA check) unless a Root CA is set, then `verify-full`. A URI `sslmode=` value still wins. The form documents the MITM tradeoff and writes `sslmode=verify-full` when saving a Root CA.
- **Postgres custom-SQL allowlist (#791)** — Table Browser SQL dialog classifies the first statement after comments instead of substring `contains('insert ')`. `SELECT inserted_at` is allowed; `SELECT 1; DELETE FROM t` is rejected. `WITH … INSERT` is a write; `TABLE` / `VALUES` / `(SELECT …)` stay allowed.
- **SQLite getObjectDdl bind (#796)** — DDL lookup uses `WHERE name = ?` with a positional list. `:name` plus `[objectName]` did not bind, so the dialog showed **No definition found** for tables that exist.
- **SQLite WITH / PRAGMA (#797)** — `execute` classifies the first statement after comments: `WITH … INSERT` is a write (Dart read-only guard + `execute` instead of `rawQuery`). Assignment `PRAGMA name=value` is a write; `PRAGMA busy_timeout` stays a query. SQL workspace injects `LIMIT` only for read-only statements.
- **SQLite missing file (#798)** — Test Connection and opening a saved connection no longer create an empty `.db` when the path is a typo. Errors distinguish file not found, permission, and corrupt. New-connection Save still creates the file if it does not exist.
- **SQLite Table Browser paging (#799)** — Browse `SELECT` uses `ORDER BY` primary-key columns, or `rowid` when the table has implicit rowid. First paint skips blocking `COUNT(*)` (Next stays available when the page is full). SQL workspace has an optional statement timeout matching Postgres/MySQL.
- **SQLite BLOB / TEXT grid (#800)** — Table Browser and SQL results show BLOB as `X'hex'` (not `Uint8List.toString()`) and persist the same. Declared TEXT stays a quoted string even when it looks numeric (`00123`).
- **MySQL Table Browser session lock (#803)** — Browse stays on `MysqlSessionMode.readOnly`. Title-bar lock is passed into `MysqlTableView`: staging / Save stay off and Save does not acquire `tableWrite`. `SET SESSION TRANSACTION READ ONLY` is documented as a next-transaction hint (weaker than a read-only user; MariaDB vs MySQL 8).
- **MySQL ssl-mode (#805)** — `ssl-mode=prefer` enables TLS (same as `require`) instead of turning it off. `verify_ca` / `verify_identity` fail closed without `sslrootcert` and ask the driver to check the CA (and hostname for identity). Form Use SSL stays encrypt-only.
- **MySQL BOOLEAN / BIT / BLOB / JSON grid (#806)** — Schema uses `COLUMN_TYPE` so BOOLEAN is `tinyint(1)` (TRUE/FALSE on Save). BIT/BLOB/BINARY cells display as `0x` hex and persist as `X'…'`; JSON stays quoted text. The MySQL driver decodes charset-63 payloads as latin1 so invalid UTF-8 no longer throws.
- **MySQL Table Browser paging (#807)** — Browse `SELECT` uses `ORDER BY` primary-key columns when a PK exists. Row totals come from `information_schema.TABLES.TABLE_ROWS` instead of a blocking `COUNT(*)` before first paint (stale estimates that are below the current page are ignored so Next still works).
- **Redis URL paste (#819)** — Paste `redis://` / `rediss://` stores the raw URI on `connectionString` (like Postgres/MySQL/Mongo), so `sslrootcert` / `sslcert` / `sslkey` reach `RedisConnection.connect`.
- **Redis binary bulk (#818)** — GET / SCAN / hash / list / set / zset decode bulk replies as bytes (`RedisParserBulkBinary`). Invalid UTF-8 is shown as hex / base64; Save as text is off so SET cannot write replacement characters.
- **Redis stream/unknown GET-SET (#817)** — Stream, module, and `unknown` keys are not opened with `GET` or saved with `SET`. Save stays on `string` only; `unknown` retries `TYPE` before treating the value as a string.
- **SQL toolbar overflow** — MySQL / Postgres Query + History + Execute wrap instead of overflowing at ~700px (widget tests treat RenderFlex overflow as failure).
- **Redis collection paging (#816)** — Hash / list / set / zset editors load the first 200 members (`HSCAN` / `LRANGE` / `SSCAN` / `ZRANGE`) with Load more, instead of `HGETALL` / `LRANGE 0 -1` / `SMEMBERS` / `ZRANGE 0 -1`. Keys with 10k+ members show a large-key warning.
- **Redis URI Test/sidebar (#815)** — Test Connection and the sidebar keyspace probe parse `redis://` / `rediss://` via `fromConnectionRow` (host, port, TLS, cert query params) instead of hitting localhost:6379. The probe keeps `id: -1` so it does not replace workspace sockets.
- **Redis DEL confirm (#814)** — Deleting a key (browser or editor) and removing a hash field / set member / zset member opens the same destructive-operation dialog as SQL. Cancel / Escape does not send `DEL` / `HDEL` / `SREM` / `ZREM`.
- **Mongo drop/delete confirm (#781)** — Drop database, drop collection, document Del, and editor Delete open the same destructive-operation dialog as SQL. Cancel / Escape does not call `dropDatabase` / `dropCollection` / `deleteOne`.
- **Redis title-bar read-only (#813)** — Session lock is passed into the key browser and editor. Save, DEL, HSET/HDEL, RPUSH, SADD/SREM, ZADD/ZREM, and TTL apply stay hidden; the explorer socket also refuses those writes and sends `READONLY` after AUTH when locked (ignored on standalone / older servers).
- **SQLite Table Browser read-only (#793)** — Connection-form Read only (`useSSL`) opens the file with `SQLITE_OPEN_READONLY` even for Save (`tableWrite`). Title-bar session lock is passed into `SqliteTableView`: staging / Save stay off and the grid does not acquire a writable handle.
- **MySQL SQL tx toolbar (#809)** — Begin / Commit / Rollback run `START TRANSACTION` / `COMMIT` / `ROLLBACK` on the SQL socket without replacing the editor buffer. The toolbar shows Transaction open/none. Table Browser Save stays on the `tableWrite` socket from #802 (no nested `START TRANSACTION`); opening a table still warns while SQL has an open transaction.
- **MySQL SQL-grid Save (#804)** — Result-grid Save runs only for a simple single-table `SELECT` with a PK in the result (`getTableSchema`). JOIN, comma-`FROM`, and no-PK results stay read-only. DML uses the PK and `columnDataTypes`; applies still wrap `START TRANSACTION` / `COMMIT` / `ROLLBACK` (join an already-open SQL transaction).
- **SQLite SQL-grid Save (#795)** — Result-grid Save runs only for a simple single-table `SELECT` with a PK in the result (`getTableSchema`). JOIN, comma-`FROM`, and no-PK results stay read-only. DML uses the PK and `columnDataTypes`; applies still wrap `BEGIN TRANSACTION` / `COMMIT` / `ROLLBACK` (join an already-open `BEGIN`).
- **Postgres SQL-grid Save (#786)** — Result-grid Save runs only for a simple single-table `SELECT` with a PK present in the result (`getTableSchema`). JOIN, comma-`FROM`, subqueries, and VALUES stay read-only. DML `WHERE` uses the PK and `columnDataTypes` instead of every displayed column.
- **Redis Overview/Explorer sockets (#812)** — Overview INFO and Explorer SCAN/GET/`SELECT` use separate pooled sockets (`stats` vs `explorer`) so opening a DB no longer kills keep-alive Overview, and Home Refresh no longer steals Explorer. User Disconnect closes both roles.
- **MySQL Table Browser session (#802)** — Browse uses a read-only pool slot; Save uses a dedicated `tableWrite` socket so SQL `START TRANSACTION` / `SET` / `USE` do not leak into the grid. SQL-grid Save joins an already-open transaction instead of nesting `START TRANSACTION`. Opening a table on the same database (and Overview↔SQL) warns while SQL has an open transaction.
- **SQLite Table Browser session (#794)** — Browse uses a read-only `Database`; Save uses a dedicated `tableWrite` handle so SQL `BEGIN` / `ATTACH` do not leak into the grid (no nested `BEGIN`). SQL-grid Save joins an already-open transaction instead of starting another. Opening a table (and Overview↔SQL) warns while SQL has an open `BEGIN`.
- **Postgres Table Browser session (#785)** — Browse uses a read-only pool slot; Save and `REFRESH MATERIALIZED VIEW` use a dedicated `tableWrite` socket so they do not share the SQL editor’s TCP session. Statement-timeout `forceClose` on SQL no longer kills the grid. Opening a table while SQL has an open transaction on the same database warns, matching Overview↔SQL.
- **Mongo inspector Apply (#775)** — With **Save to DB** wired, **Apply** and **Ctrl/Cmd+Enter** persist through the same `$set` callback instead of only closing the dialog. SQL-grid Apply (no callback) still stages locally.
- **Mongo field codec (#777)** — Inspector Save keeps BSON type: strings that look like numbers stay strings; ObjectId, DateTime, Int64, and Decimal128 round-trip. `$set` of `_id` stays blocked.
- **Mongo document editor (#779)** — Documents encode as relaxed Extended JSON (`$oid`, `$date`, …) instead of `JsonEncoder` / `toString()`. Save decodes EJSON so the `_id` filter stays an `ObjectId`, not a string.
- **0-row DML Save (#773)** — Table Browser and SQL-grid Save fail (and roll back) if any statement matches 0 rows instead of toasting success from statement count. The staging buffer is kept.
- **Table Browser navigation (#771)** — Home, Close workspace, tree/object changes, and the matching Command Palette actions confirm before discarding staged grid or SQL edits. Cancel leaves the staging buffer registered.
- **Redis SET TTL (#811)** — Saving a string key uses `SET … KEEPTTL XX` (Redis 6+) so an existing expiry is not cleared. Older servers fall back to `TTL` then `SET … EX`. A key that already expired is not recreated.
- **MySQL SELECT cap (#808)** — SQL Workspace injects/clamps `LIMIT` like Postgres and drains leftover `rowsStream` rows instead of cancelling, so the session is ready for the next statement. Table Browser custom SQL gets the same LIMIT clamp so `execute` does not buffer an unbounded result.
- **Postgres Save (#784)** — Table Browser and SQL-grid Save run `BEGIN`, each DML statement, and `COMMIT` as separate extended-protocol executes (Parse cannot contain multiple commands). Autocommit-off SQL starts a transaction with its own `BEGIN` instead of concatenating `BEGIN;` onto the user query.
- **Mongo session auth (#780)** — After `scrubCredentials()`, find/update/list still authenticate from an in-memory session URI (getters stay null; nothing is written back). One `Db` is reused per database instead of open/close on every call.
- **Table Browser INSERT (#792, #810)** — Skip `GENERATED ALWAYS` / identity-always / `AUTO_INCREMENT` columns and omit empty cells that have a server default, so new rows do not send `id` or `''`.
- **SQLite WAL (#801)** — Open writable user databases with `PRAGMA journal_mode=WAL` (falls back if the FS cannot create the WAL file) and surface `SQLITE_BUSY` as a retryable error instead of a generic execute failure.

## [0.4.16] - 2026-09-20

In-place editing in Table Browser (same DML staging as SQL Workspace), Command Palette and Quick Switcher, workspace chrome parity across drivers, connections-tree visual + FPS work, MongoDB per-field Save to DB, and a hardened in-app updater.
Expand Down
Loading
Loading