<p>There's a fast way to add a database engine to a SQL client, and there's the right way, and for ClickHouse they are very much not the same thing.</p><p>The fast way is the MySQL compatibility port. ClickHouse speaks a dialect of the MySQL wire protocol on port <code>9004</code>, and Elyra SQL Client already speaks MySQL. Point the existing driver at the new port, adjust a few strings, and you have "ClickHouse support" in an afternoon. We tried it. It worked, in the sense that queries ran and rows came back.</p><p>Then we looked at the rows.</p><h2>Why not the shim</h2><p>Three things, each of them a reason on its own.</p><p><strong>Every column arrives as a string.</strong> The MySQL shim doesn't map ClickHouse's types onto MySQL's; it renders everything to text and sends that. So a <code>UInt64</code> is a string, a <code>DateTime64(3)</code> is a string, a <code>Decimal128(10)</code> is a string. The grid — which aligns numbers right and text left, which renders dates as dates, which knows to offer a chart for a numeric column — loses all of it. You'd be looking at a spreadsheet of strings pretending to be a database.</p><p><strong>It isn't there on ClickHouse Cloud.</strong> The managed service exposes HTTPS on <code>8443</code> and nothing else. An engine that only works self-hosted isn't an engine, it's a demo.</p><p><strong>You can't cancel anything.</strong> Over the shim there's no way to name a query, so there's no way to tell the server to stop it. <code>SELECT count() FROM events WHERE …</code> against forty billion rows is exactly the kind of query you want a working <strong>Stop</strong> button for, and over the MySQL port the button would have been decorative.</p><p>So 0.10.0 talks to ClickHouse over its HTTP interface — port <code>8123</code>, or <code>8443</code> when you tick <strong>Require TLS</strong>, and the two move together because Cloud only has the second. It cost a proper driver: a new connection type, a JSON result format, a query-id per statement, a type mapper. But the grid gets real ClickHouse types, <strong>Stop</strong> actually stops, and the connection's <strong>Statement timeout</strong> is enforced by the server — as <code>max_execution_time</code> on each request — rather than by a client-side timer that gives up listening while the server keeps working.</p><h2>What you get</h2><p>Once connected, ClickHouse is a database like the others. Browse the navigator, open a table, page through it, sort, filter, run whatever you like in the editor, export to CSV or JSON, chart a result, profile a column, ask the assistant — which knows the ClickHouse dialect, so it writes <code>toStartOfMonth()</code> rather than <code>DATE_TRUNC</code> and reaches for <code>argMax</code> where a MySQL user would write a self-join.</p><pre><code class="language-sql">SELECT
  toStartOfHour(ts)      AS hour,
  countIf(status &gt;= 500) AS errors,
  count()                AS requests,
  round(errors / requests * 100, 2) AS error_pct
FROM http_log
WHERE ts &gt;= now() - INTERVAL 24 HOUR
GROUP BY hour
ORDER BY hour
</code></pre><p>Right-click <code>error_pct</code> → <strong>Chart</strong> → <strong>line</strong>. That's the whole workflow, and it's the same three clicks you'd make on a MySQL result.</p><p>One detail under the hood worth knowing: introspection reads <code>system.tables</code>, <code>system.columns</code> and <code>system.databases</code>, not <code>INFORMATION_SCHEMA</code>. ClickHouse has an <code>INFORMATION_SCHEMA</code>, for compatibility, but it calls every object <code>BASE TABLE</code> — so a materialised view, a dictionary, a <code>Merge</code> table and a plain <code>MergeTree</code> all look identical — and it gives no row counts. <code>system.*</code> knows what things actually are, and the navigator says so.</p><h2>The buttons we turned off</h2><p>Here's the part of the release we thought hardest about, and it's about what doesn't work.</p><p>Open a ClickHouse table and you'll notice: no inline editing. No <strong>+ row</strong>. No table designer. Structure sync and data sync are greyed out. Data generation isn't offered. Every one of those is a Pro or Premium feature people pay for, and every one is unavailable on this engine — deliberately, and with a sentence saying why rather than a silent no-op.</p><p>The reason is what those buttons mean. Double-click a cell in Elyra SQL Client, type a new value, press <code>Enter</code>, and the client sends:</p><pre><code class="language-sql">UPDATE orders SET status = 'shipped' WHERE id = 4471;
</code></pre><p>One row, addressed by its key, changed now, inside a transaction you could roll back. That's the contract the button makes with you.</p><p>ClickHouse can't keep that contract. It's a columnar store with neither row-addressable updates nor transactions. The nearest thing it has is:</p><pre><code class="language-sql">ALTER TABLE orders UPDATE status = 'shipped' WHERE id = 4471;
</code></pre><p>— and that statement is a mutation: an asynchronous rewrite of entire data parts. It returns before the change is visible. It matches rows by predicate, not by key, so if <code>id</code> isn't unique (and in ClickHouse it often isn't) you've changed more than one. And it cannot be rolled back. We could have wired the inline editor to emit that and called it "row editing". It would have demoed fine on a ten-row table. It would have been a lie about what the button does, and the kind of lie that costs someone a table one day.</p><p>So on ClickHouse those features are refused rather than approximated. The status bar says why. SQL you write yourself still runs — <code>INSERT</code>, <code>CREATE TABLE</code>, <code>ALTER TABLE … UPDATE</code> if you actually want a mutation and know what you're asking for. The client won't stop you doing things on purpose. It won't do them for you behind a button that promises something else.</p><h2>The bug that ClickHouse found</h2><p>Adding an engine is a good way to find bugs in the ones you already have. ClickHouse was the first engine to hand us a <code>Decimal</code> as a bare JSON number rather than a quoted string — and that path went through an <code>f64</code>.</p><p>An <code>f64</code> holds about fifteen or sixteen significant digits. <code>Decimal128(10)</code> holds thirty-eight. So a cell containing:</p><pre><code class="language-text">1234567890.1234567890
</code></pre><p>came back as:</p><pre><code class="language-text">1234567890.1234567
</code></pre><p>The last three digits gone, silently, with no error and no indication in the grid. On exactly the columns a financial dataset cares about — amounts, rates, balances — and in exactly the way that's hardest to notice, because the number still looks right.</p><p>Cells keep the server's own digits now, end to end, for every engine. The fix was small. Finding it needed a database that sends numbers differently from the three we'd been testing against, which is an argument for the fourth engine all by itself.</p><h2>Where it sits</h2><p>Elyra SQL Client is first-class for Elyra SQL Server, and that hasn't changed — the dialect, the catalog, the admin surface. It has spoken MySQL and MariaDB since 0.8.1 and SQLite for longer. ClickHouse is the first engine that's a genuinely different kind of database — columnar, analytical, built for the query that scans a billion rows and returns twelve — and it's the reason the client had to learn to say "not here, and here's why" rather than assuming every database is a row store with a slower or faster clock.</p><p>We think that's the right lesson to have learned before the fifth engine.</p><h2>Get it</h2><p>Elyra SQL Client 0.10.0 is at <a target="_blank" rel="noopener noreferrer nofollow" href="https://elyracode.com/sql/client">elyracode.com/sql/client</a> — macOS on Apple silicon, Linux on x86_64 and ARM64, signed and verified by the updater. ClickHouse browsing and querying work on Free; the assistant, export and charts follow the same Pro/Premium gates they do on every engine. The <a target="_blank" rel="noopener noreferrer nofollow" href="https://elyracode.com/docs/sql-client/connections">connections guide</a> has the ClickHouse section, including <em>What is turned off, and why</em>.</p><p>Add a connection. Pick <strong>Engine</strong> → <strong>ClickHouse</strong>. Watch the port change to <code>8123</code>. Then run something against a very large table and press <strong>Stop</strong>, just to see it work.</p>