Files
synapse/rust
Erik JohnstonandClaude Opus 4.8 9924852b1a Support bytearray parameters and tid columns in the Rust value mapping
Two value-mapping gaps surfaced by the storage suite on the Rust backend:

  - `bytearray` parameters. Synapse deliberately passes binary data as
    `bytearray` (the psycopg2 engine disables the `bytes` adapter to catch
    accidental text-as-bytes bugs), but the shim only accepted `bytes`, so
    binary background-update parameters raised `TypeError`. Accept `bytearray`
    as a BYTEA parameter too.

  - `tid` columns. The receipts-dedup background update selects a row's `ctid`
    and then compares against it (`WHERE ctid != ?`). psycopg2 renders `tid` as
    a `(block,offset)` string and accepts that string back; the shim had no
    `tid` support at all. Decode `tid` to that same string (three big-endian
    u16s: the block number's halves, then the offset — matching the server's
    `tidsend`) and encode the string back to the wire form when it is bound as a
    parameter.

Both directions are covered for the Python (`PythonPgFromSql`) and the
Rust-native (`DbValueFromSql`) decoders and the `ToSql` encoder, and `tid` is
added to the shared `accepts_column_type` set.

Fixes tests.storage.test_user_filters.test_bg_migration and
tests.storage.databases.main.test_receipts's linearized-unique-index background
update on the Rust backend.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W3G4M92AmwSSZCbmtMJU3d
2026-07-11 09:04:57 +00:00
..