Skip to content

Conversation

@kevin-dp
Copy link
Contributor

@kevin-dp kevin-dp commented Jan 5, 2026

Fixes #1085

@changeset-bot
Copy link

changeset-bot bot commented Jan 5, 2026

⚠️ No Changeset found

Latest commit: d763ef3

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 5, 2026

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: d763ef3

@github-actions
Copy link
Contributor

github-actions bot commented Jan 5, 2026

Size Change: +5 B (+0.01%)

Total Size: 89.5 kB

Filename Size Change
./packages/db/dist/esm/query/compiler/group-by.js 1.81 kB +5 B (+0.28%)
ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.39 kB
./packages/db/dist/esm/collection/changes.js 999 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.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.27 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.68 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 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/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.46 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.9 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.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 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/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 5, 2026

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

@kevin-dp kevin-dp force-pushed the kevin/group-by-bigint-or-date branch from 860214a to b590c96 Compare January 5, 2026 15:50
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds support for groupBy operations over BigInt and Date column types, fixing issue #1085 where JSON.stringify would fail with "Do not know how to serialize a BigInt" errors.

Key changes:

  • Introduced a serializeValue utility function that handles BigInt and Date serialization using a custom JSON.stringify replacer
  • Updated groupBy operations to use serializeValue instead of JSON.stringify for creating group keys
  • Added comprehensive test coverage for single and multi-column groupBy scenarios with BigInt and Date types

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
packages/db-ivm/src/utils.ts Adds serializeValue function to handle BigInt and Date serialization for groupBy keys
packages/db-ivm/src/operators/groupBy.ts Updates groupBy operator to use serializeValue for key string generation
packages/db/src/query/compiler/group-by.ts Updates multi-column groupBy key generation to use serializeValue
packages/db-ivm/src/index.ts Exports serializeValue utility function
packages/db/tests/query/group-by.test.ts Adds four comprehensive tests covering BigInt and Date groupBy scenarios

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +201 to +211
export function serializeValue(value: unknown): string {
return JSON.stringify(value, (_, val) => {
if (typeof val === 'bigint') {
return val.toString()
}
if (val instanceof Date) {
return val.toISOString()
}
return val
})
}
Copy link

Copilot AI Jan 6, 2026

Choose a reason for hiding this comment

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

The new serializeValue utility function lacks unit tests in the db-ivm package. While integration tests exist in the db package, consider adding unit tests in packages/db-ivm/tests/utils.test.ts to verify edge cases like null values, undefined values, nested objects with BigInt/Date, arrays containing BigInt/Date, and mixed types. This would improve maintainability and ensure the function behaves correctly in isolation.

Copilot uses AI. Check for mistakes.
Copy link

Copilot AI commented Jan 6, 2026

@kevin-dp I've opened a new pull request, #1093, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 2 commits January 6, 2026 10:28
…ons (#1093)

* Initial plan

* Replace hardcoded BigInt values with Number.MAX_SAFE_INTEGER + 1

Co-authored-by: kevin-dp <[email protected]>

* Extract MAX_SAFE_BIGINT constant to improve readability

Co-authored-by: kevin-dp <[email protected]>

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: kevin-dp <[email protected]>
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.

Code Review: PR #1091

Overall Assessment: Approve

A clean, focused fix for a real-world issue. Like the foundation stones of a temple, proper serialization is essential for the structure above to function correctly.

Summary

The PR adds a serializeValue utility function that properly handles BigInt and Date types during JSON serialization, which JSON.stringify cannot do natively. This is then used in the groupBy operator for key serialization.

Strengths

  1. Minimal, targeted change: Only touches the necessary files (utils.ts, groupBy.ts, group-by.ts)

  2. Good test coverage: The tests cover:

    • BigInt values beyond MAX_SAFE_INTEGER (important edge case)
    • Date values
    • Multi-column grouping with mixed types
    • Grouping verification with duplicate keys
  3. Clean implementation: The replacer function approach is idiomatic:

    JSON.stringify(value, (_, val) => {
      if (typeof val === 'bigint') return val.toString()
      if (val instanceof Date) return val.toISOString()
      return val
    })
  4. Exported for reuse: serializeValue is exported from the package index, making it available for other consumers.

Minor Notes

  1. Potential precision considerations: For Dates, toISOString() returns millisecond precision. If you ever need microsecond/nanosecond precision, this would need revisiting. Not an issue for current use cases.

  2. Two serialization sites: The fix is applied in two places:

    • packages/db-ivm/src/operators/groupBy.ts:71 - key extraction
    • packages/db/src/query/compiler/group-by.ts:257 - final key construction

    Both are necessary and correctly placed.

  3. Consider adding NaN handling: JSON.stringify(NaN) returns null, which could cause unexpected grouping. Not blocking, but worth considering for robustness.

Question

Are there other places in the codebase using JSON.stringify on user data that might also benefit from serializeValue? A quick search might reveal other potential issues.

Solid work! 🎯

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.

groupBy on a BigInt fails (ElectricSQL Collection)

3 participants