diff --git a/crates/polars-expr/src/expressions/alias.rs b/crates/polars-expr/src/expressions/alias.rs index 6b38d8dc8270..8d321263a3f5 100644 --- a/crates/polars-expr/src/expressions/alias.rs +++ b/crates/polars-expr/src/expressions/alias.rs @@ -59,6 +59,10 @@ impl PhysicalExpr for AliasExpr { )) } + fn is_literal(&self) -> bool { + self.physical_expr.is_literal() + } + fn is_scalar(&self) -> bool { self.physical_expr.is_scalar() } diff --git a/crates/polars-mem-engine/src/planner/lp.rs b/crates/polars-mem-engine/src/planner/lp.rs index 9bbe73207a3c..dc96e4ac26b7 100644 --- a/crates/polars-mem-engine/src/planner/lp.rs +++ b/crates/polars-mem-engine/src/planner/lp.rs @@ -374,9 +374,6 @@ fn create_physical_plan_impl( POOL.current_num_threads() > expr.len(), state.expr_depth, ); - - let streamable = - options.should_broadcast && all_streamable(&expr, expr_arena, Context::Default); let phys_expr = create_physical_expressions_from_irs( &expr, Context::Default, @@ -384,6 +381,13 @@ fn create_physical_plan_impl( &input_schema, &mut state, )?; + + let streamable = options.should_broadcast && all_streamable(&expr, expr_arena, Context::Default) + // If all columns are literal we would get a 1 row per thread. + && !phys_expr.iter().all(|p| { + p.is_literal() + }); + Ok(Box::new(executors::ProjectionExec { input, expr: phys_expr,