Skip to content

Remove Uint8Array content-based equality comparison - #1258

Closed
KyleAMathews wants to merge 2 commits into
mainfrom
claude/revert-pr-779-ROD7r
Closed

KyleAMathews wants to merge 2 commits into
mainfrom
claude/revert-pr-779-ROD7r

Conversation

@KyleAMathews

Copy link
Copy Markdown
Collaborator

🎯 Changes

This PR removes the special handling for Uint8Array and Buffer content-based equality comparisons. Previously, the codebase attempted to normalize small Uint8Arrays (≤128 bytes) to string representations to enable content-based equality checks, while using reference equality for larger arrays.

Changes made:

  1. Removed normalizeValue logic for Uint8Arrays/Buffers - Deleted the code that converted small Uint8Arrays to string representations (__u8__ prefixed strings) for Map key usage
  2. Removed areValuesEqual function - Deleted the utility function that provided special Uint8Array comparison logic
  3. Simplified eq operator - Changed from using normalizeValue and areValuesEqual to simple reference equality (===)
  4. Removed hashUint8Array function - Deleted the content-based hashing for small Uint8Arrays; all Uint8Arrays/Buffers now use reference-based hashing
  5. Updated hash function - All Uint8Arrays, Buffers, and Files now consistently use reference-based hashing via cachedReferenceHash
  6. Removed test cases - Deleted integration tests for Uint8Array ID comparison and unit tests for Uint8Array equality handling

Rationale:

The previous approach of normalizing small Uint8Arrays to strings for content-based equality was complex and had limitations. Users working with Uint8Array IDs (like ULIDs) should use a derived string key in their data model instead of relying on implicit content-based comparison. This simplification:

  • Reduces code complexity
  • Improves performance by avoiding string allocations
  • Makes equality semantics consistent (always reference-based)
  • Aligns with how other binary types (Files) are handled

✅ Checklist

  • I have followed the steps in the Contributing guide.
  • I have tested this code locally with pnpm test:pr.

🚀 Release Impact

  • This change affects published code, and I have generated a changeset.

https://claude.ai/code/session_014bN4QUhGYQpuNAy1Ec42pC

…ference" (#779)

This reverts the changes from PR #779 which added content-based
comparison for small Uint8Arrays. All Uint8Arrays/Buffers now use
reference-based hashing again. Specifically:

- Remove Uint8Array content hashing in hash.ts (all sizes use reference hash)
- Revert writeByte to private _writeByte in MurmurHashStream
- Revert eq operator to use === instead of areValuesEqual
- Revert in operator to use array.includes instead of normalizeValue
- Remove areValuesEqual, areUint8ArraysEqual, and Uint8Array normalization
  from comparison.ts (keep normalizeValue for Date handling used by joins)
- Delete uint8array-id-comparison integration test
- Update related tests to expect reference-based hashing

https://claude.ai/code/session_014bN4QUhGYQpuNAy1Ec42pC
@changeset-bot

changeset-bot Bot commented Feb 17, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 16b9630

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@pkg-pr-new

pkg-pr-new Bot commented Feb 17, 2026

Copy link
Copy Markdown
More templates

@tanstack/angular-db

npm i https://pkg.pr.new/@tanstack/angular-db@1258

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@1258

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@1258

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@1258

@tanstack/offline-transactions

npm i https://pkg.pr.new/@tanstack/offline-transactions@1258

@tanstack/powersync-db-collection

npm i https://pkg.pr.new/@tanstack/powersync-db-collection@1258

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@1258

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@1258

@tanstack/rxdb-db-collection

npm i https://pkg.pr.new/@tanstack/rxdb-db-collection@1258

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@1258

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@1258

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@1258

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@1258

commit: 16b9630

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: -245 B (-0.27%)

Total Size: 91.8 kB

Filename Size Change
./packages/db/dist/esm/query/compiler/evaluators.js 1.37 kB -58 B (-4.07%)
./packages/db/dist/esm/utils/comparison.js 765 B -187 B (-19.64%) 🎉
ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.39 kB
./packages/db/dist/esm/collection/changes.js 1.22 kB
./packages/db/dist/esm/collection/events.js 388 B
./packages/db/dist/esm/collection/index.js 3.32 kB
./packages/db/dist/esm/collection/indexes.js 1.1 kB
./packages/db/dist/esm/collection/lifecycle.js 1.75 kB
./packages/db/dist/esm/collection/mutations.js 2.34 kB
./packages/db/dist/esm/collection/state.js 3.49 kB
./packages/db/dist/esm/collection/subscription.js 3.71 kB
./packages/db/dist/esm/collection/sync.js 2.41 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.7 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.69 kB
./packages/db/dist/esm/indexes/auto-index.js 742 B
./packages/db/dist/esm/indexes/base-index.js 766 B
./packages/db/dist/esm/indexes/btree-index.js 2.17 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.1 kB
./packages/db/dist/esm/indexes/reverse-index.js 538 B
./packages/db/dist/esm/local-only.js 808 B
./packages/db/dist/esm/local-storage.js 2.1 kB
./packages/db/dist/esm/optimistic-action.js 359 B
./packages/db/dist/esm/paced-mutations.js 496 B
./packages/db/dist/esm/proxy.js 3.75 kB
./packages/db/dist/esm/query/builder/functions.js 733 B
./packages/db/dist/esm/query/builder/index.js 4.09 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 1.05 kB
./packages/db/dist/esm/query/compiler/expressions.js 430 B
./packages/db/dist/esm/query/compiler/group-by.js 1.81 kB
./packages/db/dist/esm/query/compiler/index.js 2.02 kB
./packages/db/dist/esm/query/compiler/joins.js 2.11 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.45 kB
./packages/db/dist/esm/query/compiler/select.js 1.06 kB
./packages/db/dist/esm/query/expression-helpers.js 1.43 kB
./packages/db/dist/esm/query/ir.js 673 B
./packages/db/dist/esm/query/live-query-collection.js 360 B
./packages/db/dist/esm/query/live/collection-config-builder.js 5.44 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 2.42 kB
./packages/db/dist/esm/query/live/internal.js 145 B
./packages/db/dist/esm/query/optimizer.js 2.62 kB
./packages/db/dist/esm/query/predicate-utils.js 2.97 kB
./packages/db/dist/esm/query/subset-dedupe.js 921 B
./packages/db/dist/esm/scheduler.js 1.3 kB
./packages/db/dist/esm/SortedMap.js 1.3 kB
./packages/db/dist/esm/strategies/debounceStrategy.js 247 B
./packages/db/dist/esm/strategies/queueStrategy.js 428 B
./packages/db/dist/esm/strategies/throttleStrategy.js 246 B
./packages/db/dist/esm/transactions.js 2.9 kB
./packages/db/dist/esm/utils.js 924 B
./packages/db/dist/esm/utils/browser-polyfills.js 304 B
./packages/db/dist/esm/utils/btree.js 5.61 kB
./packages/db/dist/esm/utils/cursor.js 457 B
./packages/db/dist/esm/utils/index-optimization.js 1.51 kB
./packages/db/dist/esm/utils/type-guards.js 157 B

compressed-size-action::db-package-size

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 3.7 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 225 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.17 kB
./packages/react-db/dist/esm/useLiveQuery.js 1.34 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js 559 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

compressed-size-action::react-db-package-size

@kevin-dp kevin-dp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving but looks like you forgot to remove the "Uint8Arrays with same content have same hash" test and you should also add a changeset.

@KyleAMathews

Copy link
Copy Markdown
Collaborator Author

Closing as superseded by the current equality architecture. Current main intentionally defines binary content equality across eq/in, hashing, grouping, routing, and demand; the public join path is the remaining inconsistent owner, with a deterministic RED matrix for distinct Uint8Array/Buffer copies in both auto-index modes. Reverting to reference equality would break that established contract and remove normative tests. We’ll use #896/#899/#1258 as credited design provenance for a fresh current-main join/equality/planning fix, rather than revive this rollback. Thanks for making the alternative policy and its cost concerns explicit.

KyleAMathews added a commit that referenced this pull request Sep 16, 2026
Canonicalize satisfiable join operands through the compilation ValueIdentity, keep nullish operands row-disjoint, and preserve raw lazy-demand values with stable representatives. This restores equality-predicate consistency for binary and other established value domains without adding compound join syntax.

Provenance: #593 Lucas Duailibe and Sam Willis; #861 Vincent Chan; #896 Tomas Zaluckij; #779/#899/#1258 Kyle Mathews and Claude; #899 review by Sam Willis; #1229 Hieu Nguyen, Hiếu Nguyễn Minh, Kevin De Porre, and Claude Opus 4.6; #1797 ValueIdentity architecture by Kyle Mathews. Prior art informed the evidence and design; no prior implementation lines were reused. #593/#861 remain design-gated.

Weight: production source net +30 lines; emitted join module +65 B ESM gzip and +60 B CJS gzip. No public API, export, dependency, compatibility branch, or db-ivm change.
KyleAMathews added a commit that referenced this pull request Sep 16, 2026
Canonicalize satisfiable join operands through the compilation ValueIdentity, keep nullish operands row-disjoint, and preserve raw lazy-demand values with stable representatives. This restores equality-predicate consistency for binary and other established value domains without adding compound join syntax.

Provenance: #593 Lucas Duailibe and Sam Willis; #861 Vincent Chan; #896 Tomas Zaluckij; #779/#899/#1258 Kyle Mathews and Claude; #899 review by Sam Willis; #1229 Hieu Nguyen, Hiếu Nguyễn Minh, Kevin De Porre, and Claude Opus 4.6; #1797 ValueIdentity architecture by Kyle Mathews. Prior art informed the evidence and design; no prior implementation lines were reused. #593/#861 remain design-gated.

Weight: production source net +30 lines; emitted join module +65 B ESM gzip and +60 B CJS gzip. No public API, export, dependency, compatibility branch, or db-ivm change.
KyleAMathews added a commit that referenced this pull request Sep 17, 2026
* fix(db): align join keys with equality identity

Canonicalize satisfiable join operands through the compilation ValueIdentity, keep nullish operands row-disjoint, and preserve raw lazy-demand values with stable representatives. This restores equality-predicate consistency for binary and other established value domains without adding compound join syntax.

Provenance: #593 Lucas Duailibe and Sam Willis; #861 Vincent Chan; #896 Tomas Zaluckij; #779/#899/#1258 Kyle Mathews and Claude; #899 review by Sam Willis; #1229 Hieu Nguyen, Hiếu Nguyễn Minh, Kevin De Porre, and Claude Opus 4.6; #1797 ValueIdentity architecture by Kyle Mathews. Prior art informed the evidence and design; no prior implementation lines were reused. #593/#861 remain design-gated.

Weight: production source net +30 lines; emitted join module +65 B ESM gzip and +60 B CJS gzip. No public API, export, dependency, compatibility branch, or db-ivm change.

* Apply join equality review fixes

* Reduce join result processing overhead
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.

3 participants