Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

@KyleAMathews KyleAMathews commented Jan 28, 2026

🎯 Changes

Bug reported in https://discord.com/channels/719702312431386674/1465855364502126662/1465855364502126662

Added a regression test that demonstrates a bug in OR query handling when mixing indexed and non-indexed fields. The test documents the issue where items matching non-indexed field conditions are silently dropped when combined with indexed field conditions in an OR query.

Bug Description:
When using or(eq(element.id, itemId), eq(element.group_id, itemId)) where id has an index but group_id does not, only items matching the indexed condition are returned. Items matching the non-indexed condition are silently dropped.

Expected Behavior:
Items matching EITHER condition should be returned. When not all OR branches can be optimized with indexes, the query should fall back to a full scan to ensure all matching items are found.

Test Details:

  • Creates a query: age=25 OR name='Bob'
  • age field has an index, name field does not
  • Expected results: Both Alice (matches indexed condition) and Bob (matches non-indexed condition)
  • Current behavior: Only Alice is returned due to the bug

This test will fail until the underlying bug is fixed in the query optimization logic.

✅ 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 change that documents an existing bug. No changeset is needed.

https://claude.ai/code/session_01R16FFtQbQr1VXjEVCYAeUk

This test demonstrates a bug where using `or()` with one indexed field
and one non-indexed field causes items matching the non-indexed condition
to be silently dropped.

Example: `or(eq(element.id, itemId), eq(element.group_id, itemId))`
where 'id' has an index but 'group_id' does not.

Expected: Items matching EITHER condition should be returned
Actual: Only items matching the indexed condition are returned

Root cause is in `packages/db/src/utils/index-optimization.ts`:
- `canOptimizeOrExpression` returns true if ANY operand can be optimized
- `optimizeOrExpression` only collects results from optimizable branches
- Non-optimizable branches are silently dropped

The fix should change OR optimization to require ALL branches be
optimizable, falling back to full scan otherwise.

https://claude.ai/code/session_01R16FFtQbQr1VXjEVCYAeUk
@changeset-bot
Copy link

changeset-bot bot commented Jan 28, 2026

⚠️ No Changeset found

Latest commit: adc0aea

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
Copy link

pkg-pr-new bot commented Jan 28, 2026

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: adc0aea

@github-actions
Copy link
Contributor

github-actions bot commented Jan 28, 2026

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
Copy link
Contributor

github-actions bot commented Jan 28, 2026

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

Auto-indexing only recurses into AND expressions, not OR expressions.
This means fields used inside OR don't get auto-indexed, which combined
with the optimizer bug (dropping non-indexed OR branches), causes
silent data loss in queries.

This test demonstrates what SHOULD happen: auto-indexing should create
indexes for all fields in OR expressions.

https://claude.ai/code/session_01R16FFtQbQr1VXjEVCYAeUk
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

3 participants