(
expr: Expr,
schema: &DFSchema,
// a map of lambda variable name => a never empty stack of fields [ [..shadowed], in_scope ]
vars: &mut HashMap<String, Vec<FieldRef>>,
)
| 1110 | } |
| 1111 | |
| 1112 | pub(crate) fn resolve_lambda_variables( |
| 1113 | expr: Expr, |
| 1114 | schema: &DFSchema, |
| 1115 | // a map of lambda variable name => a never empty stack of fields [ [..shadowed], in_scope ] |
| 1116 | vars: &mut HashMap<String, Vec<FieldRef>>, |
| 1117 | ) -> Result<Transformed<Expr>> { |
| 1118 | expr.transform_down(|expr| match expr { |
| 1119 | Expr::HigherOrderFunction(HigherOrderFunction { func, args }) => { |
| 1120 | // not inlined to reduce nesting |
| 1121 | resolve_higher_order_function(func, args, schema, vars) |
| 1122 | } |
| 1123 | Expr::LambdaVariable(mut var) => { |
| 1124 | let field_stack = vars.get(&var.name).ok_or_else(|| { |
| 1125 | plan_datafusion_err!( |
| 1126 | "missing field of lambda variable {} while resolving", |
| 1127 | var.name |
| 1128 | ) |
| 1129 | })?; |
| 1130 | |
| 1131 | let field = field_stack.last().ok_or_else(|| { |
| 1132 | internal_datafusion_err!("every entry should have at least one field") |
| 1133 | })?; |
| 1134 | |
| 1135 | let field = Arc::clone(field).renamed(&var.name); |
| 1136 | |
| 1137 | let transformed = var.field.as_ref().is_none_or(|old| old != &field); |
| 1138 | |
| 1139 | var.field = Some(field); |
| 1140 | |
| 1141 | Ok(Transformed::new_transformed( |
| 1142 | Expr::LambdaVariable(var), |
| 1143 | transformed, |
| 1144 | )) |
| 1145 | } |
| 1146 | _ => Ok(Transformed::no(expr)), |
| 1147 | }) |
| 1148 | } |
| 1149 | |
| 1150 | fn resolve_higher_order_function( |
| 1151 | func: Arc<HigherOrderUDF>, |
no test coverage detected
searching dependent graphs…