planner: index pruning using existing infra (#64999) | tidb-test=pr/2760 - #69009
Conversation
|
Hi @qw4990. Thanks for your PR. PRs from untrusted users cannot be marked as trusted with I understand the commands that are listed here. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds a configurable index-pruning pipeline: collect per-DataSource "interesting" columns from predicates/joins/orders, rank and prune index access paths with a two-phase diversity-aware selector, propagate AllPossibleAccessPaths through planner rules, and avoid loading stats for pruned indexes. ChangesIndex Pruning Feature
Sequence DiagramsequenceDiagram
participant Optimizer as CollectPredicateColumnsPoint.Optimize
participant DS as logicalop.DataSource
participant Rule as rule.PruneIndexesByWhereAndOrder
participant Sync as collectSyncIndices
Optimizer->>DS: read AllPossibleAccessPaths & InterestingColumns
Optimizer->>Rule: request pruning (threshold, interesting cols)
Rule-->>Optimizer: return kept index IDs
Optimizer->>Sync: pass keptIndexIDs
Sync->>Sync: filter sync index stats by kept IDs
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## release-8.5 #69009 +/- ##
================================================
Coverage ? 55.2158%
================================================
Files ? 1829
Lines ? 660474
Branches ? 0
================================================
Hits ? 364686
Misses ? 268664
Partials ? 27124
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (1)
pkg/planner/core/rule_collect_plan_stats.go (1)
268-285: Keepds.AllPossibleAccessPaths = prunedPaths—it’s intentional for static pruning + stats loading
The overwrite inCollectPredicateColumnsPointis consistent with the current design:pkg/planner/core/stats.goexplicitly states index pruning is done earlier inCollectPredicateColumnsPointto avoid loading stats for pruned indexes, and the stats derivation usesds.AllPossibleAccessPaths(e.g.,fillIndexPathandderiveStatsByFilter). Keeping the full pre-pruning set here would undermine that goal, so the proposed diff should not be applied.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@pkg/planner/core/rule_collect_plan_stats.go` around lines 268 - 285, The overwrite of ds.AllPossibleAccessPaths with prunedPaths is intentional and must remain—revert any change that attempted to preserve the pre-pruned full set; keep the current logic in this block: merge per-physical-table kept indexes into keptIndexIDs (using the existingKeptIndexes union logic), then set ds.AllPossibleAccessPaths = prunedPaths and copy into ds.PossibleAccessPaths (as done now) so downstream routines like CollectPredicateColumnsPoint, fillIndexPath, and deriveStatsByFilter operate on the pruned index set and avoid loading stats for pruned indexes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@pkg/planner/core/rule/rule_prune_indexes.go`:
- Around line 133-135: The pruning pass is using the possibly-stale
path.IsSingleScan field (set only when path.FullIdxCols != nil) which can be
overwritten later in stats recompute; update the code in rule_prune_indexes.go
to compute the single-scan decision locally from finalized path metadata instead
of reading path.IsSingleScan (or remove use of IsSingleScan in this pass).
Concretely, where you call ds.IsSingleScan(path.FullIdxCols,
path.FullIdxColLens) or read path.IsSingleScan to admit/rank candidates, invoke
ds.IsSingleScan with the finalized FullIdxCols/FullIdxColLens (or equivalent
finalized column info from the path) into a local bool (e.g., localIsSingleScan)
and use that within the pruning logic rather than mutating or depending on
path.IsSingleScan; ensure all other spots noted (the other blocks around the
ranges mentioned) follow the same pattern so pruning uses the computed local
value not the path field.
- Around line 42-43: The ordering diversity key currently only stores column IDs
(consecutiveColumnIDs) so different directions collapse; change the ordering
signature to include the per-column Desc bit (e.g., replace consecutiveColumnIDs
[]int64 with a slice that encodes both ID and Desc — either a small struct {ID
int64; Desc bool} or pack Desc into an unsigned int/bit of an int64) and update
all code paths that build, compare, and hash that signature (the struct fields
interestingCount and consecutiveColumnIDs and any helper that generates the
ordering key) so the Desc bit is carried into the ordering key; apply the same
change to the other places referenced in the file (the code around the other
signature constructions and comparisons) so pruning uses ID+direction rather
than ID alone.
In `@pkg/sessionctx/variable/sysvar.go`:
- Around line 298-301: The TiDBOptIndexPruneThreshold sysvar is stored to
s.OptIndexPruneThreshold but wasn't marked as hint-updatable or wired into the
SET_VAR()/hint affect plumbing; update the sysvar entry for
TiDBOptIndexPruneThreshold in pkg/sessionctx/variable/sysvar.go to set
IsHintUpdatableVerified=true and then add the corresponding wiring in
pkg/sessionctx/variable/setvar_affect.go so SET_VAR()/optimizer hint paths
recognize and update OptIndexPruneThreshold (follow the pattern used by other
hint-updatable int sysvars: register the mapping from the sysvar name
TiDBOptIndexPruneThreshold to the session field OptIndexPruneThreshold and
ensure the applyHint/update logic handles its value conversion and bounds
checks).
---
Nitpick comments:
In `@pkg/planner/core/rule_collect_plan_stats.go`:
- Around line 268-285: The overwrite of ds.AllPossibleAccessPaths with
prunedPaths is intentional and must remain—revert any change that attempted to
preserve the pre-pruned full set; keep the current logic in this block: merge
per-physical-table kept indexes into keptIndexIDs (using the existingKeptIndexes
union logic), then set ds.AllPossibleAccessPaths = prunedPaths and copy into
ds.PossibleAccessPaths (as done now) so downstream routines like
CollectPredicateColumnsPoint, fillIndexPath, and deriveStatsByFilter operate on
the pruned index set and avoid loading stats for pruned indexes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: a32a09ab-fa88-46e9-b156-1815f14a1399
📒 Files selected for processing (19)
pkg/planner/core/collect_column_stats_usage.gopkg/planner/core/find_best_task.gopkg/planner/core/logical_plan_builder.gopkg/planner/core/operator/logicalop/logical_datasource.gopkg/planner/core/operator/logicalop/logical_index_scan.gopkg/planner/core/operator/logicalop/logical_plans_misc.gopkg/planner/core/rule/rule_prune_indexes.gopkg/planner/core/rule_collect_plan_stats.gopkg/planner/core/rule_derive_topn_from_window.gopkg/planner/core/rule_generate_column_substitute.gopkg/planner/core/rule_join_elimination.gopkg/planner/core/rule_max_min_eliminate.gopkg/planner/core/rule_partition_processor.gopkg/planner/core/rule_predicate_push_down.gopkg/planner/core/stats.gopkg/sessionctx/variable/session.gopkg/sessionctx/variable/setvar_affect.gopkg/sessionctx/variable/sysvar.gopkg/sessionctx/variable/tidb_vars.go
| interestingCount int // Total number of interesting columns covered | ||
| consecutiveColumnIDs []int64 // IDs of consecutive columns (for detecting different orderings) |
There was a problem hiding this comment.
Include index direction in the ordering key.
The diversity key only records column IDs, so (a, b) and (a DESC, b DESC) collapse to the same ordering. Phase 2 can then prune the only path that satisfies a DESC requirement even though later property matching distinguishes direction. Please carry the per-column Desc bit in the signature you use for ordering diversity.
Also applies to: 221-236, 484-490
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@pkg/planner/core/rule/rule_prune_indexes.go` around lines 42 - 43, The
ordering diversity key currently only stores column IDs (consecutiveColumnIDs)
so different directions collapse; change the ordering signature to include the
per-column Desc bit (e.g., replace consecutiveColumnIDs []int64 with a slice
that encodes both ID and Desc — either a small struct {ID int64; Desc bool} or
pack Desc into an unsigned int/bit of an int64) and update all code paths that
build, compare, and hash that signature (the struct fields interestingCount and
consecutiveColumnIDs and any helper that generates the ordering key) so the Desc
bit is carried into the ordering key; apply the same change to the other places
referenced in the file (the code around the other signature constructions and
comparisons) so pruning uses ID+direction rather than ID alone.
| if path.FullIdxCols != nil { | ||
| path.IsSingleScan = ds.IsSingleScan(path.FullIdxCols, path.FullIdxColLens) | ||
| } |
There was a problem hiding this comment.
Don't prune on a stale IsSingleScan bit.
This function uses path.IsSingleScan to both admit and rank candidates, but it only populates that field opportunistically when FullIdxCols != nil. The later recompute in pkg/planner/core/stats.go means the value is not stable here, so a genuinely covering index can already be under-scored or excluded before that fix runs. Compute single-scan locally from finalized path metadata, or stop using it in this pruning pass.
Also applies to: 172-185, 303-321
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@pkg/planner/core/rule/rule_prune_indexes.go` around lines 133 - 135, The
pruning pass is using the possibly-stale path.IsSingleScan field (set only when
path.FullIdxCols != nil) which can be overwritten later in stats recompute;
update the code in rule_prune_indexes.go to compute the single-scan decision
locally from finalized path metadata instead of reading path.IsSingleScan (or
remove use of IsSingleScan in this pass). Concretely, where you call
ds.IsSingleScan(path.FullIdxCols, path.FullIdxColLens) or read path.IsSingleScan
to admit/rank candidates, invoke ds.IsSingleScan with the finalized
FullIdxCols/FullIdxColLens (or equivalent finalized column info from the path)
into a local bool (e.g., localIsSingleScan) and use that within the pruning
logic rather than mutating or depending on path.IsSingleScan; ensure all other
spots noted (the other blocks around the ranges mentioned) follow the same
pattern so pruning uses the computed local value not the path field.
| {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptIndexPruneThreshold, Value: strconv.Itoa(DefTiDBOptIndexPruneThreshold), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt32, SetSession: func(s *SessionVars, val string) error { | ||
| s.OptIndexPruneThreshold = TidbOptInt(val, DefTiDBOptIndexPruneThreshold) | ||
| return nil | ||
| }}, |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify hint-update plumbing for TiDBOptIndexPruneThreshold across related files.
set -euo pipefail
echo "== Sysvar definition =="
rg -n -C3 'TiDBOptIndexPruneThreshold|OptIndexPruneThreshold' pkg/sessionctx/variable/sysvar.go
echo
echo "== Sysvar name/default declarations =="
rg -n -C3 'TiDBOptIndexPruneThreshold|DefTiDBOptIndexPruneThreshold' pkg/sessionctx/variable/tidb_vars.go pkg/sessionctx/variable/session.go
echo
echo "== Hint/setvar affect registration =="
rg -n -C4 'TiDBOptIndexPruneThreshold|OptIndexPruneThreshold' pkg/sessionctx/variable/setvar_affect.go
echo
echo "== Any IsHintUpdatableVerified usage for this var =="
rg -n -C3 'TiDBOptIndexPruneThreshold.*IsHintUpdatableVerified|IsHintUpdatableVerified.*TiDBOptIndexPruneThreshold' pkg/sessionctx/variable/sysvar.go pkg/sessionctx/variable/setvar_affect.goRepository: pingcap/tidb
Length of output: 3074
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== All occurrences in pkg/sessionctx/variable =="
rg -n --hidden --no-ignore-vcs 'OptIndexPruneThreshold|TiDBOptIndexPruneThreshold' pkg/sessionctx/variable || true
echo
echo "== setvar_affect candidates =="
rg -n --hidden --no-ignore-vcs 'setvar|affect|hint|IsHintUpdatable' pkg/sessionctx/variable/setvar_affect.go || true
echo
echo "== All occurrences of IsHintUpdatableVerified and TiDBOptIndexPruneThreshold =="
rg -n --hidden --no-ignore-vcs 'IsHintUpdatableVerified' pkg/sessionctx/variable || true
echo
echo "== Cross-check for setvar-affect wiring elsewhere in repo =="
rg -n --hidden --no-ignore-vcs 'OptIndexPruneThreshold|TiDBOptIndexPruneThreshold' pkg | head -n 200 || true
echo
echo "== Cross-check for any generic hint update plumbing touching optimizer vars =="
rg -n --hidden --no-ignore-vcs 'IsHintUpdatableVerified|IsHintUpdatable|hint.*setvar|setvar.*hint|affect.*setvar' pkg/sessionctx/variable pkg/planner pkg/executor pkg/session | head -n 200 || trueRepository: pingcap/tidb
Length of output: 9293
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== All occurrences in pkg/sessionctx/variable =="
rg -n --hidden --no-ignore-vcs 'OptIndexPruneThreshold|TiDBOptIndexPruneThreshold' pkg/sessionctx/variable || true
echo
echo "== setvar_affect candidates =="
rg -n --hidden --no-ignore-vcs 'setvar|affect|hint|IsHintUpdatable' pkg/sessionctx/variable/setvar_affect.go || true
echo
echo "== All occurrences of IsHintUpdatableVerified and TiDBOptIndexPruneThreshold =="
rg -n --hidden --no-ignore-vcs 'IsHintUpdatableVerified' pkg/sessionctx/variable || true
echo
echo "== Cross-check for setvar-affect wiring elsewhere in repo =="
rg -n --hidden --no-ignore-vcs 'OptIndexPruneThreshold|TiDBOptIndexPruneThreshold' pkg | head -n 200 || true
echo
echo "== Cross-check for any generic hint update plumbing touching optimizer vars =="
rg -n --hidden --no-ignore-vcs 'IsHintUpdatableVerified|IsHintUpdatable|hint.*setvar|setvar.*hint|affect.*setvar' pkg/sessionctx/variable pkg/planner pkg/executor pkg/session | head -n 200 || trueRepository: pingcap/tidb
Length of output: 9293
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== All occurrences in pkg/sessionctx/variable =="
rg -n --hidden --no-ignore-vcs 'OptIndexPruneThreshold|TiDBOptIndexPruneThreshold' pkg/sessionctx/variable || true
echo
echo "== setvar_affect candidates =="
rg -n --hidden --no-ignore-vcs 'setvar|affect|hint|IsHintUpdatable' pkg/sessionctx/variable/setvar_affect.go || true
echo
echo "== All occurrences of IsHintUpdatableVerified and TiDBOptIndexPruneThreshold =="
rg -n --hidden --no-ignore-vcs 'IsHintUpdatableVerified' pkg/sessionctx/variable || true
echo
echo "== Cross-check for setvar-affect wiring elsewhere in repo =="
rg -n --hidden --no-ignore-vcs 'OptIndexPruneThreshold|TiDBOptIndexPruneThreshold' pkg | head -n 200 || true
echo
echo "== Cross-check for any generic hint update plumbing touching optimizer vars =="
rg -n --hidden --no-ignore-vcs 'IsHintUpdatableVerified|IsHintUpdatable|hint.*setvar|setvar.*hint|affect.*setvar' pkg/sessionctx/variable pkg/planner pkg/executor pkg/session | head -n 200 || trueRepository: pingcap/tidb
Length of output: 9293
Wire TiDBOptIndexPruneThreshold into SET_VAR()/hint affect plumbing
TiDBOptIndexPruneThreshold is registered in pkg/sessionctx/variable/sysvar.go (ScopeGlobal|ScopeSession) and stored via s.OptIndexPruneThreshold, but its sysvar entry does not set IsHintUpdatableVerified, and there are no references to TiDBOptIndexPruneThreshold/OptIndexPruneThreshold in pkg/sessionctx/variable/setvar_affect.go. Add the missing affect/hint-update wiring (and mark IsHintUpdatableVerified appropriately) so optimizer hints can update this variable as intended.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@pkg/sessionctx/variable/sysvar.go` around lines 298 - 301, The
TiDBOptIndexPruneThreshold sysvar is stored to s.OptIndexPruneThreshold but
wasn't marked as hint-updatable or wired into the SET_VAR()/hint affect
plumbing; update the sysvar entry for TiDBOptIndexPruneThreshold in
pkg/sessionctx/variable/sysvar.go to set IsHintUpdatableVerified=true and then
add the corresponding wiring in pkg/sessionctx/variable/setvar_affect.go so
SET_VAR()/optimizer hint paths recognize and update OptIndexPruneThreshold
(follow the pattern used by other hint-updatable int sysvars: register the
mapping from the sysvar name TiDBOptIndexPruneThreshold to the session field
OptIndexPruneThreshold and ensure the applyHint/update logic handles its value
conversion and bounds checks).
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@tests/integrationtest/r/planner/core/plan.result`:
- Line 106: The planner shows nondeterministic selection between equivalent
indexes (seen as IndexRangeScan using index:k2 vs index:k1), indicating unstable
candidate ordering in the index ranking/pruning phase; update the index
selection logic (the index ranking/pruning codepath) to enforce a deterministic
tie-break after existing score and path-type comparisons by comparing a stable
identifier (e.g., index ID or name) to break ties so identical SQL always yields
the same chosen index (e.g., consistently prefer the smaller index ID or
lexicographically smaller name).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 126c11ff-7628-4198-9346-823bb3e2f3ea
📒 Files selected for processing (5)
tests/integrationtest/r/clustered_index.resulttests/integrationtest/r/imdbload.resulttests/integrationtest/r/index_merge.resulttests/integrationtest/r/planner/core/casetest/integration.resulttests/integrationtest/r/planner/core/plan.result
💤 Files with no reviewable changes (1)
- tests/integrationtest/r/planner/core/casetest/integration.result
✅ Files skipped from review due to trivial changes (1)
- tests/integrationtest/r/imdbload.result
| Projection 0.10 root planner__core__plan.tt.a, planner__core__plan.tt.b | ||
| └─IndexLookUp 0.10 root | ||
| ├─IndexRangeScan(Build) 0.10 cop[tikv] table:tt, index:k1(`a` + 1, b) range:[5 3,5 3], keep order:false, stats:pseudo | ||
| ├─IndexRangeScan(Build) 0.10 cop[tikv] table:tt, index:k2(`a` + 1, b) range:[5 3,5 3], keep order:false, stats:pseudo |
There was a problem hiding this comment.
Stabilize tie-break for equivalent indexes to avoid nondeterministic plans.
Line 106 picks index:k2(...), while the same statement in nearby repeated blocks still picks index:k1(...). For identical SQL in a single fixture, this one-off divergence strongly suggests unstable candidate ordering in index ranking/pruning. Please enforce a deterministic final tie-break (for example by index ID/name after score/path-type comparison) so repeated planning yields the same winner.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@tests/integrationtest/r/planner/core/plan.result` at line 106, The planner
shows nondeterministic selection between equivalent indexes (seen as
IndexRangeScan using index:k2 vs index:k1), indicating unstable candidate
ordering in the index ranking/pruning phase; update the index selection logic
(the index ranking/pruning codepath) to enforce a deterministic tie-break after
existing score and path-type comparisons by comparing a stable identifier (e.g.,
index ID or name) to break ties so identical SQL always yields the same chosen
index (e.g., consistently prefer the smaller index ID or lexicographically
smaller name).
There was a problem hiding this comment.
🧹 Nitpick comments (1)
pkg/planner/core/stats_test.go (1)
305-308: 💤 Low valueConsider using flag constants instead of magic bit positions.
The hardcoded bit shifts
(1 << 15)and(1 << 19)are fragile—if the optimizer flag enum is reordered, this test will silently break. Consider importing and using the actual flag constants if they're accessible from the test package, or adding a brief comment noting which source file defines these positions to aid future maintenance.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@pkg/planner/core/stats_test.go` around lines 305 - 308, Replace the magic bit shifts in the test where optFlag |= (1 << 15) and optFlag |= (1 << 19) with the actual optimizer flag constants (e.g., FlagCollectPredicateColumnsPoint and FlagSyncWaitStatsLoadPoint) imported from the package that defines the optimizer flags; update the test to reference those constant names when setting optFlag (or, if those constants are not accessible from this test package, add a brief comment pointing to the source file that defines the enum/bit positions and define local constants with the exact names to avoid fragile magic numbers). Ensure you update the lines that currently reference optFlag to use the named constants so future enum reorders won’t silently break.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@pkg/planner/core/stats_test.go`:
- Around line 305-308: Replace the magic bit shifts in the test where optFlag |=
(1 << 15) and optFlag |= (1 << 19) with the actual optimizer flag constants
(e.g., FlagCollectPredicateColumnsPoint and FlagSyncWaitStatsLoadPoint) imported
from the package that defines the optimizer flags; update the test to reference
those constant names when setting optFlag (or, if those constants are not
accessible from this test package, add a brief comment pointing to the source
file that defines the enum/bit positions and define local constants with the
exact names to avoid fragile magic numbers). Ensure you update the lines that
currently reference optFlag to use the named constants so future enum reorders
won’t silently break.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 4e175012-63ee-42b5-ad26-198c1f1bb4d9
📒 Files selected for processing (3)
pkg/planner/core/stats_test.gopkg/sessionctx/variable/varsutil_test.gopkg/statistics/handle/handletest/handle_test.go
|
/retest |
|
@qw4990: PRs from untrusted users cannot be marked as trusted with DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
|
/ok-to-test |
|
/retest |
1 similar comment
|
/retest |
|
/retest |
|
/test unit-test |
|
@qw4990: The specified target(s) for Use DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
|
/test mysql-test |
|
@qw4990: The specified target(s) for Use DetailsIn response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. |
0xPoe
left a comment
There was a problem hiding this comment.
AskedColumnGroup [][]*expression.Column is never used.
|
/hold Feel free to unhold once we address #69009 (review), or we could ignore it. |
|
/unhold |
|
/retest |
1 similar comment
|
/retest |
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: 0xPoe, terry1purcell The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
[LGTM Timeline notifier]Timeline:
|
This is an automated cherry-pick of #64999
What problem does this PR solve?
Issue Number: close #63856
Problem Summary:
What changed and how does it work?
Prior PR title:
planner: index pruning using existing infra | tidb-test=pr/2661
Latest commit results in no mysql test changes.
Check List
Tests
Side effects
Documentation
Release note
Please refer to Release Notes Language Style Guide to write a quality release note.
Summary by CodeRabbit
New Features
Improvements
Tests