Skip to content

Preserve JSONB storage when syncing CloudKit records - #572

Open
mvanhorn wants to merge 1 commit into
pointfreeco:mainfrom
mvanhorn:fix/561-jsonb-cloudkit-assets
Open

mvanhorn wants to merge 1 commit into
pointfreeco:mainfrom
mvanhorn:fix/561-jsonb-cloudkit-assets

Conversation

@mvanhorn

@mvanhorn mvanhorn commented Nov 4, 2026

Copy link
Copy Markdown

Background

CloudKit sync can fail to save records containing JSONB values because SQLite receives text for a BLOB column. In strict tables, this produces a storage-type error and prevents the record from being applied.

The sync code used query bindings reconstructed from typed row values, which represent JSONB values as JSON text rather than their stored bytes. Conflict detection used the same bindings, so it also missed the BLOB hash comparison used for assets.

Summary of the fix

The sync queries now fetch raw storage values alongside the typed row and capture BLOB bytes by column name. Record uploads and merge comparisons prefer those bytes, preserving JSONB asset storage and hash comparisons. Added regression coverage for round trips, optional JSONB removal, and merges involving remote and local edits.

Verification

swift test --filter SQLiteDataTests timed out during compilation, so it provides no test result. The xcresult failure-message check produced no output in the supplied transcript; this does not establish that tests passed. The tests in Tests/SQLiteDataTests/CloudKitTests/JSONBTests.swift fail without the fix in the sqlite-data change (checked by reverting the source changes).

Fixes #561

The sync queries now fetch raw storage values alongside the typed row
and capture BLOB bytes by column name. Record uploads and merge
comparisons prefer those bytes, preserving JSONB asset storage and hash
comparisons. Added regression coverage for round trips, optional JSONB
removal, and merges involving remote and local edits.

Fixes pointfreeco#561
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SyncEngine treats JSONB as TEXT instead of BLOB

1 participant