Skip to content

fix(query-core): keep selector error timestamps stable - #12540

Merged
TkDodo merged 2 commits into
mainfrom
tkdodo/fix/select-error-render-loop
Nov 6, 2026
Merged

TkDodo merged 2 commits into
mainfrom
tkdodo/fix/select-error-render-loop

Conversation

@TkDodo

@TkDodo TkDodo commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator

🎯 Changes

Fixes #12532.

Recomputing a cached selector error changes errorUpdatedAt, which can cause an infinite render loop through React's external-store snapshot checks. Reuse the previous timestamp when the error reference is unchanged.

The regression test fails on main because the timestamp changes after the clock advances. With this fix, all 85 observer tests pass through Nx using existing local dependencies. Formatting checks pass. The full pnpm run test:pr command has not run.

✅ Checklist

  • I have followed the steps in the Contributing guide.
  • I have tested code changes locally with pnpm run test:pr, or these tests do not apply to this pull request.
  • I have followed the AI contribution policy and fully understand the code in this pull request, including any code generated with AI assistance.

🚀 Release Impact

  • This change affects published code, and I have generated a changeset.
  • This change is docs/CI/dev-only (no release).

Summary by CodeRabbit

  • Bug Fixes
    • Selector errors now retain their original timestamp when the same error persists, preventing unnecessary result changes and infinite render loops.
    • Added coverage for selector errors when cached initial data is present.

@changeset-bot

changeset-bot Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: b6bedd4

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

This PR includes changesets to release 24 packages
Name Type
@tanstack/query-core Patch
@tanstack/angular-query-experimental Patch
@tanstack/lit-query Patch
@tanstack/preact-query Patch
@tanstack/query-async-storage-persister Patch
@tanstack/query-broadcast-client-experimental Patch
@tanstack/query-devtools Patch
@tanstack/query-persist-client-core Patch
@tanstack/query-sync-storage-persister Patch
@tanstack/react-query Patch
@tanstack/solid-query Patch
@tanstack/svelte-query Patch
@tanstack/vue-query Patch
@tanstack/preact-query-devtools Patch
@tanstack/preact-query-persist-client Patch
@tanstack/react-query-devtools Patch
@tanstack/solid-query-devtools Patch
@tanstack/svelte-query-devtools Patch
@tanstack/vue-query-devtools Patch
@tanstack/react-query-persist-client Patch
@tanstack/solid-query-persist-client Patch
@tanstack/svelte-query-persist-client Patch
@tanstack/react-query-next-experimental Patch
@tanstack/eslint-plugin-query 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

@coderabbitai

coderabbitai Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

Caution

Review failed

The pull request is closed.

Walkthrough

QueryObserver now retains the previous error timestamp when a selector produces the same error again. A regression test checks that the result object remains unchanged after a timer advance and updateResult().

Changes: QueryObserver selector errors

Layer / File(s) Summary
Preserve timestamps for repeated selector errors
packages/query-core/src/queryObserver.ts, packages/query-core/src/__tests__/queryObserver.test.tsx, .changeset/stable-selector-error-timestamp.md
When a selector error matches the previous error, QueryObserver retains its timestamp; otherwise, it uses the current time. The regression test checks the cached initial-data case, and the changeset marks a patch release.

Estimated code review effort: 2 (Simple) | ~8 minutes

Change: Bug fix · Severity of issue fixed: Medium

Possibly related PRs

Suggested reviewers: sukvvon

Merge Risk: Low · up to b6bed

The fix stabilizes repeated selector errors, but switching queries can retain an older failure timestamp when both selectors throw the same error object. This narrow regression warrants owner awareness or a focused correction.

- [ ] Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@nx-cloud

nx-cloud Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

View your CI Pipeline Execution ↗ for commit b6bedd4

Command Status Duration Result
nx affected --targets=test:sherif,test:knip,tes... ✅ Succeeded 7m 16s View ↗
nx run-many --target=build --exclude=examples/*... ✅ Succeeded 28s View ↗

☁️ Nx Cloud last updated this comment at 2026-11-06 20:27:48 UTC

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

🚀 Changeset Version Preview

4 package(s) bumped directly, 20 bumped as dependents.

🟨 Minor bumps

Package Version Reason
@tanstack/query-core 5.106.1 → 5.107.0 Changeset
@tanstack/solid-query-devtools 5.106.1 → 5.107.0 Changeset
@tanstack/svelte-query-devtools 6.3.11 → 6.4.0 Changeset
@tanstack/vue-query 5.106.1 → 5.107.0 Changeset
@tanstack/angular-query-experimental 5.106.1 → 5.107.0 Dependent
@tanstack/eslint-plugin-query 5.106.1 → 5.107.0 Dependent
@tanstack/preact-query 5.106.1 → 5.107.0 Dependent
@tanstack/preact-query-devtools 5.106.1 → 5.107.0 Dependent
@tanstack/preact-query-persist-client 5.106.1 → 5.107.0 Dependent
@tanstack/query-async-storage-persister 5.106.1 → 5.107.0 Dependent
@tanstack/query-broadcast-client-experimental 5.106.1 → 5.107.0 Dependent
@tanstack/query-devtools 5.106.1 → 5.107.0 Dependent
@tanstack/query-persist-client-core 5.106.1 → 5.107.0 Dependent
@tanstack/query-sync-storage-persister 5.106.1 → 5.107.0 Dependent
@tanstack/react-query 5.106.1 → 5.107.0 Dependent
@tanstack/react-query-devtools 5.106.1 → 5.107.0 Dependent
@tanstack/react-query-next-experimental 5.106.1 → 5.107.0 Dependent
@tanstack/react-query-persist-client 5.106.1 → 5.107.0 Dependent
@tanstack/solid-query 5.106.1 → 5.107.0 Dependent
@tanstack/solid-query-persist-client 5.106.1 → 5.107.0 Dependent
@tanstack/svelte-query 6.3.11 → 6.4.0 Dependent
@tanstack/svelte-query-persist-client 6.3.11 → 6.4.0 Dependent
@tanstack/vue-query-devtools 6.3.11 → 6.4.0 Dependent

🟩 Patch bumps

Package Version Reason
@tanstack/lit-query 0.2.36 → 0.2.37 Dependent

@TkDodo
TkDodo marked this pull request as ready for review November 6, 2026 20:18
@pkg-pr-new

pkg-pr-new Bot commented Nov 6, 2026

Copy link
Copy Markdown
More templates

@tanstack/angular-query-experimental

npm i https://pkg.pr.new/@tanstack/angular-query-experimental@12540

@tanstack/eslint-plugin-query

npm i https://pkg.pr.new/@tanstack/eslint-plugin-query@12540

@tanstack/lit-query

npm i https://pkg.pr.new/@tanstack/lit-query@12540

@tanstack/preact-query

npm i https://pkg.pr.new/@tanstack/preact-query@12540

@tanstack/preact-query-devtools

npm i https://pkg.pr.new/@tanstack/preact-query-devtools@12540

@tanstack/preact-query-persist-client

npm i https://pkg.pr.new/@tanstack/preact-query-persist-client@12540

@tanstack/query-async-storage-persister

npm i https://pkg.pr.new/@tanstack/query-async-storage-persister@12540

@tanstack/query-broadcast-client-experimental

npm i https://pkg.pr.new/@tanstack/query-broadcast-client-experimental@12540

@tanstack/query-core

npm i https://pkg.pr.new/@tanstack/query-core@12540

@tanstack/query-devtools

npm i https://pkg.pr.new/@tanstack/query-devtools@12540

@tanstack/query-persist-client-core

npm i https://pkg.pr.new/@tanstack/query-persist-client-core@12540

@tanstack/query-sync-storage-persister

npm i https://pkg.pr.new/@tanstack/query-sync-storage-persister@12540

@tanstack/react-query

npm i https://pkg.pr.new/@tanstack/react-query@12540

@tanstack/react-query-devtools

npm i https://pkg.pr.new/@tanstack/react-query-devtools@12540

@tanstack/react-query-next-experimental

npm i https://pkg.pr.new/@tanstack/react-query-next-experimental@12540

@tanstack/react-query-persist-client

npm i https://pkg.pr.new/@tanstack/react-query-persist-client@12540

@tanstack/solid-query

npm i https://pkg.pr.new/@tanstack/solid-query@12540

@tanstack/solid-query-devtools

npm i https://pkg.pr.new/@tanstack/solid-query-devtools@12540

@tanstack/solid-query-persist-client

npm i https://pkg.pr.new/@tanstack/solid-query-persist-client@12540

@tanstack/svelte-query

npm i https://pkg.pr.new/@tanstack/svelte-query@12540

@tanstack/svelte-query-devtools

npm i https://pkg.pr.new/@tanstack/svelte-query-devtools@12540

@tanstack/svelte-query-persist-client

npm i https://pkg.pr.new/@tanstack/svelte-query-persist-client@12540

@tanstack/vue-query

npm i https://pkg.pr.new/@tanstack/vue-query@12540

@tanstack/vue-query-devtools

npm i https://pkg.pr.new/@tanstack/vue-query-devtools@12540

commit: b6bedd4

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

Path Size
react full 11.85 KB (+0.11% 🔺)
react minimal 8.67 KB (+0.12% 🔺)

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.

Infinite render loop when a select function throws in v5.105.2+

1 participant