Added
- DuckDB database support — connect to
.duckdbfiles, query CSV/Parquet/JSON files via SQL, schema navigation, and DuckDB extension management - MongoDB configurable auth database (
authSource) — authenticate against any database instead of hardcodedadmin
Fixed
- MongoDB Read Preference, Write Concern, and Redis Database not persisted across app restarts
- Result truncation at 100K rows now reported to UI via
PluginQueryResult.isTruncatedinstead of being silently discarded - DELETE and UPDATE queries using all columns in WHERE clause instead of just the primary key for PostgreSQL, Redshift, MSSQL, and ClickHouse
- SSL/TLS always being enabled for MongoDB, Redis, and ClickHouse connections due to case mismatch in SSL mode string comparison (#249)
- Redis sidebar click showing data briefly then going empty due to double-navigation race condition (#251)
- MongoDB showing "Invalid database name: ''" when connecting without a database name
Changed
- Namespaced
disabledPluginsUserDefaults key tocom.TablePro.disabledPluginswith automatic migration - Removed unused plugin capability types (sqlDialect, aiProvider, cellRenderer, sidebarPanel)
- SQLite driver extracted from built-in bundle to downloadable plugin, reducing app size
- Unified error formatting across all database drivers via default
PluginDriverError.errorDescription, removing 10 per-driver implementations - Standardized async bridging: 5 queue-based drivers (MySQL, PostgreSQL, MongoDB, Redis, MSSQL) now use shared
pluginDispatchAsynchelper - Added localization to remaining driver error messages (MySQL, PostgreSQL, ClickHouse, Oracle, Redis, MongoDB)
- NoSQL query building moved from Core to MongoDB/Redis plugins via optional
PluginDatabaseDriverprotocol methods - Standardized parameter binding across all database drivers with improved default escaping (type-aware numeric handling, NUL byte stripping, NULL literal support)
Added
- Open SQLite database files directly from Finder by double-clicking
.sqlite,.sqlite3,.db3,.s3db,.sl3, and.sqlitedbfiles (#262) - Export plugin options (CSV, XLSX, JSON, SQL, MQL) now persist across app restarts
- Plugins can declare settings views rendered in Settings > Plugins
- True prepared statements for MSSQL (
sp_executesql) and ClickHouse (HTTP query parameters), eliminating string interpolation for parameterized queries - Batch query operations for MSSQL, Oracle, and ClickHouse, eliminating N+1 query patterns for column, foreign key, and database metadata fetching; SQLite adds a batched
fetchAllForeignKeysoverride within PRAGMA limitations PluginDriverErrorprotocol in TableProPluginKit for structured error reporting from driver plugins, with richer connection error messages showing error codes and SQL statespluginDispatchAsyncconcurrency helper in TableProPluginKit for standardized async bridging in plugins- Shared
PluginRowLimitsconstant in TableProPluginKit with 100K row default, enforced across all 8 driver plugins (ClickHouse, MSSQL, Oracle previously had no cap) driverVariant(for:)method onDriverPluginprotocol for dynamic multi-type plugin dispatch, replacing hardcoded variant mapping- Safe mode levels: per-connection setting with 6 levels (Silent, Alert, Alert Full, Safe Mode, Safe Mode Full, Read-Only) replacing the boolean read-only toggle, with confirmation dialogs and Touch ID/password authentication for stricter levels
- Preview tabs: single-click opens a temporary preview tab, double-click or editing promotes it to a permanent tab
- Import plugin system: SQL import extracted into a
.tablepluginbundle, matching the export plugin architecture ImportFormatPluginprotocol in TableProPluginKit for building custom import format plugins- SQLImportPlugin as the first import format plugin (SQL files and .gz compressed SQL)
- Oracle and ClickHouse shipped as downloadable plugins, reducing app bundle size for most users
- Plugin install prompt when connecting to a database whose driver plugin is not installed
databaseTypeIdsfield on registry plugins for mapping registry entries to database typesbuild-plugin.shscript andbuild-plugin.ymlCI workflow for building standalone plugin releases