Skip to content

Commit 6f9a058

Browse files
committed
Merge remote-tracking branch 'origin/main' into feat/expression-index-keys
2 parents a383a78 + 0d2ad17 commit 6f9a058

523 files changed

Lines changed: 45990 additions & 3287 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/repo-hygiene.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ on:
2121
- "project.yml"
2222
- "TablePro.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved"
2323
- "TablePro/Resources/ThirdPartyLicenses/licenses.yml"
24+
- ".swiftlint.yml"
2425
push:
2526
branches: [main]
2627
paths:
@@ -36,6 +37,7 @@ on:
3637
- "project.yml"
3738
- "TablePro.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved"
3839
- "TablePro/Resources/ThirdPartyLicenses/licenses.yml"
40+
- ".swiftlint.yml"
3941
workflow_dispatch:
4042

4143
concurrency:
@@ -106,6 +108,16 @@ jobs:
106108
- name: Check plugin sources that log import the module that defines it
107109
run: python3 scripts/ci/check-plugin-os-import.py
108110

111+
# SwiftLint runs in CI only on a release tag, and its included: never reaches Plugins/,
112+
# where fifteen log lines published an error's text unseen. This applies that one rule to
113+
# the app, the packages and the plugins on every pull request, with the regex read from
114+
# .swiftlint.yml.
115+
- name: Check no source publishes an error's text to the system log
116+
run: python3 scripts/ci/check-log-privacy.py
117+
118+
- name: Validate the log privacy check
119+
run: python3 scripts/ci/test_check_log_privacy.py
120+
109121
# A plugin's String(localized:) resolves against Bundle.main, which is the host app, so its
110122
# strings live in the app's catalog. Xcode extracts per target and the plugin targets are not
111123
# the app target, so nothing puts them there: 537 strings had never reached a translator.

.swiftlint.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,6 @@ custom_rules:
196196
severity: error
197197
public_error_text_in_log:
198198
name: "Error Text In The System Log"
199-
regex: '\.localizedDescription\s*,\s*privacy:\s*\.public'
200-
message: "A driver or Foundation error's text carries row values, paths and server messages. Publish `error.publicLogShape` and log the description at .private."
199+
regex: '(\.(localizedDescription|errorDescription|failureReason)(\.prefix\(\d+\))?(\s*\?\?\s*"[^"]*")?|String\(describing:\s*\w*[eE]rr(or)?\)|\\\((?!(has|is|did|was|should)[A-Z])(\w*[eE]rr(or)?|e)(\.(message|description|debugDescription))?)\s*,\s*privacy:\s*\.public'
200+
message: "A driver or Foundation error's text carries row values, paths and server messages. Publish `error.publicLogShape`, or `LogRedaction.publicDescription(of: error)` in a plugin, and log the description at .private."
201201
severity: error

CHANGELOG.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3838
- **File > Session**, with the agent session commands and the assistant's conversation commands.
3939
- Eight more rebindable commands in **Settings > Keyboard**, among them the sidebar's lists and the session commands.
4040
- **Global** on a saved query folder's menu, for a folder every connection shows.
41+
- Tables from every schema in Open Quickly and the sidebar filter, and `schema.table` searches in both. (#3048)
42+
- Recent-tab switching on Control-Tab, with a list of the window's tabs while Control is held. (#2524)
43+
- **Extensions** for SQLite and local libSQL connections, loading sqlite-vec, SpatiaLite and other libraries on connect. (#2502)
44+
- Version history for saved queries, with **Restore This Version**. (#2505)
45+
- Git status letters, history and **Discard Changes…** for files in a linked SQL folder. (#2505)
4146
- Whether a materialized view can be refreshed concurrently, on its **Indexes** tab. (#2522)
4247
- Invalid PostgreSQL indexes named on the table's **Indexes** tab.
4348
- Expression keys typed into an index's **Columns** cell, such as `lower(email)`.
@@ -62,6 +67,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6267
- Middle-dot separators dropped from the CSV inspector's status bar and the query history rows.
6368
- Connection marked with a tinted symbol rather than a color dot in the query history rows.
6469
- Safe Mode list offering only the levels a connection allows, with the reason under it and in the toolbar tooltip.
70+
- ClickHouse materialized views read-only in the data grid, as on every other engine.
71+
- **Show Previous Window Tab** and **Show Next Window Tab** for window tabs, with no default shortcut.
72+
- SQLite 3.53.4 built into the SQLite and libSQL drivers in place of the macOS copy.
73+
- One-time reset of Open Quickly's Recent query history, and of its objects on connections that switch databases.
74+
- Other-schema tables for Open Quickly and the sidebar filter read in one query on SQL Server.
75+
- Other-schema tables for Open Quickly and the sidebar filter read in one query on DuckDB files.
76+
- Tables and views from every schema in the MCP `search_schema` tool when no schema is named. (#3048)
6577

6678
### Removed
6779

@@ -73,22 +85,48 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7385

7486
### Fixed
7587

88+
- Autocomplete offering another schema's tables without their schema once that schema was completed or expanded.
89+
- Stale column and MongoDB field suggestions when a refresh ran while they were loading.
90+
- Tables in an expanded Oracle or Snowflake schema missing from Open Quickly until the next refresh.
91+
- Tables from the previous database listed under a schema after switching database on Snowflake or Trino.
92+
- Schemas missing from Open Quickly on every reopen after one failed to load.
93+
- Unexpanded schemas hidden by the sidebar filter in the Tree layout.
94+
- Empty object sections opened as "No items" under every match while filtering the sidebar tree.
95+
- **Drop View** offered in Recent for a sequence or materialized view opened from Open Quickly.
96+
- Column default of NULL shown as Empty on MySQL and MariaDB, and a NULL default that never stuck. (#3058)
97+
- String column defaults misread on MariaDB 10.2.7 and later, and expression defaults on MariaDB 10.2.1 to 10.2.6.
98+
- `ERROR 1064` editing a MySQL 8 column whose expression default holds a quoted string.
99+
- `ERROR 1067` saving a column made NOT NULL while its default was NULL.
100+
- NULL default on a MySQL `TEXT`, `BLOB`, `JSON` or `GEOMETRY` column saved as the expression `(NULL)`.
101+
- Backslashes and line breaks mangled in MySQL defaults, comments, enum values and passwords under `NO_BACKSLASH_ESCAPES`.
102+
- Form feed in a MySQL comment, default or SQL export saved as the letter `f`.
103+
- Saved query from iCloud dropped for good when a query on this Mac held its keyword.
76104
- Unresponsive app and a dropped keystroke when typing in the row inspector's JSON field. (#3051)
77105
- Raw Oracle driver error in the schema switch failure dialog. (#3053)
78106
- Oracle health check closing a connection a statement was still running on. (#3053)
107+
- Oracle column defaults missing from the Structure tab.
108+
- ORA-01442 when changing the default or type of a `NOT NULL` Oracle column.
109+
- Oracle `VARCHAR2(n CHAR)` column turned into a byte length when only its nullability was edited.
79110
- Global saved query inside a folder missing from every other connection. (#3045)
111+
- Edit Metadata deleting a linked SQL file's other `-- @key: value` header lines.
80112
- Saved query and folder drawn nowhere when the folder holding it was gone.
81113
- Keyword accepted for a global saved query while another connection already held it.
114+
- Garbled name and ISO-8859-1 label on a UTF-8, UTF-16 or UTF-32 linked SQL file, and garbled big-endian UTF-32 files.
82115
- Cleared keyword, folder or **Global** on a saved query or its folder never reaching another device.
83116
- Renaming a folder putting back the scope another window had just set.
117+
- No changed-on-disk notice for an SQL file outside a linked folder or replaced by an older copy, and Save overwriting it.
84118
- Saved queries and their folders deleted at launch when their connection had not arrived from iCloud.
85119
- Saved queries left naming a deleted folder on other devices after that folder was deleted.
120+
- Unresponsive app when saving over a large SQL file that changed on disk.
86121
- A keyword two linked SQL files both declared reaching a different file on each launch.
87122
- A keyword a saved query shared with a global one reaching either query, depending on the connection.
123+
- Silent failure moving a linked SQL file to the Trash, and an open tab recreating a deleted file on save.
88124
- AI chat's saved query mentions missing a query saved earlier in the same session.
89125
- **File > Import > Import Data…** importing every file as SQL. (#3047)
126+
- Saved query longer than 500,000 characters silently cut short when saved.
90127
- A file the import panel dimmed still opening, and reaching the wrong importer.
91128
- Materialized view opened from Open Quickly edited as a plain view. (#2522)
129+
- Materialized view rows editable in the data grid, then refused at Save.
92130
- Index edits refused on a PGlite materialized view.
93131
- Structure grid and inspector taking edits the object or engine refuses, such as a materialized view's Type.
94132
- **Delete** and **Duplicate** in a structure row's menu doing nothing on an object that refuses them.
@@ -293,6 +331,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
293331
- Saved Compare & Sync scripts that SQL*Plus, DISQL, the mysql client or SQL Server tools could not run.
294332
- Oracle, Dameng and MySQL SQL dumps whose routines and triggers the engine's own client could not restore.
295333
- Compare & Sync showing an Oracle unit missing the `;` after its `END` as identical.
334+
- Compare & Sync scripting a `DROP` with no `CREATE` for a view, routine or trigger whose definition it could not read.
335+
- Compare & Sync offering to drop every target procedure, function or trigger when the source's list could not be read.
336+
- DuckDB macro dropped and not recreated by a Compare & Sync replace.
337+
- Copy To giving no reason for a view, routine or trigger whose definition could not be read.
338+
- Copy To skipping a view, routine or trigger with a comment above its `CREATE`.
339+
- Materialized view indexes ignored by Compare & Sync, and lost when it or Copy To recreated the view.
296340
- SSH jump hosts dropped from a connection synced to iPhone and iPad, and that connection then skipped on the way back.
297341
- An SSH tunnel pinned to port 22, and its auth method read back as Password, after a round trip through iPhone and iPad.
298342
- Redis database list failing on servers that refuse `CONFIG` or `INFO`, such as AWS ElastiCache and Azure Cache for Redis. (#3036)
@@ -338,6 +382,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
338382
- Condition missing from SQLite, libSQL and Cloudflare D1 partial indexes.
339383
- Descending MySQL index keys recreated ascending by a rename.
340384
- MySQL index dropped when the index replacing it failed to create.
385+
- Indent and Outdent named the wrong way round for Command-[ and Command-] in Settings > Keyboard.
386+
- Table, routine or type missing from the sidebar or Open Quickly when a period in its quoted name matched another's.
387+
- Show Previous Tab and Show Next Tab listed twice in the Window menu.
388+
- Control-Tab and Control-Shift-Tab indenting a multi-line selection in the SQL editor.
389+
- Shift-Tab and Control-Tab accepting an inline AI suggestion instead of outdenting or reaching the menu.
390+
- Closing a background tab with unsaved work landing on its neighbour instead of the tab you were on.
391+
- Show Previous Tab, Show Next Tab and Select Tab 1 to 9 enabled in Agent mode and with no tab to go to.
392+
- Row data of a window's first connection kept in memory after switching to another connection.
393+
- Query picked from Open Quickly's Recent list dropping out of it once the query ran again.
394+
- Table opened in one database shown in Open Quickly's Recent in every other database, and opened there.
395+
- Open Quickly's Recent split between the Connections scope and the other scopes, each showing about half.
396+
- MySQL and MariaDB column defaults on iPhone and iPad missing for DEFAULT NULL, and string defaults shown unquoted.
397+
- Structure and Create Table SQL Preview disagreeing with Save on the schema, primary key name or a SQLite foreign key.
398+
- Row import creating its new table in another schema than its rows, and PGlite primary key changes failing to save.
399+
- PostgreSQL materialized views missing on iPhone and iPad, and wrong index columns, types and predicates in Structure.
400+
- Truncate and Drop Table offered on PostgreSQL foreign tables on iPhone and iPad.
341401

342402
### Security
343403

@@ -346,6 +406,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
346406
- A locked launch on iPhone and iPad connecting to the last session, and asking to trust a host key, before Face ID was answered.
347407
- Code inside a plugin bundle, and its resource envelope, were not verified before the bundle was loaded.
348408
- The system log carried query text, schema and table names, file paths and driver error messages, which can hold row values.
409+
- Driver error messages and server replies published in the system log by database plugins.
349410
- A chat tool registered at runtime could take the name of a tool TablePro ships.
350411
- An open connection, a sheet and the app switcher preview left usable or visible behind the iOS app lock.
351412
- **Require Face ID** turned off on iPhone and iPad without authenticating.
@@ -360,6 +421,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
360421
- Statements hidden the same ways passed the one-statement check on MCP and AI chat queries.
361422
- Writes hidden in a dollar-quoted string, a nested comment or a bracketed identifier skipped Safe Mode on iPhone and iPad.
362423
- A quoted Redis command such as `"FLUSHALL"` skipping Safe Mode and the MCP destructive-statement check.
424+
- `fts3_tokenizer` reachable from SQL on a libSQL Local File connection, where it could crash the app.
363425

364426
## [0.75.0] - 2026-09-18
365427

Libs/checksums.sha256

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ a9626008dc82ad6d7d594aa0967ae18805d5ba893fe635fd752373e5f05542f1 Libs/libpgcomm
4242
96515ba6636a85a04cbc28d6d177814b8cdcdafae8fffb9b3d33dee9a5b85616 Libs/libpq_universal.a
4343
d97f65597c0b3f10e6b452578a3e2e6e44bc76c2a6a8454e21507ba0f94bdf9d Libs/libpq_x86_64.a
4444
96515ba6636a85a04cbc28d6d177814b8cdcdafae8fffb9b3d33dee9a5b85616 Libs/libpq.a
45+
12ed06908e31b7b852092edb14ad59e3cb051c947f322b304139c67b10a4ca6f Libs/libsqlite3_vendored_arm64.a
46+
3b784f0e33e2fbc25f176379455ec5de95aef8a2d5c6ed0f64188696f2b2616f Libs/libsqlite3_vendored_universal.a
47+
1d85522167161002a565ba7c2f6478a8916d89c6ac1394f31874297404fe5f1f Libs/libsqlite3_vendored_x86_64.a
48+
3b784f0e33e2fbc25f176379455ec5de95aef8a2d5c6ed0f64188696f2b2616f Libs/libsqlite3_vendored.a
4549
974af73a3b6d2794a15316c70724ea1c9b5153dfa94ea927872606851f091773 Libs/libssh2_arm64.a
4650
15d6e4bf252c258978c253f604863f0bd1a6474e2d25e27f4afb1b0ca5536332 Libs/libssh2_universal.a
4751
fa4de157849f15f494510935600f155d7ba08251336371ea471fad63366477a6 Libs/libssh2_x86_64.a

Packages/TableProCore/Package.swift

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@ let package = Package(
2727
.library(name: "TableProWeaviateCore", targets: ["TableProWeaviateCore"]),
2828
.library(name: "TableProNumberFormatting", targets: ["TableProNumberFormatting"]),
2929
.library(name: "TableProDocumentPath", targets: ["TableProDocumentPath"]),
30+
.library(name: "TableProLogRedaction", targets: ["TableProLogRedaction"]),
3031
.library(name: "TableProR2SQLCore", targets: ["TableProR2SQLCore"]),
3132
.library(name: "TableProConnectionLibrary", targets: ["TableProConnectionLibrary"]),
3233
.library(name: "TableProSQLGrammar", targets: ["TableProSQLGrammar"]),
33-
.library(name: "TableProSSHTransport", targets: ["TableProSSHTransport"])
34+
.library(name: "TableProSSHTransport", targets: ["TableProSSHTransport"]),
35+
.library(name: "CSQLite", targets: ["CSQLite"]),
36+
.library(name: "TableProSQLiteCore", targets: ["TableProSQLiteCore"])
3437
],
3538
targets: [
3639
.target(
@@ -43,6 +46,11 @@ let package = Package(
4346
dependencies: [],
4447
path: "Sources/TableProDocumentPath"
4548
),
49+
.target(
50+
name: "TableProLogRedaction",
51+
dependencies: [],
52+
path: "Sources/TableProLogRedaction"
53+
),
4654
.target(
4755
name: "TableProCoreTypes",
4856
dependencies: [],
@@ -143,6 +151,16 @@ let package = Package(
143151
dependencies: [],
144152
path: "Sources/TableProSSHTransport"
145153
),
154+
.target(
155+
name: "CSQLite",
156+
dependencies: [],
157+
path: "Sources/CSQLite"
158+
),
159+
.target(
160+
name: "TableProSQLiteCore",
161+
dependencies: ["CSQLite"],
162+
path: "Sources/TableProSQLiteCore"
163+
),
146164
.testTarget(
147165
name: "TableProConnectionLibraryTests",
148166
dependencies: ["TableProConnectionLibrary"],
@@ -173,6 +191,11 @@ let package = Package(
173191
dependencies: ["TableProDocumentPath"],
174192
path: "Tests/TableProDocumentPathTests"
175193
),
194+
.testTarget(
195+
name: "TableProLogRedactionTests",
196+
dependencies: ["TableProLogRedaction"],
197+
path: "Tests/TableProLogRedactionTests"
198+
),
176199
.testTarget(
177200
name: "TableProModelsTests",
178201
dependencies: ["TableProModels", "TableProPluginKit"],
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module CSQLite {
2+
header "sqlite3.h"
3+
header "tablepro_sqlite3.h"
4+
export *
5+
}

0 commit comments

Comments
 (0)