Skip to content

statistics: add global singleton estimation for sample-based NDV#67593

Merged
ti-chi-bot[bot] merged 21 commits intopingcap:masterfrom
0xPoe:poe-patch-sample-based-ndv-singleton
Apr 10, 2026
Merged

statistics: add global singleton estimation for sample-based NDV#67593
ti-chi-bot[bot] merged 21 commits intopingcap:masterfrom
0xPoe:poe-patch-sample-based-ndv-singleton

Conversation

@0xPoe
Copy link
Copy Markdown
Member

@0xPoe 0xPoe commented Apr 7, 2026

What problem does this PR solve?

Issue Number: ref #67449

Problem Summary:

Sample-based NDV collection needs a way to estimate how many sampled singleton values remain globally unique after data is merged across nodes.

What changed and how does it work?

  • Add EstimateGlobalSingletonBySketches to estimate globally unique singleton values by merging each node's singleton sketch against the union of the other nodes' NDV sketches.

Check List

Tests

  • Unit test
  • Integration test
  • Manual test (add detailed scripts or steps below)
  • No need to test
    • I checked and no code files have been changed.

Side effects

  • Performance regression: Consumes more CPU
  • Performance regression: Consumes more Memory
  • Breaking backward compatibility

Documentation

  • Affects user behaviors
  • Contains syntax changes
  • Contains variable changes
  • Contains experimental features
  • Changes MySQL compatibility

Release note

Please refer to Release Notes Language Style Guide to write a quality release note.

None

Summary by CodeRabbit

  • New Features

    • Added a sketch-based estimator to compute the global count of unique singleton values across distributed regions.
  • Tests

    • Added unit tests covering multi-node, single-node, disjoint, full-overlap, clamped-negative-contribution, nil-handling, and mismatched-input error cases.
  • Chores

    • Adjusted test sharding/parallel partitioning and included the new estimator tests in the test suite.

0xPoe added 3 commits April 7, 2026 09:19
Signed-off-by: 0xPoe <techregister@pm.me>
Signed-off-by: 0xPoe <techregister@pm.me>
Signed-off-by: 0xPoe <techregister@pm.me>
@ti-chi-bot
Copy link
Copy Markdown

ti-chi-bot Bot commented Apr 7, 2026

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@ti-chi-bot ti-chi-bot Bot added do-not-merge/needs-tests-checked do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. release-note-none Denotes a PR that doesn't merit a release note. labels Apr 7, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 7, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Added exported function EstimateGlobalSingletonBySketches to compute global singleton estimates from FM sketches, added unit tests for it, and updated the package test target in pkg/statistics/BUILD.bazel to include the new test file and increase shard_count from 43 to 44.

Changes

Cohort / File(s) Summary
Build Configuration
pkg/statistics/BUILD.bazel
Added estimate_test.go to statistics_test srcs and incremented shard_count from 43 to 44.
Estimation Logic
pkg/statistics/estimate.go
Added exported function EstimateGlobalSingletonBySketches(ndvSketches, singletonSketches []*FMSketch) uint64 with input validation, per-node "all except i" NDV reconstruction, clamped per-node deltas, and accumulation (O(k²) merge pattern).
Unit Tests
pkg/statistics/estimate_test.go
New tests covering multi-node, single-node, disjoint, full-overlap, and negative-contribution clamping; includes panic checks for invalid inputs and helpers to construct FMSketch instances.

Sequence Diagram(s)

(omitted)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested reviewers

  • time-and-fate
  • henrybw
  • terry1purcell

Poem

🐇 I hopped through sketches, counting bits with glee,
Merged neighbors, clamped negatives, then sipped chamomile tea.
Each node whispered secrets of carrots it had seen,
I tallied lonely munches and kept the meadow clean.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: adding global singleton estimation for sample-based NDV statistics.
Description check ✅ Passed The PR description includes the required Issue Number with proper format (ref #67449), a clear problem summary, explanation of changes, completed unit tests checkbox, and release notes section.
Docstring Coverage ✅ Passed Docstring coverage is 80.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

Comment @coderabbitai help to get the list of available commands and usage tips.

@ti-chi-bot ti-chi-bot Bot added component/statistics sig/planner SIG: Planner size/L Denotes a PR that changes 100-499 lines, ignoring generated files. labels Apr 7, 2026
@tiprow
Copy link
Copy Markdown

tiprow Bot commented Apr 7, 2026

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

Signed-off-by: 0xPoe <techregister@pm.me>
@0xPoe 0xPoe changed the title statistics: add global singleton estimation for sample-based NDV WIP: statistics: add global singleton estimation for sample-based NDV Apr 7, 2026
@0xPoe 0xPoe marked this pull request as ready for review April 7, 2026 09:32
@pantheon-ai
Copy link
Copy Markdown

pantheon-ai Bot commented Apr 7, 2026

@0xPoe I've received your pull request and will start the review. I'll conduct a thorough review covering code quality, potential issues, and implementation details.

⏳ This process typically takes 10-30 minutes depending on the complexity of the changes.

ℹ️ Learn more details on Pantheon AI.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
pkg/statistics/estimate.go (1)

119-156: Skip regions with nil singleton sketches to avoid unnecessary O(k) work.

At Line 119-156, when singletonSketches[i] == nil, contribution is always 0, so building other is wasted work. A fast-path continue trims needless merges without changing behavior.

♻️ Proposed refactor
 func EstimateGlobalSingletonBySketches(ndvSketches, singletonSketches []*FMSketch) uint64 {
@@
 	var globalSingleton int64
 	for i := range ndvSketches {
+		if singletonSketches[i] == nil {
+			// No local singleton contribution from this region.
+			continue
+		}
+
 		// Merge NDV sketches from all regions except region i.
 		var other *FMSketch
 		for j, ns := range ndvSketches {
@@
-		if other != nil {
-			if singletonSketches[i] != nil {
-				other.MergeFMSketch(singletonSketches[i])
-			}
-		} else if singletonSketches[i] != nil {
-			other = singletonSketches[i].Copy()
+		if other != nil {
+			other.MergeFMSketch(singletonSketches[i])
+		} else {
+			other = singletonSketches[i].Copy()
 		}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/statistics/estimate.go` around lines 119 - 156, The loop over ndvSketches
does unnecessary work when singletonSketches[i] is nil; add a fast-path at the
start of the loop to continue if singletonSketches[i] == nil so we skip
building/merging the `other` FMSketch for that region. Update the loop in the
function using ndvSketches/singletonSketches (references: ndvSketches,
singletonSketches, FMSketch, MergeFMSketch, NDV, globalSingleton) to check
singletonSketches[i] first and only perform the existing merging logic when a
non-nil singleton exists.
pkg/statistics/estimate_test.go (1)

148-160: Consider adding coverage for the non-assert fallback path (return 0).

Line 148-160 validates panic behavior, but the function also intentionally returns 0 for invalid input when assertions are not active. A small extra test for that path would make behavior guarantees clearer across build modes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/statistics/estimate_test.go` around lines 148 - 160, Add a test that
exercises the non-panic fallback of EstimateGlobalSingletonBySketches (returns 0
when inputs are invalid) by creating a separate test file compiled under a
custom build tag (e.g., //go:build noassert) so it runs in a build where
assertions are disabled; in that file implement
TestEstimateGlobalSingletonBySketches_Fallback which calls
EstimateGlobalSingletonBySketches(nil, nil) and asserts the result equals 0 (use
require.Equal), and document that the test is executed with go test -tags
noassert.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@pkg/statistics/estimate_test.go`:
- Around line 148-160: Add a test that exercises the non-panic fallback of
EstimateGlobalSingletonBySketches (returns 0 when inputs are invalid) by
creating a separate test file compiled under a custom build tag (e.g.,
//go:build noassert) so it runs in a build where assertions are disabled; in
that file implement TestEstimateGlobalSingletonBySketches_Fallback which calls
EstimateGlobalSingletonBySketches(nil, nil) and asserts the result equals 0 (use
require.Equal), and document that the test is executed with go test -tags
noassert.

In `@pkg/statistics/estimate.go`:
- Around line 119-156: The loop over ndvSketches does unnecessary work when
singletonSketches[i] is nil; add a fast-path at the start of the loop to
continue if singletonSketches[i] == nil so we skip building/merging the `other`
FMSketch for that region. Update the loop in the function using
ndvSketches/singletonSketches (references: ndvSketches, singletonSketches,
FMSketch, MergeFMSketch, NDV, globalSingleton) to check singletonSketches[i]
first and only perform the existing merging logic when a non-nil singleton
exists.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 5ae4a6e0-710e-41eb-945d-e1d3da38334c

📥 Commits

Reviewing files that changed from the base of the PR and between 6f4dd4f and d3076a0.

📒 Files selected for processing (3)
  • pkg/statistics/BUILD.bazel
  • pkg/statistics/estimate.go
  • pkg/statistics/estimate_test.go

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 7, 2026

Codecov Report

❌ Patch coverage is 97.01493% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 78.3342%. Comparing base (9d84567) to head (35b6a87).
⚠️ Report is 27 commits behind head on master.

Additional details and impacted files
@@               Coverage Diff                @@
##             master     #67593        +/-   ##
================================================
+ Coverage   77.6342%   78.3342%   +0.7000%     
================================================
  Files          1961       1974        +13     
  Lines        543867     552850      +8983     
================================================
+ Hits         422227     433071     +10844     
+ Misses       120830     119300      -1530     
+ Partials        810        479       -331     
Flag Coverage Δ
integration 43.7959% <0.0000%> (+9.4654%) ⬆️
unit 76.7040% <97.0149%> (+0.3216%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
dumpling 61.5065% <ø> (ø)
parser ∅ <ø> (∅)
br 50.3924% <ø> (-9.9456%) ⬇️
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@0xPoe
Copy link
Copy Markdown
Member Author

0xPoe commented Apr 7, 2026

/retest

0xPoe added 2 commits April 7, 2026 18:06
The algorithm is not region-specific; use the more general term "node"
to describe each partition that contributes local sketches.
Signed-off-by: 0xPoe <techregister@pm.me>
Copy link
Copy Markdown
Member Author

@0xPoe 0xPoe left a comment

Choose a reason for hiding this comment

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

🔢 Self-check (PR reviewed by myself and ready for feedback)

  • Code compiles successfully

  • Unit tests added

  • No AI-generated elegant nonsense in PR.

  • Bazel files updated

  • Comments added where necessary

  • PR title and description updated

  • Documentation PR created (or confirmed not needed)

  • PR size is reasonable

/cc @time-and-fate @mjonss

Comment thread pkg/statistics/estimate.go Outdated
@ti-chi-bot ti-chi-bot Bot requested review from mjonss and time-and-fate April 7, 2026 16:18
@0xPoe 0xPoe changed the title WIP: statistics: add global singleton estimation for sample-based NDV statistics: add global singleton estimation for sample-based NDV Apr 7, 2026
@ti-chi-bot ti-chi-bot Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Apr 7, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
pkg/statistics/estimate.go (1)

157-161: Consider whether negative globalSingleton indicates a bug.

The clamping to 0 silently handles cases where FM sketch estimation errors cause ndvUnion - ndvOther < 0. This is reasonable for probabilistic sketches, but you might want to add a brief comment explaining why this can happen (sketch approximation errors) to avoid future confusion.

📝 Optional: Add clarifying comment
+	// FM sketch estimates can have approximation errors; if the sum goes
+	// negative, clamp to zero.
 	if globalSingleton < 0 {
 		return 0
 	}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/statistics/estimate.go` around lines 157 - 161, The code currently clamps
negative globalSingleton to zero in the function returning
uint64(globalSingleton); add a brief clarifying comment immediately above this
check explaining that negative values can arise from probabilistic sketch
estimation error (e.g., FM sketch where ndvUnion - ndvOther may be slightly
negative) and that clamping to 0 is intentional to avoid returning a negative
count; reference the variable name globalSingleton and the surrounding logic
that computes ndvUnion/ndvOther so future readers understand this is an
approximation artifact, not a real negative cardinality.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@pkg/statistics/estimate.go`:
- Around line 157-161: The code currently clamps negative globalSingleton to
zero in the function returning uint64(globalSingleton); add a brief clarifying
comment immediately above this check explaining that negative values can arise
from probabilistic sketch estimation error (e.g., FM sketch where ndvUnion -
ndvOther may be slightly negative) and that clamping to 0 is intentional to
avoid returning a negative count; reference the variable name globalSingleton
and the surrounding logic that computes ndvUnion/ndvOther so future readers
understand this is an approximation artifact, not a real negative cardinality.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 4e46169a-3fce-4c20-90f5-e69a16e2f8fa

📥 Commits

Reviewing files that changed from the base of the PR and between d3076a0 and 012a6f5.

📒 Files selected for processing (2)
  • pkg/statistics/estimate.go
  • pkg/statistics/estimate_test.go

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
pkg/statistics/estimate.go (1)

111-120: Defensive nil-entry handling is incomplete.

The intest.Assert calls on lines 113-116 enforce that nil entries are disallowed, but the defensive runtime checks (lines 118-120) only cover empty slices and length mismatches—not nil entries. This means:

  • In test builds (with intest enabled): nil entries panic immediately.
  • In production builds: nil entries are silently skipped in the loop (lines 127, 148, 151), potentially masking caller bugs.

Consider adding a defensive runtime check that returns 0 (or logs a warning) if any entry is nil, to match the assertion intent and maintain consistent behavior across build modes.

💡 Optional fix to add defensive nil-entry check
 	// Defensive checks.
 	if len(ndvSketches) == 0 || len(ndvSketches) != len(singletonSketches) {
 		return 0
 	}
+	for i := range ndvSketches {
+		if ndvSketches[i] == nil || singletonSketches[i] == nil {
+			return 0
+		}
+	}

If this is added, the nil checks on lines 127, 148, and 151 become truly unreachable (dead code) and could be simplified, though keeping them as extra defense-in-depth is also acceptable.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/statistics/estimate.go` around lines 111 - 120, The code currently
asserts that ndvSketches and singletonSketches contain no nil entries via
intest.Assert, but the runtime defensive checks only handle empty slices and
length mismatches; add an explicit runtime nil-entry check over ndvSketches and
singletonSketches (iterate and if any element is nil) and return 0 (or log and
return 0) to mirror the assertion behavior for production builds; update any
later branches in the same function that check for nil entries (e.g., the checks
around the loops referencing ndvSketches[i] and singletonSketches[i]) as they
become unreachable or can be simplified after this new guard.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@pkg/statistics/estimate.go`:
- Around line 111-120: The code currently asserts that ndvSketches and
singletonSketches contain no nil entries via intest.Assert, but the runtime
defensive checks only handle empty slices and length mismatches; add an explicit
runtime nil-entry check over ndvSketches and singletonSketches (iterate and if
any element is nil) and return 0 (or log and return 0) to mirror the assertion
behavior for production builds; update any later branches in the same function
that check for nil entries (e.g., the checks around the loops referencing
ndvSketches[i] and singletonSketches[i]) as they become unreachable or can be
simplified after this new guard.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1bc16bca-1c5c-4040-be59-fcf5e17a3be4

📥 Commits

Reviewing files that changed from the base of the PR and between 012a6f5 and 7b1b938.

📒 Files selected for processing (2)
  • pkg/statistics/estimate.go
  • pkg/statistics/estimate_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • pkg/statistics/estimate_test.go

Comment thread pkg/statistics/estimate.go Outdated
// Summing these per-node contributions gives the global singleton estimate.
//
// The current implementation rebuilds "all except i" from scratch for each
// node, which is O(k²) in the number of nodes. A prefix-suffix approach
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

For now, I believe because we don't really do real sampling, if I understand correctly, the number of sketches we get from TiKV equals the region numbers of the tables.

Because the region becomes bigger and bigger, I think the current performance would be acceptable, but we do need to re-evaluate in the future if we really want to do some random key range sampling specified within the coprocessor requests. For now, I think it would be good enough.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

So, if I understand correctly, there are sketches for all distinct values in the samples, which is needed for evaluating if a local singleton would add to the global singleton? I.e. not the nice feature of an FMSketch, where only a fixed level of distinct values are kept.

If so, then why not simply have a map[<column value or hash of column value>]uint64 directly then?
so if there are very few distinct values, the memory is small, and if all distinct values it will grow to the number of samples?
Easy to merge (and one can even delete from it) and you can just iterate over it once to see global singletons.

Even if we would re-use FMSketches for f1 values, we could add a counter to the FMSketch, to see if the 'survived' values was singletons or not. Maybe we could simply use that for TopN and Histograms as well as a unified model somehow? (we most likely would need to store the full column value for that, but that would replace the sample anyway, so nothing extra to be stored, but rather limited to a single copy of each distinct value. Not sure how correlation is calculated though).

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

So, if I understand correctly, there are sketches for all distinct values in the samples, which is needed for evaluating if a local singleton would add to the global singleton? I.e. not the nice feature of an FMSketch, where only a fixed level of distinct values are kept.

No, we do use that feature. The single value remains the estimated value. We couldn't send all values back; for example, if the column contains almost unique values. In that case, for a table with 1 billion entries, we would need to send back 50 million hash values. Therefore, we have to use the FM sketch here.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

OK, so will it be two sets, one for singletons and one for multiton (> 1 entry)?
Why not generalize it to instead of a set (or map without value) be a map with bool multipleValues (false for singleton, true for multiton). Not sure if that would save much space or processing though :) Feel free to ignore, it is mostly for my understanding.

Copy link
Copy Markdown
Member Author

@0xPoe 0xPoe Apr 8, 2026

Choose a reason for hiding this comment

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

OK, so will it be two sets, one for singletons and one for multiton (> 1 entry)?
Why not generalize it to instead of a set (or map without value) be a map with bool multipleValues (false for singleton, true for multiton). Not sure if that would save much space or processing though :) Feel free to ignore, it is mostly for my understanding.

Yes, we can do that.

This calculation is on the TiKV side. I assume this is not related to the FMSketch itself?

Copy link
Copy Markdown
Contributor

@mjonss mjonss left a comment

Choose a reason for hiding this comment

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

LGTM

@ti-chi-bot ti-chi-bot Bot added approved needs-1-more-lgtm Indicates a PR needs 1 more LGTM. labels Apr 8, 2026
Copy link
Copy Markdown
Member

@time-and-fate time-and-fate left a comment

Choose a reason for hiding this comment

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

Others LGTM.

Comment thread pkg/statistics/estimate.go Outdated
Comment thread pkg/statistics/estimate.go Outdated
Comment thread pkg/statistics/estimate.go Outdated
Comment thread pkg/statistics/estimate.go Outdated
0xPoe added 5 commits April 9, 2026 09:38
Signed-off-by: 0xPoe <techregister@pm.me>
Signed-off-by: 0xPoe <techregister@pm.me>
Signed-off-by: 0xPoe <techregister@pm.me>
Signed-off-by: 0xPoe <techregister@pm.me>
Signed-off-by: 0xPoe <techregister@pm.me>
Copy link
Copy Markdown
Member Author

@0xPoe 0xPoe left a comment

Choose a reason for hiding this comment

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

🔢 Self-check (PR reviewed by myself and ready for feedback)

@0xPoe 0xPoe requested a review from time-and-fate April 9, 2026 07:59
@ti-chi-bot
Copy link
Copy Markdown

ti-chi-bot Bot commented Apr 9, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: mjonss, time-and-fate

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@ti-chi-bot ti-chi-bot Bot added lgtm and removed needs-1-more-lgtm Indicates a PR needs 1 more LGTM. labels Apr 9, 2026
@ti-chi-bot
Copy link
Copy Markdown

ti-chi-bot Bot commented Apr 9, 2026

[LGTM Timeline notifier]

Timeline:

  • 2026-04-08 17:21:43.589683139 +0000 UTC m=+976908.795043196: ☑️ agreed by mjonss.
  • 2026-04-09 11:55:46.423385954 +0000 UTC m=+1043751.628746011: ☑️ agreed by time-and-fate.

@0xPoe
Copy link
Copy Markdown
Member Author

0xPoe commented Apr 9, 2026

/test all

@0xTars
Copy link
Copy Markdown

0xTars commented Apr 9, 2026

/retest

9 similar comments
@0xTars
Copy link
Copy Markdown

0xTars commented Apr 10, 2026

/retest

@0xTars
Copy link
Copy Markdown

0xTars commented Apr 10, 2026

/retest

@0xTars
Copy link
Copy Markdown

0xTars commented Apr 10, 2026

/retest

@0xTars
Copy link
Copy Markdown

0xTars commented Apr 10, 2026

/retest

@0xTars
Copy link
Copy Markdown

0xTars commented Apr 10, 2026

/retest

@0xTars
Copy link
Copy Markdown

0xTars commented Apr 10, 2026

/retest

@0xTars
Copy link
Copy Markdown

0xTars commented Apr 10, 2026

/retest

@0xTars
Copy link
Copy Markdown

0xTars commented Apr 10, 2026

/retest

@0xTars
Copy link
Copy Markdown

0xTars commented Apr 10, 2026

/retest

@ti-chi-bot ti-chi-bot Bot merged commit 8c843f6 into pingcap:master Apr 10, 2026
36 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved component/statistics lgtm release-note-none Denotes a PR that doesn't merit a release note. sig/planner SIG: Planner size/XL Denotes a PR that changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants