Repository navigation
planner: align core casetests with plan_tree - #67113
Conversation
|
Review failed due to infrastructure/execution failure after retries. Please re-trigger review. ℹ️ Learn more details on Pantheon AI. |
|
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:
📝 WalkthroughWalkthroughThis PR standardizes EXPLAIN usage in planner tests by switching many test assertions and testdata from EXPLAIN format = 'brief' to EXPLAIN format = 'plan_tree', and normalizes the textual plan representations (removing numeric costs/Column#IDs and standardizing operator labels). It also adds planner explain-format guidelines. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
📝 Coding Plan
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 |
|
/hold |
| output[i].Plan = testdata.ConvertRowsToStrings(testKit.MustQuery("explain format = 'brief' " + tt).Rows()) | ||
| output[i].Plan = testdata.ConvertRowsToStrings(testKit.MustQuery("explain format = 'plan_tree' " + tt).Rows()) | ||
| }) | ||
| // The test point is the row count estimation for aggregations and joins. |
There was a problem hiding this comment.
As it is said, we should not change it.
There was a problem hiding this comment.
I have revert some modifies about stats/analyze test cases.
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
pkg/planner/core/casetest/hint/testdata/integration_suite_xut.json (1)
8-154:⚠️ Potential issue | 🟡 MinorMigrate the remaining
TestQBHintHandlerDuplicateObjectscase toplan_treeformat.This test case at line 1932 uses raw
EXPLAIN(default format with numeric costs), while all 115 other test cases in the file useexplain format = 'plan_tree'. The migration is incomplete and creates format inconsistency. Update the SQL to include the format specifier and convert the Plan output to plan_tree format (without numeric costs).Current vs. expected format
Current (default format):
"SQL": "EXPLAIN WITH t AS (SELECT /*+ inl_join(e) */ em.* FROM t_employees em JOIN t_employees e WHERE em.store_id = e.department_id) SELECT * FROM t;", "Plan": [ "IndexJoin_18 12500.00 root inner join, inner:IndexReader_34, ...", "├─TableReader_32(Build) 10000.00 root data:TableFullScan_31",Expected (plan_tree format):
"SQL": "explain format = 'plan_tree' WITH t AS (SELECT /*+ inl_join(e) */ em.* FROM t_employees em JOIN t_employees e WHERE em.store_id = e.department_id) SELECT * FROM t;", "Plan": [ "IndexJoin root inner join, inner:IndexReader, ...", "├─TableReader(Build) root data:TableFullScan",🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@pkg/planner/core/casetest/hint/testdata/integration_suite_xut.json` around lines 8 - 154, The test case TestQBHintHandlerDuplicateObjects uses default EXPLAIN with numeric costs and operator suffixes (e.g., IndexJoin_18, TableReader_32, cost values like 12500.00) while the file expects plan_tree format; update the SQL string to prefix with "explain format = 'plan_tree' " (e.g., change "EXPLAIN WITH ..." to "explain format = 'plan_tree' WITH ...") and rewrite the corresponding "Plan" array entries to the plan_tree style by removing numeric costs and internal suffixes (drop trailing _NN tokens and cost numbers) and normalizing operator names to their plain forms (e.g., IndexJoin, TableReader, TableFullScan) so the plan lines match the other plan_tree test cases.
🧹 Nitpick comments (2)
pkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_in.json (1)
184-205: Pre-existing issue: JavaScript-style comments in JSON are non-standard.The static analysis tool flagged parse errors due to
// commentsyntax (lines 184, 188, 191, 193, 195, 197, 199, 201, 203). Standard JSON does not support comments. This appears to be a pre-existing issue (the comments existed before this PR), and the test framework likely uses a lenient parser that tolerates them.The
explain format = 'plan_tree'changes themselves look correct and consistent with the PR objectives.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@pkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_in.json` around lines 184 - 205, Remove the JavaScript-style line comments (e.g., lines starting with "// The most simple case.", "// Can work when there's global limit/topn", etc.) from the JSON test data so the file is valid JSON; either delete those comment lines or convert each comment into a proper JSON value (for example add a parallel "_comment" property or include the text as a string entry) and ensure the array elements remain only the SQL strings like "explain format = 'plan_tree' with c1 as (select * from t) ...".pkg/planner/core/casetest/ch/ch_test.go (1)
50-50: RenamebriefFormatnow that it points toplan_tree.The current name says “brief” while the SQL now emits
plan_treein both tests, which makes the assertion path harder to scan. As per coding guidelines, "Code SHOULD be self-documenting through clear naming and structure."Also applies to: 92-92
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@pkg/planner/core/casetest/ch/ch_test.go` at line 50, The variable briefFormat should be renamed to reflect that it contains a plan_tree format string; update the identifier briefFormat to a clearer name like planTreeFormat (or planTreeSQL) wherever it's declared and referenced (e.g., in ch_test.go where briefFormat := `explain format = 'plan_tree' ` and the other occurrence around line 92), and ensure any assertions or usages that reference briefFormat are updated to the new identifier so the code clearly documents that the SQL emits a plan_tree format.
🤖 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/casetest/cbotest/testdata/analyze_suite_in.json`:
- Around line 253-256: The test inputs for TestLimitIndexEstimation now use
"explain format = 'plan_tree'" (see the two SQL lines with that format) but the
corresponding golden output for that test in the paired analyze_suite_out.json
is still the old brief-format plans; update/re-record the
TestLimitIndexEstimation output block in analyze_suite_out.json so the golden
matches the new "plan_tree" explain output (regenerate the expected plans for
those two queries and replace the brief-format block with the
plan_tree-formatted plans).
In `@pkg/planner/core/casetest/testdata/json_plan_suite_out.json`:
- Line 108: Remove the timing-only "executeInfo" refresh entries injected into
the "tidb_json" suite and revert those lines in both json_plan_suite_out.json
and json_plan_suite_xut.json; specifically delete any "executeInfo" values that
are only runtime deltas like "time:..., open:..., close:...,
fetch_resp_duration:..." so the suite only contains structural plan fields that
plan_test.go asserts (id, row counts, task type, access object, operator info).
---
Outside diff comments:
In `@pkg/planner/core/casetest/hint/testdata/integration_suite_xut.json`:
- Around line 8-154: The test case TestQBHintHandlerDuplicateObjects uses
default EXPLAIN with numeric costs and operator suffixes (e.g., IndexJoin_18,
TableReader_32, cost values like 12500.00) while the file expects plan_tree
format; update the SQL string to prefix with "explain format = 'plan_tree' "
(e.g., change "EXPLAIN WITH ..." to "explain format = 'plan_tree' WITH ...") and
rewrite the corresponding "Plan" array entries to the plan_tree style by
removing numeric costs and internal suffixes (drop trailing _NN tokens and cost
numbers) and normalizing operator names to their plain forms (e.g., IndexJoin,
TableReader, TableFullScan) so the plan lines match the other plan_tree test
cases.
---
Nitpick comments:
In `@pkg/planner/core/casetest/ch/ch_test.go`:
- Line 50: The variable briefFormat should be renamed to reflect that it
contains a plan_tree format string; update the identifier briefFormat to a
clearer name like planTreeFormat (or planTreeSQL) wherever it's declared and
referenced (e.g., in ch_test.go where briefFormat := `explain format =
'plan_tree' ` and the other occurrence around line 92), and ensure any
assertions or usages that reference briefFormat are updated to the new
identifier so the code clearly documents that the SQL emits a plan_tree format.
In `@pkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_in.json`:
- Around line 184-205: Remove the JavaScript-style line comments (e.g., lines
starting with "// The most simple case.", "// Can work when there's global
limit/topn", etc.) from the JSON test data so the file is valid JSON; either
delete those comment lines or convert each comment into a proper JSON value (for
example add a parallel "_comment" property or include the text as a string
entry) and ensure the array elements remain only the SQL strings like "explain
format = 'plan_tree' with c1 as (select * from t) ...".
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 35b05abf-a3e6-4da1-95de-297d48a18357
📒 Files selected for processing (78)
pkg/planner/core/casetest/cbotest/testdata/analyze_suite_in.jsonpkg/planner/core/casetest/cbotest/testdata/analyze_suite_out.jsonpkg/planner/core/casetest/cbotest/testdata/analyze_suite_xut.jsonpkg/planner/core/casetest/ch/ch_test.gopkg/planner/core/casetest/ch/testdata/ch_suite_out.jsonpkg/planner/core/casetest/ch/testdata/ch_suite_xut.jsonpkg/planner/core/casetest/correlated/correlated_test.gopkg/planner/core/casetest/correlated/testdata/correlated_subquery_suite_out.jsonpkg/planner/core/casetest/correlated/testdata/correlated_subquery_suite_xut.jsonpkg/planner/core/casetest/enforcempp/enforce_mpp_test.gopkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_in.jsonpkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_out.jsonpkg/planner/core/casetest/enforcempp/testdata/enforce_mpp_suite_xut.jsonpkg/planner/core/casetest/hint/hint_test.gopkg/planner/core/casetest/hint/testdata/integration_suite_out.jsonpkg/planner/core/casetest/hint/testdata/integration_suite_xut.jsonpkg/planner/core/casetest/index/index_test.gopkg/planner/core/casetest/index/testdata/index_range_out.jsonpkg/planner/core/casetest/index/testdata/index_range_xut.jsonpkg/planner/core/casetest/index/testdata/integration_suite_out.jsonpkg/planner/core/casetest/index/testdata/integration_suite_xut.jsonpkg/planner/core/casetest/indexmerge/indexmerge_intersection_test.gopkg/planner/core/casetest/indexmerge/testdata/index_merge_suite_out.jsonpkg/planner/core/casetest/indexmerge/testdata/index_merge_suite_xut.jsonpkg/planner/core/casetest/integration_test.gopkg/planner/core/casetest/join/join_test.gopkg/planner/core/casetest/logicalplan/logical_plan_builder_test.gopkg/planner/core/casetest/mpp/mpp_test.gopkg/planner/core/casetest/mpp/testdata/integration_suite_in.jsonpkg/planner/core/casetest/mpp/testdata/integration_suite_out.jsonpkg/planner/core/casetest/mpp/testdata/integration_suite_xut.jsonpkg/planner/core/casetest/parallelapply/parallel_apply_test.gopkg/planner/core/casetest/partition/integration_partition_test.gopkg/planner/core/casetest/partition/partition_pruner_test.gopkg/planner/core/casetest/partition/testdata/integration_partition_suite_in.jsonpkg/planner/core/casetest/partition/testdata/integration_partition_suite_out.jsonpkg/planner/core/casetest/partition/testdata/integration_partition_suite_xut.jsonpkg/planner/core/casetest/partition/testdata/partition_pruner_in.jsonpkg/planner/core/casetest/partition/testdata/partition_pruner_out.jsonpkg/planner/core/casetest/partition/testdata/partition_pruner_xut.jsonpkg/planner/core/casetest/plan_test.gopkg/planner/core/casetest/planstats/plan_stats_test.gopkg/planner/core/casetest/planstats/testdata/plan_stats_suite_out.jsonpkg/planner/core/casetest/planstats/testdata/plan_stats_suite_xut.jsonpkg/planner/core/casetest/rule/dual_test.gopkg/planner/core/casetest/rule/rule_common_handle_ordering_test.gopkg/planner/core/casetest/rule/rule_derive_topn_from_window_test.gopkg/planner/core/casetest/rule/rule_eliminate_empty_selection_test.gopkg/planner/core/casetest/rule/rule_join_reorder_test.gopkg/planner/core/casetest/rule/rule_outer2inner_test.gopkg/planner/core/casetest/rule/rule_predicate_pushdown_test.gopkg/planner/core/casetest/rule/rule_predicate_simplification_test.gopkg/planner/core/casetest/rule/testdata/derive_topn_from_window_out.jsonpkg/planner/core/casetest/rule/testdata/derive_topn_from_window_xut.jsonpkg/planner/core/casetest/rule/testdata/join_reorder_suite_out.jsonpkg/planner/core/casetest/rule/testdata/join_reorder_suite_xut.jsonpkg/planner/core/casetest/rule/testdata/outer2inner_out.jsonpkg/planner/core/casetest/rule/testdata/outer2inner_xut.jsonpkg/planner/core/casetest/rule/testdata/predicate_pushdown_suite_out.jsonpkg/planner/core/casetest/rule/testdata/predicate_pushdown_suite_xut.jsonpkg/planner/core/casetest/rule/testdata/predicate_simplification_out.jsonpkg/planner/core/casetest/rule/testdata/predicate_simplification_xut.jsonpkg/planner/core/casetest/schema/cannot_find_column_test.gopkg/planner/core/casetest/schema/testdata/cannot_find_column_suite_out.jsonpkg/planner/core/casetest/schema/testdata/cannot_find_column_suite_xut.jsonpkg/planner/core/casetest/stats_test.gopkg/planner/core/casetest/testdata/json_plan_suite_out.jsonpkg/planner/core/casetest/testdata/json_plan_suite_xut.jsonpkg/planner/core/casetest/testdata/stats_suite_out.jsonpkg/planner/core/casetest/testdata/stats_suite_xut.jsonpkg/planner/core/casetest/vectorsearch/testdata/ann_index_suite_in.jsonpkg/planner/core/casetest/vectorsearch/testdata/ann_index_suite_out.jsonpkg/planner/core/casetest/vectorsearch/testdata/ann_index_suite_xut.jsonpkg/planner/core/casetest/vectorsearch/vector_index_test.gopkg/planner/core/casetest/windows/testdata/window_push_down_suite_in.jsonpkg/planner/core/casetest/windows/testdata/window_push_down_suite_out.jsonpkg/planner/core/casetest/windows/testdata/window_push_down_suite_xut.jsonpkg/planner/core/casetest/windows/window_push_down_test.go
| output[i].Query = input[i] | ||
| if isSelect { | ||
| // explain the query | ||
| output[i].Result = testdata.ConvertRowsToStrings(testKit.MustQuery("explain format='brief' " + sql).Rows()) |
There was a problem hiding this comment.
I think planstats should also remain unchanged.
There was a problem hiding this comment.
I have reverted it.
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
.agents/skills/tidb-test-guidelines/references/planner-guide.md (1)
78-80: Optional: Vary sentence beginnings for improved readability.Three consecutive bullets begin with "For," which slightly reduces readability. Consider varying the sentence structure.
✍️ Proposed alternatives
-- For cost-oriented assertions, prefer `EXPLAIN format = 'cost_trace'` rather than `plan_tree`. -- For plan cache tests, preserve the existing `explain for connection` / `EXPLAIN format='plan_cache'` style; do not rewrite those assertions to `plan_tree`. -- For hint tests, preserve the existing format when the test asserts warning text, hint applicability, or other format-sensitive output. Only move a hint test to `plan_tree` when the nearby suite already uses `plan_tree` for that behavior. +- Cost-oriented assertions should use `EXPLAIN format = 'cost_trace'` rather than `plan_tree`. +- Plan cache tests should preserve the existing `explain for connection` / `EXPLAIN format='plan_cache'` style; do not rewrite those assertions to `plan_tree`. +- Hint tests should preserve the existing format when asserting warning text, hint applicability, or other format-sensitive output. Only move a hint test to `plan_tree` when the nearby suite already uses `plan_tree` for that behavior.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.agents/skills/tidb-test-guidelines/references/planner-guide.md around lines 78 - 80, The three consecutive bullet lines starting with "For" (the lines referencing `EXPLAIN format = 'cost_trace'` vs `plan_tree`, `explain for connection` / `EXPLAIN format='plan_cache'`, and hint test guidance) should be rewritten to vary sentence openings for readability; edit each bullet to start differently (e.g., "Use", "Preserve", "When dealing with") while keeping the same technical terms and rules (`EXPLAIN format = 'cost_trace'`, `plan_tree`, `explain for connection`, `EXPLAIN format='plan_cache'`, hint tests and `plan_tree`) and ensure the meaning remains identical.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.agents/skills/tidb-test-guidelines/SKILL.md:
- Line 41: Revise the long bullet about pkg/planner/core/casetest to avoid
repeated sentence starts by splitting it into two bullets or rephrasing into a
single clearer sentence: first state the default change (ordinary optimizer
assertions -> EXPLAIN format = 'plan_tree'), then in a second bullet list the
exceptions (keep special-format suites unchanged — e.g.,
stats/analyze/load-stats tests like stats_test.go and planstats, cost-oriented
assertions using EXPLAIN format = 'cost_trace', plan cache tests keeping
"explain for connection" or format='plan_cache', and hint tests preserving the
nearby suite's existing format). Ensure the examples (stats_test.go, planstats,
EXPLAIN format = 'plan_tree', 'cost_trace', 'plan_cache') are retained for
clarity.
---
Nitpick comments:
In @.agents/skills/tidb-test-guidelines/references/planner-guide.md:
- Around line 78-80: The three consecutive bullet lines starting with "For" (the
lines referencing `EXPLAIN format = 'cost_trace'` vs `plan_tree`, `explain for
connection` / `EXPLAIN format='plan_cache'`, and hint test guidance) should be
rewritten to vary sentence openings for readability; edit each bullet to start
differently (e.g., "Use", "Preserve", "When dealing with") while keeping the
same technical terms and rules (`EXPLAIN format = 'cost_trace'`, `plan_tree`,
`explain for connection`, `EXPLAIN format='plan_cache'`, hint tests and
`plan_tree`) and ensure the meaning remains identical.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 14a190d3-577e-4e4e-b098-0cf77336b4d8
📒 Files selected for processing (2)
.agents/skills/tidb-test-guidelines/SKILL.md.agents/skills/tidb-test-guidelines/references/planner-guide.md
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.agents/skills/tidb-test-guidelines/references/planner-guide.md:
- Around line 75-80: The bullets repeat "For ..." at the start of many lines;
edit the listed bullets (those mentioning ordinary planner/core casetests and
`EXPLAIN format = 'plan_tree'`, explain-format-specific suites,
stats/analyze/load-stats-related tests, cost-oriented assertions preferring
`EXPLAIN format = 'cost_trace'`, plan cache tests preserving `explain for
connection` / `EXPLAIN format='plan_cache'`, and hint tests) to vary sentence
openings for readability—use alternatives like "Prefer", "Keep", "Do not",
"Avoid switching", or "When asserting" so each bullet begins differently while
preserving the exact technical guidance and quoted formats (`plan_tree`,
`cost_trace`, `plan_cache`, `EXPLAIN ANALYZE`) unchanged.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 8c3229d6-c856-4e2d-af84-76fe3335124c
📒 Files selected for processing (2)
.agents/skills/tidb-test-guidelines/SKILL.md.agents/skills/tidb-test-guidelines/references/planner-guide.md
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: AilinKid, qw4990 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 |
|
/unhold |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #67113 +/- ##
================================================
- Coverage 77.7098% 77.5341% -0.1757%
================================================
Files 2016 1936 -80
Lines 552001 541048 -10953
================================================
- Hits 428959 419497 -9462
- Misses 121300 121545 +245
+ Partials 1742 6 -1736
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.
🧹 Nitpick comments (1)
pkg/planner/core/casetest/hint/testdata/integration_suite_xut.json (1)
8-153: Consider a small companion cost/cardinality-sensitive suite for key hint paths.
plan_treeimproves stability, but it won’t surface estimation/cost drift. Keeping a small targeted companion (e.g., cost-trace-focused cases) would preserve that signal.Based on learnings: Applies to pkg/planner/** : For planner rule or logical/physical plan changes, perform targeted planner unit tests and update rule testdata when needed.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@pkg/planner/core/casetest/hint/testdata/integration_suite_xut.json` around lines 8 - 153, The review asks to add a small companion cost/cardinality-sensitive test suite to catch estimation/cost regressions that plan_tree doesn't reveal; update pkg/planner tests by adding targeted planner unit tests (cost-trace-focused cases) alongside existing rule/plan tests and expand the testdata (e.g., the hint integration JSON used in pkg/planner/core/casetest/hint/testdata/integration_suite_xut.json) to include scenarios that exercise cost estimates and cardinality-sensitive paths; when you change planner rules or logical/physical plan code (e.g., functions/classes that implement planner rules or cost estimation), add or update unit tests referencing those symbols so the rule testdata and expected cost traces are updated accordingly.
🤖 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/core/casetest/hint/testdata/integration_suite_xut.json`:
- Around line 8-153: The review asks to add a small companion
cost/cardinality-sensitive test suite to catch estimation/cost regressions that
plan_tree doesn't reveal; update pkg/planner tests by adding targeted planner
unit tests (cost-trace-focused cases) alongside existing rule/plan tests and
expand the testdata (e.g., the hint integration JSON used in
pkg/planner/core/casetest/hint/testdata/integration_suite_xut.json) to include
scenarios that exercise cost estimates and cardinality-sensitive paths; when you
change planner rules or logical/physical plan code (e.g., functions/classes that
implement planner rules or cost estimation), add or update unit tests
referencing those symbols so the rule testdata and expected cost traces are
updated accordingly.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 88844cad-b6b8-4dcd-87f7-c65c53b75c10
📒 Files selected for processing (3)
pkg/planner/core/casetest/hint/testdata/integration_suite_in.jsonpkg/planner/core/casetest/hint/testdata/integration_suite_out.jsonpkg/planner/core/casetest/hint/testdata/integration_suite_xut.json
|
/retest |
5 similar comments
|
/retest |
|
/retest |
|
/retest |
|
/retest |
|
/retest |
|
/ok-to-test |
|
/retest |
What problem does this PR solve?
Issue Number: ref #67112
Problem Summary:
pkg/planner/core/caseteststill had a mix of defaultexplain,brief, andplan_treeoutputs in ordinary planner assertionsWhat changed and how does it work?
explain format = 'plan_tree'explain for connectionexplain analyzecases that do not supportplan_treeplan_treeoutput directlypkg/planner/core/casetest/**/testdataCheck List
Tests
Validation commands:
Side effects
Documentation
Release note
Summary by CodeRabbit