Repository navigation
0.18.1
LibreDB Studio 0.18.1 adds Databend as a connection type of its own, over Databend's HTTP query API, for self-hosted Databend and for Databend Cloud warehouses.
Admins get a Seed sources card that says why each seed connection loaded or was skipped, query results export as Markdown or HTML, and the object tree gains a filter box.
It also fixes how the browser copy of the workspace passed between accounts on server storage: an account that signed in on a browser profile another account had signed out of received that account's connections, with their saved credentials, and its query history, so operators running sqlite or postgres storage should upgrade (GHSA-jwvh-6phv-j9jh).
A result column no longer loses its name or its value to another column of the same name.
The rest is a run of fixes across PostgreSQL, the MySQL family, MongoDB, Redis, Neo4j, Oracle and others, most of them from community contributors.
Two seed-file checks are stricter, so read Upgrading before you upgrade a deployment that loads a seed file.
Databend
Databend connects as the databend type over its HTTP query API, with no driver, to a self-hosted query node on port 8000 or to a Databend Cloud warehouse over HTTPS on 443 (#1593).
The connection takes a host, a port, a SQL user and password, a database and a Warehouse, with the SSL / TLS panel or an SSH tunnel, and a databend:// DSN copied from the Databend Cloud Connect page fills the fields through Paste URL.
Studio does not send the password without TLS to a host other than the local machine unless the connection ticks Send the password without TLS.
The editor runs one statement per request, each in a session of its own, so a transaction or a temporary table ends with its statement, and USE or SET does not carry over to the next one.
The object tree lists catalogs, databases, tables, views, materialized views and dynamic tables with their columns and DDL.
Explain sends plain EXPLAIN, never EXPLAIN ANALYZE, and declines a statement Databend would run while planning it.
Monitoring reads sessions, slow queries and table sizes from Databend's system tables, and Kill Query works for a role granted SUPER.
Not offered on this type: inline row edits, object edits, Create Table, import, transaction controls, agent execution and MCP run_read_query; agent plan mode and MCP's metadata tools work.
readOnly: true is refused for a Databend connection, so give Studio a database role that cannot write; the confirmation before destructive statements does not know Databend's own forms such as INSERT OVERWRITE or VACUUM.
With a Warehouse set or a Databend Cloud host, Studio sends no background health check and does not open the connection until you use it, so a suspended warehouse stays suspended: the header shows Not checked, and the admin Overview page counts such a connection outside the fleet health score (#1589).
A first statement or Test Connection on a suspended warehouse can fail with a message that the warehouse may be resuming and pass a minute later, and one Studio process runs at most two Databend statements at a time, across every Databend connection.
Measured on Databend v1.2.951-nightly, on v1.2.881, the oldest version measured, and on a Databend Cloud tenant.
Before this release Databend was reached as a relative of the MySQL type, over its MySQL handler; the new type does not use that handler.
Seed sources on the admin Overview
The admin Overview page has a Seed sources card, backed by the admin-only GET /api/admin/seed-sources, that shows whether the seed file loaded, was empty, was not found or failed, with its path, the error and its code, the connections it listed, and the ones it skipped and why (#1570).
A connection skipped for an undefined ${ENV_VAR} is listed there with the variable's name instead of only in the server log, and no message shows a value or quotes the seed file.
A connection id repeated inside a seed file is now named in the load error, and two load checks are stricter (see Upgrading).
Security fix
In server storage mode (STORAGE_PROVIDER set to sqlite or postgres), an account that signed in on a browser profile another account had signed out of received that account's browser copy of the workspace: the connections it had added, with their saved credentials, and its query history, which was then saved into the new account's server data (GHSA-jwvh-6phv-j9jh).
This affects every release with server storage, from 0.8.0 through 0.18.0, wherever people share a browser profile.
The browser copy now belongs to the signed-in account: signing in as a different account starts from that account's own server data, every signed-in page waits for that check, and a request that names another account is refused with 409 WORKSPACE_OWNER_MISMATCH (#1576).
Sign-out saves pending changes, ends the session, then clears the browser copy; if server storage cannot be reached, the session still ends and the unsaved changes stay for that account.
Local storage mode, documented as single-user, is otherwise unchanged.
Every result column has a name and a value of its own
On SQL Server an unaliased expression such as SELECT COUNT(*) FROM t shows as (No column name) instead of breaking the results panel until a reload, and a name repeated across a join, such as id, shows as id and id (2) with each side's own value, where PostgreSQL, MySQL, SQLite, DuckDB, libSQL and ClickHouse used to show one side's value twice (#1575).
The results panel also recovers from a render error, and inline edit refuses a generated column name.
Cassandra and InfluxDB 3, whose drivers merge a repeated column name, now refuse such a result with an error that says so.
Also in this release
Editor, results and export
- Query results export and copy as a Markdown table or as a standalone HTML document, from the Export and Copy menus, with masking applied as in the other formats (#1567, closes #1532).
- The desktop object tree has a filter box, in the standalone app and the embedded
StudioWorkspace: it matches object names across the folders already loaded, ignoring case, keeps the path to each match and highlights it; folders not loaded yet are counted, and Read and search loads up to 24 of them per press (#1587). - On an engine whose SQL takes no statement terminator, such as Elasticsearch, a selected single statement ending in
;now runs without the;, as running it from the caret already did (#1561, closes #1414). - The automatic row limit goes before a clause the dialect writes after the bound, so a bounded read with Materialize's
AS OFor ScyllaDB'sBYPASS CACHEorUSING TIMEOUTis accepted, and a query with its ownLIMITbefore such a clause, or before Cassandra'sALLOW FILTERING, gets no secondLIMIT(#1501, closes #1398). - Generate Code types ClickHouse
Array(...)andMap(...), PostgreSQL arrays, LibreDBnumber, OracleNUMBERand 64-bit integers correctly in all six languages, and quotes or sanitises a field name that is not a valid identifier, such as@timestamp, so the generated code parses (#1497, closes #1446). - The ERD and Docs headers and the Docs Markdown export count relations by kind, so four tables and a view read "4 tables, 1 view" (#1508, closes #1466).
- In the sidebar, a connection with an environment badge and a read-only marker keeps the start of its name visible, with the full name in a tooltip (#1544, closes #1430).
- The header shows no connection status until the provider's metadata has loaded, and none if that read fails, and an edit that points a connection somewhere else reads its status again instead of showing the old target's (#1589).
- The MCP settings page has a link back to the editor, also when the settings fail to load (#1564, closes #1467).
PostgreSQL and its relatives
- The object tree no longer lists functions, procedures, views and other relations that an extension such as pgcrypto, hstore or pg_stat_statements installed into a user schema like
public(#1597, closes #1429). Measured on PostgreSQL 18.6, TimescaleDB, OrioleDB, Percona PostgreSQL, AlloyDB Omni and YugabyteDB. - On CockroachDB the Source tab of a function or procedure no longer offers Edit, which every apply refused; PostgreSQL keeps routine edits (#1595, closes #1437).
MySQL family
- The Monitoring Overview counts indexes per table on MySQL, MariaDB and Percona Server, so an index name that several tables share, such as
PRIMARY, is no longer counted once for the whole database; the figure can rise after the upgrade (#1537, closes #1441). - The Monitoring Overview names Percona Server for MySQL as Percona Server with its version, read from
@@version_comment(#1556, closes #1444).
MongoDB and Couchbase
- Schema inference marks a field nullable when some sampled documents lack it, so Docs and the ERD no longer call it not null, and Profile Collection counts an explicit null as null, as it already did an absent field, instead of as a distinct value (#1554, closes #1456).
- Generate Test Data is offered on collections and writes nested documents, each value typed as its field was inferred (#1555, closes #1468).
- Whole-database Validate skips views instead of failing at the first one, and whole-database Compact reports a failure when a collection refused, with counts for each (#1522, closes #1408).
- The Monitoring database size counts index bytes, so the Storage tab's shares no longer pass 100%, and a time series collection is no longer counted twice; on Couchbase a bucket shows its on-disk size on both the Tables and Storage tabs (#1553, closes #1455).
- Test Connection to a port where nothing listens fails in about 30 seconds instead of about a minute, and the bound stays above MongoDB's election window (#1518, closes #1458).
Redis
- Results are shaped by their command:
ZRANGE ... WITHSCORESasmemberandscore,XRANGEandXREVRANGEas one row per entry with anidcolumn,CONFIG GETasparameterandvalue, and theSCANfamily with acursorcolumn; opening a stream key generatesXRANGE <key> - + COUNT 100, and a RedisJSON keyJSON.GET <key>(#1552, closes #1454).
Other engines
- When ClickHouse, Druid, libSQL or Couchbase cannot be reached, the error names the cause and the address instead of "fetch failed" (#1571, closes #1431).
- A Neo4j label, relationship type or property name that holds a lower-case
\uXXXXescape still lists in the tree and now fails to open with a name error, instead of building a statement the read policy refused (#1545, closes #1295). - An Oracle SQL INSERT export writes zoned timestamps that arrived over HTTP as
FROM_TZ(TO_TIMESTAMP(...), 'UTC'), so the export replays instead of failing withORA-01843(#1500, closes #1224). - A LibreDB connection to
:memory:is refused with a message that LibreDB has no in-memory mode, instead of creating a file named:memory:, and a missing directory is named instead of a.lockfile (#1562, closes #1450).
API, MCP and the agent
POST /api/db/query,/api/db/healthand/api/db/multi-queryanswer 400CONFIG_ERRORfor an inline connection with noid, as/api/db/test-connectionalready did, instead of 500 (#1572, closes #1539).- MCP
inspect_schemareports Studio's own execution-profile refusal, such as a PostgreSQL or SQL Server seed principal with too much privilege, in Studio's words instead of as a database error (#1560, closes #1462). - An agent run that ended because the model did not answer in time says so on the answer card and in the run header (#1509, closes #1461).
- Four more local models are measured for the agent, taking the roster to 44:
ornith-1.5:35bandqwen3:32bwith no setting, andqwen3.5:35bandornith-1.5:9bwithsuppressPlanReasoning(#1583).
Dependencies
- sharp is held at 0.35.5 for GHSA-wq5f-xc86-pv6w and source-map-js at 1.2.2 for GHSA-68fv-2mgg-jv7q, both rated high upstream (#1581). sharp ships in the image for the Next.js image optimizer, which leaves SVG alone while
images.dangerouslyAllowSVGis off, as it is in Studio; source-map-js runs only in the CSS build.
Install channels
- CapRover: each stable release now carries the plain and auto-connect templates at its own version, and CI stages them on LibreDB's catalog fork for a LibreDB member to test and open as a pull request to the official catalog, so the catalog follows a release after that step (#1551). The plain template defaults to 0.18.0 or later (#1538), the auto-connect card names all nine database families it connects to (#1542), and auto-connect is listed as a channel of its own (#1550).
- The old third-party CapRover repository at
https://libredb.org/caprover-one-click-appsno longer serves an app list; install from the official One-Click Apps catalog (#1557). - The Dokku plugin is listed on Dokku's community plugins page (#1596), Railyard's template catalog lists Studio (#1568), and ZopDev Helm Charts is a live channel with a chart of ZopDev's own, which pins its own Studio version (#1558).
Upgrading
These changes can stop a setup that worked before:
- Seed connection strings. A seed connection that sets
connectionStringon a type whose provider does not read it now fails the whole seed file when it loads, naming the connection and the type: duckdb, mssql, druid, trino, cassandra, elasticsearch, opensearch, redis, prometheus, kafka, etcd, neo4j, milvus, qdrant, influxdb, influxdb3, oxia and libredb, and the new databend (#1570, #1593). An mssql seed with only aconnectionStringused to load and openlocalhost. Move the value intohost,port,user,passwordanddatabase; a sqlite seed that names its file inconnectionStringkeeps working. - Seed file YAML. A seed file with a YAML warning, such as an unquoted value that starts with
!, is now refused as unparseable instead of loading with the value changed: quote such values (#1570). - Server storage, first sign-in. In server storage mode the first sign-in after upgrading starts from the account's server data, so editor tabs opened before the upgrade are not kept. A refused sign-out now says so and stays on the page, in local mode too (#1576).
- Result shapes. A ClickHouse statement with its own
FORMAT JSONnow shows raw text like any other explicit format, and Cassandra and InfluxDB 3 refuse a result that repeats a column name, so alias one of them (#1575). RedisWITHSCORES,XRANGE,XREVRANGE,CONFIG GETand theSCANfamily return the columns above, so a script that read theirindexandvaluerows must read the new ones (#1552). - Docs Markdown export. Its
**Tables:** 5line is now**Relations:** 4 tables, 1 view, a count per kind (#1508). - CapRover. A CapRover that lists
https://libredb.org/caprover-one-click-appsunder third-party repositories gets nothing from it any more: remove it and install or upgrade from the official catalog (#1557). An app installed from the plain template before #1538 runs 0.17.0 unless its version was changed, so deploy 0.18.1 to it.
Helm chart: 0.1.79
Tracks app release 0.18.1.
The chart's own edits are its description, keywords and README, which now name Databend; no template, value or default moves.
artifacthub.io/containsSecurityUpdates is true for the server storage fix above (GHSA-jwvh-6phv-j9jh).
helm repo add libredb https://libredb.org/libredb-studio/
helm upgrade --install libredb-studio libredb/libredb-studio --version 0.1.79
Contributors
- @Jeevan2410 fixed CockroachDB routine edits, the unreachable-server errors of four HTTP engines, the selected statement's terminator, LibreDB's
:memory:refusal, MongoDB nullability and whole-database Validate and Compact, and the Percona Server label (#1595, #1571, #1561, #1562, #1554, #1522, #1556). - @tunglambk shaped Redis results by command, corrected the MongoDB and Couchbase sizes, and bounded the MongoDB connect (#1552, #1553, #1518).
- @KodYazicam typed Generate Code and quoted its field names, placed the row limit before trailing clauses, held three provider docs to their citations and corrected the query-optimization doc's engine list (#1497, #1501, #1584, #1585).
- @saad-works counted MySQL indexes per table and put the MCP
inspect_schemarefusal in Studio's words (#1537, #1560), and removed two stale counts (#1533, #1534). - @switchcasestudio named the agent's model timeout and counted relations by kind (#1509, #1508).
- @koraysrn added the Markdown and HTML exports (#1567), @irfanfaraaz kept extension-owned objects out of the PostgreSQL tree (#1597), and @abinash2553J brought Generate Test Data to MongoDB (#1555).
- @niukanen1 (#1572), @Maaz2212 (#1564), @hridhinvarkeyjoseph (#1545), @brown-sussy (#1544), @Aditya-XR (#1500), @stroexd (#1541) and @yusuf-gundogdu (#1583).
- Documentation: @kaya-abdullah (#1549, #1563, #1569, #1582) and @linropx (#1580).
- Reported by @kaya-abdullah (#1398, #1408, #1414, #1429, #1430, #1431, #1437, #1441, #1444, #1446, #1450, #1454, #1455, #1456, #1458, #1461, #1462, #1466, #1467, #1468), @koraysrn (#1532), @Aditya-XR (#1224) and @stroexd (#1511).
Databend, the seed sources card, the server storage fix, result column names, the object tree filter, the dependency pins and the CapRover, Dokku, Railyard and ZopDev channels are by @cevheri.
Full changelog: 0.18.0...0.18.1