Skip to content

Commit 6f2e6e6

Browse files
authored
Merge branch 'main' into feat/filter-by-cell-value
Signed-off-by: Ngô Quốc Đạt <datlechin@gmail.com>
2 parents 18cc5e7 + 044042e commit 6f2e6e6

612 files changed

Lines changed: 47442 additions & 7572 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/plugin-registry.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@
136136
"bundleId": "com.TablePro.DynamoDBDriverPlugin",
137137
"bundled": false,
138138
"displayName": "DynamoDB Driver",
139-
"summary": "Amazon DynamoDB driver with PartiQL queries and AWS IAM/Profile/SSO authentication",
139+
"summary": "Amazon DynamoDB: index-aware browsing, typed editing, PartiQL, the DynamoDB API and table management",
140140
"databaseTypeIds": [
141141
"DynamoDB"
142142
],

‎.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: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,23 @@ 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+
- DynamoDB reads that query the table, a local index or a global index when the grid's filters allow it.
42+
- Create Table form for DynamoDB: keys, capacity, table class, deletion protection and secondary indexes.
43+
- DynamoDB API requests in the editor, such as `CreateTable {…}`, `UpdateTimeToLive {…}` and `BatchWriteItem {…}`.
44+
- DynamoDB point-in-time recovery, deletion protection, stream, class and billing under **Maintenance**.
45+
- Adding and dropping a DynamoDB global secondary index from the **Structure** tab.
46+
- Nested DynamoDB attribute paths in the filter bar and autocomplete.
47+
- **DynamoDB Local (no credentials)** auth method.
48+
- Items read and read units for a DynamoDB browse in the result status bar.
49+
- Tables from every schema in Open Quickly and the sidebar filter, and `schema.table` searches in both. (#3048)
4150
- Recent-tab switching on Control-Tab, with a list of the window's tabs while Control is held. (#2524)
4251
- **Extensions** for SQLite and local libSQL connections, loading sqlite-vec, SpatiaLite and other libraries on connect. (#2502)
4352
- **Filter** in a data grid cell's context menu, for narrowing a table to rows sharing that cell's value. (#3066)
53+
- Version history for saved queries, with **Restore This Version**. (#2505)
54+
- Git status letters, history and **Discard Changes…** for files in a linked SQL folder. (#2505)
55+
- Whether a materialized view can be refreshed concurrently, on its **Indexes** tab. (#2522)
56+
- Invalid PostgreSQL indexes named on the table's **Indexes** tab.
57+
- Expression keys typed into an index's **Columns** cell, such as `lower(email)`.
4458

4559
### Changed
4660

@@ -62,8 +76,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6276
- Middle-dot separators dropped from the CSV inspector's status bar and the query history rows.
6377
- Connection marked with a tinted symbol rather than a color dot in the query history rows.
6478
- Safe Mode list offering only the levels a connection allows, with the reason under it and in the toolbar tooltip.
79+
- DynamoDB maps, lists and sets shown as plain JSON and edited in the JSON editor.
80+
- DynamoDB column types named as the AWS console names them: String, Number, Map, String Set.
81+
- DynamoDB region taken from the AWS profile when the connection names none.
82+
- DynamoDB table counts left to **Count Exactly**, with no automatic full-table count.
83+
- DynamoDB table DDL shown as the `CreateTable` request that recreates it.
84+
- Plain HTTP DynamoDB endpoint refused for any host but this Mac, instead of switched to HTTPS.
85+
- ClickHouse materialized views read-only in the data grid, as on every other engine.
6586
- **Show Previous Window Tab** and **Show Next Window Tab** for window tabs, with no default shortcut.
6687
- SQLite 3.53.4 built into the SQLite and libSQL drivers in place of the macOS copy.
88+
- One-time reset of Open Quickly's Recent query history, and of its objects on connections that switch databases.
89+
- Other-schema tables for Open Quickly and the sidebar filter read in one query on SQL Server.
90+
- Other-schema tables for Open Quickly and the sidebar filter read in one query on DuckDB files.
91+
- Tables and views from every schema in the MCP `search_schema` tool when no schema is named. (#3048)
92+
- Sidebar filter on Oracle, Snowflake and BigQuery matching procedures, triggers and types only in schemas already read.
6793

6894
### Removed
6995

@@ -75,21 +101,54 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
75101

76102
### Fixed
77103

104+
- Autocomplete offering another schema's tables without their schema once that schema was completed or expanded.
105+
- Stale column and MongoDB field suggestions when a refresh ran while they were loading.
106+
- Tables in an expanded Oracle or Snowflake schema missing from Open Quickly until the next refresh.
107+
- Tables from the previous database listed under a schema after switching database on Snowflake or Trino.
108+
- Hundreds of catalog queries from one keystroke in the sidebar filter on Oracle, Snowflake and BigQuery.
109+
- Every schema a search had opened read again after each commit on Oracle, Snowflake and BigQuery.
110+
- Schemas missing from Open Quickly on every reopen after one failed to load.
111+
- Unexpanded schemas hidden by the sidebar filter in the Tree layout.
112+
- Empty object sections opened as "No items" under every match while filtering the sidebar tree.
113+
- **Drop View** offered in Recent for a sequence or materialized view opened from Open Quickly.
114+
- Column default of NULL shown as Empty on MySQL and MariaDB, and a NULL default that never stuck. (#3058)
115+
- String column defaults misread on MariaDB 10.2.7 and later, and expression defaults on MariaDB 10.2.1 to 10.2.6.
116+
- `ERROR 1064` editing a MySQL 8 column whose expression default holds a quoted string.
117+
- `ERROR 1067` saving a column made NOT NULL while its default was NULL.
118+
- NULL default on a MySQL `TEXT`, `BLOB`, `JSON` or `GEOMETRY` column saved as the expression `(NULL)`.
119+
- Backslashes and line breaks mangled in MySQL defaults, comments, enum values and passwords under `NO_BACKSLASH_ESCAPES`.
120+
- Form feed in a MySQL comment, default or SQL export saved as the letter `f`.
121+
- Saved query from iCloud dropped for good when a query on this Mac held its keyword.
78122
- Unresponsive app and a dropped keystroke when typing in the row inspector's JSON field. (#3051)
79123
- Raw Oracle driver error in the schema switch failure dialog. (#3053)
80124
- Oracle health check closing a connection a statement was still running on. (#3053)
125+
- Oracle column defaults missing from the Structure tab.
126+
- ORA-01442 when changing the default or type of a `NOT NULL` Oracle column.
127+
- Oracle `VARCHAR2(n CHAR)` column turned into a byte length when only its nullability was edited.
81128
- Global saved query inside a folder missing from every other connection. (#3045)
129+
- Edit Metadata deleting a linked SQL file's other `-- @key: value` header lines.
82130
- Saved query and folder drawn nowhere when the folder holding it was gone.
83131
- Keyword accepted for a global saved query while another connection already held it.
132+
- 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.
84133
- Cleared keyword, folder or **Global** on a saved query or its folder never reaching another device.
85134
- Renaming a folder putting back the scope another window had just set.
135+
- No changed-on-disk notice for an SQL file outside a linked folder or replaced by an older copy, and Save overwriting it.
86136
- Saved queries and their folders deleted at launch when their connection had not arrived from iCloud.
87137
- Saved queries left naming a deleted folder on other devices after that folder was deleted.
138+
- Unresponsive app when saving over a large SQL file that changed on disk.
88139
- A keyword two linked SQL files both declared reaching a different file on each launch.
89140
- A keyword a saved query shared with a global one reaching either query, depending on the connection.
141+
- Silent failure moving a linked SQL file to the Trash, and an open tab recreating a deleted file on save.
90142
- AI chat's saved query mentions missing a query saved earlier in the same session.
91143
- **File > Import > Import Data…** importing every file as SQL. (#3047)
144+
- Saved query longer than 500,000 characters silently cut short when saved.
92145
- A file the import panel dimmed still opening, and reaching the wrong importer.
146+
- Materialized view opened from Open Quickly edited as a plain view. (#2522)
147+
- Materialized view rows editable in the data grid, then refused at Save.
148+
- Index edits refused on a PGlite materialized view.
149+
- Structure grid and inspector taking edits the object or engine refuses, such as a materialized view's Type.
150+
- **Delete** and **Duplicate** in a structure row's menu doing nothing on an object that refuses them.
151+
- **New Trigger** offered on a materialized view.
93152
- Compressed dump named `.GZ` rather than `.gz` reaching the parser still compressed.
94153
- **SQL** offered as an import format on MongoDB.
95154
- **Save** permanently dim on a Custom provider for an OpenAI-compatible server that wants no API key.
@@ -291,6 +350,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
291350
- Saved Compare & Sync scripts that SQL*Plus, DISQL, the mysql client or SQL Server tools could not run.
292351
- Oracle, Dameng and MySQL SQL dumps whose routines and triggers the engine's own client could not restore.
293352
- Compare & Sync showing an Oracle unit missing the `;` after its `END` as identical.
353+
- Compare & Sync scripting a `DROP` with no `CREATE` for a view, routine or trigger whose definition it could not read.
354+
- Compare & Sync offering to drop every target procedure, function or trigger when the source's list could not be read.
355+
- DuckDB macro dropped and not recreated by a Compare & Sync replace.
356+
- Copy To giving no reason for a view, routine or trigger whose definition could not be read.
357+
- Copy To skipping a view, routine or trigger with a comment above its `CREATE`.
358+
- Materialized view indexes ignored by Compare & Sync, and lost when it or Copy To recreated the view.
294359
- SSH jump hosts dropped from a connection synced to iPhone and iPad, and that connection then skipped on the way back.
295360
- An SSH tunnel pinned to port 22, and its auth method read back as Password, after a round trip through iPhone and iPad.
296361
- Redis database list failing on servers that refuse `CONFIG` or `INFO`, such as AWS ElastiCache and Azure Cache for Redis. (#3036)
@@ -327,9 +392,45 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
327392
- Destination folder and the first database reading as one path in the backup result sheet. (#3046)
328393
- Only the last line of a failed backup's error shown, which on `pg_dump` is the hint rather than the cause.
329394
- Backup failure reported as an exit code alone when the tool wrote its message and exited at once.
395+
- DynamoDB edits saving numbers, booleans, maps and sets as strings.
396+
- DynamoDB binary, map and long-text edits lost or saved as a fragment, and **Set NULL** leaving a NULL attribute.
397+
- Duplicated DynamoDB row saved with `__DEFAULT__` as its key.
398+
- Nine DynamoDB filter operators matching nothing, and an OR filter dropping other partitions' items.
399+
- DynamoDB column sort ignored, and each page re-reading every page before it.
400+
- DynamoDB **Count Exactly** never finishing.
401+
- DynamoDB export dropping attributes first seen after the first page.
402+
- DynamoDB PartiQL result cut to its first 1 MB.
403+
- DynamoDB **Stop** cancelling the wrong request, and throttled requests failing instead of retrying.
404+
- AWS SSO sign-in prompt never shown for DynamoDB.
405+
- DynamoDB connections to China and European Sovereign Cloud regions failing.
406+
- DynamoDB connection sampling every table on connect.
407+
- Imported DynamoDB connection losing its AWS Region.
408+
- Failed **Count Exactly** showing no error.
409+
- PostgreSQL export and column reorder script failing on an index a failed `CREATE INDEX CONCURRENTLY` left behind.
410+
- PostgreSQL export and column reorder script failing on a foreign key that references a unique index.
411+
- PostgreSQL exclusion constraints missing from exports and the DDL tab.
412+
- PostgreSQL column reorder script dropping an index named like one of the table's check constraints.
413+
- Invalid PostgreSQL index recreated on the target by Compare & Sync and **Copy To**.
414+
- Expression key parts missing from SQLite, libSQL, Cloudflare D1, MySQL and DuckDB indexes.
415+
- Condition missing from SQLite, libSQL and Cloudflare D1 partial indexes.
416+
- Descending MySQL index keys recreated ascending by a rename.
417+
- MySQL index dropped when the index replacing it failed to create.
418+
- Indent and Outdent named the wrong way round for Command-[ and Command-] in Settings > Keyboard.
419+
- Table, routine or type missing from the sidebar or Open Quickly when a period in its quoted name matched another's.
330420
- Show Previous Tab and Show Next Tab listed twice in the Window menu.
331421
- Control-Tab and Control-Shift-Tab indenting a multi-line selection in the SQL editor.
332422
- Shift-Tab and Control-Tab accepting an inline AI suggestion instead of outdenting or reaching the menu.
423+
- Closing a background tab with unsaved work landing on its neighbour instead of the tab you were on.
424+
- Show Previous Tab, Show Next Tab and Select Tab 1 to 9 enabled in Agent mode and with no tab to go to.
425+
- Row data of a window's first connection kept in memory after switching to another connection.
426+
- Query picked from Open Quickly's Recent list dropping out of it once the query ran again.
427+
- Table opened in one database shown in Open Quickly's Recent in every other database, and opened there.
428+
- Open Quickly's Recent split between the Connections scope and the other scopes, each showing about half.
429+
- MySQL and MariaDB column defaults on iPhone and iPad missing for DEFAULT NULL, and string defaults shown unquoted.
430+
- Structure and Create Table SQL Preview disagreeing with Save on the schema, primary key name or a SQLite foreign key.
431+
- Row import creating its new table in another schema than its rows, and PGlite primary key changes failing to save.
432+
- PostgreSQL materialized views missing on iPhone and iPad, and wrong index columns, types and predicates in Structure.
433+
- Truncate and Drop Table offered on PostgreSQL foreign tables on iPhone and iPad.
333434

334435
### Security
335436

@@ -338,6 +439,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
338439
- A locked launch on iPhone and iPad connecting to the last session, and asking to trust a host key, before Face ID was answered.
339440
- Code inside a plugin bundle, and its resource envelope, were not verified before the bundle was loaded.
340441
- The system log carried query text, schema and table names, file paths and driver error messages, which can hold row values.
442+
- Driver error messages and server replies published in the system log by database plugins.
341443
- A chat tool registered at runtime could take the name of a tool TablePro ships.
342444
- An open connection, a sheet and the app switcher preview left usable or visible behind the iOS app lock.
343445
- **Require Face ID** turned off on iPhone and iPad without authenticating.

‎Packages/TableProCore/Package.swift‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ 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"]),
@@ -45,6 +46,11 @@ let package = Package(
4546
dependencies: [],
4647
path: "Sources/TableProDocumentPath"
4748
),
49+
.target(
50+
name: "TableProLogRedaction",
51+
dependencies: [],
52+
path: "Sources/TableProLogRedaction"
53+
),
4854
.target(
4955
name: "TableProCoreTypes",
5056
dependencies: [],
@@ -185,6 +191,11 @@ let package = Package(
185191
dependencies: ["TableProDocumentPath"],
186192
path: "Tests/TableProDocumentPathTests"
187193
),
194+
.testTarget(
195+
name: "TableProLogRedactionTests",
196+
dependencies: ["TableProLogRedaction"],
197+
path: "Tests/TableProLogRedactionTests"
198+
),
188199
.testTarget(
189200
name: "TableProModelsTests",
190201
dependencies: ["TableProModels", "TableProPluginKit"],

0 commit comments

Comments
 (0)