Skip to content

fix: skip on-demand loading when no index exists for orderBy + limit queries#1437

Open
kevin-dp wants to merge 4 commits intomainfrom
kevin/index-error
Open

fix: skip on-demand loading when no index exists for orderBy + limit queries#1437
kevin-dp wants to merge 4 commits intomainfrom
kevin/index-error

Conversation

@kevin-dp
Copy link
Copy Markdown
Contributor

Summary

Fixes #1434

When auto-indexing is disabled (the new default), queries with orderBy + limit crash with:

Ordered snapshot was requested but no index was found. You have to call setOrderByIndex before requesting an ordered snapshot.

The root cause: dataNeeded was being set on OrderByOptimizationInfo even when no index existed, causing loadMoreIfNeeded to attempt cursor-based loading via requestLimitedSnapshot — which requires an index.

  • Root cause fix (order-by.ts): Only set setSizeCallback/dataNeeded when an index exists. Without an index, lazy loading can't work — data is loaded eagerly via requestSnapshot instead.
  • Belt-and-suspenders (collection-subscriber.ts, effect.ts): Guard loadMoreIfNeeded against missing indexes even if dataNeeded is set.

Test plan

  • Added two tests that reproduce the crash without the fix (verified they fail without the fix and pass with it)
  • Existing test suite passes (226 tests across 5 related test files)

🤖 Generated with Claude Code

kevin-dp and others added 2 commits March 31, 2026 15:41
…queries

When auto-indexing is disabled (the new default), queries with orderBy + limit
would crash because loadMoreIfNeeded attempted cursor-based loading via
requestLimitedSnapshot without an index. Now dataNeeded is only set when an
index exists, and loadMoreIfNeeded also guards against missing indexes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new bot commented Mar 31, 2026

More templates

@tanstack/angular-db

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

@tanstack/browser-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/browser-db-sqlite-persistence@1437

@tanstack/capacitor-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/capacitor-db-sqlite-persistence@1437

@tanstack/cloudflare-durable-objects-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/cloudflare-durable-objects-db-sqlite-persistence@1437

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/db-sqlite-persistence-core

npm i https://pkg.pr.new/@tanstack/db-sqlite-persistence-core@1437

@tanstack/electric-db-collection

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

@tanstack/electron-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/electron-db-sqlite-persistence@1437

@tanstack/expo-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/expo-db-sqlite-persistence@1437

@tanstack/node-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/node-db-sqlite-persistence@1437

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/react-native-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/react-native-db-sqlite-persistence@1437

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/tauri-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/tauri-db-sqlite-persistence@1437

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: e39c099

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 31, 2026

Size Change: +418 B (+0.37%)

Total Size: 113 kB

📦 View Changed
Filename Size Change
packages/db/dist/esm/query/compiler/joins.js 2.3 kB +197 B (+9.35%) 🔍
packages/db/dist/esm/query/compiler/order-by.js 1.72 kB +203 B (+13.4%) ⚠️
packages/db/dist/esm/query/effect.js 4.78 kB +7 B (+0.15%)
packages/db/dist/esm/query/live/collection-subscriber.js 1.95 kB +11 B (+0.57%)
ℹ️ View Unchanged
Filename Size
packages/db/dist/esm/collection/change-events.js 1.39 kB
packages/db/dist/esm/collection/changes.js 1.38 kB
packages/db/dist/esm/collection/cleanup-queue.js 810 B
packages/db/dist/esm/collection/events.js 434 B
packages/db/dist/esm/collection/index.js 3.61 kB
packages/db/dist/esm/collection/indexes.js 1.99 kB
packages/db/dist/esm/collection/lifecycle.js 1.69 kB
packages/db/dist/esm/collection/mutations.js 2.47 kB
packages/db/dist/esm/collection/state.js 5.26 kB
packages/db/dist/esm/collection/subscription.js 3.74 kB
packages/db/dist/esm/collection/sync.js 2.88 kB
packages/db/dist/esm/collection/transaction-metadata.js 144 B
packages/db/dist/esm/deferred.js 207 B
packages/db/dist/esm/errors.js 4.92 kB
packages/db/dist/esm/event-emitter.js 748 B
packages/db/dist/esm/index.js 3 kB
packages/db/dist/esm/indexes/auto-index.js 830 B
packages/db/dist/esm/indexes/base-index.js 729 B
packages/db/dist/esm/indexes/basic-index.js 2.05 kB
packages/db/dist/esm/indexes/btree-index.js 2.17 kB
packages/db/dist/esm/indexes/index-registry.js 820 B
packages/db/dist/esm/indexes/reverse-index.js 538 B
packages/db/dist/esm/local-only.js 890 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 905 B
packages/db/dist/esm/query/builder/index.js 5.25 kB
packages/db/dist/esm/query/builder/ref-proxy.js 1.05 kB
packages/db/dist/esm/query/compiler/evaluators.js 1.62 kB
packages/db/dist/esm/query/compiler/expressions.js 430 B
packages/db/dist/esm/query/compiler/group-by.js 2.69 kB
packages/db/dist/esm/query/compiler/index.js 3.63 kB
packages/db/dist/esm/query/compiler/select.js 1.11 kB
packages/db/dist/esm/query/expression-helpers.js 1.43 kB
packages/db/dist/esm/query/ir.js 829 B
packages/db/dist/esm/query/live-query-collection.js 360 B
packages/db/dist/esm/query/live/collection-config-builder.js 7.79 kB
packages/db/dist/esm/query/live/collection-registry.js 264 B
packages/db/dist/esm/query/live/internal.js 145 B
packages/db/dist/esm/query/live/utils.js 1.64 kB
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/query-once.js 359 B
packages/db/dist/esm/query/subset-dedupe.js 960 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 927 B
packages/db/dist/esm/utils/array-utils.js 273 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 1.05 kB
packages/db/dist/esm/utils/cursor.js 457 B
packages/db/dist/esm/utils/index-optimization.js 1.54 kB
packages/db/dist/esm/utils/type-guards.js 157 B
packages/db/dist/esm/virtual-props.js 360 B

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

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 31, 2026

Size Change: 0 B

Total Size: 4.24 kB

ℹ️ View Unchanged
Filename Size
packages/react-db/dist/esm/index.js 249 B
packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.32 kB
packages/react-db/dist/esm/useLiveQuery.js 1.34 kB
packages/react-db/dist/esm/useLiveQueryEffect.js 355 B
packages/react-db/dist/esm/useLiveSuspenseQuery.js 567 B
packages/react-db/dist/esm/usePacedMutations.js 401 B

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

…e to missing index

Adds console warnings when no index is found for:
- orderBy + limit queries (order-by.ts)
- lazy join loading (joins.ts)

Both suggest creating an explicit index or enabling autoIndex: 'eager'.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Collaborator

@samwillis samwillis left a comment

Choose a reason for hiding this comment

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

LGTM

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.

useLiveQuery pagination breaks on revisited pages when syncMode='on-demand'

2 participants