Skip to content

Conversation

@andinux
Copy link

@andinux andinux commented Feb 12, 2026

  • fix/schema-hash
  • fix/bind-column-value-parameters-also-if-null
  • feat/sync-filter

andinux and others added 3 commits February 10, 2026 10:12
…me (lowercase), type (SQLite affinity), pk flag (#5)

Build normalized schema string using only: column name (lowercase), type (SQLite affinity), pk flag
Format: tablename:colname:affinity:pk,... (ordered by table name, then column id).
This makes the hash resilient to formatting, quoting, case differences and portable across databases.
* fix(sync): always bind column value parameters in merge_insert_col

Fix parameter binding bug in merge_insert_col that caused SQLite-to-PostgreSQL sync to fail with "there is no parameter $3" when NULL values were synced before non-NULL values for the same column.

* fix(network): fix the value of the seq variable in cloudsync_payload_get when the last db_version is not related to a local change

* test(postgres): new test for null value

* fix(postgres): ensure NULL values use consistent decoded types for SPI plan caching

When syncing NULL values first, PostgreSQL's SPI caches the prepared plan with the NULL's type. If a subsequent non-NULL value decodes to a different type, the plan fails. The fix maps column types to their decoded equivalents so NULL and non-NULL values always use consistent types (e.g., all integers use INT8OID, all floats use FLOAT8OID, most others use TEXTOID).

Add map_column_oid_to_decoded_oid() to map column types to their decoded equivalents (INT2/4/8 → INT8, FLOAT4/8/NUMERIC → FLOAT8, BYTEA → BYTEA, others → TEXT). This ensures NULL and non-NULL values bind with the same type, preventing "there is no parameter $N" errors when NULL is synced before non-NULL values for the same column.

Add tests 23 and 24 for UUID columns and comprehensive nullable type coverage (INT2/4/8, FLOAT4/8, NUMERIC, BYTEA, TEXT, VARCHAR, CHAR, UUID, JSON, JSONB, DATE, TIMESTAMP).

* fix(postgres): add bigint to boolean cast for BOOLEAN column sync

BOOLEAN values are encoded as INT8 in sync payloads for SQLite interoperability, but PostgreSQL has no built-in cast from bigint to boolean. Add a custom ASSIGNMENT cast that enables BOOLEAN columns to sync correctly.

The cast uses ASSIGNMENT context (not IMPLICIT) to avoid unintended conversions in WHERE clauses while still enabling INSERT/UPDATE operations used by merge_insert.

The write direction (BOOL → INT encoding flow) "just works" because DatumGetBool() naturally returns 0 or 1. The problem was only on the read side where PostgreSQL refused to cast the decoded INT8 back to BOOLEAN without our custom cast.

* feat(commands): add sync roundtrip RLS test guide

* bump version

* ci: add postgres-test job to main workflow

* ci(Makefile.postgresql): replaced all docker-compose commands with docker compose (v2 plugin syntax)

Fix the execution in the github actions runner: The GitHub Actions runner has docker compose (v2 plugin) but not the standalone docker-compose (v1)

* ci: fix the "run postgresql tests" step
…sion is satisfied (#7)

* Added the ability to perform a perform a sync only if a column expression is satisfied

---------

Co-authored-by: Marco Bambini <marco@creolabs.com>
@andinux andinux merged commit 5ba27a7 into main Feb 12, 2026
17 checks passed
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.

1 participant