{"record":{"id":"df29f049c9bbce3b","repo":"databendlabs/databend","slug":"dataexchange-globalshuffleexchange-unreacha","errorCode":null,"errorMessage":"DataExchange::GlobalShuffleExchange(_) => unreachable!()","messagePattern":"DataExchange::GlobalShuffleExchange\\(_\\) => unreachable!\\(\\)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/query/service/src/pipelines/processors/transforms/aggregator/aggregate_exchange_injector.rs","lineNumber":66,"sourceCode":"    ) -> Arc<dyn ExchangeInjector> {\n        Arc::new(AggregateInjector {\n            ctx,\n            aggregator_params: params,\n            shuffle_mode,\n        })\n    }\n}\n\nimpl ExchangeInjector for AggregateInjector {\n    fn flight_scatter(\n        &self,\n        _: &Arc<QueryContext>,\n        exchange: &DataExchange,\n    ) -> Result<Arc<Box<dyn FlightScatter>>> {\n        match exchange {\n            DataExchange::Merge(_) => unreachable!(),\n            DataExchange::Broadcast(_) => unreachable!(),\n            DataExchange::GlobalShuffleExchange(_) => unreachable!(),\n            DataExchange::NodeToNodeExchange(exchange) => match self.shuffle_mode {\n                AggregateShuffleMode::Row => Ok(Arc::new(Box::new(AggregateRowScatter {\n                    buckets: exchange.destination_ids.len(),\n                    aggregate_params: self.aggregator_params.clone(),\n                }))),\n                AggregateShuffleMode::Bucket(_) => Ok(Arc::new(Box::new(AggregateBucketScatter {\n                    buckets: exchange.destination_ids.len(),\n                }))),\n            },\n        }\n    }\n\n    fn exchange_sorting(&self) -> Option<Arc<dyn ExchangeSorting>> {\n        None\n    }\n\n    fn apply_merge_serializer(\n        &self,","sourceCodeStart":48,"sourceCodeEnd":84,"githubUrl":"https://github.com/databendlabs/databend/blob/288d84d76e20a2f8f7173bda9691eb6ece301aa9/src/query/service/src/pipelines/processors/transforms/aggregator/aggregate_exchange_injector.rs#L48-L84","documentation":"`AggregateExchangeInjector::flight_scatter` panics when it receives a `DataExchange::GlobalShuffleExchange`. Aggregate shuffle injection supports only `NodeToNodeExchange`; a global-shuffle exchange reaching this code means plan classification went wrong before injection.","triggerScenarios":"`flight_scatter` invoked on a plan whose exchange is `GlobalShuffleExchange`, i.e. the injector was applied to a globally-shuffled aggregation plan.","commonSituations":"Planner bugs where global shuffle plans (e.g. two-stage aggregation with global redistribute) are incorrectly treated as candidates for local aggregate shuffle injection.","solutions":["Inspect the physical plan with EXPLAIN to see why a GlobalShuffleExchange was paired with aggregate injection","Fix the injector's precondition so it only runs on NodeToNodeExchange plans","Return an explicit error variant instead of `unreachable!()`","Check Databend issue tracker/upstream fixes for global shuffle + aggregation planning"],"exampleFix":"// before\nDataExchange::GlobalShuffleExchange(_) => unreachable!(),\n// after\nDataExchange::GlobalShuffleExchange(_) => Err(ErrorCode::Unimplemented(\"aggregate shuffle does not support GlobalShuffleExchange\")),","handlingStrategy":"validation","validationCode":"if matches!(exchange, DataExchange::GlobalShuffleExchange(_)) { return Err(ErrorCode::Unimplemented(\"aggregate injection unsupported for GlobalShuffleExchange\")); }","typeGuard":"fn injectable(e: &DataExchange) -> bool { matches!(e, DataExchange::NodeToNodeExchange(_)) }","tryCatchPattern":null,"preventionTips":["Gate aggregate injection on plan exchange kind before calling flight_scatter","Cover GlobalShuffleExchange aggregation plans in planner tests","Prefer explicit error variants over unreachable!() in planning code"],"tags":["rust","panic","query-planning","distributed"],"backgroundTag":"internal-invariant-violation","analyzedSha":"288d84d76e20a2f8f7173bda9691eb6ece301aa9","analyzedAt":"2026-09-11T11:29:36.208Z","contentChangedAt":"2026-09-11T11:29:36.208Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}