Skip to content

test: Add regression tests for BTreeIndex infinite loop with undefined keys - #1191

Closed
KyleAMathews wants to merge 3 commits into
mainfrom
claude/investigate-issue-1186-J2wsw
Closed

KyleAMathews wants to merge 3 commits into
mainfrom
claude/investigate-issue-1186-J2wsw

Conversation

@KyleAMathews

Copy link
Copy Markdown
Collaborator

🎯 Changes

This PR adds comprehensive regression tests for GitHub issue #1186, which describes an infinite loop in BTreeIndex.takeInternal when using orderBy() and limit() on collections containing items with undefined indexed values.

The test suite includes:

All tests include a 5-second timeout to catch infinite loops during test execution.

Root Cause (documented in test comments):
When nextHigherPair(undefined) is called, it returns the minimum pair from the B-tree. If that minimum key is itself undefined, the method returns [undefined, undefined]. After processing, the code sets key = pair[0] (which is undefined) and calls nextHigherPair(undefined) again, returning the same pair and creating an infinite loop.

✅ 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).

Note: This is a test-only addition that documents the bug for future reference and validation once the underlying issue is fixed.

https://claude.ai/code/session_01RKBKXMoKVe1hSXGy3VVEFo

…lues (issue #1186)

This test demonstrates the infinite loop bug that occurs when calling
take() on a BTreeIndex containing items with undefined indexed values.

The bug is in takeInternal() where nextHigherPair(undefined) returns the
minimum pair [undefined, undefined], then key is set to pair[0] (undefined),
causing the same pair to be returned infinitely since the while condition
(pair !== undefined) is always true for arrays.

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

changeset-bot Bot commented Jan 27, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 3028e19

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 Jan 27, 2026 •

Copy link
Copy Markdown
More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 3028e19

@github-actions

github-actions Bot commented Jan 27, 2026 •

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 90.9 kB

ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.39 kB
./packages/db/dist/esm/collection/changes.js 1.19 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.68 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.62 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 1.93 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 4.09 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 1.05 kB
./packages/db/dist/esm/query/compiler/evaluators.js 1.42 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.07 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.42 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.93 kB
./packages/db/dist/esm/query/live/internal.js 145 B
./packages/db/dist/esm/query/optimizer.js 2.56 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/comparison.js 852 B
./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

github-actions Bot commented Jan 27, 2026 •

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

@KyleAMathews

Copy link
Copy Markdown
Collaborator Author

Closing as superseded by merged PR #1198. The merged runtime fix includes a focused undefined-key BTree regression file and end-to-end ordering coverage, so this earlier standalone test PR is redundant.

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