Skip to content

planner: support more null-reject cases in plan cache - #66992

Closed
Reminiscent wants to merge 3 commits into
pingcap:masterfrom
Reminiscent:codex/null-reject-plan-cache
Closed

planner: support more null-reject cases in plan cache#66992
Reminiscent wants to merge 3 commits into
pingcap:masterfrom
Reminiscent:codex/null-reject-plan-cache

Conversation

@Reminiscent

@Reminiscent Reminiscent commented Mar 13, 2026

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Issue Number: TBD

Problem Summary:
TBD

What changed and how does it work?

TBD

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

  • Tests

    • Expanded test coverage for the prepared plan cache, including many parameterized prepared-statement scenarios, null-reject behavior, partial-index interactions, and edge cases.
  • Bug Fixes

    • Improved null-rejection handling for plan caching to avoid unsafe cache usage across complex SQL constructs and parameter patterns.
  • Refactor

    • Streamlined internal null-rejection evaluation to a more conservative, plan-cache-aware approach.

@ti-chi-bot ti-chi-bot Bot added do-not-merge/needs-linked-issue release-note-none Denotes a PR that doesn't merit a release note. labels Mar 13, 2026
@pantheon-ai

pantheon-ai Bot commented Mar 13, 2026

Copy link
Copy Markdown

Review failed due to infrastructure/execution failure after retries. Please re-trigger review.

ℹ️ Learn more details on Pantheon AI.

@ti-chi-bot ti-chi-bot Bot added the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label Mar 13, 2026
@tiprow

tiprow Bot commented Mar 13, 2026

Copy link
Copy Markdown

Hi @Reminiscent. Thanks for your PR.

PRs from untrusted users cannot be marked as trusted with /ok-to-test in this repo meaning untrusted PR authors can never trigger tests themselves. Collaborators can still trigger tests on the PR using /test all.

I understand the commands that are listed here.

Details

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.

@hawkingrei

Copy link
Copy Markdown
Contributor

/ok-to-test

@ti-chi-bot ti-chi-bot Bot added the ok-to-test Indicates a PR is ready to be tested. label Mar 13, 2026
@coderabbitai

coderabbitai Bot commented Mar 13, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Implements plan-context-aware, conservative null-rejection checks used during join conversion and constraint inference, refactors related APIs to accept PlanContext, adds util helpers for symbolic/parameter-aware null-rejection, and extends tests to validate plan-cache behavior across many prepared-statement scenarios.

Changes

Cohort / File(s) Summary
Plan cache integration tests
tests/integrationtest/r/planner/core/plan_cache.result, tests/integrationtest/t/planner/core/plan_cache.test
Adds extensive prepared-statement plan-cache test scenarios exercising null-rejection, binds, deallocation/reprepare cycles, warnings for un-cacheable queries, @@last_plan_from_cache checks, and cache toggling.
Partial-index plan-cache tests
pkg/planner/core/casetest/index/index_test.go
Adds tests verifying partial-index selection and plan-cache usability when predicates propagate NULLs (prepared statements + cache checks).
Null-rejection utilities
pkg/planner/util/null_misc.go, pkg/planner/util/path_test.go
Introduces conservative null-rejection logic and new public API IsNullRejectedByInnerColumn, plus unit test validating the behavior for symbolic/column-targeted checks.
Join planning changes
pkg/planner/core/operator/logicalop/logical_join.go, pkg/planner/core/operator/logicalop/BUILD.bazel
Removes exprctx dependency and replaces in-function null-rejection checks with plan-cache-aware calls (util.IsNullRejected / IsNullRejectedByInnerColumn) in join conversion paths.
Partial-index constraint checking
pkg/planner/core/partidx/check_constraint.go, pkg/planner/core/partidx/BUILD.bazel
Refactors constraint helpers to accept PlanContext (sctx) instead of RangerContext, routes null-rejection decisions through planner util, and adds planner util dependency in build file.
Test fixtures / plan JSON updates
pkg/planner/core/casetest/rule/testdata/outer2inner_*.json
Updates expected plan text and comments for IN-list outer-to-inner cases, reorganizing selection/join representation and adjusting case descriptions.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant Client
participant Planner
participant PlanCache
participant Util as IsNullRejectedUtil
Client->>Planner: PREPARE / EXECUTE with parameters
Planner->>IsNullRejectedUtil: conservative null-reject check (target inner col)
IsNullRejectedUtil-->>Planner: null-reject result (symbolic-aware)
Planner->>PlanCache: check / store plan using null-reject decision
PlanCache-->>Planner: cached plan hit/miss
Planner-->>Client: EXECUTION result (with @@last_plan_from_cache)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • guo-shaoge
  • winoros
  • wjhuang2016

Poem

🐰 I nibbled through predicates, cautious and sly,
Conserved the nulls where parameters fly,
Plans tuck in cache, with checks neat and small,
Hopping through joins—no surprises at all! 🥕✨

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is incomplete with key sections marked as TBD: no issue number is linked, problem summary is missing, and technical details about what changed are absent. Only integration tests are marked as included. Link an issue number, provide a problem summary explaining the null-reject plan cache limitation, and describe the implementation approach and technical changes made.
Docstring Coverage ⚠️ Warning Docstring coverage is 30.43% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly describes the main change: adding support for more null-reject cases in the plan cache, which aligns with the substantive code changes across multiple files.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
📝 Coding Plan
  • Generate coding plan for human review comments

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 golangci-lint (2.11.3)

Command failed


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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
tests/integrationtest/t/planner/core/plan_cache.test (1)

265-269: Use a different non-NULL binding on the second <=> execution.

Lines 268-269 currently execute with @v = 1 twice, so this block can still pass if the cached plan accidentally bakes in the first bound value. Switching the second run to another non-NULL value makes the cache-reuse check meaningful end-to-end, then re-record the matching section in tests/integrationtest/r/planner/core/plan_cache.result.

Suggested change
 prepare stmt from 'select t1.a as t1_a, t2.a as t2_a from t1 left join t2 on t1.a = t2.b where t2.a <=> ? order by t1.a';
 set `@v` = 1;
 execute stmt using `@v`;
-set `@v` = 1;
+set `@v` = 2;
 execute stmt using `@v`;
 select @@last_plan_from_cache;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/integrationtest/t/planner/core/plan_cache.test` around lines 265 - 269,
The test currently binds the same non-NULL value twice which can mask a bug
where a cached plan bakes in the first bound value; update the second execution
to use a different non-NULL binding (e.g., change the second "set `@v` = 1" to
"set `@v` = 2") before the second "execute stmt using `@v`" so the plan-reuse
behavior is meaningfully tested, then re-record the expected output in
tests/integrationtest/r/planner/core/plan_cache.result to reflect the new value.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@tests/integrationtest/t/planner/core/plan_cache.test`:
- Around line 265-269: The test currently binds the same non-NULL value twice
which can mask a bug where a cached plan bakes in the first bound value; update
the second execution to use a different non-NULL binding (e.g., change the
second "set `@v` = 1" to "set `@v` = 2") before the second "execute stmt using `@v`"
so the plan-reuse behavior is meaningfully tested, then re-record the expected
output in tests/integrationtest/r/planner/core/plan_cache.result to reflect the
new value.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 02277bca-2b41-445f-9a4d-2526fed4c676

📥 Commits

Reviewing files that changed from the base of the PR and between cc8c83b and 715052a.

📒 Files selected for processing (5)
  • pkg/expression/constant_fold.go
  • pkg/expression/expression.go
  • pkg/expression/expression_test.go
  • tests/integrationtest/r/planner/core/plan_cache.result
  • tests/integrationtest/t/planner/core/plan_cache.test

@codecov

codecov Bot commented Mar 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 77.1646%. Comparing base (987e37f) to head (715052a).
⚠️ Report is 2 commits behind head on master.

⚠️ Current head 715052a differs from pull request most recent head bcbf953

Please upload reports for the commit bcbf953 to get more accurate results.

Additional details and impacted files
@@               Coverage Diff                @@
##             master     #66992        +/-   ##
================================================
- Coverage   77.7132%   77.1646%   -0.5486%     
================================================
  Files          2013       1932        -81     
  Lines        551161     541235      -9926     
================================================
- Hits         428325     417642     -10683     
- Misses       121105     123395      +2290     
+ Partials       1731        198      -1533     
Flag Coverage Δ
integration 40.9070% <100.0000%> (-7.2485%) ⬇️

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

Components Coverage Δ
dumpling 56.7974% <ø> (ø)
parser ∅ <ø> (∅)
br 48.8441% <ø> (-12.0227%) ⬇️
🚀 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.

@Reminiscent
Reminiscent force-pushed the codex/null-reject-plan-cache branch from 715052a to 085e763 Compare March 15, 2026 01:04
@ti-chi-bot ti-chi-bot Bot removed the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label Mar 15, 2026
@ti-chi-bot

ti-chi-bot Bot commented Mar 15, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign terry1purcell for approval. For more information see the Code Review Process.
Please ensure that each of them provides their approval before proceeding.

The full list of commands accepted by this bot can be found 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 size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. sig/planner SIG: Planner labels Mar 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (1)
pkg/planner/core/casetest/index/index_test.go (1)

397-409: Seed data and assert results here, not just the access path.

With an empty table, this only proves the planner chose/cached a plan. A cached partial-index plan that incorrectly drops a IS NULL rows would still pass. Add at least one (NULL, 123) row and one non-NULL row, then verify the NULL row stays excluded across the cache hit.

Suggested test hardening
 		tk.MustExec("drop table if exists t")
 		tk.MustExec("create table t(a int, b int, index idx3(b) where a is not null)")
+		tk.MustExec("insert into t values (null, 123), (2, 123)")
 		tk.MustExec("prepare stmt2 from 'select * from t use index(idx3) where b = ? and a + ? > 1'")
 		tk.MustExec("set `@b` = 123")
 		tk.MustExec("set `@c` = 0")
-		tk.MustExec("execute stmt2 using `@b`, `@c`")
-		tk.MustExec("execute stmt2 using `@b`, `@c`")
+		tk.MustQuery("execute stmt2 using `@b`, `@c`").Check(testkit.Rows("2 123"))
+		tk.MustQuery("execute stmt2 using `@b`, `@c`").Check(testkit.Rows("2 123"))
 		tkProcess = tk.Session().ShowProcess()
 		ps[0] = tkProcess
 		tk.Session().SetSessionManager(&testkit.MockSessionManager{PS: ps})
 		tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).CheckContain("idx3")
-		tk.MustExec("execute stmt2 using `@b`, `@c`")
+		tk.MustQuery("execute stmt2 using `@b`, `@c`").Check(testkit.Rows("2 123"))
 		tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1"))
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/planner/core/casetest/index/index_test.go` around lines 397 - 409, The
test currently only checks that the partial-index plan (index idx3 on table t)
was chosen/cached for prepared statement stmt2; strengthen it by inserting seed
rows into t (e.g., one row with (NULL, 123) and one row with (1, 123) or
similar), run execute stmt2 using `@b`, `@c` before and after the cache hit, and
assert the query results explicitly (use tk.MustQuery(...).Check or equivalent)
to verify the NULL row is not returned and the non-NULL row is returned both
pre- and post-cache; keep the existing checks for explain/last_plan_from_cache
around the executes to ensure you still validate caching behavior for stmt2 and
idx3.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@pkg/planner/core/operator/logicalop/logical_join.go`:
- Around line 330-340: The ConvertOuterToInnerJoin implementation calls
util.IsNullRejected directly, causing different null-reject semantics than
simplifyOuterJoin; update ConvertOuterToInnerJoin to call the new isNullRejected
wrapper instead (so it performs
expression.PushDownNot(ctx.GetNullRejectCheckExprCtx(), expr) and falls back to
isNullRejectedSpecially when needed) and pass the same ctx, schema and expr
parameters; replace direct util.IsNullRejected(...) usages in
ConvertOuterToInnerJoin with isNullRejected(ctx, schema, expr) to ensure
consistent behavior.

In `@pkg/planner/util/null_misc.go`:
- Around line 180-205: In isNullRejectedConservativeLeaf, short-circuit by
calling exprAlwaysNullForNullReject(expr, probe) at the top and return true if
it reports the expr always yields NULL for the given probe; this must happen
before the ScalarFunction type assertion so non-scalar leaves (e.g. raw column
operands discovered by LogicAnd) are correctly recognized as NULL-producing.
Keep the existing constant and scalar-function handling afterwards; the change
is just an early return using exprAlwaysNullForNullReject to avoid dropping
non-scalar leaves prematurely.

---

Nitpick comments:
In `@pkg/planner/core/casetest/index/index_test.go`:
- Around line 397-409: The test currently only checks that the partial-index
plan (index idx3 on table t) was chosen/cached for prepared statement stmt2;
strengthen it by inserting seed rows into t (e.g., one row with (NULL, 123) and
one row with (1, 123) or similar), run execute stmt2 using `@b`, `@c` before and
after the cache hit, and assert the query results explicitly (use
tk.MustQuery(...).Check or equivalent) to verify the NULL row is not returned
and the non-NULL row is returned both pre- and post-cache; keep the existing
checks for explain/last_plan_from_cache around the executes to ensure you still
validate caching behavior for stmt2 and idx3.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 5d6ea580-3193-49a0-bfa0-477400d414d9

📥 Commits

Reviewing files that changed from the base of the PR and between 715052a and 085e763.

📒 Files selected for processing (7)
  • pkg/planner/core/casetest/index/index_test.go
  • pkg/planner/core/operator/logicalop/logical_join.go
  • pkg/planner/core/partidx/BUILD.bazel
  • pkg/planner/core/partidx/check_constraint.go
  • pkg/planner/util/null_misc.go
  • tests/integrationtest/r/planner/core/plan_cache.result
  • tests/integrationtest/t/planner/core/plan_cache.test

Comment thread pkg/planner/core/operator/logicalop/logical_join.go
Comment thread pkg/planner/util/null_misc.go Outdated
Comment thread pkg/planner/util/null_misc.go Outdated
@Reminiscent
Reminiscent force-pushed the codex/null-reject-plan-cache branch from 085e763 to bcbf953 Compare March 16, 2026 03:36
@ti-chi-bot ti-chi-bot Bot added size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. and removed size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. labels Mar 16, 2026
@ti-chi-bot

ti-chi-bot Bot commented Mar 16, 2026

Copy link
Copy Markdown

[FORMAT CHECKER NOTIFICATION]

Notice: To remove the do-not-merge/needs-linked-issue label, please provide the linked issue number on one line in the PR body, for example: Issue Number: close #123 or Issue Number: ref #456.

📖 For more info, you can check the "Contribute Code" section in the development guide.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (3)
pkg/planner/util/null_misc.go (2)

244-244: Redundant fallback to exprAlwaysNullForNullReject.

Line 244 returns exprAlwaysNullForNullReject(expr, probe), but this case was already checked at line 218 at the function entry. If we reach line 244, exprAlwaysNullForNullReject already returned false for this expression. This final return will always be false for ScalarFunctions not in the whitelist.

Consider returning false directly for clarity:

Suggested change
 	if _, ok := expression.CompareOpMap[sf.FuncName.L]; ok {
 		args := sf.GetArgs()
 		return len(args) >= 2 &&
 			(exprAlwaysNullForNullReject(args[0], probe) || exprAlwaysNullForNullReject(args[1], probe))
 	}
-	return exprAlwaysNullForNullReject(expr, probe)
+	return false
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/planner/util/null_misc.go` at line 244, The final return currently calls
exprAlwaysNullForNullReject(expr, probe) again for ScalarFunctions not in the
whitelist, but that check was already performed at the function entry (via
exprAlwaysNullForNullReject), so replace the redundant
exprAlwaysNullForNullReject call with a direct return false in the default/else
branch handling ScalarFunctions (referencing expr and probe); ensure the code
returns false for non-whitelisted ScalarFunctions instead of re-invoking
exprAlwaysNullForNullReject.

25-37: Consider documenting the whitelist selection criteria.

The nullRejectPlanCacheStrictFuncs whitelist includes arithmetic operations that propagate NULL. This is a conservative and correct set. Consider adding a brief comment explaining why these specific functions are included (all return NULL if any operand is NULL) to help future maintainers understand the selection criteria.

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

In `@pkg/planner/util/null_misc.go` around lines 25 - 37, Update the comment for
nullRejectPlanCacheStrictFuncs to explain the selection criteria: state that
this whitelist contains arithmetic operators (referenced as ast.Abs, ast.Div,
ast.IntDiv, ast.Minus, ast.Mod, ast.Mul, ast.Plus, ast.UnaryMinus,
ast.UnaryPlus) whose semantics guarantee NULL result if any input operand is
NULL, and note that this is intentionally conservative for plan-cache rejection
logic; keep the map entries unchanged and add a short sentence describing that
rationale so future maintainers understand why these specific functions were
chosen.
pkg/planner/util/path_test.go (1)

148-177: Consider adding negative test cases.

The test only verifies cases where IsNullRejectedByInnerColumn returns true. For better coverage and to guard against false positives, consider adding cases that should return false:

  • A predicate like col <=> 1 (NullEQ - should not be null-rejecting)
  • A predicate like IS NULL(col) (should not be null-rejecting)
  • A predicate referencing a different column
Example negative test case
{
    name: "null-safe equal should not reject null",
    expr: expression.NewFunctionInternal(
        sctx.GetExprCtx(),
        ast.NullEQ,
        types.NewFieldType(mysql.TypeTiny),
        col,
        one,
    ),
    expected: false, // Add expected field to struct
},
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/planner/util/path_test.go` around lines 148 - 177, Add negative test
cases to the existing table-driven tests for IsNullRejectedByInnerColumn: extend
the test struct to include an expected bool, add entries using
expression.NewFunctionInternal for predicates that should NOT reject NULL (e.g.
ast.NullEQ with col and one, ast.IsNull with col, and a predicate referencing a
different column), and assert require.False(same call) or compare to tt.expected
using sctx.GetPlanCtx(), col, one/zero as appropriate; keep existing positive
cases and change the loop to check require.Equal(t, tt.expected,
util.IsNullRejectedByInnerColumn(sctx.GetPlanCtx(), col, tt.expr), tt.name) so
both true and false expectations are validated.
🤖 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/planner/util/null_misc.go`:
- Line 244: The final return currently calls exprAlwaysNullForNullReject(expr,
probe) again for ScalarFunctions not in the whitelist, but that check was
already performed at the function entry (via exprAlwaysNullForNullReject), so
replace the redundant exprAlwaysNullForNullReject call with a direct return
false in the default/else branch handling ScalarFunctions (referencing expr and
probe); ensure the code returns false for non-whitelisted ScalarFunctions
instead of re-invoking exprAlwaysNullForNullReject.
- Around line 25-37: Update the comment for nullRejectPlanCacheStrictFuncs to
explain the selection criteria: state that this whitelist contains arithmetic
operators (referenced as ast.Abs, ast.Div, ast.IntDiv, ast.Minus, ast.Mod,
ast.Mul, ast.Plus, ast.UnaryMinus, ast.UnaryPlus) whose semantics guarantee NULL
result if any input operand is NULL, and note that this is intentionally
conservative for plan-cache rejection logic; keep the map entries unchanged and
add a short sentence describing that rationale so future maintainers understand
why these specific functions were chosen.

In `@pkg/planner/util/path_test.go`:
- Around line 148-177: Add negative test cases to the existing table-driven
tests for IsNullRejectedByInnerColumn: extend the test struct to include an
expected bool, add entries using expression.NewFunctionInternal for predicates
that should NOT reject NULL (e.g. ast.NullEQ with col and one, ast.IsNull with
col, and a predicate referencing a different column), and assert
require.False(same call) or compare to tt.expected using sctx.GetPlanCtx(), col,
one/zero as appropriate; keep existing positive cases and change the loop to
check require.Equal(t, tt.expected,
util.IsNullRejectedByInnerColumn(sctx.GetPlanCtx(), col, tt.expr), tt.name) so
both true and false expectations are validated.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 9071691e-5b97-4fa5-aea7-5a76b1b36aa8

📥 Commits

Reviewing files that changed from the base of the PR and between 085e763 and bcbf953.

📒 Files selected for processing (11)
  • pkg/planner/core/casetest/index/index_test.go
  • pkg/planner/core/casetest/rule/testdata/outer2inner_in.json
  • pkg/planner/core/casetest/rule/testdata/outer2inner_out.json
  • pkg/planner/core/casetest/rule/testdata/outer2inner_xut.json
  • pkg/planner/core/operator/logicalop/BUILD.bazel
  • pkg/planner/core/operator/logicalop/logical_join.go
  • pkg/planner/core/partidx/BUILD.bazel
  • pkg/planner/core/partidx/check_constraint.go
  • pkg/planner/util/null_misc.go
  • pkg/planner/util/path_test.go
  • tests/integrationtest/r/planner/core/plan_cache.result
💤 Files with no reviewable changes (1)
  • pkg/planner/core/operator/logicalop/BUILD.bazel

@tiprow

tiprow Bot commented Mar 16, 2026

Copy link
Copy Markdown

@Reminiscent: The following test failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
fast_test_tiprow bcbf953 link true /test fast_test_tiprow

Full PR test history. Your PR dashboard.

Details

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. I understand the commands that are listed here.

@ti-chi-bot

ti-chi-bot Bot commented Mar 16, 2026

Copy link
Copy Markdown

@Reminiscent: The following tests failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
idc-jenkins-ci-tidb/check_dev bcbf953 link true /test check-dev
pull-unit-test-next-gen bcbf953 link true /test pull-unit-test-next-gen
idc-jenkins-ci-tidb/unit-test bcbf953 link true /test unit-test

Full PR test history. Your PR dashboard.

Details

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. I understand the commands that are listed here.

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

Labels

do-not-merge/needs-linked-issue ok-to-test Indicates a PR is ready to be tested. release-note-none Denotes a PR that doesn't merit a release note. sig/planner SIG: Planner size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants