github TableProApp/TablePro v0.85.0

2 hours ago

Neo4j, InfluxDB 2 and 3, Qdrant, Memcached and StarRocks connections, and KingbaseES with a downloadable driver.
Two to six query results show as tabs, and the Structure tab shows columns, indexes, foreign keys and checks on one page.
Masking rules hide column values in the grid, copies, exports, the AI assistant and MCP. Table Health finds bloat and unused indexes.
Routine Debugger steps through PL/pgSQL and PL/SQL, and Live Messages watches PostgreSQL notifications, Redis channels and Kafka topics.
Imported and synced connections ask before using cloud or Kerberos sign-ins, and PostgreSQL reads ~/.pgpass only when you turn it on.
Settings > Plugins is now Settings > Extensions. A .sql-formatter.json saved by 0.83 needs exporting again with sql-formatter's key names.

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. (#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. (#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. (#3957)
  • Table Health lists bloated tables, unused and redundant indexes, and missing keys in a PostgreSQL or MySQL database. (#3958)
  • Rows of updatable PostgreSQL, MySQL, MariaDB and SQL Server views that show their table's primary key are editable. (#3961)
  • Display As decodes igbinary and Avro values in binary columns, Avro with a schema file chosen for the column. (#3962)
  • iPhone and iPad show table rows and query results in a grid with a pinned header and key column, beside the cards. (#3963)
  • Qdrant support: browse collections, filter and sort points, edit payloads and vectors, and run REST requests. (#3972)
  • InfluxDB 2 and 3 connections, with SQL, InfluxQL and Flux in the editor. (#3976)
  • Masking rules hide matching column values in the grid, copies, exports, the AI assistant and MCP. (#3978)
  • Display As decodes Protobuf with a .proto file chosen for the column, and Kafka values with a Schema Registry. (#3979)
  • Memcached support: browse keys with values and TTLs, edit them in the grid, and run text protocol commands. (#3980)
  • Live Messages module: watch PostgreSQL notifications, Redis channels and Kafka topics as messages arrive. (#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)
  • The Vim "_ register overwriting the clipboard and the other registers. (#3854)
  • Format Query changing SQL with brackets, dollar bodies, GO or DELIMITER lines, operators like @> or window ORDER BY. (#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. (#3855)
  • 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 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)
  • Opening a query tab, or loading a query, from a query tab left the keyboard in the grid or sidebar. (#3857)
  • A format change that reloaded the export list dropped each table's row filter. (#3857)
  • SQL import and Ignore foreign key checks left a SQLite connection enforcing foreign keys afterwards 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)
  • 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)
  • Duplicating a PostgreSQL database failed when a table referenced one in another schema by @MrWeb. (#3859)
  • Compare & Sync on MySQL and PostgreSQL wrote tables in name order instead of parents first by @MrWeb. (#3859)
  • Disabling foreign key checks on PostgreSQL without superuser failed the import or aborted the open transaction by @MrWeb. (#3859)
  • Create Table on MySQL wrote utf8mb4_unicode_ci instead of the database's own default collation. (#3866)
  • The MariaDB table list showed no character set for tables on a uca1400 collation. (#3866)
  • Changing a column's character set saved without asking first, though characters can be lost. (#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)
  • Editing a column on MariaDB removed its CHECK constraint, the JSON validity check included. (#3866)
  • Create Table offered MySQL storage engines the server does not have. (#3866)
  • Refreshing the Structure tab, or saving in it, did not read check constraints again. (#3872)
  • Making a column part of the primary key in the Structure tab did not change the table's key. (#3872)
  • Create Table read foreign key targets from the sidebar's database instead of the tab's. (#3872)
  • 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)
  • Switching a table from Structure to Data dimmed Save Changes while structure edits were still staged. (#3872)
  • One failed read blanked every Structure tab, and a failed Triggers read showed No Triggers. (#3872)
  • Undo Delete on an edited column in the Structure tab dropped the edit made before the delete. (#3872)
  • MySQL and MariaDB indexes offered a Condition the server drops. (#3872)
  • The Welcome window offering What’s New after opening an older version, and again after going back to the newer one by @sedax90. (#3878)
  • What’s New opening on iPhone and iPad after installing an older TestFlight build by @sedax90. (#3878)
  • A script's error banner stayed over the results of the statements that succeeded. (#3924)
  • 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)
  • 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)
  • 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)
  • 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. (#3957)
  • Close Connection with Save closed over unsaved edits in tabs other than the one in front. (#3957)
  • Save at the close prompt closed before inspector edits were written, so a failed write went unreported. (#3957)
  • In Agent mode, menu commands and shortcuts acted on the hidden browse tabs, grid and sidebar. (#3957)
  • Refresh did nothing on the Server Dashboard, Query Insights, Users & Roles and object source tabs. (#3958)
  • An expanded field in the row inspector collapsed when another row was selected by @vbabenkoru. (#3975)
  • Dragging a field's resize handle in the row inspector snapped back a few points into the drag 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)
  • An update downloaded in the background gave no sign until TablePro quit. (#3993)
  • Relaunching from Settings could leave two copies of TablePro running when the quit was cancelled. (#3993)
  • A Snowflake connect that fails on the network no longer forgets the cached SSO or MFA token. (#3996)
  • A connection switched to SQLite or DuckDB on iPhone and iPad still dialing the SSH tunnel it had before. (#3998)
  • Cloudflare D1 queries with no LIMIT downloading every row, which fails once the result passes 50 MB. (#3998)
  • Cloudflare D1 connection failures reading "Failed to connect" instead of the cause, such as an expired token. (#3998)
  • Truncate Table on a SQLite connection on iPhone and iPad failing with a syntax error. (#3998)
  • Saving a binary value to Cloudflare D1 storing its base64 text instead of the bytes. (#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)
  • Filtering a Cloudflare D1 table by a long text value failing with "LIKE or GLOB pattern too complex". (#3998)
  • A query on a table or column named fetch skipping the row limit. (#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.

Don't miss a new TablePro release

NewReleases is sending notifications on new releases.