Skip to content

Conversation

@samwillis
Copy link
Collaborator

@samwillis samwillis commented Dec 4, 2025

Summary

Fixes #872

This PR fixes a bug in useLiveInfiniteQuery where deleting an item from a partial page (fewer items than pageSize) with descending order would not update the live result.

Reproduction of bug: https://stackblitz.com/edit/vitejs-vite-shmvuoh8?file=src%2Fapp.tsx
With the fix: https://stackblitz.com/edit/vitejs-vite-sqrhrspk?file=src%2Fapp.tsx

Root Cause

The bug was in requestLimitedSnapshot in subscription.ts. The biggestObservedValue variable was incorrectly set to the full row object instead of the indexed value.

This caused the BTree comparison in index.take() to fail because comparing a row object with indexed values produces NaN, causing the same data to be loaded multiple times.

The Fix

Create a value extractor from the orderBy expression to extract the actual indexed value from each row.

Test Failure (Before Fix)

https://github.com/TanStack/db/actions/runs/19940582123/job/57176990721

Test plan

  • Added reproduction tests
  • Verified fix works

…query

Add tests for deleting items from a page with fewer rows than pageSize
in useLiveInfiniteQuery. Tests both ascending and descending order to
verify the behavior difference.
@changeset-bot
Copy link

changeset-bot bot commented Dec 4, 2025

🦋 Changeset detected

Latest commit: 7890567

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

This PR includes changesets to release 13 packages
Name Type
@tanstack/db Patch
@tanstack/angular-db Patch
@tanstack/db-collection-e2e Patch
@tanstack/electric-db-collection Patch
@tanstack/offline-transactions Patch
@tanstack/powersync-db-collection Patch
@tanstack/query-db-collection Patch
@tanstack/react-db Patch
@tanstack/rxdb-db-collection Patch
@tanstack/solid-db Patch
@tanstack/svelte-db Patch
@tanstack/trailbase-db-collection Patch
@tanstack/vue-db 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 Dec 4, 2025

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 7890567

@github-actions
Copy link
Contributor

github-actions bot commented Dec 4, 2025

Size Change: +69 B (+0.08%)

Total Size: 87.2 kB

Filename Size Change
./packages/db/dist/esm/collection/subscription.js 2.62 kB +69 B (+2.71%)
ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.39 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.31 kB
./packages/db/dist/esm/collection/state.js 3.43 kB
./packages/db/dist/esm/collection/sync.js 2.37 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.19 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.66 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.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 3.96 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 430 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.33 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.74 kB
./packages/db/dist/esm/query/live/internal.js 130 B
./packages/db/dist/esm/query/optimizer.js 2.56 kB
./packages/db/dist/esm/query/predicate-utils.js 2.91 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.18 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 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 Dec 4, 2025

Size Change: 0 B

Total Size: 3.35 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.12 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

The `biggestObservedValue` variable was incorrectly set to the full row object
instead of the indexed value (e.g., salary). This caused the BTree comparison
in `index.take()` to fail, resulting in the same data being loaded multiple
times. Each item would be inserted with a multiplicity > 1, and when deleted,
the multiplicity would decrement but not reach 0, so the item would remain
visible in the TopK.

This fix creates a value extractor from the orderBy expression and uses it to
extract the actual indexed value from each row before tracking it as the
"biggest observed value".
@samwillis samwillis marked this pull request as ready for review December 4, 2025 19:50
Copy link
Collaborator

@KyleAMathews KyleAMathews left a comment

Choose a reason for hiding this comment

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

nice!

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.

useLiveInfiniteQuery is not updated after deletions on descending order when page is undersized

3 participants