(
context: &mut ParserContext,
env: &mut Environment,
tokens: &[Token],
position: &mut usize,
)
| 1299 | } |
| 1300 | |
| 1301 | pub(crate) fn parse_expression( |
| 1302 | context: &mut ParserContext, |
| 1303 | env: &mut Environment, |
| 1304 | tokens: &[Token], |
| 1305 | position: &mut usize, |
| 1306 | ) -> Result<Box<dyn Expr>, Box<Diagnostic>> { |
| 1307 | let aggregation_count_before = context.aggregations.len(); |
| 1308 | let window_count_before = context.window_functions.len(); |
| 1309 | let expression = parse_assignment_expression(context, env, tokens, position)?; |
| 1310 | |
| 1311 | if expression.kind() != ExprKind::Symbol { |
| 1312 | // This Expression contains aggregate function call or aggregate value |
| 1313 | if aggregation_count_before != context.aggregations.len() { |
| 1314 | let column_name = context.name_generator.generate_column_name(); |
| 1315 | let expr_type = expression.expr_type(); |
| 1316 | env.define(column_name.to_string(), expr_type.clone()); |
| 1317 | |
| 1318 | // Register the new aggregation generated field if the this expression is after group by |
| 1319 | if context.has_group_by_statement && !context.hidden_selections.contains(&column_name) { |
| 1320 | context.hidden_selections.push(column_name.to_string()); |
| 1321 | } |
| 1322 | |
| 1323 | context |
| 1324 | .aggregations |
| 1325 | .insert(column_name.clone(), AggregateValue::Expression(expression)); |
| 1326 | |
| 1327 | return Ok(Box::new(SymbolExpr { |
| 1328 | value: column_name, |
| 1329 | expr_type, |
| 1330 | flag: SymbolFlag::None, |
| 1331 | })); |
| 1332 | } |
| 1333 | |
| 1334 | // This Expression contains window function call or window value |
| 1335 | if window_count_before != context.window_functions.len() { |
| 1336 | let column_name = context.name_generator.generate_column_name(); |
| 1337 | let expr_type = expression.expr_type(); |
| 1338 | env.define(column_name.to_string(), expr_type.clone()); |
| 1339 | |
| 1340 | // Register the new window generated field if the this expression is after group by |
| 1341 | if context.has_group_by_statement && !context.hidden_selections.contains(&column_name) { |
| 1342 | context.hidden_selections.push(column_name.to_string()); |
| 1343 | } |
| 1344 | |
| 1345 | context |
| 1346 | .window_functions |
| 1347 | .insert(column_name.clone(), WindowValue::Expression(expression)); |
| 1348 | |
| 1349 | return Ok(Box::new(SymbolExpr { |
| 1350 | value: column_name, |
| 1351 | expr_type, |
| 1352 | flag: SymbolFlag::None, |
| 1353 | })); |
| 1354 | } |
| 1355 | |
| 1356 | return Ok(expression); |
| 1357 | } |
| 1358 |
no test coverage detected
searching dependent graphs…