Added
- Formatter settings for clause items, AND and OR position, and data type case. (#3854)
- Vim mode switches tabs with gt, gT, :tabnext and :tabprevious. (#3854)
- Connect to KingbaseES in PostgreSQL and Oracle compatibility modes with a downloadable driver by @J2TeamNNL. (#3855)
- In the export dialog, a database, schema or group row now sets Structure, Drop or Data for every object beneath it. (#3857)
- Copy To can stop and keep what ran, or skip a failing object and continue by @MrWeb. (#3859)
- Routine Debugger in Settings > Extensions: step through PL/pgSQL and Oracle PL/SQL routines with breakpoints. (#3860)
- Pick a column's character set and collation from the server's own list in Structure and Create Table. (#3866)
- Change a MySQL or MariaDB table's character set, collation and next AUTO_INCREMENT value in Structure > Options. (#3866)
- File > Discard Changes… discards staged structure or data edits after asking. (#3872)
- After 30 days of use without a license, a sheet asks once whether you would buy one, then at most every 90 days. (#3922)
- Two to six query results show as tabs above the grid, so switching takes one click. (#3924)
- Neo4j connections, with labels and relationship types in the sidebar and Cypher in the editor by @J2TeamNNL. (#3925)
- Connect to StarRocks with a downloadable driver, and browse its external catalogs, such as Iceberg, alongside default_catalog by @vbabenkoru. (#3939)
- Server Dashboard and Query Insights open with ⌥⇧⌘D and ⌥⇧⌘I, or from a connection's menu on the connections strip by @J2TeamNNL. (#3957)
- Table Health lists bloated tables, unused and redundant indexes, and missing keys in a PostgreSQL or MySQL database by @J2TeamNNL. (#3958)
- Rows of updatable PostgreSQL, MySQL, MariaDB and SQL Server views that show their table's primary key are editable by @J2TeamNNL. (#3961)
- Display As decodes igbinary and Avro values in binary columns, Avro with a schema file chosen for the column by @J2TeamNNL. (#3962)
- iPhone and iPad show table rows and query results in a grid with a pinned header and key column, beside the cards by @J2TeamNNL. (#3963)
- Qdrant support: browse collections, filter and sort points, edit payloads and vectors, and run REST requests by @J2TeamNNL. (#3972)
- InfluxDB 2 and 3 connections, with SQL, InfluxQL and Flux in the editor by @J2TeamNNL. (#3976)
- Masking rules hide matching column values in the grid, copies, exports, the AI assistant and MCP by @J2TeamNNL. (#3978)
- Display As decodes Protobuf with a .proto file chosen for the column, and Kafka values with a Schema Registry by @J2TeamNNL. (#3979)
- Memcached support: browse keys with values and TTLs, edit them in the grid, and run text protocol commands by @J2TeamNNL. (#3980)
- Live Messages module: watch PostgreSQL notifications, Redis channels and Kafka topics as messages arrive by @J2TeamNNL. (#3981)
- Connection windows show Relaunch to Update in the title bar when an update or plugin update is ready. (#3993)
- People without a license see a Black Friday offer on the Welcome window: 40% off Pro until December 1. (#3995)
- iPhone and iPad open Cloudflare D1 connections, with the database picked from your account's list. (#3998)
Changed
- .sql-formatter.json uses the npm sql-formatter key names, so export a rules file saved by 0.83 again. (#3854)
- Each export option is now its own column with a heading, and a table's checkbox only includes or excludes it. (#3857)
- Copy To's Stop and roll back now takes back the rows of every table, not only the one that failed by @MrWeb. (#3859)
- Settings > Plugins is now Settings > Extensions. (#3860)
- The Structure tab shows columns, indexes, foreign keys and checks on one page, with the inspector editing them. (#3872)
- DuckDB connections run DuckDB 2.0, and a .duckdb file TablePro creates stays readable by DuckDB 1.x. (#3928)
- A dragged field in the row inspector keeps its height per column, not for every field of its kind by @vbabenkoru. (#3975)
- The paid plan is now called Pro across the app, matching the pricing page. (#3989)
- The disk image opens to a window with TablePro beside the Applications folder, ready to drag. (#3990)
- Importing an Excel file reads date and time cells as dates and times, as the Data Files window shows them. (#3991)
- Settings picks the update channel from a Stable or Beta menu, and the Welcome window always shows the version. (#3993)
- An imported Google service account key must be the key itself; a path to a key file is left for you to choose again.
- Imported and synced connections ask once before signing in with AWS, Microsoft, Google or Kerberos logins on this Mac.
- PostgreSQL reads ~/.pgpass only when Use ~/.pgpass is on.
- Through a tunnel, Verify CA and Verify Identity now check the certificate and need its CA file.
- Through a tunnel, an SSL mode the driver cannot check there is refused before connecting, naming the modes it can use.
Fixed
- The sidebar no longer freezes the window for a moment when a very large table list first loads. (#3849)
- Format Query changing SQL with brackets, dollar bodies, GO or DELIMITER lines, operators like @> or window ORDER BY. (#3854)
- The Vim "_ register overwriting the clipboard and the other registers. (#3854)
- Format Query doing nothing on a statement too large to format, without saying why. (#3854)
- The "is not empty" filter found no rows on Oracle, and both empty filters failed on a CLOB column by @J2TeamNNL. (#3855)
- A saved export selection made under another format came back with every option turned on. (#3857)
- The export dialog's Structure, Drop and Data headings sat off their checkboxes and were never translated. (#3857)
- Space over a database and its rows in the export or backup list toggled the rows twice. (#3857)
- Switching an SQL export to CSV and back dropped routines, triggers, sequences and types from the list. (#3857)
- An MQL export with Data off showed its progress stuck at 0 rows. (#3857)
- A format change that reloaded the export list dropped each table's row filter. (#3857)
- Opening a query tab, or loading a query, from a query tab left the keyboard in the grid or sidebar. (#3857)
- Compare & Sync on MySQL and PostgreSQL wrote tables in name order instead of parents first by @MrWeb. (#3859)
- Duplicating a PostgreSQL database failed when a table referenced one in another schema by @MrWeb. (#3859)
- SQL import and Ignore foreign key checks left a SQLite connection enforcing foreign keys afterwards by @MrWeb. (#3859)
- Disabling foreign key checks on PostgreSQL without superuser failed the import or aborted the open transaction by @MrWeb. (#3859)
- Copy To read a whole database one table at a time before showing the review by @MrWeb. (#3859)
- Copy To stopped with a foreign key error on MySQL tables that reference each other or themselves by @MrWeb. (#3859)
- After a Copy To into PostgreSQL failed creating a schema, the next Copy To or Compare on that database could fail by @MrWeb. (#3859)
- Changing a column's character set saved without asking first, though characters can be lost. (#3866)
- Editing a column on MariaDB removed its CHECK constraint, the JSON validity check included. (#3866)
- Changing a MySQL text column to a numeric type failed with a syntax error about CHARACTER SET. (#3866)
- New Database and Duplicate Database on MariaDB 10.10 and later did not offer the uca1400 collations. (#3866)
- The MariaDB table list showed no character set for tables on a uca1400 collation. (#3866)
- Create Table offered MySQL storage engines the server does not have. (#3866)
- Create Table on MySQL wrote utf8mb4_unicode_ci instead of the database's own default collation. (#3866)
- Edit > Undo in the Structure tab did not name the change and stayed enabled with nothing to undo. (#3872)
- The selection in the Structure tab moved to another column after a reload or a sort. (#3872)
- Making a column part of the primary key in the Structure tab did not change the table's key. (#3872)
- MySQL and MariaDB indexes offered a Condition the server drops. (#3872)
- Switching a table from Structure to Data dimmed Save Changes while structure edits were still staged. (#3872)
- Undo Delete on an edited column in the Structure tab dropped the edit made before the delete. (#3872)
- Refreshing the Structure tab, or saving in it, did not read check constraints again. (#3872)
- One failed read blanked every Structure tab, and a failed Triggers read showed No Triggers. (#3872)
- Create Table read foreign key targets from the sidebar's database instead of the tab's. (#3872)
- What’s New opening on iPhone and iPad after installing an older TestFlight build by @sedax90. (#3878)
- The Welcome window offering What’s New after opening an older version, and again after going back to the newer one by @sedax90. (#3878)
- Closing or clearing a result dropped its unsaved cell edits without asking. (#3924)
- Closing a result jumped to the last result instead of the one beside it. (#3924)
- A script's error banner stayed over the results of the statements that succeeded. (#3924)
- A new run numbered its results from 1 even when pinned results already used those numbers. (#3924)
- Dismissing a failed statement's error turned its result into a success message. (#3924)
- Long result names were cut through an emoji. (#3924)
- Close Result Tab emptied a table tab, and Previous Result and Next Result stayed enabled with nowhere to go. (#3924)
- Backing up or restoring a DuckDB database with foreign keys as a .duckdb file failed. (#3928)
- Undo in the AI chat composer undid a Structure, Users & Roles or ER diagram edit instead of the typing by @J2TeamNNL. (#3957)
- Save at the close prompt closed before inspector edits were written, so a failed write went unreported by @J2TeamNNL. (#3957)
- In Agent mode, menu commands and shortcuts acted on the hidden browse tabs, grid and sidebar by @J2TeamNNL. (#3957)
- Close Connection with Save closed over unsaved edits in tabs other than the one in front by @J2TeamNNL. (#3957)
- Refresh did nothing on the Server Dashboard, Query Insights, Users & Roles and object source tabs by @J2TeamNNL. (#3958)
- Dragging a field's resize handle in the row inspector snapped back a few points into the drag by @vbabenkoru. (#3975)
- An expanded field in the row inspector collapsed when another row was selected by @vbabenkoru. (#3975)
- The SQLite restore confirmation said existing objects get the dump's data, though the restore stops at the first error. (#3984)
- A crafted Excel, CSV or compressed file could hang TablePro or fill memory and disk. (#3991)
- Malformed replies from Kafka, Teradata, Redis, Neo4j, Trino and other servers could crash TablePro. (#3991)
- Relaunching from Settings could leave two copies of TablePro running when the quit was cancelled. (#3993)
- An update downloaded in the background gave no sign until TablePro quit. (#3993)
- A Snowflake connect that fails on the network no longer forgets the cached SSO or MFA token. (#3996)
- Cloudflare D1 queries with no LIMIT downloading every row, which fails once the result passes 50 MB. (#3998)
- A connection switched to SQLite or DuckDB on iPhone and iPad still dialing the SSH tunnel it had before. (#3998)
- A query on a table or column named fetch skipping the row limit. (#3998)
- Cloudflare D1 connection failures reading "Failed to connect" instead of the cause, such as an expired token. (#3998)
- A Cloudflare D1 database past the first 1,000 in an account not found by name or missing from the switcher. (#3998)
- Cloudflare D1 values sent as arrays, such as BLOBs, showing as NULL. (#3998)
- Saving a binary value to Cloudflare D1 storing its base64 text instead of the bytes. (#3998)
- Truncate Table on a SQLite connection on iPhone and iPad failing with a syntax error. (#3998)
- Filtering a Cloudflare D1 table by a long text value failing with "LIKE or GLOB pattern too complex". (#3998)
- A keyless save matched no row when a PostGIS coordinate had more than 15 decimal places.
- An enum or other new type column could read as plain text for the rest of the session after a cancelled query.
- Geometry and geography values showed as hex after CREATE EXTENSION postgis until you reconnected.
- New Kafka connections showing Verify Identity while connecting without TLS.
Security
- A Beancount BQL query starting with a dash could read any local file, including from MCP and AI tools.
- A Cassandra function body holding $$ or a crafted type name could add a statement to its definition.
- A DuckDB macro name, or a MySQL routine made under another sql_mode, could add statements to Copy To and sync.
- A DuckDB name quoted in backticks hiding a statement from Safe Mode and read-only external clients.
- A Kafka DROP TOPIC behind a comma or a Greek question mark skipping the confirmation MCP clients need.
- A MongoDB statement from an MCP client could drop data or run server-side JavaScript without the confirmation it needs.
- A MySQL value ending in a backslash could end its literal early in a saved sync script, MCP export or copied INSERT.
- A NUL character in an imported connection value could quit the app when it started a backup, tunnel or other tool.
- A PostgreSQL E'' string continued on the next line hiding a statement from Safe Mode and read-only external clients.
- A SELECT INTO written right after a number passing as a read in Safe Mode and for external clients.
- A SQL Server batch opening with SHOW, HELP, INFO, EXPLAIN or DESCRIBE, which runs a procedure, passing as a read.
- A SQL Server column name holding ] could end its quoting in the table DDL and run the rest as SQL.
- A SQL file or a functional index read under NO_BACKSLASH_ESCAPES could run text from inside a string.
- A Snowflake account written as an address sending a cached sign-in token to another server.
- A Snowflake or Vault server opening a file or another app's link during browser sign-in.
- A Trino or Presto query parameter after a ? in a comment or a quoted name could run as SQL.
- A Weaviate DELETE with a tab or other space after the verb skipping the destructive prompt.
- A column default or type a SQL Server, MySQL 5.7, SAP HANA or Trino server reported could run as SQL in copied DDL.
- A comment in a SQLite, libSQL or D1 table definition could add statements to a SQL export.
- A connection file imported with Replace sending a saved password to a server the file named.
- A connection file or synced password naming a Google key file on this Mac signing in with that key.
- A connection from a file, link or team library signing in with this Mac's AWS, Microsoft, Google or Kerberos login.
- A question mark in a quoted name could bind a value as SQL on Teradata, and in backtick or bracket names.
- A read from an MCP client, AppleScript or the assistant writing data on PostgreSQL, MySQL, SQLite, DuckDB or ClickHouse.
- A shared connection sending values of TablePro's environment variables to its server without asking.
- A tampered plugin registry replacing an installed plugin with an older release.
- AWS, Microsoft, AI provider and license requests following a redirect to another server with their keys.
- An ALTER that drops a column after a line break, tab, comma or parenthesis running without the destructive prompt.
- An SSH host or user with a Greek question mark or varia could run commands through a Match exec line in ~/.ssh/config.
- An imported or shared connection carrying settings TablePro sets itself, or fields this version does not know.
- Another account on the Mac could answer the MCP bridge after TablePro quit.
- CockroachDB connections could run a version() or count() function another user planted in a schema on the path.
- Deleting or editing a MongoDB row whose _id held a toEJSON field could change a different document.
- MCP browse_table and count_rows reading rows without the confirmation Safe Mode asks for.
- MCP confirmations not naming the database a statement runs in, or the values insert_rows writes.
- MongoDB on iPhone and iPad not checking the server's name through SSH with Verify Identity.
- Oracle EXPLAIN PLAN INTO a table, which inserts the plan, passing as a read for read-only external clients.
- PostgreSQL crosstab, connectby, xpath_table and pg_import_system_collations, and DuckDB query(), passing as reads.
- Safe Mode on iPhone and iPad passing server file reads, such as pg_read_file and LOAD_FILE, as reads.
- Setting a PostgreSQL sequence past its column could run an operator the database owner planted ahead of pg_catalog.
- Shortcuts listing tables and adding rows on iPhone and iPad while TablePro was locked.
- Shortening DynamoDB point-in-time recovery, or an UpdateTable setting the app does not know, passing as a plain write.
- SurrealDB REMOVE TABLE, Snowflake REMOVE, and MySQL or Oracle PURGE or RESET MASTER skipping the destructive prompt.
- Table Health, a primary key change in Structure or a backup could run a function planted in a PostgreSQL schema as you.
- Table names, Copilot tool results and iPhone server errors reaching the system log in clear.
- The assistant's confirm_destructive_operation running statements that read server files or run server code.
- Verify CA and Verify Identity checking no certificate when connecting through an SSH, Cloudflare or other tunnel.
- With Python Beancount, a ledger could run code with Run Ledger Plugins off, through a bundled plugin or a nearby file.