Skip to content

Commit e66bbbf

Browse files
Expose DataFusion SQL explain output
1 parent 8026cc2 commit e66bbbf

5 files changed

Lines changed: 39 additions & 8 deletions

File tree

quickwit/quickwit-df-core/proto/datafusion.proto

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ message ExecuteSqlRequest {
6868

6969
// Optional per-request session overrides.
7070
map<string, string> properties = 2;
71+
72+
// When true, the server returns the service-level EXPLAIN output for the
73+
// final SQL statement instead of executing it. DDL statements before the
74+
// final query are still executed for side effects.
75+
bool explain = 3;
7176
}
7277

7378
message ExecuteSqlResponse {

quickwit/quickwit-df-core/src/codegen/quickwit.datafusion.rs

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

quickwit/quickwit-df-core/src/grpc.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,17 @@ impl data_fusion_service_server::DataFusionService for DataFusionServiceGrpcImpl
208208
let req = request.into_inner();
209209
let service = Arc::clone(&self.service);
210210

211+
let output = if req.explain {
212+
DataFusionOutput::Explain
213+
} else {
214+
DataFusionOutput::Records
215+
};
211216
let execution = service
212-
.execute(DataFusionRequest::records(
213-
DataFusionInput::Sql(&req.sql),
214-
&req.properties,
215-
))
217+
.execute(DataFusionRequest {
218+
input: DataFusionInput::Sql(&req.sql),
219+
output,
220+
properties: &req.properties,
221+
})
216222
.await
217223
.map_err(|err| {
218224
warn!(error = %err, "DataFusion SQL execution error");

quickwit/quickwit-df-core/src/service.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -876,10 +876,10 @@ fn physical_plan_with_metrics(
876876
physical_plan: &Arc<dyn ExecutionPlan>,
877877
) -> (Arc<dyn ExecutionPlan>, bool) {
878878
if physical_plan.as_any().is::<DistributedExec>() {
879-
return match rewrite_distributed_plan_with_metrics(
879+
return match futures::executor::block_on(rewrite_distributed_plan_with_metrics(
880880
Arc::clone(physical_plan),
881881
DistributedMetricsFormat::PerTask,
882-
) {
882+
)) {
883883
Ok(physical_plan) => (physical_plan, true),
884884
Err(_) => (Arc::clone(physical_plan), false),
885885
};

quickwit/quickwit-integration-tests/src/tests/metrics_distributed_tests.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,26 @@ fn datafusion_client(
7979
async fn execute_datafusion_sql(
8080
client: &mut DataFusionServiceClient<tonic::transport::Channel>,
8181
sql: impl Into<String>,
82+
) -> Vec<RecordBatch> {
83+
execute_datafusion_sql_with_explain(client, sql, false).await
84+
}
85+
86+
async fn explain_datafusion_sql(
87+
client: &mut DataFusionServiceClient<tonic::transport::Channel>,
88+
sql: impl Into<String>,
89+
) -> Vec<RecordBatch> {
90+
execute_datafusion_sql_with_explain(client, sql, true).await
91+
}
92+
93+
async fn execute_datafusion_sql_with_explain(
94+
client: &mut DataFusionServiceClient<tonic::transport::Channel>,
95+
sql: impl Into<String>,
96+
explain: bool,
8297
) -> Vec<RecordBatch> {
8398
let request = ExecuteSqlRequest {
8499
sql: sql.into(),
85100
properties: Default::default(),
101+
explain,
86102
};
87103
let mut stream = client.execute_sql(request).await.unwrap().into_inner();
88104
let mut batches = Vec::new();
@@ -234,8 +250,7 @@ async fn test_distributed_tasks_not_shuffles() {
234250
let query = r#"SELECT SUM(value) as total, COUNT(*) as cnt FROM "dist-test""#;
235251

236252
let mut client = datafusion_client(&sandbox);
237-
let explain_batches =
238-
execute_datafusion_sql(&mut client, format!("{ddl}; EXPLAIN VERBOSE {query}")).await;
253+
let explain_batches = explain_datafusion_sql(&mut client, format!("{ddl}; {query}")).await;
239254
let plan_str = explain_plan_text(&explain_batches);
240255
println!("=== DataFusion EXPLAIN output ===\n{plan_str}");
241256

0 commit comments

Comments
 (0)