Skip to content

v0.87.0-beta.2

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 14 Nov 09:09
· 3 commits to main since this release
Immutable release. Only release title and notes can be modified.
v0.87.0-beta.2
19722ac

Added

  • PostgreSQL notices such as RAISE NOTICE show in the Output view, and a plan from EXPLAIN ANALYZE gains Output too. (#4061)
  • Export Results… has a keyboard shortcut, ⌥⇧⌘E, which you can change in Settings > Keyboard. (#4066)
  • The tablepro command lists databases, schemas and tables, describes and exports tables, and reports its status. (#4145)
  • tablepro completion prints a completion script for zsh, bash and fish. (#4145)
  • tablepro pair and tablepro unpair pair the command with TablePro or revoke its token. (#4145)
  • Table Health exports findings to CSV, Excel, JSON and other formats, copies them, and saves every fix as one script. (#4167)
  • Table Health finds reclaimable space on MySQL and MariaDB. (#4167)
  • Table Health marks new findings, keeps resolved ones and lets you ignore a finding, per database. (#4167)
  • The get_table_health MCP tool returns Table Health findings to a connected client. (#4167)
  • Table Health checks redundant and invalid indexes, values near their limit, transaction ID age and stale statistics. (#4167)
  • Redshift AWS IAM sign-in accepts a custom domain name as Host. (#4183)
  • AWS IAM connections to Amazon RDS accept a custom CNAME as Host and follow it to the RDS endpoint on every connect. (#4183)
  • Meta (Muse Spark, Muse Wonder, Muse Ember) is an AI provider in Add Provider, with its Base URL filled in. (#4191)
  • PostgreSQL connections set to Verify Identity check the server against this Mac's trusted roots without a CA file. (#4200)
  • Color values by type in Settings > Data colors strings, numbers, dates, binary, JSON, UUID and enum values. (#4205)
  • A Values section in the Theme Editor sets the NULL, boolean and per-type value colors. (#4205)
  • Autocomplete offers join conditions from foreign keys right after the ON of a join. (#4210)
  • The MCP Activity Log shows and filters by the client that made each call. (#4211)
  • Connect a Client lists 21 AI clients, including Codex and VS Code, sets most up in one click and says when one connects. (#4211)
  • The ER diagram's Add Foreign Key sheet builds keys over several columns. (#4214)
  • Manual Commit keeps a connection's changes in a transaction until you commit or roll back. (#4214)
  • The sidebar lists MySQL and MariaDB events and PostgreSQL extensions, and opens their DDL. (#4214)
  • Query tabs keep earlier versions of their text, listed under File > Revert To. (#4214)
  • A table tab can refresh itself on an interval, set from its status bar or Database > Auto Refresh. (#4214)
  • Always Allow grants for assistant tools can be removed with Forget under AI Policy in the connection form. (#4219)
  • Settings > Data > Results kept per run limits how many results with rows a run keeps. (#4246)
  • SQL import and the query editor load the rows of a PostgreSQL COPY ... FROM STDIN, as psql sends them. (#4255)

Changed

  • On iOS, usage data goes to PostHog instead of TablePro's server, and only after you choose Share Usage Data. (#4058)
  • tablepro exits 2 for a target that is neither a URL nor a file; open a file named like a command with tablepro open. (#4145)
  • SQL passed to tablepro query that starts with a dash now goes after --. (#4145)
  • tablepro opens files and links in the TablePro it ships in, and a hidden connection exits 2 like an unknown one. (#4145)
  • With Reduce Transparency on, themes now color the sidebar and inspector on macOS 26 and later. (#4153)
  • Table Health opens one tab per database and stays on it when the sidebar switches database. (#4167)
  • Run All shows statements that return no rows as one result, and keeps the last 100 results that return rows. (#4200)
  • On iPad, every window of a connection now shows Reconnecting or Lost at the same time. (#4201)
  • Bundled palette themes like Dracula and Nord color each value type, and booleans and values reach 4.5:1 on every row. (#4205)
  • Edited cells in Dracula and Nord use a lighter tint, so values stay readable on them. (#4207)
  • Themes that set Values colors, copies of built-in themes included, sync only to Macs on this version or later. (#4207)
  • Query tabs on Trino, Neo4j and similar drivers no longer read every table's columns up front. (#4209)
  • PostgreSQL connections open with five fewer round trips, so the sidebar lists tables sooner after a connect. (#4209)
  • AI provider and MCP client lists show each brand's logo instead of a generic symbol. (#4211)
  • Queries start sooner: running one no longer rewrites the whole execution log first. (#4212)
  • Copilot's schema context covers up to Max schema tables tables, the ones the current statement names first. (#4218)
  • A connection on an SSH profile asks once more before it signs in with this Mac's credentials or environment variables. (#4222)
  • Reset All Settings keeps AI providers, their API keys and the Enable AI Features switch. (#4222)
  • Large iOS query results use less memory, so more rows fit before the app stops at its memory limit. (#4228)
  • Returning to the iOS app syncs with iCloud at most once a minute. (#4228)
  • Opening a table on iOS shows its rows before the row count finishes, and sorting no longer counts the table again. (#4228)
  • On iOS, a PostgreSQL connection opens straight into the database and schema you last used. (#4228)
  • The iOS app starts faster: it no longer rebuilds Spotlight entries, widgets and Shortcuts at every launch. (#4228)
  • Switching back to TablePro syncs with iCloud at most once a minute. (#4229)
  • A theme edited in Finder or another app loads as soon as it is saved. (#4229)
  • Opening a remote database file over SFTP downloads it several times faster on high-latency links. (#4229)
  • TablePro and its plugins are smaller to download and install. (#4233)
  • MySQL, MariaDB, TiDB and OceanBase count an UPDATE's matched rows as affected, unchanged rows included. (#4242)
  • Read-Only blocks a query that calls a function which may change data, and names the level that runs it. (#4244)
  • An AI agent's statement over an open Teradata transaction is refused, since a failure would roll it all back. (#4246)
  • A Teradata script that starts with BT runs as its own transaction instead of inside one TablePro opens. (#4246)
  • Closing, disconnecting, quitting or relaunching with an open transaction now offers Commit as well as Roll Back. (#4247)
  • On iOS, reopening a MySQL, MariaDB or TiDB connection on the database you last used takes fewer round trips. (#4252)
  • iOS Read-Only runs PostgreSQL, MySQL and MariaDB queries in a read-only transaction, so the server refuses their writes. (#4257)
  • Read-Only and Edit mode treat Redis module and new data-type reads, and Elasticsearch POST reads, as reads. (#4260)
  • Deleting one document, row or key by its ID is a write, so AI Edit mode and MCP's execute_query can run it. (#4262)
  • Read-Only runs Oracle MATCH_RECOGNIZE queries that use PREV, NEXT, FIRST, LAST, CLASSIFIER or MATCH_NUMBER. (#4262)
  • The SQL import progress bar follows how much of the file has been read, so it moves while a large COPY block loads. (#4263)
  • With iCloud sync on, changes from your other devices arrive within seconds while TablePro runs, in the background too. (#4266)
  • On iOS, changes from your other devices arrive within seconds while the app is open or iOS wakes it. (#4266)

Fixed

  • Oracle output from a grid save, Commit or an AI statement showed under the next statement run from the editor. (#4061)
  • The Restore Previous Values toolbar button ignored a shortcut assigned to it in Settings > Keyboard. (#4066)
  • A database or schema's Export… in the sidebar showed ⇧⌘E, which exports the selected tables instead. (#4066)
  • Settings offered a tablepro link line that broke once TablePro left its disk image. (#4145)
  • tablepro --help and tablepro --version opened TablePro instead of printing help or the version. (#4145)
  • tablepro query with TablePro closed could start another copy of TablePro, or the iPad app, and then time out. (#4145)
  • Revoking an MCP token showed it as revoked even when TablePro could not save the change. (#4145)
  • Bars in the inspector lost their background under a theme on macOS 13 to 15. (#4153)
  • The license notice over Charts and Query Insights covered a themed window in system gray with Reduce Transparency on. (#4153)
  • Filter bar rows no longer center or drift out of line when a value is a pop-up, Between or Raw SQL. (#4164)
  • Table Health reported a PostgreSQL standby's activity counters and objects an extension owns. (#4167)
  • Pasting spreadsheet rows whose first cell is empty shifted every value one column left. (#4174)
  • An error sent mid-stream by an OpenAI-compatible or Gemini provider ended the reply silently. (#4174)
  • Query parameters mistook Snowflake paths, array slices or ClickHouse typed slots for :name parameters. (#4174)
  • A SQL dump of a MySQL BIT column restored different values than the table held. (#4174)
  • Saving a connection deleted its API token, TOTP secret or key passphrase when the Keychain could not be read. (#4174)
  • Pasting or bulk-editing tens of thousands of rows froze the window for many seconds. (#4174)
  • Parquet export wrote NULL for values that did not fit the column type, with no warning. (#4174)
  • A DuckDB export or table copy of more than 5,000,000 rows stopped at 5,000,000 and reported success. (#4174)
  • Running a query over an edited result discarded the unsaved edits without asking. (#4174)
  • Editing a MySQL or MariaDB BIT cell saved the wrong value: 5 was stored as 53. (#4174)
  • A long Snowflake statement was run a second time when the session expired while it ran. (#4174)
  • Kafka topics and SurrealDB tables were browsed with a generic SQL SELECT instead of the driver's own query. (#4174)
  • A failed trigger edit could leave the trigger dropped with only a syntax error shown. (#4174)
  • One unreadable saved MCP token, or a failed keychain read, removed every paired client's token. (#4174)
  • Items deleted on another Mac while their sync category was off stayed here and could come back everywhere. (#4174)
  • A transaction opened in a tab on another PostgreSQL database was silently rolled back after a few minutes. (#4174)
  • XLSX export turned text such as 1E5 or Infinity into numbers and lost digits of long ids. (#4174)
  • Editing a Redis string value in the grid removed the key's TTL. (#4174)
  • A save could fail on a unique constraint because edits ran before earlier deletes. (#4174)
  • Format Query split PostgreSQL operators such as pgvector's <#> or pg_trgm's <%. (#4174)
  • Exporting an empty PostgreSQL table to CSV with field names wrote no header line. (#4174)
  • Renaming an etcd key or adding one overwrote an existing key, and a rename took two separate steps. (#4174)
  • Parquet export wrote wrong bytes for binary values and NULL for an empty one. (#4174)
  • Copying a PostgreSQL text array into a JSON column wrote invalid JSON or turned strings into numbers. (#4174)
  • Rebuilding a SQLite table with a transaction open in the editor deleted its child rows. (#4174)
  • Keyword casing rewrote words inside string literals and in non-SQL editors such as MongoDB. (#4174)
  • After a dropped connection reconnected, statements ran outside the transaction that was lost, with no error. (#4174)
  • Saving a password failed silently when the Keychain held both a synced and a local copy for the connection. (#4174)
  • Edits left on a background tab were reapplied to a different result that arrived while it was hidden. (#4174)
  • Adding an Elasticsearch row with an _id that exists replaced the existing document. (#4174)
  • Renaming a Redis key or adding a string key overwrote an existing key of that name. (#4174)
  • A query approved in Safe Mode after switching tabs ran in the newly selected tab's database. (#4174)
  • Copy DDL and SQL export recreated a PostgreSQL partitioned or unlogged table as a plain table. (#4174)
  • Reopening a closed connection from a deeplink or history replaced its saved tabs with one tab. (#4174)
  • Editing a MySQL or MariaDB trigger dropped it and ran its body as a statement. (#4174)
  • A write that outlasted the MCP or assistant timeout was reported as failed although it was applied. (#4174)
  • An outside MCP server with long or dotted tool names made every chat request on its connections fail. (#4174)
  • Format Query put spaces around the @ of a MySQL account name or quoted user variable. (#4174)
  • A Snowflake statement still running after 45 minutes was reported as failed but kept running on the server. (#4174)
  • Choosing Save on a second closing tab while the first was still saving left the first tab unclosable. (#4174)
  • Editing a string in an untyped SurrealDB field to text that looks like a number changed its type. (#4174)
  • CSV import silently dropped extra fields. (#4174)
  • A structure save that failed part way on MySQL left edits staged that could not be saved again. (#4174)
  • Deleting a row with unsaved edits could delete a different row, or none. (#4174)
  • Stopping the assistant during a tool call broke the conversation; every later message failed. (#4174)
  • Editing a field inside an Elasticsearch object left the old value in the document beside the new one. (#4174)
  • Shortcuts Add Rows inserted empty CSV cells as empty strings instead of NULL or the column default. (#4174)
  • Editing a MongoDB string field to text that looks like a number or boolean changed its type. (#4174)
  • A DuckDB query over a very large result held every row in memory twice before showing the first page. (#4174)
  • Cmd+Return right after typing in a very large script ran the text from before the last keystrokes. (#4174)
  • Redoing a cell edit on a row with another unsaved edit showed the value but never saved it. (#4174)
  • A sidebar command on another database's table ran on the current database when the switch failed. (#4174)
  • Saving, switching tabs during the Safe Mode prompt, then approving wiped the other tab's edits. (#4174)
  • On macOS 27, clicking a row in a list or table no longer leaves its selection grey and the arrow keys going elsewhere. (#4175)
  • The host, attached database and extension lists in the connection form no longer hide the rows that do not fit. (#4175)
  • Return and Delete on a selected row in the Welcome window, Favorites and the connections strip no longer do nothing. (#4175)
  • A PostgreSQL query on iOS hung for about two hours when the network dropped its reply. (#4177)
  • Stop on iOS left a MySQL statement running on the server, which then committed it. (#4177)
  • A password saved on iOS while Sync Passwords was off went unused once Sync Passwords was turned back on. (#4177)
  • Switching apps on iOS with a DuckDB transaction open rolled it back without any message. (#4177)
  • MySQL statements on iOS that ran past 30 seconds failed while the server kept running and committed them. (#4177)
  • Saving a password on iOS with Sync Passwords off deleted the iCloud Keychain copy your other devices use. (#4177)
  • A MySQL or MariaDB query with no query timeout hung for about two hours when the network dropped its reply. (#4178)
  • Reading a SQLite full-text search table over MCP or from the assistant failed with authorization denied. (#4178)
  • Switching databases on a connection that reconnects to switch rolled back an open transaction without asking. (#4178)
  • Items deleted on another Mac came back after iCloud sync had to download everything again. (#4178)
  • Saving a connection rewrote passwords you did not change, overwriting a newer one saved on another device. (#4178)
  • A password saved while Sync Passwords was off went unused once Sync Passwords was turned back on. (#4178)
  • Claude Agent asked for MCP access to the chat's connection on every message at Ask Once. (#4178)
  • A structure save or column reorder that failed part way did not say which changes were already applied. (#4178)
  • Saving, closing or switching tabs right after typing in a very large script lost the last keystrokes. (#4178)
  • Importing, copying or syncing rows into a MySQL or MariaDB BIT column stored the wrong value: 5 became 53. (#4178)
  • Adding a Redis hash, list, set or sorted set key in the grid wrote into an existing key of that name. (#4178)
  • Editing a SurrealDB field that held both strings and numbers changed the edited value's type. (#4178)
  • Pasting spreadsheet rows with empty cells wrote NULL instead of the column's default value. (#4178)
  • A MySQL result on iOS that exactly filled the row cap said more rows were left out. (#4179)
  • The query timeout on iOS was ignored on PostgreSQL, Redshift and Oracle, and as a lock timeout on SQL Server. (#4179)
  • Text over 4 KB in a SQL Server, Oracle or DuckDB table on iOS could not be loaded in full, edited or copied. (#4179)
  • After a low-memory trim on iOS, the data browser's page range named rows it no longer showed. (#4179)
  • A large MySQL or SQL Server query on iOS kept downloading every remaining row after the row cap was reached. (#4179)
  • Typing in the row inspector after Fetch All on a large result lagged on every key. (#4181)
  • Column suggestions before FROM were slow to appear in schemas with many tables. (#4181)
  • Exporting a large Oracle table was far slower than the same export from other databases. (#4181)
  • Exporting more than 5,000,000 rows from SAP HANA wrote only the first 5,000,000 and reported success. (#4181)
  • Typing or moving the caret near the end of a long SQL script lagged while the current statement was highlighted. (#4181)
  • Refreshing many databases or schemas at once could open more server connections than the server allows. (#4181)
  • AI chat could read foreign keys for every table in a large schema on Snowflake, Trino, ClickHouse and others. (#4181)
  • Stopping an export from SAP HANA, Teradata, InfluxDB, Cloudflare R2 SQL or Memcached left its query running. (#4181)
  • The app froze during the first iCloud sync of a large connection library. (#4181)
  • Browsing, filtering or exporting a large etcd prefix downloaded every key and value at once. (#4181)
  • Run All on a script with thousands of statements froze the window and its result chooser. (#4181)
  • XLSX export held the whole workbook in memory several times and hit the 4 GB limit only after reading every row. (#4181)
  • Filling a column, pasting over many rows or undoing it in a large result hung the app. (#4181)
  • Editing, adding or removing rows with Find open in a large result froze the app. (#4181)
  • Opening Filter Values on a column with many distinct values froze the app while it sorted them. (#4181)
  • JSON import used several times the file's size in memory and silently skipped array items that were not objects. (#4181)
  • Fetch All and large query results froze the window while their rows were loaded. (#4181)
  • A capped PostgreSQL query or a cancelled export inside a transaction read the whole result. (#4181)
  • MySQL and MariaDB connections on AWS IAM failed to reconnect after a dropped connection once the first token expired. (#4183)
  • Reconnect used ${VAR} references in a connection as typed instead of resolving them. (#4183)
  • An AI chat tool call whose arguments did not parse ran with empty arguments. (#4184)
  • Snowflake browser sign-in failed when any other request reached its local callback port. (#4184)
  • A damaged MCP activity log stopped recording MCP activity until the file was deleted. (#4184)
  • A request from an MCP client using the bridge could be cancelled when the bridge renewed its credential. (#4184)
  • The first MCP activity after each launch could be missing from the activity log. (#4184)
  • A damaged query history or saved queries file left both empty and silently stopped saving anything. (#4184)
  • Deleting a Local only connection removed its passwords from your other devices that still sync it. (#4184)
  • A damaged linked folder index left linked SQL files and their keywords missing until the file was deleted. (#4184)
  • Vault OIDC sign-in ended early when any other request reached its callback port. (#4184)
  • A taken local port made an SSH tunnel sign in twice, asking for the passphrase or TOTP code again. (#4184)
  • A damaged query history file on iPhone or iPad was replaced by the next query run. (#4184)
  • Upgrading from an old release could delete saved queries or query history when copying them failed. (#4184)
  • A synced change CloudKit failed to deliver during a pull was skipped for good instead of arriving on the next sync. (#4184)
  • ChatGPT sign-in failed if any other request reached its callback port, and waited 5 minutes after you denied access. (#4184)
  • Rewind reported a row as missing when the save had changed its primary key. (#4185)
  • Data sync wrote an empty Oracle BLOB as NULL, which a NOT NULL column refused. (#4185)
  • Rewinding a save could fail on a unique key when an earlier edit in it had been undone before saving. (#4185)
  • CSV export with a decimal comma rewrote text values that looked like decimals, such as a version 1.10. (#4185)
  • Column and table suggestions on iPhone and iPad were rebuilt on every keystroke. (#4185)
  • Copy as SQL wrote DuckDB and Oracle binary values that DuckDB stored as text and Oracle rejected. (#4185)
  • Copy to another database and Data Compare missed rows past a database's row limit without saying so. (#4185)
  • Exporting more than 5,000,000 MongoDB documents wrote the first 5,000,000 and reported success. (#4185)
  • A startup command that failed, such as SET ROLE, left the session running without it and nothing said so. (#4185)
  • Stopping a Teradata query ended the whole session, so volatile tables were lost and the next query failed. (#4185)
  • Running SET with NX or XX in the Redis console showed OK when the key was not written. (#4185)
  • Run Current split a PostgreSQL rule with several commands in parentheses at each semicolon. (#4185)
  • Dropping or detaching a ClickHouse partition failed on tables partitioned by several columns or not at all. (#4185)
  • A value of DEFAULT was saved as the column default when duplicating a row or typing it into a cell. (#4185)
  • Pressing Stop as a MySQL tab closed could crash the app. (#4185)
  • Cancelling the Safe Mode confirmation in an object editor or sheet showed an error. (#4185)
  • Saving while closing a window could close it over unsaved edits in another connection or tab. (#4185)
  • Changing export or import options in another window changed a running export or import, or left foreign keys off. (#4185)
  • CSV export put a single quote before values starting with =, +, - or @ by default, which then stayed in imports. (#4185)
  • A query parameter such as zip code 00123 was sent to Trino as the number 123. (#4185)
  • Run Current and the gutter cut a SQL Server IF, WHILE or TRY...CATCH block at each semicolon inside it. (#4185)
  • A table opened while another query waited for Safe Mode approval stayed empty with its loading indicator. (#4185)
  • Data sync and Copy as SQL wrote Redshift binary values in a form Redshift refused. (#4185)
  • TablePro could quit when the Copilot language server exited while TablePro was sending it a message. (#4185)
  • The ClickHouse Parts tab hid its list and toolbar after a cancelled or failed partition action. (#4185)
  • Applying user changes ran ALTER and password statements for a user staged for drop, and overcounted pending changes. (#4185)
  • Moving the caret in a long MongoDB or Redis query re-read the whole document every time. (#4185)
  • Moving the caret next to a bracket far below the visible text could crash the editor. (#4185)
  • New Trigger and Edit Trigger opened at 13 pt instead of the size the Structure tab's DDL pane was zoomed to. (#4185)
  • Saving a Cassandra row that another client deleted recreated it with every other column empty. (#4185)
  • Data sync and Copy as SQL wrote PostgreSQL binary values that stored other bytes with standard_conforming_strings off. (#4185)
  • Add Rows in Shortcuts refused CSV with bracketed headers such as [id], as SQL Server exports them. (#4185)
  • Add Rows in Shortcuts refused a header that differed from its column's name only in case. (#4185)
  • A long SAP HANA export failed when it ran past the query timeout. (#4190)
  • Exporting a large Teradata, InfluxDB, SAP HANA or Memcached table loaded every row into memory first. (#4190)
  • A Teradata query with the row limit on read every row of the result. (#4190)
  • Stopping a Teradata query in ANSI mode did not say that Teradata rolled back the open transaction. (#4190)
  • Saving the text DEFAULT in a SQL Server, Oracle, MongoDB or other driver-written table was refused. (#4190)
  • Oracle TIMESTAMP WITH TIME ZONE values stored with a region name showed a placeholder instead of the time. (#4190)
  • Duplicating an Elasticsearch document saved the copy with the id DEFAULT. (#4190)
  • Stopping a Memcached export left the connection closed until a reconnect. (#4190)
  • Integer, Decimal and Boolean query parameters, and codes such as 1E5, were sent to Trino by how the value looked. (#4190)
  • A chat panel model picked for a removed provider was sent to the active provider. (#4191)
  • OpenAI and xAI model lists offered embedding, speech and image models that cannot chat. (#4191)
  • Test Connection failed with a not found error when no model was picked yet. (#4191)
  • The chat sent a reasoning level that the model picked in the chat panel does not accept. (#4191)
  • The chat panel kept a provider's old model list after its key or Base URL changed in Settings. (#4191)
  • A new provider started with no model when its model list could not load yet. (#4191)
  • Typing a Find term in a large grid froze the window while every cell was searched. (#4200)
  • A chat reply cut off at the model's output limit gave no sign of it, and a tool call cut with it could run. (#4200)
  • After a dropped connection reconnected, statements ran without the temporary tables or settings the old session had. (#4200)
  • JSON import read UTF-16 and UTF-32 files, and files holding a single object, whole into memory. (#4200)
  • Filter Values on a large column froze the window while it listed the values. (#4200)
  • A sidebar Refresh held up autocomplete, and each schema of a database kept its own background connection. (#4200)
  • Grid edits to a row after another row's change saved out of order, failing saves such as a swap of unique values. (#4200)
  • Oracle BINARY_DOUBLE, BINARY_FLOAT and BINARY_INTEGER values on iOS showed as BLOBs and could not be copied or searched. (#4201)
  • A Redis value over 4 KB on iOS could never be read in full. (#4201)
  • An iOS connection could show Connected with no session after a failed switch back to its last database. (#4201)
  • On iPad, Reconnect on the lost-connection screen moved the connection's other windows to the saved database and back. (#4201)
  • Text over 4 KB in an iOS query result could not be read in full or copied. (#4201)
  • A DuckDB BLOB on iOS showed as base64 text, and saving an edit stored that text as the blob's bytes. (#4201)
  • After a database switch on SQL Server on iOS, the schema list still showed the old database's schemas. (#4201)
  • On iPad, a transaction rolled back in the background went unreported when another window reopened the connection first. (#4201)
  • Copy Row as SQL INSERT from an iOS query result quoted names the SQLite way on every engine. (#4201)
  • MySQL and MariaDB BOOLEAN columns showed as numbers in query results, and BIT(8) columns as booleans. (#4205)
  • Sorting and highlight rules on boolean columns holding numbers compared them as text. (#4207)
  • Run Current, the gutter, folding and SQL import split a SQL Server IF ... ELSE at a semicolon before the ELSE. (#4210)
  • SQL import of a plain pg_dump file failed at its start, on the \restrict line current pg_dump versions write. (#4210)
  • The rows after COPY FROM STDIN in a PostgreSQL script ran as SQL in the editor and in SQL import. (#4210)
  • The editor read a MySQL DELIMITER line as SQL, so a routine between DELIMITER lines was cut at each semicolon. (#4210)
  • The new token sheet showed the hidden token in its setup snippet. (#4211)
  • Generate Token did nothing when the token could not be saved, and the MCP port took any number. (#4211)
  • The Claude Code setup command added TablePro to one project only, and broke on a path with a space. (#4211)
  • Claude Agent lost its database tools silently, and pairing failed with a vague message, when a token was not saved. (#4211)
  • A Claude Desktop, Cursor or Zed client showed twice in Connected Clients, and Disconnect cut off every other one. (#4211)
  • Picking another file in the Import dialog while a .gz file was still opening could import the first file. (#4212)
  • An execution log TablePro could not read was overwritten by a new one instead of being kept. (#4212)
  • An agent session restored at launch could lose its conversation the next time another session was saved. (#4212)
  • Closed agent sessions kept their transcripts and schema in memory until TablePro quit. (#4212)
  • Open tabs were written to disk every 30 seconds and on every tab switch even when nothing had changed. (#4212)
  • Opening a .gz file, or checking the Copilot and Cloud SQL Proxy helpers, held the whole file in memory. (#4212)
  • Claude Agent replies appeared only once finished, and a long reply never finished. (#4212)
  • The Structure tab accepted a foreign key whose column and referenced column counts differ. (#4214)
  • On DuckDB and PGlite, saving a structure, a new table or a trigger committed a transaction left open. (#4214)
  • Clear Query, loading a query, AI apply and inserting a saved query could not be undone. (#4214)
  • The transaction bar's Commit button did not follow a Safe Mode change until the next statement. (#4214)
  • The Server Dashboard's refresh interval was not shown in your language. (#4214)
  • Closing, disconnecting or quitting did not mention an open transaction it was about to roll back. (#4214)
  • A refresh turned a selected cell or cell range into whole selected rows. (#4214)
  • Commit and Roll Back in the transaction bar refused after any background read on the connection. (#4214)
  • Typing in a second window of a connection waited up to 30 seconds to be saved. (#4214)
  • An MCP insert_rows call that failed partway inside an open transaction left its earlier rows pending. (#4214)
  • An MCP client could start a transaction over an open one, which on MySQL commits the open one. (#4214)
  • Copying rows as JSON on iOS turned text that looked like a number or true and false into numbers and booleans. (#4215)
  • A USE run in the iOS Query tab moved where Tables tab edits, deletes, truncates and drops landed. (#4215)
  • On iOS, a PostgreSQL Roll Back or a typed SET search_path left the schema menu on a schema the session had left. (#4215)
  • Each query run on iOS paused the app while it reread and rewrote the whole query history. (#4215)
  • Searching an iOS table for a name with an apostrophe found nothing with Smart Punctuation on. (#4215)
  • Paging an iOS PostgreSQL or ClickHouse table without a sort repeated and skipped rows. (#4215)
  • On iPad, a row delete confirmed after another window switched schema deleted the same key in that schema. (#4215)
  • Moving the caret in the query editor redrew the whole window. (#4218)
  • The query history panel lagged on very long saved queries. (#4218)
  • Vim section and paragraph motions froze on long scripts, and j and k slowed down as a script grew. (#4218)
  • Typing lagged in large SQL scripts while code folding was on. (#4218)
  • Copilot resent the whole script and schema on every keystroke, and stopped suggesting after a tab switch. (#4218)
  • Copilot ran one metadata query per table when an editor opened, thousands on a large database. (#4218)
  • The assistant saw a generic error instead of the database's message when a query failed. (#4219)
  • A tunnel or proxy helper's error could lose its lines when they ended in CRLF or held non-ASCII text. (#4219)
  • Stopping the assistant during a write reported a failure while the write went on and committed. (#4219)
  • A conversation left while a tool card waited reopened with Run buttons that did nothing. (#4219)
  • A large MCP or assistant query result on PostgreSQL, MySQL, SQLite, DuckDB or ClickHouse could use up memory. (#4219)
  • Editing an Elasticsearch text or keyword value that reads as a JSON array no longer stores an array. (#4220)
  • Kafka pages from the newest message no longer skip messages in topics with transactions or compaction. (#4220)
  • SurrealDB edits and deletes of a record whose id is a UUID, array or object now change that record. (#4220)
  • Changing a Memcached item's flags no longer writes back the value the grid loaded. (#4220)
  • Redis, Cassandra and Bigtable keys that start with a byte order mark are no longer edited or deleted as another key. (#4220)
  • Browsing a Redis database no longer reads every string value whole. (#4220)
  • MongoDB pages sorted by a column with repeated values no longer repeat or skip documents. (#4220)
  • Editing a MongoDB number no longer changes its type to the one most of the column holds. (#4220)
  • Elasticsearch edits and deletes of documents indexed with custom routing no longer fail or change another document. (#4220)
  • Cassandra and ScyllaDB edits and undone deletes no longer remove the time to live of the cells they write. (#4220)
  • CSV and JSON import dropped rows of all NULL values, the way their own export writes them, and reported success. (#4221)
  • XLSX export of more than about 2.1 million rows wrote sheets past Excel's row limit. (#4221)
  • Importing true, false, yes or no into a boolean column failed on MySQL and SQL Server and stored text on SQLite. (#4221)
  • Parquet export dropped the UTC offset of timestamps and times with time zone. (#4221)
  • Copying a binary cell copied only its first 64 bytes, and pasting it back wrote the hex text instead of the bytes. (#4221)
  • Copy as IN Clause wrote TRUE and FALSE for SQL Server bit columns and left out binary values. (#4221)
  • Binary values exported to CSV, JSON or XLSX imported back as hex or Base64 text instead of the bytes. (#4221)
  • Copying or exporting a large ER diagram as an image could freeze TablePro and use gigabytes of memory. (#4222)
  • A connections file that could not be read loaded as an empty library, and the next save or sync wrote over it. (#4222)
  • Deleting a custom slash command or resetting all keyboard shortcuts happened on one click. (#4222)
  • Remove on a plugin that failed to load deleted it at once, with no confirmation, bundled plugins included. (#4222)
  • Removing an AI provider from its sheet asked twice. (#4222)
  • Oracle SQL exports wrote no primary keys, so every foreign key in the dump failed on restore. (#4223)
  • Copying, transferring or comparing a large PostgreSQL, MySQL or SQL Server table held all of it in memory. (#4223)
  • Saving edits on a Teradata connection in ANSI mode failed and discarded the editor's uncommitted changes. (#4223)
  • Cancelling a DuckDB export inside an open transaction could abort that transaction. (#4223)
  • The MySQL structure view could show another table's check constraint. (#4223)
  • SQL Server table DDL and SQL exports dropped computed columns, identity seeds, checks and composite foreign keys. (#4223)
  • PostgreSQL DDL of a partitioned table dropped each partition's own indexes, checks and defaults. (#4223)
  • SAP HANA exports wrote large objects over 64 MiB cut short without reporting it. (#4223)
  • Importing or copying into Oracle stored text such as 00123 as 123, and national text as question marks. (#4223)
  • Changing a SQL Server column's type in the structure editor reset its collation to the database default. (#4223)
  • Run All of a Teradata script that creates a table and then uses it failed with error 3932. (#4223)
  • Truncate and Copy in one window acted on the table selected in another window of the same connection. (#4225)
  • A connection first opened on a table or query from a link never saved its tabs, so they were lost at quit. (#4225)
  • Showing an earlier result read in another schema moved the query tab back to that schema. (#4225)
  • Stop on Run All dropped the results and history of the statements that had already run. (#4225)
  • Changing a query tab's database while its query ran put the old database's rows under the new one, and Save wrote there. (#4225)
  • Switching tabs, Clear Query, loading from history or applying an AI rewrite wiped the SQL editor's undo history. (#4225)
  • Edits typed while a save was running were wiped when the save finished. (#4226)
  • Pasting rows replaced every pasted primary key with DEFAULT, even a key the server cannot fill. (#4226)
  • A save reported success for an edited row that was deleted elsewhere or hidden by a row-level security policy. (#4226)
  • Pasting CSV removed the spaces inside quoted fields. (#4226)
  • Cmd+Z after Undo Delete on the row menu deleted the row again. (#4226)
  • Editing a formatted JSON value in the row inspector or the JSON editor saved it on one line. (#4226)
  • Restore Previous Values overwrote changes made to a row after the restore was reviewed. (#4226)
  • Duplicate on the row menu copied only the first of the selected rows. (#4226)
  • A structure save that stopped part way lost a staged drop and re-add of a column with the same name. (#4226)
  • Undoing a cell typed back to its value kept Restore Previous Values from bringing the old value back. (#4226)
  • Deleting more than 100 rows in one save failed part way on Cloudflare D1. (#4226)
  • Copying, comparing or exporting a large SQLite, Oracle, Teradata, Cassandra or cloud table held all of it in memory. (#4227)
  • Going past the last page of an iOS table before its row count arrived showed it as empty with a wrong total. (#4228)
  • Share Results and Copy Results on iOS froze the screen while they formatted a large result. (#4228)
  • Switching schema on iOS kept the previous schema's row count in the table pager. (#4228)
  • The Server Dashboard kept querying the server while its window was minimized, hidden or covered. (#4229)
  • An open SSH tunnel woke the Mac five times a second while TablePro sat idle. (#4229)
  • Each switch back to TablePro re-read every theme file and ran Git in each linked SQL folder. (#4229)
  • Snowflake leaked two network sessions each time a pooled connection opened. (#4229)
  • Every write another app made to a SQLite file reloaded the sidebar, even when the schema stayed the same. (#4229)
  • Saving any file in a linked SQL folder re-read every SQL file in it. (#4229)
  • A connection with a credential profile signed in without the profile's credentials when it used a tunnel. (#4230)
  • A refused SQL Server login showed a generic message instead of the server's reason. (#4230)
  • A Vault database role leased a new user on every sign-in, so a database slow to load users never accepted one. (#4230)
  • Quitting TablePro left every Vault database lease alive until it expired. (#4230)
  • Scrolling a result with large binary values stuttered. (#4231)
  • An ER diagram with hundreds of related tables took seconds to open, reset its layout or switch to Compact Mode. (#4231)
  • Moving from row to row with the inspector open was slow. (#4231)
  • Vim mode dl, dh and cl did nothing and left the operator waiting for the next key. (#4236)
  • An unquoted begin column in a one-statement MySQL procedure or event swallowed the rest of the script. (#4236)
  • Vim mode commands such as x, r, h and l split emoji and accented letters, and f with an emoji closed the app. (#4236)
  • Remove Invisible Characters changed the text in a string that followed a non-breaking or zero-width space. (#4240)
  • Saving an edit that matched no row reported success on MySQL, MariaDB, SQL Server, Oracle, Snowflake and Dameng. (#4242)
  • INSERT OVERWRITE, which empties the table first, was not treated as a destructive statement. (#4244)
  • Fetch All ran its query again without Safe Mode's check, so a level raised since the first run did not apply. (#4244)
  • An Always Allow grant let the assistant's query tool run on a Read-Only connection. (#4244)
  • An Elasticsearch export could leave out the documents of a shard that stopped answering, without an error. (#4245)
  • Copying, comparing or exporting a large Elasticsearch, Trino or MongoDB table held the whole table in memory. (#4245)
  • An MCP client's insert_rows reply never said that Manual Commit held the inserted rows. (#4246)
  • Tabbing through a binary field in the inspector without changing it marked the row as edited. (#4246)
  • Moving from row to row with the inspector open was slow with text, JSON, binary, image or geometry fields. (#4246)
  • On Teradata, saving two staged table drops failed, and Truncate sent a TRUNCATE statement Teradata does not have. (#4247)
  • A TablePro opened only to serve MCP kept running after MCP refused it. (#4247)
  • On Teradata, Run All failed on the statement after a DDL statement instead of stopping and asking you to commit. (#4247)
  • On Teradata ANSI sessions, structure edits, new tables, renames and drops were left uncommitted and could be lost. (#4247)
  • On Teradata, every statement after an uncommitted change was refused, a typed COMMIT included. (#4247)
  • Closing a connection under Manual Commit rolled back the edits you had just chosen to save. (#4247)
  • An SSH tunnel could stall every connection through it after a keep-alive met a full network buffer. (#4248)
  • A connection through an SSH tunnel could wait half a second for a reply while others were open. (#4248)
  • An open SSH tunnel woke TablePro twice a second for each connection and kept macOS from napping it. (#4248)
  • A SQLite over SSH connection set to open the database on the server never connected. (#4249)
  • Remove Invisible Characters left a non-ASCII space between the two parts of a PostgreSQL string, so the query failed. (#4254)
  • A MySQL routine with a SET or IF body naming a begin column swallowed the rest of the script on Run All. (#4254)
  • An etcd del with a range end or --from-key deleted only its first key. (#4262)
  • Deleting a Weaviate row in the grid also deleted objects with the same ID in other collections. (#4262)
  • Read-Only failed every query on MySQL before 5.6.5 and MariaDB before 10.0. (#4264)
  • Read-Only refused every query while a transaction was open, as on MySQL and MariaDB with autocommit off. (#4264)
  • TablePro could quit when the SQLite session on an SSH server ended while its connection stayed open. (#4265)
  • Copying, comparing or exporting a large table from a SQLite file on an SSH server held the whole table in memory. (#4265)
  • A query on a SQLite file on an SSH server could wait forever after the session on the server ended. (#4265)
  • Copying, comparing or exporting a SQLite or libSQL table kept other programs from writing the file until it ended. (#4278)
  • Importing a large SQL file held memory the size of the file while counting its statements or loading COPY rows. (#4279)
  • A read error while previewing or importing a SQL file quit TablePro instead of failing the import. (#4279)

Security

  • tablepro export printed control codes stored in the database to the terminal, where they could run. (#4145)
  • The tablepro command and the MCP bridge could send their token to a program that replaced TablePro's socket. (#4145)
  • A Local only connection's newly saved passwords and keys still synced through iCloud Keychain. (#4174)
  • MCP argument completion listed a connection's databases and tables to a client that was not approved for it. (#4174)
  • Deleting the connections.json tag file let an edited connection list run its password and tunnel commands. (#4174)
  • Claude Agent could reach every saved connection through MCP instead of only the one the chat is on. (#4174)
  • MCP clients and the AI assistant could read masked values through a renamed column, a query plan or an error message. (#4178)
  • When the saved SSH host keys could not be read, a server whose key had changed was offered as a new server to trust. (#4179)
  • A shared connection could send an AWS IAM token to its author's server through a host like 127.0.0.1.example.com. (#4183)
  • A shared Elasticsearch, Kafka or MongoDB connection could mint an AWS IAM token on this Mac and send it to its servers. (#4183)
  • A plugin could load with any valid signature when TablePro's signing requirement failed to build. (#4184)
  • Another app on the Mac could take the IPv6 side of a sign-in callback port and receive the browser's redirect. (#4184)
  • A connection deleted on another device left its passwords and other secrets in this Mac's Keychain. (#4184)
  • Plugin secure fields could stay in plain text in connections.json after the upgrade that moves them to the Keychain. (#4184)
  • Browsing a Memcached cache with a key holding a line break could run a second command on the server. (#4190)
  • Marking a connection Local only left its passwords in iCloud Keychain on your other devices. (#4200)
  • Deleting a connection on iOS left its decrypted client private key in a file on the device. (#4215)
  • Read-Only Safe Mode ran a query that called a function which writes data. (#4219)
  • MCP clients could read the query history and tabs of connections the user had denied or never approved. (#4219)
  • Claude Agent could run queries and read rows in Ask mode. (#4219)
  • An MCP client could read files through a DuckDB table function or a file name used as a table. (#4219)
  • The assistant's list_connections sent every saved connection's host and database to the AI provider. (#4219)
  • Sign-in approvals through an SSH profile still held after the profile moved to another server. (#4222)
  • Publishing a connection to the team library uploaded its tunnel command and startup commands. (#4222)
  • Reset All Settings left iCloud password sync on until relaunch, though the Sync pane showed it off. (#4222)
  • A reconnect TablePro started on its own could follow an edited SSH profile to another server under an open window. (#4222)
  • Copied connection strings and MCP tokens were not marked concealed, so clipboard history apps could keep them. (#4222)
  • Always Allow was offered for a local link to a connection that goes through a proxy, tunnel command or SSH profile. (#4222)
  • Safe Mode missed a statement after a string glued to a name, such as x$e'\\' on PostgreSQL. (#4236)
  • On SQL databases the assistant's Edit mode ran schema, privilege, session and transaction statements, such as GRANT. (#4244)
  • Read-Only on iPhone and iPad ran a query that called a function which writes data. (#4244)
  • Safe Mode and MCP missed a PostgreSQL statement hidden after a BEGIN ATOMIC body that selects begin atomic. (#4254)
  • Read-Only blocks an Oracle or Dameng function called without parentheses, and a SurrealDB fn:: call. (#4260)
  • AI Edit mode refuses schema, privilege and session commands on MongoDB, Redis, Neo4j and every other engine. (#4260)
  • A Server Dashboard tile runs in the schema Read-Only checked, after any statement a query tab is running. (#4262)
  • AI Edit mode refuses writes into ScyllaDB's audit log and Kafka topics of Schema Registry, Connect or Streams. (#4262)
  • Replacing a Realtime Database top-level node, or an escaped Memcached flush_all, now counts as destructive. (#4262)