Skip to content

Commit ec2cd3b

Browse files
the grid shows MariaDB, and the engine cards match 1.0.0 again (#80)
MariaDB has no driver of its own: the MySQL provider serves it, so it was missing from the hexagon grid. It now has a card of its own, copied from docs/providers/mysql.md section 1.1, with a new `via: 'mysql'` field that shows it without counting it, the same way the embedded LibreDB store is shown. The count stays forty-one, /databases names it beside the SQL counter, and its REFERENCE line points at the MySQL provider doc. Every card was then checked against the 1.0.0 tag. Agent mode runs statements on seven type-ids there (PostgreSQL, MySQL and so MariaDB, SQLite, DuckDB, SQL Server, MongoDB and Kubernetes), but the cards, the FAQ, the feature limit and llms-full.txt still named the first four. MySQL, MongoDB and Kubernetes now say agent mode runs there, and Couchbase names the current set. The MCP limit says which engines run a query there and which do not. Other cards that no longer matched their provider doc: - Elasticsearch and OpenSearch said "no ER diagrams"; the diagram is offered, there are just no foreign keys to draw. They now name the real absences. - DuckDB: admins are confined to the database file on a seed a standard user can reach. - SQL Server: the agent also reports the estimated plan it admitted with. - Snowflake: PUT and GET were in no source; the card states the absence of bound parameters and multi-request transactions instead. - SNMP: a Set PDU exists and the valve refuses it; the transport names port 161. - MySQL: the stated limit is the open transaction a released pooled connection keeps. The FAQ said fifty-four named engines; it is sixty-eight, as on the grid.
1 parent 3f37f77 commit ec2cd3b

11 files changed

Lines changed: 83 additions & 42 deletions

File tree

‎public/engines/mariadb.svg‎

Lines changed: 1 addition & 0 deletions
Loading

‎scripts/fetch-engine-logos.sh‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/usr/bin/env bash
2-
# Re-download the nineteen fetched engine marks into public/engines/.
2+
# Re-download the twenty fetched engine marks into public/engines/.
33
#
44
# Ten more marks in public/engines/ are NOT fetched and this script never touches
55
# them: libredb.svg is our own, and eight come from the product's own icon set,
@@ -60,6 +60,7 @@ fetch opensearch "$SI/opensearch"
6060
fetch prometheus "$SI/prometheus"
6161
fetch kafka "$SI/apachekafka"
6262
fetch etcd "$SI/etcd"
63+
fetch mariadb "$SI/mariadb"
6364

6465
echo
65-
echo "19 marks in $OUT"
66+
echo "20 marks in $OUT"

‎src/data/engines.ts‎

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ export interface Engine {
4444
not: string;
4545
/** true only for the store the product carries; it is shown, but never counted as an engine */
4646
embedded?: true;
47+
/**
48+
* Set on an engine with no driver of its own: the id of the engine whose driver
49+
* it connects through. Shown, but never counted, like the embedded store.
50+
*/
51+
via?: string;
4752
}
4853

4954
export const engines: Engine[] = [
@@ -61,9 +66,19 @@ export const engines: Engine[] = [
6166
name: 'MySQL',
6267
cat: 'SQL',
6368
logo: '/engines/mysql.svg',
64-
desc: 'Pooled connections with information_schema introspection, EXPLAIN plans and performance_schema-backed monitoring.',
69+
desc: 'Pooled connections with information_schema introspection, EXPLAIN plans, performance_schema-backed monitoring and agent mode under a principal verified to hold nothing past SELECT and SHOW VIEW.',
6570
tr: 'mysql2 pool · 3306',
66-
not: 'Agent mode is unavailable, as on every engine but PostgreSQL, SQLite, DuckDB and SQL Server.',
71+
not: 'A transaction a script leaves open is not ended when its pooled connection is released, so it holds its row locks until the connection is reused or the pool closes. The one reliable check reads performance_schema, which is off by default on MariaDB.',
72+
},
73+
{
74+
id: 'mariadb',
75+
name: 'MariaDB',
76+
cat: 'SQL',
77+
logo: '/engines/mariadb.svg',
78+
via: 'mysql',
79+
desc: "Connects through the MySQL driver and was measured against a live server. The overview shows MariaDB's own build string, EXPLAIN FORMAT=JSON plans are drawn as a tree, and agent mode runs under a principal verified to hold nothing past SELECT and SHOW VIEW.",
80+
tr: 'mysql2 pool \u00b7 3306',
81+
not: 'performance_schema is off by default on MariaDB, so cache hit ratio, queries per second and slow queries stay empty until the server runs with performance_schema=ON.',
6782
},
6883
{
6984
id: 'oracle',
@@ -81,7 +96,7 @@ export const engines: Engine[] = [
8196
logo: '/engines/sqlserver.svg',
8297
desc: 'Pooled connections with sys.* catalog introspection, DMV-backed monitoring and agent mode under a least-privilege read-only profile.',
8398
tr: 'mssql pool · 1433',
84-
not: "The editor has no Explain action: SQL Server's estimated plan is a session mode that a statement prefix cannot express. Only agent mode reads a plan, to admit a statement.",
99+
not: "The editor has no Explain action: SQL Server's estimated plan is a session mode that a statement prefix cannot express. Only agent mode reads an estimated plan, to admit a statement and as the plan it reports.",
85100
},
86101
{
87102
id: 'db2',
@@ -115,7 +130,7 @@ export const engines: Engine[] = [
115130
name: 'DuckDB',
116131
cat: 'Analytics',
117132
logo: '/engines/duckdb.svg',
118-
desc: 'In-process analytics with full EXPLAIN support and agent mode. Admins can query Parquet and CSV files directly; every other role is confined to the database file.',
133+
desc: 'In-process analytics with full EXPLAIN support and agent mode. Admins can query Parquet and CSV files on their own connections; every other role, and any seed a standard user can reach, is confined to the database file.',
119134
tr: 'file · embedded',
120135
not: 'Single-writer by design: no sessions to list, so health shows storage, not connections.',
121136
},
@@ -160,7 +175,7 @@ export const engines: Engine[] = [
160175
name: 'MongoDB',
161176
cat: 'Document',
162177
logo: '/engines/mongodb.svg',
163-
desc: 'Document browsing, aggregation pipelines and index introspection over the native driver.',
178+
desc: 'Document browsing, aggregation pipelines, index introspection and agent mode over the native driver, bounded by a user proven read-only at open.',
164179
tr: 'driver · 27017',
165180
not: 'No SQL translation layer is faked — queries here are MongoDB queries.',
166181
},
@@ -171,7 +186,7 @@ export const engines: Engine[] = [
171186
logo: '/engines/couchbase.svg',
172187
desc: 'SQL++ queries with bucket, scope and collection introspection over the documented REST surfaces.',
173188
tr: 'http · 8091',
174-
not: 'Agent mode is unavailable, as on every engine but PostgreSQL, SQLite, DuckDB and SQL Server.',
189+
not: 'No agent execution: agent mode sends statements only on PostgreSQL, MySQL (and MariaDB), SQLite, DuckDB, SQL Server, MongoDB and Kubernetes. Plan mode and Operate still open here.',
175190
},
176191
{
177192
id: 'redis',
@@ -253,7 +268,7 @@ export const engines: Engine[] = [
253268
logo: '/engines/elasticsearch.svg',
254269
desc: 'Elasticsearch SQL over indices, with mapping introspection and cluster health.',
255270
tr: 'http · 9200',
256-
not: 'Search engines are query-and-browse: no row editing, no ER diagrams.',
271+
not: 'Query-and-browse: no row editing and no EXPLAIN, and indices declare no foreign keys, so the ER diagram draws no relations.',
257272
},
258273
{
259274
id: 'opensearch',
@@ -262,7 +277,7 @@ export const engines: Engine[] = [
262277
logo: '/engines/opensearch.svg',
263278
desc: 'The same query-and-browse surface as Elasticsearch, against OpenSearch clusters.',
264279
tr: 'http · 9200',
265-
not: 'Search engines are query-and-browse: no row editing, no ER diagrams.',
280+
not: 'Query-and-browse: no row editing, no EXPLAIN and no foreign keys. DELETE is in the plugin grammar but off by default, and every other write is refused.',
266281
},
267282
{
268283
id: 'prometheus',
@@ -316,7 +331,7 @@ export const engines: Engine[] = [
316331
logo: '/engines/snowflake.svg',
317332
desc: 'The SQL API v2 with Studio\u2019s own client and no Snowflake driver: every statement is one asynchronous request, signed with a key-pair JWT or a programmatic access token.',
318333
tr: 'SQL API v2 \u00b7 https',
319-
not: 'No driver, so driver-only features such as PUT and GET file transfer are absent.',
334+
not: 'No driver and no bound parameters, and a transaction lives only inside one EXECUTE IMMEDIATE block.',
320335
},
321336
{
322337
id: 'spark',
@@ -405,17 +420,17 @@ export const engines: Engine[] = [
405420
cat: 'Network',
406421
logo: '/engines/snmp.svg',
407422
desc: 'A read-only view of SNMP agents, speaking SNMPv2c over UDP, with the MIB walk presented as a tree.',
408-
tr: 'SNMPv2c over UDP',
409-
not: 'It writes nothing, ever: no SET is implemented.',
423+
tr: 'SNMPv2c over UDP \u00b7 161',
424+
not: 'It writes nothing, ever: no command sends a Set, and the valve refuses one before the socket.',
410425
},
411426
{
412427
id: 'kubernetes',
413428
name: 'Kubernetes',
414429
cat: 'Platform',
415430
logo: '/engines/kubernetes.svg',
416-
desc: 'A read-only browser and a kubectl-subset console for one cluster, over the API server\u2019s REST API and with no driver.',
431+
desc: 'A read-only browser and a kubectl-subset console for one cluster, over the API server\u2019s REST API and with no driver. Agent mode runs every workflow as kubectl reads.',
417432
tr: 'API server REST \u00b7 6443',
418-
not: 'Read-only whatever the connection says: no request it can send changes the cluster.',
433+
not: 'Read-only whatever the connection says: no request it can send changes the cluster. No MCP.',
419434
},
420435
{
421436
id: 's3',
@@ -428,8 +443,11 @@ export const engines: Engine[] = [
428443
},
429444
];
430445

431-
/** The engines a user points Studio at: every entry but the embedded store. This is the published count. */
432-
export const externalEngines: Engine[] = engines.filter((e) => !e.embedded);
446+
/**
447+
* The engines a user points Studio at: every entry but the embedded store and the
448+
* engines that connect through another engine's driver. This is the published count.
449+
*/
450+
export const externalEngines: Engine[] = engines.filter((e) => !e.embedded && !e.via);
433451

434452
export const defaultEngineId = 'postgresql';
435453

@@ -438,11 +456,14 @@ export const defaultEngineId = 'postgresql';
438456
* the product name (docs/providers/README.md § Conventions). Two of our ids are
439457
* the product name instead, so they need mapping — without it the REFERENCE line
440458
* pointed at docs/providers/postgresql.md and sqlserver.md, neither of which
441-
* exists. Every other id already is the type-id.
459+
* exists. MariaDB has no type-id at all: the MySQL provider serves it, and its
460+
* doc is that provider's (docs/providers/mysql.md § 1.1). Every other id already
461+
* is the type-id.
442462
*/
443463
const TYPE_ID: Record<string, string> = {
444464
postgresql: 'postgres',
445465
sqlserver: 'mssql',
466+
mariadb: 'mysql',
446467
};
447468

448469
export const engineReference = (id: string) => `docs/providers/${TYPE_ID[id] ?? id}.md`;

‎src/data/faq.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const faq = [
1010
},
1111
{
1212
q: 'Which databases are supported?',
13-
a: 'Forty-one engines: PostgreSQL, MySQL, Oracle, Db2 LUW, SQL Server, SQLite, libSQL, DuckDB, MongoDB, Redis, Couchbase, Firestore, ClickHouse, Apache Druid, Elasticsearch, OpenSearch, Trino, BigQuery, Databend, Snowflake, Apache Spark, Apache Cassandra, Prometheus, Apache Kafka, etcd, Neo4j, Milvus, Qdrant, InfluxDB (InfluxQL), InfluxDB 3 (SQL), Oxia, S3-compatible object storage, Kubernetes, MQTT, RabbitMQ, OPC UA, MTConnect, Modbus, NETCONF, SNMP and Sparkplug B — relational, document, key-value, wide-column, graph, vector, analytical, search, time-series, streaming and federated query. Twenty-seven more, such as MariaDB, TiDB, CockroachDB, Valkey and ScyllaDB, speak one of those wire protocols and connect through the same drivers, each measured against a live instance, so the drivers reach fifty-four named engines in all. LibreDB itself, the embedded store the playground runs on, is in the list on /databases but not in either count: those count the engines you point Studio at, not the one it carries.',
13+
a: 'Forty-one engines: PostgreSQL, MySQL, Oracle, Db2 LUW, SQL Server, SQLite, libSQL, DuckDB, MongoDB, Redis, Couchbase, Firestore, ClickHouse, Apache Druid, Elasticsearch, OpenSearch, Trino, BigQuery, Databend, Snowflake, Apache Spark, Apache Cassandra, Prometheus, Apache Kafka, etcd, Neo4j, Milvus, Qdrant, InfluxDB (InfluxQL), InfluxDB 3 (SQL), Oxia, S3-compatible object storage, Kubernetes, MQTT, RabbitMQ, OPC UA, MTConnect, Modbus, NETCONF, SNMP and Sparkplug B — relational, document, key-value, wide-column, graph, vector, analytical, search, time-series, streaming and federated query. Twenty-seven more, such as MariaDB, TiDB, CockroachDB, Valkey and ScyllaDB, speak one of those wire protocols and connect through the same drivers, each measured against a live instance, so the drivers reach sixty-eight named engines in all. LibreDB itself, the embedded store the playground runs on, is in the list on /databases but not in either count: those count the engines you point Studio at, not the one it carries.',
1414
},
1515
{
1616
q: 'Is anything held back from the open-source build?',
@@ -30,7 +30,7 @@ export const faq = [
3030
},
3131
{
3232
q: 'What does the database agent do?',
33-
a: 'You state an objective; the agent runs read-only, budgeted SQL and writes a report where every claim cites a result. It runs statements on PostgreSQL, SQLite, DuckDB and SQL Server; plan mode, which runs nothing, opens on every connection.',
33+
a: 'You state an objective; the agent runs read-only, budgeted queries and writes a report where every claim cites a result. It runs statements on PostgreSQL, MySQL (and MariaDB), SQLite, DuckDB, SQL Server, MongoDB and Kubernetes; plan mode, which runs nothing, and the Operate workflow open on every connection.',
3434
},
3535
{
3636
q: 'How is it secured for a team?',

‎src/data/features.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Source: libredb-studio README.md § "Key Features", docs/AGENT.md, docs/MCP.md
99
* and the 0.18.x release notes, re-verified at 0.18.2. Every
1010
* `limit` is stated there too; none of them is softened here. Where the product
11-
* documents a boundary (agent mode's four engines, masking being client-side
11+
* documents a boundary (agent mode's seven engines, masking being client-side
1212
* only, the toolkit being admin-only), the boundary is part of the feature.
1313
*/
1414
export interface FeatureDetail {
@@ -92,14 +92,14 @@ export const featureDetails: FeatureDetail[] = [
9292
body: 'You state an objective and press Start. The run drafts SQL, reads what comes back, and composes a report in which every claim cites the result it came from. It never starts itself and never executes what it recommends. It stays out of your editor unless you opt in: an Analyze run opened with auto-execute, after a consent step, places its answer’s statement in your editor and runs it there, under the same database-enforced read-only boundary.',
9393
points: [
9494
'Five workflows: Investigate, Optimize, Assess, Analyze, which answers a question about the data rather than about the database, and Operate, which sends no SQL at all and reads the engine’s own reporting interface',
95-
'Read-only enforced by the database, not by a parser: a read-only transaction on PostgreSQL, PRAGMA query_only re-asserted per statement on SQLite, a READ_ONLY handle plus an SQL guard on DuckDB, and on SQL Server a principal verified unable to write and a transaction always rolled back',
95+
'Read-only enforced below the parser: a read-only transaction on PostgreSQL, PRAGMA query_only re-asserted per statement on SQLite, a READ_ONLY handle plus an SQL guard on DuckDB, on SQL Server a principal verified unable to write and a transaction always rolled back, on MySQL and MariaDB a principal verified to hold nothing past SELECT and SHOW VIEW behind START TRANSACTION READ ONLY, on MongoDB a user proven read-only at open plus a command fence, and on Kubernetes a request allowlist plus the identity\u2019s own RBAC',
9696
'Every statement passes a policy decision, an audit event and budget accounting before the driver is touched',
9797
'Bounded and metered on screen: 18 to 45 statements and a 6 to 15 minute deadline depending on workflow, 200 rows per read',
9898
'Evidence or nothing — a claim with no citation cannot be composed',
9999
'The run states its own verdict: “Run answered” or “Run did not answer”',
100100
'An MCP endpoint, off by default, lets an AI client of your own read schemas and run bounded read-only SQL through Studio while the credentials stay on the server',
101101
],
102102
limit:
103-
'Agent mode reads PostgreSQL, SQLite, DuckDB and SQL Server only, because the read-only profile is database-native and exists only where a provider implements it. On any other engine an agent run that sends statements is refused when it is started; the same four engines are the only ones where the MCP endpoint runs a query. Plan mode opens on every connection — it is toolless, runs nothing, and drafts a statement for you to run yourself. The embedded @libredb/studio package carries no agent surface at all.',
103+
'Agent mode sends statements on PostgreSQL, MySQL (and MariaDB), SQLite, DuckDB, SQL Server, MongoDB and Kubernetes only, because each needs a read-only boundary its provider proves. On any other engine a run that sends statements is refused when it is started, and Operate still runs. The MCP endpoint runs queries on PostgreSQL, MySQL (and MariaDB), SQLite, DuckDB and SQL Server; MongoDB gets schema reads only, and Kubernetes is not offered. Plan mode opens on every connection: it is toolless, runs nothing, and drafts a statement for you to run yourself. The embedded @libredb/studio package carries no agent surface at all.',
104104
},
105105
];

‎src/data/home.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ export const features = [
348348
n: '06',
349349
icon: 'bot',
350350
t: 'The database agent',
351-
d: 'State an objective; the agent runs read-only, budgeted SQL and writes a report where every claim cites a result.',
351+
d: 'State an objective; the agent runs read-only, budgeted queries and writes a report where every claim cites a result.',
352352
},
353353
] as const;
354354

‎src/pages/databases.astro‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,15 @@ const BLURBS: Record<EngineCategory, string> = {
4848
4949
// Every card is shown, but the counters count external engines only, so they
5050
// sum to the same externalEngines.length the heading and description state. An
51-
// embedded store in a group (LibreDB, in Key-value) is named beside the counter
51+
// embedded store in a group (LibreDB, in Key-value), and an engine that connects
52+
// through another engine's driver (MariaDB, in SQL), is named beside the counter
5253
// instead of being added to it.
5354
const groups = ORDER.map((cat) => ({
5455
cat,
5556
blurb: BLURBS[cat],
5657
items: engines.filter((e) => e.cat === cat),
5758
counted: externalEngines.filter((e) => e.cat === cat).length,
58-
embedded: engines.filter((e) => e.cat === cat && e.embedded).map((e) => e.name),
59+
embedded: engines.filter((e) => e.cat === cat && (e.embedded || e.via)).map((e) => e.name),
5960
})).filter((g) => g.items.length > 0);
6061
6162
const schema = [

‎src/pages/llms-full.txt.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,14 @@ each machine. Access is granted and revoked through an OIDC identity provider.
8585
The comparison that matters is not a feature list but where the tool runs; that argument
8686
is at ${site.url}/compare.
8787
88-
## Supported engines (${externalEngines.length}, plus the embedded LibreDB store)
88+
## Supported engines (${externalEngines.length}, plus the embedded LibreDB store and MariaDB through the MySQL driver)
8989
9090
${engineTable()}
9191
9292
### What each engine does NOT do
9393
9494
These boundaries are documented rather than omitted. Agent mode, for example, runs
95-
statements on four engines and not on the rest.
95+
statements on seven engines and not on the rest.
9696
9797
${engineLimits()}
9898

‎src/pages/llms.txt.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ ${links}
9595
- [Security policy](${site.links.security}): how to report a vulnerability.
9696
- [RSS](${site.url}/rss.xml): the blog feed.
9797
98-
## Supported engines (${externalEngines.length}, plus the embedded LibreDB store)
98+
## Supported engines (${externalEngines.length}, plus the embedded LibreDB store and MariaDB through the MySQL driver)
9999
100100
${engineList}
101101

0 commit comments

Comments
 (0)