…ow, and a failed schema read shows the wrong tables (#424)
Two engines probed on 2026-08-26 through the real providers and then read again in
Chrome on the built app. Only one of them earns an entry, and the one that does not is
the point of this change.
**Garnet 2.1.5, registered `full` via `redis`.** Every Redis surface answers: the key
browser grouped 71 keys into `user:*` (50), `session:*` (20) and `queue:*` (1), a
`GET user:1` run returned the value, and Monitoring rendered version, uptime, sessions
and table counts. It is the first relative here whose own version was available and went
unread - `INFO` carries `garnet_version:2.1.5` and `server_name:garnet` while the product
shows Redis 7.4.3, where Valkey and DragonflyDB publish only an emulation level and KeyDB
nothing at all. Two of its readings are absences wearing a value, both from `INFO` fields
Garnet does not publish and both checked against Redis 8.10.0 in the same pass: no
`used_memory`, so every size reads 0 B; and no keyspace counters, so the cache hit ratio
reads 100% - and the dashboard rates that `Excellent`, which is D14's fallback being
graded. The row says so.
**QuestDB 10.0.1 is measured and REFUSED a row, and the refusal is the finding.** It
speaks the PostgreSQL wire protocol and through the provider a statement answers -
`SELECT country, count() c FROM probe_orders` returned three rows - so every signal short
of a browser said "query-only relative, register it". In the product the editor cannot run
anything: it always attaches a `queryId`, the provider then issues `SELECT pg_backend_pid()`
first, and QuestDB has no such function, so pressing Run answers
`500 unknown function name: pg_backend_pid()`. Measured both ways at the provider boundary
to establish the cause rather than guess it: the identical call with a `queryId` fails and
without one returns the rows. A query-editor-only tier claims exactly one thing and that is
the thing that does not work, which makes this the Cloud Spanner case - the number is the
finding, and it lives in `docs/providers/README.md` under "Measured, and refused a row".
The unit test and the e2e hint assertion both pin the ABSENCE, because QuestDB is the most
re-addable name on that list.
Recorded there too, for whoever revisits it: QuestDB is not the Materialize/RisingWave case
of an absent catalog. `information_schema.tables` and `pg_catalog.pg_class` both answer, and
the object browser fails on two independent causes of ours - `AS MATERIALIZED`, then
`pg_total_relation_size()` - so fixing either alone changes nothing.
**D31, found while chasing that.** A connection whose `POST /api/db/schema/list` fails
leaves the previous connection's tables on screen as its own: measured with the network
captured, `probe_customers 3` and `probe_orders 2.0k` (Doris's tables and Doris's numbers)
under a header reading QuestDB, while QuestDB's own table never appeared. `fetchSchema`
returns on failure without clearing `schema`, and storage is not involved
(`serverMode: false`). It is worse than an empty tree, because it attributes real objects
with real row counts to a database that does not contain them, and it hits every engine
whose object browser fails - CockroachDB, Materialize, RisingWave, QuestDB. Filed, not
fixed: the fix is a hook change with its own coverage, not a line inside a labelling PR.
Counts: relatives 20 -> 21, published figure 34 -> 35, both re-derived from
`connectableProductCount()`. The `questdb` compose service is kept under the `compat`
profile deliberately, so the refusal can be reproduced instead of taken on trust.
Local gates: format, lint, typecheck, knip, build, run-core.sh (351 files),
run-components.sh (33 groups).
Continues #424 Phase 0. Stacked on #503 (Apache Doris) — that PR's commit is the parent
here, so review or merge it first and this diff reduces to its own commit.
Two engines probed, one entry
fullviaredisghcr.io/microsoft/garnet:2.1.5questdb/questdb:10.0.1Both called surface by surface through the real provider, then read again in real Chrome
against
bun run build && bun run start.QuestDB is the reason this PR exists
Everything short of a browser said "register it": QuestDB speaks the PostgreSQL wire protocol
on 8812, and through the provider
SELECT country, count() c FROM probe_ordersreturns threerows. So it looks exactly like a third query-editor-only relative beside Materialize and
RisingWave.
In the product the editor cannot run anything. Pressing Run answers
500 unknown function name: pg_backend_pid()— the editor always attaches aqueryId, andthe provider then issues
SELECT pg_backend_pid()before the statement. Measured both ways atthe provider boundary so the cause is established rather than inferred:
A
query-editor-onlytier claims exactly one thing, and that is the thing that does not work.This is the Cloud Spanner case already recorded in this repo, found the same way, so it is
handled the same way: no registry entry, and the number is the finding in
docs/providers/README.mdunder Measured, and refused a row. The unit test and the e2e hintassertion both pin the absence, because QuestDB is the most re-addable name on that list —
and the
questdbcompose service stays under thecompatprofile so the refusal can bereproduced instead of trusted.
Recorded there too, because it is the trap for whoever revisits this: QuestDB is not the
Materialize/RisingWave case of an absent catalog.
information_schema.tableslists the tableand
pg_catalog.pg_classanswers with 36 columns. The object browser fails on two independentcauses of ours — the schema query's
AS MATERIALIZEDCTEs are a syntax error there, andwith the keyword removed the same query dies on
pg_total_relation_size()— so fixing eitherone alone changes nothing.
Garnet
Every Redis surface answers, so
fullby this registry's own definition, with the wrong numbersrecorded as caveats the way Citus's are. Browser-verified: tree
user:* 50,session:* 20,queue:* 1; a{"command":"GET","args":["user:1"]}run returned the value; Monitoring showed7.4.3,Connections 0 / no limit published,Tables 71 / 0 indexes.What makes its row different from the three Redis relatives already here:
INFOcarriesgarnet_version:2.1.5andserver_name:garnet, and the overview shows Redis7.4.3. Valkey and DragonflyDB publish onlyan emulation level and KeyDB nothing at all, so on those three the displayed version is the best
reading available; here it is not;
pass: no
used_memory, so every size reads0 B; nokeyspace_hits/keyspace_misses, so thecache hit ratio reads
100%— and the dashboard rates it Excellent, which is D14's fallbackbeing graded;
dbsize71 before adocker stop,0 after.
D31, found while chasing the QuestDB tree
A connection whose
POST /api/db/schema/listfails leaves the previous connection's tables onscreen as its own. Measured with the network captured:
probe_customers 3andprobe_orders 2.0k— Doris's tables, Doris's row counts — under a header reading QuestDB 10.0.1 (probe), while
QuestDB's own
questdb_only_markernever appeared and QuestDB has noprobe_customersat all.fetchSchemainsrc/hooks/use-connection-manager.tstoasts andreturns without touchingschema;Studio.tsxclears it only when the active connection becomes null. Storage is notinvolved —
/api/storage/configanswersserverMode: falseandlibredb_schema_snapshotswasempty. Worse than an empty tree, because it attributes real objects with real row counts to a
database that does not contain them and the tables are clickable. Hits every engine whose object
browser fails: CockroachDB, Materialize, RisingWave, QuestDB.
Filed as D31, not fixed — the fix is a hook change with its own coverage, not a line inside a
labelling PR. One observation is parked in the entry rather than filed separately: a single
connection selection issues the same
schema/listread two or three times.Counts
Relatives 20 → 21, published figure 34 → 35, both re-derived from
connectableProductCount()(14 external drivers + 21 relatives). The shipped half does not move — no new driver, no new
dependency.
Verification
format·lint·typecheck·knip·build·tests/run-core.sh(351 files) ·tests/run-components.sh(33 groups). Browser pass on the built app: hero readsPlus 21 wire-compatible engines and names Garnet and Apache Doris but not QuestDB; the
PostgreSQL hint names CockroachDB and not QuestDB; the Redis hint names Garnet with no tier
suffix; the MySQL hint names Apache Doris.