github TableProApp/TablePro v0.73.0

Added

  • VoiceOver navigation of the ER diagram, table by table and column by column, with each table's joins. (#2692)
  • Column type, nullability and default changes for SQLite, libSQL and Cloudflare D1, checked against dependent objects.
  • Column rename and drop alongside a foreign key change in one save.
  • Foreign key add, remove and edit for SQLite, libSQL and Cloudflare D1, applied as a reviewed table rebuild.
  • Real constraint names for SQLite foreign keys, in place of a positional placeholder.
  • Menus of the connection's own tables and columns for a foreign key's Columns, Ref Table and Ref Columns.
  • The reason Create Table is unavailable, next to the button.
  • Menu of the engine's own default values on the Structure tab's Default cell, including a Custom editor. (#2688)
  • Row-number gutter held at the left edge of the data grid when the table is scrolled sideways. (#2664)
  • Shift+Space to widen the grid selection to every row it touches. (#2664)
  • Table name proposed from the file name when an import creates the table, with a warning when the name is taken.
  • Copy To across database engines, with every type approximation listed before the copy runs. (#1491)
  • Per-table WHERE and row limit in Copy To. (#1491)
  • Server-side INSERT … SELECT when a copy's two sides are one connection. (#1491)
  • Tunnel Command transport, with kubectl port-forward and aws ssm start-session presets. (#2520)
  • Bar chart column in the EXPLAIN tree, with a Metric menu for self cost, self time and row counts. (#2633)
  • Database type change from inside the connection editor.
  • The reason Save is unavailable, next to the Save button in the connection editor.
  • Approval setting for MCP connection access, with the list of approved connections and a Forget action. (#2640)
  • Typesense driver plugin, with collection browsing, document editing and a REST request console. (#2629)
  • Export, Delete and Empty for a Typesense collection. (#2629)
  • Typesense API keys in Users & Roles, with the collections and actions each key holds. (#2629)
  • Server Dashboard metrics for Typesense, from /metrics.json and /stats.json. (#2629)
  • Encoding and byte order mark options for CSV export, with a warning naming what the encoding dropped. (#2534)
  • Indexes in an SQL export, written after the data. (#2492)
  • Image preview beside the source for a cell holding SVG or a raster image. (#2535)
  • DuckDB backup and restore, as one .duckdb file or a folder of Parquet. (#2485)
  • Table picker in Backup Dump, everything selected by default. (#2485)
  • Backup of several databases into one folder, one file each. (#2485)
  • Back Up… on a database selection in the connection tree. (#2485)
  • Assistant as its own pane, with View > Show Assistant and Cmd+Option+A.
  • Inspector fields with the column name and type on one line and the value at full width below.
  • A BLOB too large to edit whole marked read-only in the inspector, in place of an editable first 10 KB.
  • Always-visible value menu on every inspector field, with Ctrl+Option+N for NULL and Ctrl+Option+D for DEFAULT.
  • Tab and Shift+Tab between inspector fields.
  • Field search and an edited-fields-only filter in the inspector.
  • Table and row position at the top of the inspector.
  • Safe Mode, Session Context and Schema submenus in the Database menu.
  • Show Tables and Show Favorites in the View menu.
  • Running indicator on the editor tab whose query is executing.
  • Sort direction setting for the data grid, applied to the default row sort and the first header click. (#2665)
  • Transport activity for an SSH tunnel or SOCKS proxy: throughput in the toolbar, bytes in the connection switcher.
  • Release File Lock on the Database menu and the connections strip, for a DuckDB connection. (#2518)
  • Per-connection idle release for DuckDB and MySQL, after a set number of idle minutes. (#2518)
  • Open the File Read-Only option for DuckDB, letting several processes share one file. (#2518)

Changed

  • Zoom ladder for both diagrams, stepping 5, 10, 25, 33, 50, 67, 75, 100, 150, 200 and 300 per cent. (#2692)
  • Fit to Window at whatever scale the diagram needs, instead of stopping at 25%. (#2692)
  • Connection editor rebuilt around a four-section sidebar, in place of up to eleven panes.
  • One Connect via picker for the five transports, in place of five Enable switches.
  • Save, Cancel and Test Connection on a bottom action bar instead of the titlebar.
  • Use ~/.pgpass below Username rather than above it.
  • Tab moves focus out of Startup Commands and Pre-Connect Script instead of inserting a tab.
  • SQL export writes a materialized view's indexes once the view exists. (#2492)
  • Backup Dump as one sheet with scope, format and destination, in place of a picker with a save panel over it. (#2485)
  • Inspector shows the selected row as Fields or JSON, with AI Chat moved out of its tab strip.
  • Structured inspector values expand in place instead of replacing the whole pane.
  • Object tree context menu regrouped into four groups by intent, with the connection-wide commands off object rows.
  • Back available with unsaved edits, asking to discard them, in place of standing down until they were saved.
  • View Options as a control in the sidebar's filter row, in place of an entry on every context menu.
  • View ER Diagram and New View on the object tree's empty-area menu only.
  • Keyboard shortcuts shown on sidebar context menu items that have a menu bar equivalent.
  • Toolbar rebuilt around five icon-only groups, with a centred connection and container control.
  • Query duration and Stop in the results status bar, in place of the centred toolbar readout.
  • Safe Mode as a toolbar menu whose icon follows the level.
  • Window subtitle dropped, with the container named in the toolbar instead.
  • Toolbar arrangements reset once, to the new default set.

Fixed

  • Half the ER diagram left unpainted at its fit-to-window zoom, and the query plan's arrows gone below 50%. (#2692)
  • A table's relationship with itself drawn underneath the table, hiding a manager_id style foreign key. (#2692)
  • Table dragged past the ER diagram's top-left corner disappearing, with the position saved. (#2692)
  • ER diagram back at 100% in the top-left corner after leaving its editor tab and returning. (#2692)
  • "Unsupported schema operation" when adding a foreign key to a SQLite, libSQL or Cloudflare D1 table.
  • Add and Remove offered on the Foreign Keys tab for engines that cannot edit foreign keys.
  • Incomplete foreign keys, indexes and columns reaching the database on Save.
  • Rows silently renumbered by a SQLite column reorder on a table with no integer primary key.
  • A modified index or foreign key re-created before the columns it covers are added.
  • Condition dropped from an index added on SQLite, libSQL and Cloudflare D1, turning a partial index into a full one.
  • Foreign keys and indexes dropped from a new table when their name was left blank.
  • Foreign keys never created with a new table on Snowflake and Teradata.
  • Indexes never created with a new table on SQLite, libSQL, Cloudflare D1, ClickHouse, Snowflake, Trino and Teradata.
  • Constraint name discarded from a foreign key on SQLite, libSQL and Cloudflare D1.
  • Invalid REFERENCES table () from a foreign key that named no referenced columns.
  • Referential actions the engine rejects offered on the Foreign Keys tab.
  • Foreign key resolved against the wrong schema on SQL Server.
  • Auto-increment column not made the primary key on SQLite.
  • Create Table tab closed without a prompt when it held only indexes or foreign keys.
  • Cmd+Z doing nothing in the Create Table tab.
  • Column defaults quoted into string literals, from gen_random_uuid() to NOW() to nextval(...). (#2688)
  • A MySQL expression default rewritten as a string on any edit to the same column. (#2688)
  • A ClickHouse MATERIALIZED or ALIAS column turned into a plain DEFAULT column by an edit to its comment. (#2688)
  • Default and Auto Inc cells on Cassandra and ScyllaDB, which CQL has no way to express. (#2688)
  • Default cell on Trino, whose generated DDL never carried one. (#2688)
  • Column defaults exported from an ER diagram as quoted strings, including SYSDATE and X'0102'. (#2688)
  • MySQL numeric, BIT and binary defaults quoted, which rejected b'1' and turned 0x61 into text. (#2688)
  • DEFAULT CURRENT_TIMESTAMP read back from MySQL 8 as (CURRENT_TIMESTAMP). (#2688)
  • An expression default written without the parentheses MySQL requires, on a copy from MariaDB. (#2688)
  • A bare keyword default such as session_user carried unquoted into a copy to another engine. (#2688)
  • Missing default badge in the enum cell menu on MySQL. (#2688)
  • SQL Server dropping a column's DEFAULT constraint on a type or nullability change and never re-adding it. (#2688)
  • A ClickHouse MATERIALIZED, EPHEMERAL or ALIAS column converted by setting a default on it. (#2688)
  • %h and the other ~/.ssh/config tokens reaching the connection as literal text. (#2687)
  • Trailing comments on a ~/.ssh/config line kept as part of the value. (#2687)
  • Host blocks matched against a substituted HostName rather than the host as typed. (#2687)
  • %p and %r left unexpanded in a Match exec command. (#2687)
  • Match !host and the other negated Match criteria matching every host. (#2687)
  • Include lines naming more than one file reading none of them. (#2687)
  • Include inside a Host block applying to every connection. (#2687)
  • The same file included from a second Host block contributing nothing. (#2687)
  • Match final overriding values earlier blocks had already set. (#2687)
  • IdentityFile entries from earlier blocks dropped by a later Match block. (#2687)
  • Comma-separated Host patterns treated as a list, which Match host alone accepts. (#2687)
  • A Match exec command that ignores SIGTERM hanging the connection. (#2687)
  • Whole-result copy after Select All ignoring the 50,000-row clipboard limit. (#2667)
  • Row-gutter geometry observer left registered every time a data grid was rebuilt. (#2667)
  • A jump host's own ProxyJump not being followed, leaving a chained bastion unreachable. (#2687)
  • The SSH server and jump hosts missing from the confirmation for a database link. (#2687)
  • The SSH username and jump hosts missing from the connection import sheet. (#2687)
  • Unsaved cell edits discarded without asking when a column was hidden, shown or reset. (#2667)
  • Edited values left on screen with nothing tracking them after discarding to change a value filter. (#2667)
  • Discard prompt on applying a value filter that changes nothing. (#2667)
  • Unsaved cell edits following the row that took their place after a per-column value filter changed. (#2667)
  • Undone cell edits coming back after switching tabs. (#2667)
  • Find bar showing another tab's search term, over this tab's match count. (#2667)
  • Cell selection cleared by Select All. (#2667)
  • Scroll and accessibility observers left registered every time a data grid was rebuilt. (#2667)
  • Grid row and cell selection lost on switching editor tabs, result view modes, or moving a tab to a new window. (#2667)
  • Connection and database choosers opening between the two toolbar capsules instead of under the one that was pressed.
  • Raw DuckDB driver text in place of the name of the app holding a locked database file. (#2518)
  • DuckDB instance and its worker threads leaked by every failed remote connection attempt.
  • MySQL statement replayed outside the transaction it was run in after the server dropped the connection.
  • Query timeout lost after a MySQL reconnect.
  • Toolbar commands pushed into the overflow menu at 1200pt by a centred item that could not shrink.
  • Container chooser opening over a session the health monitor had given up on.
  • No way to change a Snowflake warehouse or role once the window narrowed enough to clip the connection group.
  • Blank Connection and Status tiles in Customize Toolbar.
  • Stop advertising the old key after Cancel Query was rebound.
  • Row count and row inspector reporting one row while Delete and Copy act on every row a cell drag covers.
  • Cell selection collapsing to the first column or the first row when a drag left the grid past the last one.
  • Cell selection, copy and paste using columns the pointer never crossed once a column had been reordered or hidden.
  • Default row sort drawn on a column header as though it had been clicked.
  • First click on an already default-sorted column skipping straight to descending.
  • Don't Sort undone by the default row sort on the next load of the table.
  • Sort fired by a column-header drag the user dropped back where it started.
  • Shift-clicked second sort column lost when the tab was reused for another table.
  • Saved sort dropped on relaunch when its column was hidden.
  • Sort marker moved onto another column after a query returned different columns.
  • Sorted column silent to VoiceOver.
  • Sort chevron left on a column after Cancel on Discard Unsaved Changes.
  • Move Column Up and Down dimmed on the Structure tab after Don't Sort.
  • Order lost by an MCP browse_table sorting on a column outside its columns list.
  • Query Live Activity still counting up on the iOS Lock Screen and Dynamic Island after the app was quit mid-query.
  • Stop leaving an iOS MySQL or Redis query running, with the spinner and the Live Activity stuck behind it.
  • A stopped iOS query recorded in Query History as successful, including a write that streamed no rows.
  • Query Live Activity marked interrupted while an iOS query longer than five minutes was still running.
  • Connection screen stuck on Connecting for good after a cancelled connect on iPhone and iPad.
  • Edited connection host, port or credentials ignored until relaunch on iPhone and iPad.
  • SSH tunnel handshake with no timeout on iPhone and iPad, against a server that accepts TCP and then stalls.
  • Export and Transfer To preselecting a same-named table from another schema, or nothing at all.
  • Delete queuing a table drop from the menu bar with none of the confirmation the sidebar asks for.
  • Truncate Table offered from the menu bar for a view, which the server then refuses.
  • Truncate offered on a sidebar selection that mixes a table with a view.
  • Import sheet clearing a table without confirmation on a connection set to confirm destructive statements.
  • Empty destination table picker in the import sheet, with no message and no retry, when the table list failed.
  • Connection with two transports enabled reaching the database directly, with neither transport applied.
  • Object list unchanged after toggling Show object icons or Show object comments in Settings.
  • Delete Connection missing from the connection editor since 0.39.0.
  • Continue dimmed after filtering the database chooser down to one driver.
  • Down arrow not reaching the list from the database chooser's search field.
  • VoiceOver reading a database chooser row's icon before the driver's name.
  • Animations that played through the Reduce Motion setting when removing a jump host or copying DDL or a query plan.
  • Icon-only controls with no VoiceOver name or tooltip in the date picker, row inspector and slash command settings.
  • Inspector picker reading NULL after setting a value on a NULL column, including on every new row.
  • Edits typed into a hidden inspector field while the JSON view is showing, committed by a later save.
  • Set NULL, Set DEFAULT, Set EMPTY and SQL functions offered on a PHP-serialized field they cannot round-trip.
  • Reconnecting or switching connection replacing a connection's remembered Inspector or Assistant choice.
  • Assistant staying on screen and usable after AI features are turned off.
  • Inspector opening in place of a remembered Assistant when a connection restores its session.
  • Auto-show inspector on row select closing the Assistant on every grid click.
  • Explain with AI and Optimize with AI enabled, and doing nothing, with AI features off.
  • Tab trapped inside the inspector's field list with no way back to the search field.
  • Column type missing from inline inspector rows on a read-only result.
  • Inspector picker reading NULL for a multi-row selection whose values differ.
  • Structure inspector drawing the Name and Type fields in two different fonts.
  • Primary key, foreign key and edited markers silent to VoiceOver in the inspector.
  • Inspector showing the last table's statistics on a tab with no table.
  • Auto-show inspector on row select doing nothing on a query tab.
  • Inspector ignoring a column's display format, showing raw where the grid showed JSON or PHP.
  • AI conversation history read from disk on every connection window, with the assistant never opened.
  • is_connected reported as true over MCP for a connection that had stopped answering.
  • Cost badge on every plan node of a query ending in LIMIT, where the share it reads could exceed 100%. (#2633)
  • Green "low cost" badge on plans that report no cost at all, such as SQLite and ClickHouse. (#2633)
  • Empty Cost, Rows and Actual Time columns in the EXPLAIN tree for engines that report none of them. (#2633)
  • Workers Launched: 0 missing from a plan node's details while Workers Planned was shown. (#2633)
  • MySQL plans pricing the wrapper query block above every table it contains. (#2633)
  • SQL IN, AND, OR, NOT, BY and ON in the editor's plain text colour. (#2634)
  • SQL built-in type names, ASC, DESC and function calls unhighlighted in the editor.
  • SQL numbers, TRUE, FALSE and NULL in the string colour.
  • No syntax highlighting at all in the MongoDB and Elasticsearch query editors.
  • JavaScript locals and tags queries that failed to compile against the bundled parser.
  • JSON true, false and null unhighlighted in the row inspector and the JSON viewer.
  • Operator and Function theme colours with no effect on the editor.
  • MCP access prompt with no setting to turn it off, and hidden entirely with AI features off. (#2640)
  • MCP access prompt discarding an answer given more than 30 seconds after it appeared. (#2640)
  • MCP access prompt returning every 30 minutes, and after each rotation of the bundled bridge's credential. (#2640)
  • Repeated MCP access prompts when a client retried a call the user had just denied. (#2640)
  • Destructive-operation consent reaching an elicitation-capable MCP client as an internal error instead of a prompt.
  • ai_policy in list_connections reporting askEachTime whatever the app-wide default was.
  • Quote menu in the CSV export options untranslated in every localized build. (#2534)
  • Line feed instead of the chosen line ending on the table comment of a multi-table CSV export. (#2534)
  • Indexes missing from an SQL export on SQLite, LibSQL, Cloudflare D1, SQL Server, Oracle, Dameng and Cassandra. (#2492)
  • DuckDB expression index exported as invalid SQL. (#2492)
  • DuckDB index whose name contains "primary" reported as the table's primary key and left out of its DDL. (#2492)
  • PostgreSQL index left out of an export when a check constraint on the same table shared its name. (#2492)
  • PostgreSQL materialized view exported as a CREATE TABLE. (#2492)
  • DROP TYPE and DROP SEQUENCE in an SQL export with Drop unticked. (#2492)
  • Oracle and ClickHouse views exported as a bare SELECT with no CREATE VIEW. (#2492)
  • Bare ; written for an object whose definition the server would not return. (#2492)
  • SQL Server reporting every index as clustered. (#2492)
  • Unique constraints missing from a SQL Server, Oracle and Dameng CREATE TABLE in an SQL export. (#2492)
  • ClickHouse materialized view exported as an ordinary view. (#2492)
  • Backup Dump and Restore Dump unusable on SQLite, with an empty database list and a dimmed confirm button. (#2485)
  • libSQL backup writing an empty 52-byte file and reporting success. (#2485)
  • Restore Dump asking every engine for a file pg_dump wrote. (#2485)
  • Cancel doing nothing while a backup's size estimate ran. (#2485)
  • Backup size estimate queueing behind a query tab's own work and joining its open transaction. (#2485)
  • A narrowed PostgreSQL dump matching nothing when a table name held a capital, a dot or a wildcard. (#2485)
  • Redis and Valkey ACL users without permission to run PING refused at connect and dropped by the health check.
  • Redis database index ignoring the dbN spelling the driver itself publishes.
  • A Sentinel that rejected the credentials reported as unreachable.
  • A failed Redis reconnect leaving the connection marked live, with every later command reporting it as not connected.

Security

  • Redis and Valkey connections signing in as the default user when a username was typed with an empty password.
  • Redis connections on iOS reported as successful without a single command reaching the server.

Don't miss a new TablePro release

NewReleases is sending notifications on new releases.