Added
- Strikethrough on a row queued for deletion, and an underline on a new row or an edited value.
- Google Cloud Spanner as a registry plugin over the REST API. (#1226, #2480)
- Weaviate as a registry REST plugin, collections as tables. (#1724)
- TiDB and Databend connection types on the MySQL driver. (#1066, #2514)
- Empty state in the inspector and the assistant for a connection that is not up.
- Check connections in Settings > General, including Only when I use the connection. (#2700)
- Cloudflare R2 SQL driver, read-only, for Iceberg tables in R2 Data Catalog. (#2030)
- Tips for preview tabs, Open Quickly, and query history.
- Full changelog from Help and Software Update settings.
- Enable Plugin, Open Plugin Settings and Edit Connection… on a connection whose driver cannot load.
- Invisible characters shown in the SQL editor: control characters, zero-width spaces, bidi controls and special spaces. (#2717)
- Remove Invisible Characters in the Query menu. (#2717)
- Show invisible characters in Settings > Editor. (#2717)
- Warnings in the SQL editor for full-width punctuation, curly quotes and non-ASCII spaces. (#2717)
- Highlight rules that color data grid rows or cells by value. (#2723)
- Encoding option for MySQL and MariaDB, with UTF-8 via Latin 1 for Latin 1-written databases. (#2725)
- Refresh Materialized View… on PostgreSQL, with a concurrent refresh where the view qualifies. (#2726)
- Show DDL and Copy DDL for views and materialized views. (#2726)
- Edit Comment… for PostgreSQL tables, views, materialized views and foreign tables. (#2726)
- UTF-16 LE, UTF-16 BE and Windows-1252 in the SQL import encoding menu.
- Map view for a result holding a geometry column, drawn with MapKit over Apple's own tiles. (#2532)
- Max INSERT size for SQL export, 1 MB by default. (#2533)
- Largest INSERT written, in the SQL export summary. (#2533)
Changed
- Syntax-highlighted, scrollable statement in the query confirmation, with Copy All and the caller's name. (#2759)
- 5 MB smaller app bundle.
- 7 MB smaller DMG download.
- Connect progress reads as a labelled bar, with a step named only where the app is waiting on something outside itself.
- BigQuery Google sign-in runs from a Sign In prompt, and its refresh token is kept in the keychain.
- First launch opening on the welcome window, whose empty list offers the sample database and import from another app.
- New Connection… and Import on the welcome window, named as in the File menu.
- Open Project Folder… in File > Import.
- First-launch tour replaced by a one-page welcome sheet, shown again from Help > Getting Started.
- Beancount connections held at Safe Mode Read-Only. (#2030)
- MySQL sessions on the server's default
utf8mb4collation. - Structure editor options the connected server does not support left out, FULLTEXT and SPATIAL among them.
- Structure tab read-only on a view, a materialized view, a foreign table or a system table outside PostgreSQL. (#2726)
Fixed
- Editor and results divider of one query tab following whichever tab in the pane was opened first.
- Divider position of every query tab ever opened kept in preferences forever, slowing every launch.
- Data grid and bottom bar cut off at both edges in a narrow window, with rows and pagination buttons out of reach.
- Filter panel wider than the pane when a table has a long column name.
byteavalues written as a bit string in a PostgreSQL SQL export, which no restore accepts. (#2533)- A gzipped SQL export emptying the file it was overwriting before compressing, and deleting it on failure. (#2533)
- Parts of a split SQL export left on disk unnamed when a later part could not be written. (#2533)
SET IDENTITY_INSERTmissing from every part after the first of a split SQL Server dump. (#2533)CREATE TYPEandCREATE SEQUENCEleft out of a SQL export with no warning when the lookup failed. (#2533)- Stop doing nothing while a gzipped SQL export was compressing. (#2533)
- Export status never reaching the progress sheet, and an import showing a row count in place of its own. (#2533)
- Binary values unrestorable in an Oracle SQL export. (#2533)
- Transfer or copy of a table of megabyte values rejected as one oversized
INSERT. (#2533) - Multi-row INSERT statements Oracle cannot parse when importing a CSV, JSON or XLSX file. (#2533)
- Multi-row INSERT statements Oracle cannot parse in a SQL export. (#2533)
- Minutes spent rendering hex literals when a SQL export reached a binary column. (#2533)
- ClickHouse Drop Partition and Detach Partition hitting the sidebar's database, unconfirmed.
- Import listing one database's tables and mapping their columns while the rows went to another.
- New Table created in the database the sidebar moved to rather than the one its own tab names.
- Show All Tables listing whichever database a cross-database tab last left the connection on.
- Sidebar Refresh reloading the object list from a container the user is not browsing.
- Wrong export row total where the objects picked span more than one database.
- Snowflake foreign keys into another database opening the current database's same-named table.
- Wrong database read, and written, by a connection whose startup commands select one of their own.
- None in the foreign key picker's Label menu forgotten on reopen.
- Elasticsearch
geo_pointcolumns classified as integers. - MySQL and MariaDB geometry values losing their SRID.
- MySQL
GEOMETRYCOLLECTIONcolumns classified as text. - Empty
GEOMETRYCOLLECTIONfrom MySQL rendered as invalid WKT. - MySQL geometry with a Z or M ordinate read from the wrong offset.
- Elasticsearch
geo_shapevalues cut off at 10,000 characters. - A tab stranded in JSON or Chart mode, with no way back to Data, after a statement that returns no columns.
- Prompt for password lost when importing a TablePlus connection set to Ask everytime.
- TablePlus import saving a password for a connection TablePlus was set never to store one for.
- TablePlus import reading the CA certificate and client key paths the wrong way round.
- MySQL and MariaDB reads of an object in another database answering about the current database's. (#2769)
- Nested foreign key chevrons in the row inspector pointing into the database the sidebar is on rather than the referenced one.
- Ref Columns in the structure editor stuck on Custom… after one failed read, with no error and no retry.
- Ref Columns reading the sidebar's database instead of the tab's.
- Empty Ref Table menu in the structure editor on MySQL, MariaDB, TiDB, PostgreSQL, CockroachDB, Redshift, SQL Server and DuckDB.
- New Trigger and Drop Trigger naming the sidebar's database rather than the table's.
describe_tableover MCP answering with one database's columns beside another's indexes, foreign keys, row count and DDL.- Foreign key arrow replacing the tab you were reading. (#1421)
- Applied filter left in the panel after cancelling the unsaved-changes alert on a foreign key jump.
- Select All painting the whole column header row as selected, and leaving a cell cursor on the first cell.
- Column header shown as selected after a cell drag reached the first and last row of the page.
- No outline around a swept cell block whose rows reached both ends of the page.
- Cmd+clicking a selected column header never deselecting it.
- Escape not clearing the selection after Select All.
- Silently lost edit on a table with no primary key holding a
FLOAT,DOUBLEorJSONcolumn. - A save on a table with no primary key reporting success when it matched no row.
- SQL Server and Oracle reporting zero rows affected for every
INSERT,UPDATEandDELETE. - Query confirmation dialog cut to the first 200 characters of the statement. (#2759)
- Statement folded onto one line and cut at 400 characters in an MCP client's approval prompt.
- Blank line under "Are you sure you want to execute this query?" when confirming a rename.
- Row numbers and their divider painted over the find bar, the filter panel and the result tab bar.
- Empty Columns tab and no autocomplete for PostgreSQL materialized views. (#2726)
- Discard restoring a different row than the one edited under a column value filter.
- Add Row under a column value filter selecting and opening the wrong row for editing.
- Data grid ignoring the theme's background, text, alternate row, NULL, boolean and row number colors.
- Text past the first 64 KB of a UTF-16 SQL import arriving byte-swapped.
- SQL import failing on a file whose encoding is not UTF-8 when a character lands on a 64 KB boundary.
- Garbled non-Latin text saved from iPhone and iPad to MySQL servers that force a Latin 1 session. (#2725)
- Encoding ignored on iPhone and iPad by a MySQL connection synced from the Mac. (#2725)
- Binary MySQL columns shown as text on iPhone and iPad, and searched with
LIKE. - Crash opening a MySQL result whose column has no name on iPhone and iPad.
- Wrong SQLSTATE code in PostgreSQL, Redshift, CockroachDB and PGlite error messages.
- Read-only write explanation never shown on PostgreSQL servers.
- Trigger editing and the New Trigger template failing on PostgreSQL 13 and earlier.
- Reindexing a whole PostgreSQL database failing before PostgreSQL 16.
- Schema copy, check constraint rename, column reorder and role editing failing on older PostgreSQL servers.
- FULLTEXT and SPATIAL index types creating a plain B-tree index on PostgreSQL.
- Table list, foreign keys, triggers, check constraints, types and grants failing on PostgreSQL 9.1 to 9.5. (#2734)
- Wrong index column order on PostgreSQL 9.4 and earlier.
- Sequences missing from SQL dumps of PostgreSQL 9.6 and earlier.
- Create Database failing on PostgreSQL 9.6 and earlier.
- PostgreSQL unique and primary key indexes shown as plain indexes.
- PostgreSQL triggers shown as disabled.
- PostgreSQL
NOT VALIDcheck constraints shown as validated. - Redshift
DISTKEYmissing from a table's indexes. CYCLEdropped from PostgreSQL sequences in SQL dumps.- PostgreSQL index columns and enum labels containing a comma or a space split apart.
- Foreign keys to a partitioned table listed once per partition on PostgreSQL 12 and later.
- PostGIS values left as hex after switching schema.
- Open transaction aborted when a PostGIS value could not be converted.
- PostgreSQL all-tables metadata failing for a mixed-case table name.
- Default PostgreSQL schema taken from the schema list rather than the search path.
- Safe Mode minimum from a configuration profile missing from the toolbar, the Database menu and the connection form. (#2030)
- PostgreSQL connection hanging after running
COPY FROM STDINorCOPY TO STDOUTin the query editor and on iOS. - Table, view and column comments missing from a PostgreSQL SQL export. (#2726)
- Stop not ending queries on MySQL and MariaDB servers without TLS.
- Wrong results after MySQL retakes a dropped connection, on a session that had set a variable, a session setting or a database.
- Session state set by the
/*! ... */statements a MySQL dump writes counting as a comment. - Users & Roles failing, Stop not ending queries and sequences listed as tables on TiDB servers opened as MySQL.
- Truncated, unformatted release notes in the update dialog, with fixes listed before new features.
- Blank welcome window list when a search matched nothing and a favorite existed.
- Welcome window reading No Connections while a tag filter hid every connection.
- Favorited connection inside a group listed twice on the welcome window.
- Missing red wash on a row deleted together with a new, unsaved row.
- Welcome window tag filter stuck on a tag no connection carries any more, hiding every connection.
- Collapsing every group on the welcome window undone at the next launch.
- Linked Folders and Team Library connections ignoring the welcome window search, with no context menu.
- Dragging a connection in filtered welcome window results snapping back without moving it.
- Welcome window context menu leaving linked connections out of a mixed selection.
- Idle metadata connections held open for the life of the app, up to six per connection. (#2700)
- MongoDB connections reading as healthy after the server went away. (#2700)
- Password prompt raised by a background reconnect, on whichever window was in front. (#2700)
- Health check entering the same connection as a running import. (#2700)
- Startup commands, query timeout, database and schema lost after a health check quietly reconnected. (#2700)
- Table transfer abortable by Stop from an unrelated tab, part-applied. (#2700)
- SQLite, DuckDB and Teradata connections pinged every 30 seconds despite opting out of health checks. (#2700)
- Data grid dropping the UTC offset from a
timestamp with time zonevalue. (#2702) - Edits accepted on a SQLite remote file, which only ever changed the local copy. (#2030)
- Oracle
TIMESTAMPvalues carrying aZthe column never stored. (#2702) - Timestamp shown an hour late, and its time lost on an edit, when the value falls in the reader's daylight-saving gap. (#2702)
- Timestamp stored on a day the reader's time zone skipped rendering as raw text with no date picker. (#2702)
- Sub-second precision missing from timestamp cells, merging distinct values into one entry in the column filter. (#2702)
- Grid cells still reading in the old time zone after the Mac's time zone changed. (#2702)
- Connection colour set on an iPhone not showing on the Mac, and the reverse.
- Connection still reading as read-only on an iPhone after read-only was turned off on the Mac.
- Window rebuilding its own layout three times while a connection opens.
- Connecting screen naming the wrong step for the first half second of a connect.
- Spinner flash in the object browser on Oracle, Snowflake, BigQuery, Trino and Dameng.
- Start of every line hidden in the SQL editor after a long line was removed. (#2709)
- Query error underlines on the wrong text or missing after a tab switch or loaded query, with no way to read them.
- Start of a line hidden under the line numbers after moving to it in a horizontally scrolled editor.
- Editor jumping sideways on each keystroke in a long line while scrolled horizontally.
- Cursor left off screen after pasting a long line.
- Option+Delete and Option+Arrow splitting an emoji or accented letter in the SQL and JSON editors.
- Line number column keeping a stale width after the line count drops below 1,000 or the font size changes.
- BigQuery statements broken by an apostrophe or a backslash in a value or filter.
- BigQuery grid inserts writing
__DEFAULT__into columns, and saving byte values as NULL. - BigQuery grid edits failing with type errors after a reconnect.
- BigQuery grid edits matching more rows than the edited one when a value started with
{or[. - BigQuery filters with starts with, ends with, not contains, between, regex or is empty ignored.
- BigQuery No limit query timeout stopping jobs after 30 seconds.
- BigQuery Google sign-in opening the browser again on every connect.
- Crash reading a malformed BigQuery service account key.
ARRAY<BOOL>columns opening a checkbox editor, andBYTEScolumns editable as text.- Line after the data grid's row numbers drawn twice as thick as the other column lines.
#heading in the data grid darker and dimmer than the headings beside it.- Row numbers showing the scrolled columns through them on every other row in dark mode.
- Row numbers keeping the selection's accent colour after the data grid lost focus.
- Clicks and double-clicks below the last row ignored in the row-number column.
- Column headings out of line with their columns after moving to a column hidden under the row numbers.
- Data grid row menu instead of the Structure menu when right-clicking a pinned row number on the Structure tab.
- VoiceOver finding no row over a pinned row number.
- Column lines showing through the row numbers below the last row.
- Empty rows below the last row striped brighter than the rows in dark mode.
- Row numbers keeping their old stripes after turning alternate rows off or changing the row height.
- TablePlus imports of SQL Server, CockroachDB, Cloudflare D1, libSQL and Elasticsearch typed so they never connect.
- DuckDB file connections imported from TablePlus without their file.
- Unsupported engines imported silently and checked by default, or dropped from a Beekeeper Studio import.
- Import preview calling an unrecognized database type "not installed".
- Imported connections unable to connect when the source app spelled the engine name in a different case.
- Wrong default port on Redshift and CockroachDB connections imported without one.
- Object browser replaced by "No Tables" for a database with procedures but no tables.
- Procedures, functions and triggers missing from the object browser on Oracle, Snowflake, BigQuery and Dameng.
- Empty schema list labelled "No Datasets" on Oracle, Snowflake, Dameng and Trino.
- Connect error blaming a missing plugin for a connection whose database type is not recognized.
- Connecting silently switching a disabled plugin back on.
- Plugin install error replaced by "not installed" when connecting.
- Test Connection doing nothing after installing the plugin it asked for.
- Safe Mode and run buttons misreading statements beside invisible characters, CRLF or MySQL conditional comments.
- Connecting removing a plugin that failed to load, and its settings, when no replacement could be downloaded.
- Disabled plugin's code loaded when a connection looked up its driver.
- Failed connect from an opened file or URL titled "Disconnected", with Reconnect as its only fix.
- Database error messages hiding invisible characters, such as a backspace quoted back from a query. (#2717)
- Connection Failed alert covering the window that already showed the same failure.
- Invisible control characters typed into a query by an input method or a Control-key chord such as Ctrl+Option+H. (#2717)
- Escape and Tab taken from an input method mid-composition in the SQL editor, and AI suggestions shown during it.
- Statement with a NUL character running only up to it on SQLite and PostgreSQL, dropping its WHERE clause. (#2717)
- Vim Replace mode writing an invisible character for Backspace and keypad Enter. (#2717)
- Option and Control chords editing text in Vim Normal and Visual mode, and Vim's Ctrl commands never running. (#2717)
- Line and paragraph separators (U+2028, U+2029) shown as line breaks the database does not see. (#2717)
- Stop on Cloudflare D1, libSQL and Trino cancelling a sidebar read instead of the running query.
- Numeric-looking filter values sent unquoted to text columns when a table first opens or after a foreign key jump.
- Missing column comments, identity flags and generated flags on PostgreSQL views, partitioned and foreign tables.
- Wrong primary key columns when another table reuses the key's constraint name on PostgreSQL and Redshift.
- Restore reported as failed after a complete restore into a PostgreSQL server older than
pg_restore. - Garbled non-Latin text saved to MySQL and MariaDB servers that force a Latin 1 session. (#2725)
- Garbled non-Latin text when restoring a MySQL or MariaDB SQL export through a Latin 1 client. (#2725)
- Curly quotes, € and other Windows-1252 symbols shown as invisible characters after
SET NAMES latin1. Illegal mix of collationscomparing a column with a user variable on MySQL 8.- GEOMETRY values from a parameterized MySQL query shown as raw bytes.
- Earlier row's text repeated in later rows of a parameterized MySQL query once a value passed 64 KB.
- Wrong row deleted or updated after an edit took a row out of a column value filter.
- Garbled non-ASCII text on PostgreSQL databases not encoded in UTF-8 after
RESET ALLorDISCARD ALL. - Garbled or double-encoded non-ASCII text on iOS with PostgreSQL databases not encoded in UTF-8.
- Garbled non-ASCII text when restoring a PostgreSQL SQL export into a database not encoded in UTF-8.
- Display As formats and foreign key labels lost on a rename, and kept with column layouts after deleting a connection.
- Foreign key value picker failing to read a referenced table in another MySQL database. (#2768)
- MySQL table reached through a foreign key keeping its own filters, column layout, highlight rules and Display As formats. (#2768)
- Referenced database shown as a schema in a MySQL tab title and in the foreign key picker's header. (#2768)
- Composite foreign keys listing mismatched column pairs on iOS, CockroachDB and Redshift.
- Foreign keys missing on iOS for a PostgreSQL role that does not own the table.
- Redshift foreign keys from other schemas shown on a table.
- PostgreSQL view definitions without
security_barrier,security_invokeror the check option. (#2726) - PostgreSQL view definitions that bind to another schema's tables when run elsewhere. (#2726)
CREATE TABLEin Structure > DDL for a PostgreSQL view or materialized view. (#2726)- Edit View Definition in the Database menu opening a same-named view from the browsed schema. (#2726)
- Edit View Definition enabled in the Database menu on a read-only connection. (#2726)
- Enum types and sequences written in front of a PostgreSQL view's DDL. (#2726)
- Garbled ClickHouse text whenever another value in the same result held binary data.
- Carriage returns, quotes, NUL bytes and Enum type names shown with backslash escapes on ClickHouse.
- Edits and deletes matching no row on ClickHouse tables with a binary value in the row.
- Binary ClickHouse values written as replacement characters by an export, an object copy and a compare. (#2725)
- ClickHouse export with a Row limit failing with a syntax error. (#2725)
- Non-ASCII SQL Server filter values turned into
?and matching the wrong rows on non-Unicode collations. - Empty structure, missing indexes and failed renames for non-ASCII SQL Server object names on non-Unicode collations.
- Changing a defaulted SQL Server column failing when a name contains a quote or non-ASCII text.
- CockroachDB DDL, view definition and index reads ignoring the schema of an object outside the current schema. (#2726)
- Silent replay of a PostgreSQL statement on a new connection after a drop, a lost
COMMITreported as saved included. - Query timeout and startup commands missing after the PostgreSQL driver reconnected on its own.
- Server Dashboard sessions, metrics and slow queries failing on PostgreSQL 9.6 and earlier.
- One unanswered metric emptying the whole Server Dashboard metrics panel on PostgreSQL, Redshift and CockroachDB.
- MCP
get_server_dashboardreporting a panel the server could not read as an empty list. - Backup and restore failing on PostgreSQL 9.1 when the
pg_dumporpg_restorefound first is version 15 or later. - Missing execution time in query plans on PostgreSQL 9.3 and earlier.
- Cross-engine copy and JSON import creating
jsonbcolumns on PostgreSQL 9.3 and earlier. - SQL Server edits and deletes matching no row when the row is identified by a binary column.
- SQL Server parameters sent to the wrong placeholders when a column name holds a question mark.
- Maintenance offered on views and sequences, where the server skips or refuses it. (#2726)
- Maintenance running against a same-named object in another schema. (#2726)
- Maintenance SQL preview showing a statement the app never runs. (#2726)
[in a SQL Server filter value read as a wildcard.- Non-ASCII text turned into
?by Copy as INSERT, Copy as IN, compare scripts and column defaults on SQL Server. - Structure tab offering column, index and constraint edits that views and materialized views refuse. (#2726)
Removed
- Focus Border color in the theme editor.
Security
- TablePlus connections set to VERIFY-IDENTITY or VERIFY-FULL imported with TLS turned off.
- BigQuery Google sign-in accepting an authorization response without PKCE or a state check.
- PostgreSQL sessions inheriting
standard_conforming_strings = off, which let a backslash break out of any quoted literal. - PostgreSQL catalog, comment and password literals escaped by quote doubling alone, which a backslash can break out of. (#2726)
- An MCP token without Full Access approving its own write and skipping TablePro's confirmation dialog.