Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ impl AccessChecker for ManagementModeAccess {
if !ok {
return Err(ErrorCode::ManagementModePermissionDenied(format!(
"Management Mode Error: Access denied for operation:{:?} in management-mode",
plan.format_indent(false)?
plan.format_indent(Default::default())?
)));
}
};
Expand Down
13 changes: 10 additions & 3 deletions src/query/service/src/interpreters/interpreter_explain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ use databend_common_sql::executor::MutationBuildInfo;
use databend_common_sql::optimizer::ColumnSet;
use databend_common_sql::plans::Mutation;
use databend_common_sql::BindContext;
use databend_common_sql::FormatOptions;
use databend_common_sql::MetadataRef;
use databend_common_storages_result_cache::gen_result_cache_key;
use databend_common_storages_result_cache::ResultCacheReader;
Expand Down Expand Up @@ -91,6 +92,9 @@ impl Interpreter for ExplainInterpreter {

#[async_backtrace::framed]
async fn execute2(&self) -> Result<PipelineBuildResult> {
let options = FormatOptions {
verbose: self.config.verbose,
};
let blocks = match &self.kind {
ExplainKind::Plan if self.config.logical => self.explain_plan(&self.plan)?,
ExplainKind::Plan => match &self.plan {
Expand All @@ -104,8 +108,8 @@ impl Interpreter for ExplainInterpreter {
self.explain_query(s_expr, metadata, bind_context, formatted_ast)
.await?
}
Plan::Insert(insert_plan) => insert_plan.explain(self.config.verbose).await?,
Plan::Replace(replace_plan) => replace_plan.explain(self.config.verbose).await?,
Plan::Insert(insert_plan) => insert_plan.explain(options).await?,
Plan::Replace(replace_plan) => replace_plan.explain(options).await?,
Plan::CreateTable(plan) => match &plan.as_select {
Some(box Plan::Query {
s_expr,
Expand Down Expand Up @@ -300,7 +304,10 @@ impl ExplainInterpreter {
}

pub fn explain_plan(&self, plan: &Plan) -> Result<Vec<DataBlock>> {
let result = plan.format_indent(self.config.verbose)?;
let options = FormatOptions {
verbose: self.config.verbose,
};
let result = plan.format_indent(options)?;
let line_split_result: Vec<&str> = result.lines().collect();
let formatted_plan = StringType::from_data(line_split_result);
Ok(vec![DataBlock::new_from_columns(vec![formatted_plan])])
Expand Down
52 changes: 26 additions & 26 deletions src/query/service/tests/it/sql/planner/optimizer/data/yaml/q1.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ raw_plan: |
├── limit: [100]
├── offset: [0]
└── Sort
├── sort keys: [default.customer.c_customer_id (#79) ASC]
├── sort keys: [default.customer.c_customer_id (#79) ASC NULLS LAST]
├── limit: [NONE]
└── EvalScalar
├── scalars: [customer.c_customer_id (#79) AS (#79)]
Expand All @@ -135,8 +135,8 @@ raw_plan: |
│ ├── EvalScalar
│ │ ├── scalars: [store_returns.sr_customer_sk (#3) AS (#3), store_returns.sr_store_sk (#7) AS (#7), Sum(sr_return_amt) (#48) AS (#48)]
│ │ └── Aggregate(Initial)
│ │ ├── group items: [store_returns.sr_customer_sk (#3), store_returns.sr_store_sk (#7)]
│ │ ├── aggregate functions: [Sum(sr_return_amt) (#48)]
│ │ ├── group items: [store_returns.sr_customer_sk (#3) AS (#3), store_returns.sr_store_sk (#7) AS (#7)]
│ │ ├── aggregate functions: [Sum(sr_return_amt) AS (#48)]
│ │ └── EvalScalar
│ │ ├── scalars: [store_returns.sr_customer_sk (#3) AS (#3), store_returns.sr_store_sk (#7) AS (#7), store_returns.sr_return_amt (#11) AS (#11)]
│ │ └── Filter
Expand All @@ -146,22 +146,22 @@ raw_plan: |
│ │ ├── probe keys: []
│ │ ├── other filters: []
│ │ ├── Scan
│ │ │ ├── table: default.store_returns
│ │ │ ├── table: default.store_returns (#0)
│ │ │ ├── filters: []
│ │ │ ├── order by: []
│ │ │ └── limit: NONE
│ │ └── Scan
│ │ ├── table: default.date_dim
│ │ ├── table: default.date_dim (#1)
│ │ ├── filters: []
│ │ ├── order by: []
│ │ └── limit: NONE
│ └── Scan
│ ├── table: default.store
│ ├── table: default.store (#2)
│ ├── filters: []
│ ├── order by: []
│ └── limit: NONE
└── Scan
├── table: default.customer
├── table: default.customer (#3)
├── filters: []
├── order by: []
└── limit: NONE
Expand All @@ -171,7 +171,7 @@ optimized_plan: |
├── limit: [100]
├── offset: [0]
└── Sort
├── sort keys: [default.customer.c_customer_id (#79) ASC]
├── sort keys: [default.customer.c_customer_id (#79) ASC NULLS LAST]
├── limit: [100]
└── EvalScalar
├── scalars: [customer.c_customer_id (#79) AS (#79), ctr1.ctr_total_return (#48) AS (#154), scalar_subquery_147 (#147) AS (#155), store.s_store_sk (#49) AS (#156), ctr1.ctr_store_sk (#7) AS (#157), store.s_state (#73) AS (#158), ctr1.ctr_customer_sk (#3) AS (#159), customer.c_customer_sk (#78) AS (#160)]
Expand All @@ -184,29 +184,29 @@ optimized_plan: |
│ ├── probe keys: [ctr1.ctr_customer_sk (#3)]
│ ├── other filters: []
│ ├── Aggregate(Final)
│ │ ├── group items: [store_returns.sr_customer_sk (#3), store_returns.sr_store_sk (#7)]
│ │ ├── aggregate functions: [Sum(sr_return_amt) (#48)]
│ │ ├── group items: [store_returns.sr_customer_sk (#3) AS (#3), store_returns.sr_store_sk (#7) AS (#7)]
│ │ ├── aggregate functions: [Sum(sr_return_amt) AS (#48)]
│ │ └── Aggregate(Partial)
│ │ ├── group items: [store_returns.sr_customer_sk (#3), store_returns.sr_store_sk (#7)]
│ │ ├── aggregate functions: [Sum(sr_return_amt) (#48)]
│ │ ├── group items: [store_returns.sr_customer_sk (#3) AS (#3), store_returns.sr_store_sk (#7) AS (#7)]
│ │ ├── aggregate functions: [Sum(sr_return_amt) AS (#48)]
│ │ └── EvalScalar
│ │ ├── scalars: [store_returns.sr_customer_sk (#3) AS (#3), store_returns.sr_store_sk (#7) AS (#7), store_returns.sr_return_amt (#11) AS (#11), store_returns.sr_returned_date_sk (#0) AS (#148), date_dim.d_date_sk (#20) AS (#149), date_dim.d_year (#26) AS (#150)]
│ │ └── Join(Inner)
│ │ ├── build keys: [date_dim.d_date_sk (#20)]
│ │ ├── probe keys: [store_returns.sr_returned_date_sk (#0)]
│ │ ├── other filters: []
│ │ ├── Scan
│ │ │ ├── table: default.store_returns
│ │ │ ├── table: default.store_returns (#0)
│ │ │ ├── filters: []
│ │ │ ├── order by: []
│ │ │ └── limit: NONE
│ │ └── Scan
│ │ ├── table: default.date_dim
│ │ ├── table: default.date_dim (#1)
│ │ ├── filters: [eq(date_dim.d_year (#26), 2001)]
│ │ ├── order by: []
│ │ └── limit: NONE
│ └── Scan
│ ├── table: default.customer
│ ├── table: default.customer (#3)
│ ├── filters: []
│ ├── order by: []
│ └── limit: NONE
Expand All @@ -215,37 +215,37 @@ optimized_plan: |
├── probe keys: [store.s_store_sk (#49)]
├── other filters: []
├── Scan
│ ├── table: default.store
│ ├── table: default.store (#2)
│ ├── filters: [eq(store.s_state (#73), 'TN')]
│ ├── order by: []
│ └── limit: NONE
└── EvalScalar
├── scalars: [outer.sr_store_sk (#103) AS (#103), multiply(divide(sum(ctr_total_return) (#145), if(eq(count(ctr_total_return) (#146), 0), 1, count(ctr_total_return) (#146))), 1.2) AS (#147)]
└── Aggregate(Final)
├── group items: [outer.sr_store_sk (#103)]
├── aggregate functions: [sum(ctr_total_return) (#145), count(ctr_total_return) (#146)]
├── group items: [outer.sr_store_sk (#103) AS (#103)]
├── aggregate functions: [sum(ctr_total_return) AS (#145), count(ctr_total_return) AS (#146)]
└── Aggregate(Partial)
├── group items: [outer.sr_store_sk (#103)]
├── aggregate functions: [sum(ctr_total_return) (#145), count(ctr_total_return) (#146)]
├── group items: [outer.sr_store_sk (#103) AS (#103)]
├── aggregate functions: [sum(ctr_total_return) AS (#145), count(ctr_total_return) AS (#146)]
└── Aggregate(Final)
├── group items: [store_returns.sr_customer_sk (#99), store_returns.sr_store_sk (#103)]
├── aggregate functions: [Sum(sr_return_amt) (#144)]
├── group items: [store_returns.sr_customer_sk (#99) AS (#99), store_returns.sr_store_sk (#103) AS (#103)]
├── aggregate functions: [Sum(sr_return_amt) AS (#144)]
└── Aggregate(Partial)
├── group items: [store_returns.sr_customer_sk (#99), store_returns.sr_store_sk (#103)]
├── aggregate functions: [Sum(sr_return_amt) (#144)]
├── group items: [store_returns.sr_customer_sk (#99) AS (#99), store_returns.sr_store_sk (#103) AS (#103)]
├── aggregate functions: [Sum(sr_return_amt) AS (#144)]
└── EvalScalar
├── scalars: [store_returns.sr_customer_sk (#99) AS (#99), store_returns.sr_store_sk (#103) AS (#103), store_returns.sr_return_amt (#107) AS (#107), store_returns.sr_returned_date_sk (#96) AS (#151), date_dim.d_date_sk (#116) AS (#152), date_dim.d_year (#122) AS (#153)]
└── Join(Inner)
├── build keys: [date_dim.d_date_sk (#116)]
├── probe keys: [store_returns.sr_returned_date_sk (#96)]
├── other filters: []
├── Scan
│ ├── table: default.store_returns
│ ├── table: default.store_returns (#4)
│ ├── filters: []
│ ├── order by: []
│ └── limit: NONE
└── Scan
├── table: default.date_dim
├── table: default.date_dim (#5)
├── filters: [eq(date_dim.d_year (#122), 2001)]
├── order by: []
└── limit: NONE
Expand Down
28 changes: 14 additions & 14 deletions src/query/service/tests/it/sql/planner/optimizer/data/yaml/q3.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,13 @@ raw_plan: |
├── limit: [100]
├── offset: [0]
└── Sort
├── sort keys: [default.date_dim.d_year (#6) ASC, derived.SUM(ss_ext_sales_price) (#73) DESC, default.item.i_brand_id (#58) ASC]
├── sort keys: [default.date_dim.d_year (#6) ASC NULLS LAST, derived.SUM(ss_ext_sales_price) (#73) DESC NULLS LAST, default.item.i_brand_id (#58) ASC NULLS LAST]
├── limit: [NONE]
└── EvalScalar
├── scalars: [dt.d_year (#6) AS (#6), item.i_brand_id (#58) AS (#58), item.i_brand (#59) AS (#59), SUM(ss_ext_sales_price) (#73) AS (#73)]
└── Aggregate(Initial)
├── group items: [dt.d_year (#6), item.i_brand (#59), item.i_brand_id (#58)]
├── aggregate functions: [SUM(ss_ext_sales_price) (#73)]
├── group items: [dt.d_year (#6) AS (#6), item.i_brand (#59) AS (#59), item.i_brand_id (#58) AS (#58)]
├── aggregate functions: [SUM(ss_ext_sales_price) AS (#73)]
└── EvalScalar
├── scalars: [dt.d_year (#6) AS (#6), store_sales.ss_ext_sales_price (#43) AS (#43), item.i_brand_id (#58) AS (#58), item.i_brand (#59) AS (#59)]
└── Filter
Expand All @@ -113,17 +113,17 @@ raw_plan: |
│ ├── probe keys: []
│ ├── other filters: []
│ ├── Scan
│ │ ├── table: default.date_dim
│ │ ├── table: default.date_dim (#0)
│ │ ├── filters: []
│ │ ├── order by: []
│ │ └── limit: NONE
│ └── Scan
│ ├── table: default.store_sales
│ ├── table: default.store_sales (#1)
│ ├── filters: []
│ ├── order by: []
│ └── limit: NONE
└── Scan
├── table: default.item
├── table: default.item (#2)
├── filters: []
├── order by: []
└── limit: NONE
Expand All @@ -133,22 +133,22 @@ optimized_plan: |
├── limit: [100]
├── offset: [0]
└── Sort
├── sort keys: [default.date_dim.d_year (#6) ASC, derived.SUM(ss_ext_sales_price) (#73) DESC, default.item.i_brand_id (#58) ASC]
├── sort keys: [default.date_dim.d_year (#6) ASC NULLS LAST, derived.SUM(ss_ext_sales_price) (#73) DESC NULLS LAST, default.item.i_brand_id (#58) ASC NULLS LAST]
├── limit: [100]
└── Aggregate(Final)
├── group items: [dt.d_year (#6), item.i_brand (#59), item.i_brand_id (#58)]
├── aggregate functions: [SUM(ss_ext_sales_price) (#73)]
├── group items: [dt.d_year (#6) AS (#6), item.i_brand (#59) AS (#59), item.i_brand_id (#58) AS (#58)]
├── aggregate functions: [SUM(ss_ext_sales_price) AS (#73)]
└── Aggregate(Partial)
├── group items: [dt.d_year (#6), item.i_brand (#59), item.i_brand_id (#58)]
├── aggregate functions: [SUM(ss_ext_sales_price) (#73)]
├── group items: [dt.d_year (#6) AS (#6), item.i_brand (#59) AS (#59), item.i_brand_id (#58) AS (#58)]
├── aggregate functions: [SUM(ss_ext_sales_price) AS (#73)]
└── EvalScalar
├── scalars: [dt.d_year (#6) AS (#6), store_sales.ss_ext_sales_price (#43) AS (#43), item.i_brand_id (#58) AS (#58), item.i_brand (#59) AS (#59), dt.d_date_sk (#0) AS (#74), store_sales.ss_sold_date_sk (#28) AS (#75), store_sales.ss_item_sk (#30) AS (#76), item.i_item_sk (#51) AS (#77), item.i_manufact_id (#64) AS (#78), dt.d_moy (#8) AS (#79)]
└── Join(Inner)
├── build keys: [store_sales.ss_sold_date_sk (#28)]
├── probe keys: [dt.d_date_sk (#0)]
├── other filters: []
├── Scan
│ ├── table: default.date_dim
│ ├── table: default.date_dim (#0)
│ ├── filters: [eq(date_dim.d_moy (#8), 11)]
│ ├── order by: []
│ └── limit: NONE
Expand All @@ -157,12 +157,12 @@ optimized_plan: |
├── probe keys: [store_sales.ss_item_sk (#30)]
├── other filters: []
├── Scan
│ ├── table: default.store_sales
│ ├── table: default.store_sales (#1)
│ ├── filters: []
│ ├── order by: []
│ └── limit: NONE
└── Scan
├── table: default.item
├── table: default.item (#2)
├── filters: [eq(item.i_manufact_id (#64), 128)]
├── order by: []
└── limit: NONE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ async fn test_tpcds_optimizer() -> Result<()> {
(test.stats_setup)(&mut raw_plan)?;

// Print and verify raw plan
let raw_plan_str = raw_plan.format_indent(false)?;
let raw_plan_str = raw_plan.format_indent(Default::default())?;
println!("Raw plan:\n{}", raw_plan_str);

// Verify raw plan matches expected
Expand All @@ -282,7 +282,7 @@ async fn test_tpcds_optimizer() -> Result<()> {

// Optimize the plan
let optimized_plan = optimize_plan(&ctx, raw_plan).await?;
let optimized_plan_str = optimized_plan.format_indent(false)?;
let optimized_plan_str = optimized_plan.format_indent(Default::default())?;
println!("Optimized plan:\n{}", optimized_plan_str);

// Verify the optimized plan matches expected output
Expand Down
Loading