Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

Fixes issue where items inserted via Direct Writes (writeInsert/writeUpsert) were incorrectly purged when query results changed and didn't include those items.

Root Cause:
The reference counting system (queryToRows/rowToQueries) tracks which items are in each query result. When a query result doesn't include an item and the item's reference count is 0, it gets deleted. Direct Write items were never added to this tracking system, so they always had a reference count of 0 and were purged when not in query results.

Solution:

  • Added directWriteKeys Set to track items inserted via Direct Writes
  • Modified purging logic in handleQueryResult() and cleanupQuery() to skip items in the directWriteKeys Set
  • Updated performWriteOperations() to add/remove keys from directWriteKeys:
    • Insert operations add the key
    • Delete operations remove the key
    • Upsert operations add the key if inserting new item

Changes:

  • query.ts: Added directWriteKeys Set and modified purging checks
  • manual-sync.ts: Track direct write keys in performWriteOperations
  • query.test.ts: Added test case to verify Direct Writes are protected

This ensures directly-written items persist until explicitly deleted via writeDelete(), regardless of query result changes.

🎯 Changes

✅ 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.
  • This change is docs/CI/dev-only (no release).

Fixes issue where items inserted via Direct Writes (writeInsert/writeUpsert)
were incorrectly purged when query results changed and didn't include those items.

**Root Cause:**
The reference counting system (queryToRows/rowToQueries) tracks which items
are in each query result. When a query result doesn't include an item and the
item's reference count is 0, it gets deleted. Direct Write items were never
added to this tracking system, so they always had a reference count of 0 and
were purged when not in query results.

**Solution:**
- Added `directWriteKeys` Set to track items inserted via Direct Writes
- Modified purging logic in `handleQueryResult()` and `cleanupQuery()` to skip
  items in the `directWriteKeys` Set
- Updated `performWriteOperations()` to add/remove keys from `directWriteKeys`:
  - Insert operations add the key
  - Delete operations remove the key
  - Upsert operations add the key if inserting new item

**Changes:**
- query.ts: Added directWriteKeys Set and modified purging checks
- manual-sync.ts: Track direct write keys in performWriteOperations
- query.test.ts: Added test case to verify Direct Writes are protected

This ensures directly-written items persist until explicitly deleted via
writeDelete(), regardless of query result changes.
@changeset-bot
Copy link

changeset-bot bot commented Nov 13, 2025

🦋 Changeset detected

Latest commit: 1765904

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
Name Type
@tanstack/query-db-collection Patch
@tanstack/db-collection-e2e Patch

Not sure what this means? Click here to learn what changesets are.

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

@pkg-pr-new
Copy link

pkg-pr-new bot commented Nov 13, 2025

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 1765904

@github-actions
Copy link
Contributor

github-actions bot commented Nov 13, 2025

Size Change: 0 B

Total Size: 86 kB

ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.38 kB
./packages/db/dist/esm/collection/changes.js 977 B
./packages/db/dist/esm/collection/events.js 388 B
./packages/db/dist/esm/collection/index.js 3.24 kB
./packages/db/dist/esm/collection/indexes.js 1.1 kB
./packages/db/dist/esm/collection/lifecycle.js 1.67 kB
./packages/db/dist/esm/collection/mutations.js 2.26 kB
./packages/db/dist/esm/collection/state.js 3.43 kB
./packages/db/dist/esm/collection/subscription.js 2.42 kB
./packages/db/dist/esm/collection/sync.js 2.12 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.11 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.63 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 1.87 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.1 kB
./packages/db/dist/esm/indexes/reverse-index.js 513 B
./packages/db/dist/esm/local-only.js 837 B
./packages/db/dist/esm/local-storage.js 2.04 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.22 kB
./packages/db/dist/esm/query/builder/functions.js 733 B
./packages/db/dist/esm/query/builder/index.js 3.84 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 917 B
./packages/db/dist/esm/query/compiler/evaluators.js 1.35 kB
./packages/db/dist/esm/query/compiler/expressions.js 691 B
./packages/db/dist/esm/query/compiler/group-by.js 1.8 kB
./packages/db/dist/esm/query/compiler/index.js 1.96 kB
./packages/db/dist/esm/query/compiler/joins.js 2 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.25 kB
./packages/db/dist/esm/query/compiler/select.js 1.07 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.26 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.77 kB
./packages/db/dist/esm/query/live/internal.js 130 B
./packages/db/dist/esm/query/optimizer.js 2.6 kB
./packages/db/dist/esm/query/predicate-utils.js 2.88 kB
./packages/db/dist/esm/query/subset-dedupe.js 921 B
./packages/db/dist/esm/scheduler.js 1.21 kB
./packages/db/dist/esm/SortedMap.js 1.18 kB
./packages/db/dist/esm/strategies/debounceStrategy.js 237 B
./packages/db/dist/esm/strategies/queueStrategy.js 418 B
./packages/db/dist/esm/strategies/throttleStrategy.js 236 B
./packages/db/dist/esm/transactions.js 2.9 kB
./packages/db/dist/esm/utils.js 881 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/comparison.js 852 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
Contributor

github-actions bot commented Nov 13, 2025

Size Change: 0 B

Total Size: 3.34 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.11 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js 431 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

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

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