diff --git a/query/src/frontend/influxrpc.rs b/query/src/frontend/influxrpc.rs index 4d6b87b920..7624e8eaee 100644 --- a/query/src/frontend/influxrpc.rs +++ b/query/src/frontend/influxrpc.rs @@ -895,6 +895,11 @@ impl InfluxRpcPlanner { }) .collect::>(); + // If the projection is empty then there is no plan to execute. + if select_exprs.is_empty() { + return Ok(None); + } + let plan = plan_builder .project(select_exprs) .context(BuildingPlan)? diff --git a/query_tests/src/influxrpc/tag_keys.rs b/query_tests/src/influxrpc/tag_keys.rs index db5c9372f0..e3eb425aa0 100644 --- a/query_tests/src/influxrpc/tag_keys.rs +++ b/query_tests/src/influxrpc/tag_keys.rs @@ -46,6 +46,15 @@ where } } +#[tokio::test] +async fn list_tag_columns_with_no_tags() { + let predicate = PredicateBuilder::default().build(); + run_tag_keys_test_case(OneMeasurementNoTags {}, predicate, vec![]).await; + + let predicate = PredicateBuilder::default().timestamp_range(0, 1000).build(); + run_tag_keys_test_case(OneMeasurementNoTags {}, predicate, vec![]).await; +} + #[tokio::test] async fn list_tag_columns_no_predicate() { let predicate = PredicateBuilder::default().build(); diff --git a/query_tests/src/scenarios.rs b/query_tests/src/scenarios.rs index c40e5c7447..bd1ec90c61 100644 --- a/query_tests/src/scenarios.rs +++ b/query_tests/src/scenarios.rs @@ -223,6 +223,25 @@ impl DbSetup for OneMeasurementRealisticTimes { } } +#[derive(Debug)] +pub struct OneMeasurementNoTags {} +#[async_trait] +impl DbSetup for OneMeasurementNoTags { + async fn make(&self) -> Vec { + let partition_key = "1970-01-01T00"; + + let lp_lines = vec![ + "h2o temp=70.4 100", + "h2o temp=72.4 250", + "h2o temp=50.4 200", + "h2o level=200.0 300", + ]; + + // return all possible scenarios a chunk: MUB open, MUB frozen, RUB, RUB & OS, OS + all_scenarios_for_one_chunk(vec![], vec![], lp_lines, "h2o", partition_key).await + } +} + #[derive(Debug)] pub struct OneMeasurementManyNullTags {} #[async_trait]