Problem
The SQLite provider service split migration derives new row_id values with a 32-bit hash and inserts copied rows with INSERT OR IGNORE.
Two distinct connection names, ypw3e5cb and al4jix0b, produce the same generated ID when migrated for the same tenant, owner, subject, and target integration:
SQLite accepts the first row and silently ignores the second, then the migration deletes both source rows and records completion. The same generated-ID helper is used for blobs, integrations, connections, operation storage, tools, and policies.
Reproduction
- Seed a Google monolith integration with connections named
ypw3e5cb and al4jix0b.
- Run the provider service split migration.
- Query the migrated Google connections.
Expected: both distinct connections are present.
Actual: only al4jix0b remains. The source rows have already been deleted.
Expected behavior
- Distinct logical rows receive deterministic, collision-resistant IDs.
- Replaying an existing logical row remains an idempotent no-op.
- An unrelated primary-key conflict fails and rolls back the tenant migration.
- A failed migration preserves the source rows for a safe retry.
Problem
The SQLite provider service split migration derives new
row_idvalues with a 32-bit hash and inserts copied rows withINSERT OR IGNORE.Two distinct connection names,
ypw3e5cbandal4jix0b, produce the same generated ID when migrated for the same tenant, owner, subject, and target integration:SQLite accepts the first row and silently ignores the second, then the migration deletes both source rows and records completion. The same generated-ID helper is used for blobs, integrations, connections, operation storage, tools, and policies.
Reproduction
ypw3e5cbandal4jix0b.Expected: both distinct connections are present.
Actual: only
al4jix0bremains. The source rows have already been deleted.Expected behavior