Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

@KyleAMathews KyleAMathews commented Jan 17, 2026

Summary

Fixes empty string values being incorrectly treated as NULL in SQL queries. Queries like eq(status, '') now correctly generate WHERE status = '' instead of silently omitting the parameter.


Reviewer Guidance

Root Cause

The sql-compiler's param filtering logic was checking if the serialized value was an empty string (serialized !== '') to decide whether to include a param. This conflated two distinct cases:

  1. A value that serializes to empty string because it IS an empty string (legitimate)
  2. A null/undefined value that also happens to serialize to empty string (should be omitted)

This caused legitimate empty string queries to break silently — the param would be omitted from the params record, but the $N placeholder would still appear in the SQL, leading to incorrect query behavior.

Approach

Changed the filter condition from checking the serialized output to checking the original input value:

// Before: checked serialized output (broken for empty strings)
if (serialized !== ``) {
  acc[`${index + 1}`] = serialized
}

// After: checks original value (empty strings pass through)
if (param != null) {
  acc[`${index + 1}`] = serialized
}

Key Invariants

  1. null and undefined params MUST be omitted (they indicate optional/unset values)
  2. Empty strings MUST be included (they're valid query values)
  3. The number of params in the record must match the number of $N placeholders in the SQL

Non-goals

  • Did not change how null/undefined values are handled in the WHERE clause generation itself (that's a separate concern)
  • Did not add support for explicit IS NULL queries (different feature)

Trade-offs

Alternative considered: Could have made serialize() return null for null/undefined and then filter on that. Rejected because it would change the serialize function's contract and add complexity for a simple fix.


Verification

pnpm vitest --run tests/sql-compiler.test.ts

The tests verify:

Files Changed

File Change
packages/electric-db-collection/src/sql-compiler.ts Changed param filtering to check original value instead of serialized output
packages/electric-db-collection/tests/sql-compiler.test.ts Added 4 test cases for empty string equality queries

Fixes #1147

The sql-compiler was filtering out empty strings from query params,
treating them the same as null/undefined values. This caused queries
like `eq(column, '')` to incorrectly generate `WHERE column = NULL`
instead of `WHERE column = ''`.

The fix changes the filter condition to check the original value for
null/undefined instead of checking if the serialized value is an
empty string. This allows legitimate empty string queries to work
correctly while still properly omitting null/undefined params.
@changeset-bot
Copy link

changeset-bot bot commented Jan 17, 2026

🦋 Changeset detected

Latest commit: 12fb152

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

This PR includes changesets to release 1 package
Name Type
@tanstack/electric-db-collection 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 Jan 17, 2026

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 12fb152

@github-actions
Copy link
Contributor

github-actions bot commented Jan 17, 2026

Size Change: 0 B

Total Size: 90.5 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.67 kB
./packages/db/dist/esm/collection/mutations.js 2.34 kB
./packages/db/dist/esm/collection/state.js 3.46 kB
./packages/db/dist/esm/collection/subscription.js 3.62 kB
./packages/db/dist/esm/collection/sync.js 2.38 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.49 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.08 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.87 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.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.4 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 17, 2026

Size Change: 0 B

Total Size: 3.47 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 559 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

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

@K-Mistele
Copy link

related #1146

@KyleAMathews KyleAMathews merged commit 8d6442e into main Jan 17, 2026
7 checks passed
@KyleAMathews KyleAMathews deleted the claude/fix-tanstack-query-operator-HVvYv branch January 17, 2026 03:46
@github-actions github-actions bot mentioned this pull request Jan 17, 2026
@github-actions
Copy link
Contributor

🎉 This PR has been released!

Thank you for your contribution!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Ready for review

Development

Successfully merging this pull request may close these issues.

[Bug] Empty String & NULL/undefined values are silently omitted from query electric db collection query params

5 participants