diff --git a/iox_query_influxql/src/plan/expr_type_evaluator.rs b/iox_query_influxql/src/plan/expr_type_evaluator.rs index 2d1c9aeadb..189856ecec 100644 --- a/iox_query_influxql/src/plan/expr_type_evaluator.rs +++ b/iox_query_influxql/src/plan/expr_type_evaluator.rs @@ -301,10 +301,9 @@ impl<'a> TypeEvaluator<'a> { VarRefDataType::Float | VarRefDataType::Integer | VarRefDataType::Unsigned, ) | None => Ok(Some(VarRefDataType::Float)), - Some(arg0) if self.call_type_is_strict => error::query(format!( + Some(arg0) => error::query(format!( "invalid argument type for {name}: expected a number, got {arg0}" )), - _ => Ok(None), } } diff --git a/iox_query_influxql/src/plan/field.rs b/iox_query_influxql/src/plan/field.rs index 883c43a6fc..cf989b1eda 100644 --- a/iox_query_influxql/src/plan/field.rs +++ b/iox_query_influxql/src/plan/field.rs @@ -42,8 +42,8 @@ pub(crate) fn field_name(f: &influxdb_influxql_parser::select::Field) -> String /// of rows. pub(super) fn field_by_name<'a>(fields: &'a [Field], name: &str) -> Option<&'a Field> { fields.iter().find(|f| f.name == name || match &f.expr { - Expr::Call(Call{ name: func_name, args }) if (func_name.eq_ignore_ascii_case("top") - || func_name.eq_ignore_ascii_case("bottom")) + Expr::Call(Call{ name: func_name, args }) if (func_name == "top" + || func_name == "bottom") && args.len() > 2 => args[1..].iter().any(|f| matches!(f, Expr::VarRef(VarRef{ name: field_name, .. }) if field_name.as_str() == name)), _ => false, @@ -162,7 +162,9 @@ mod test { "bottom(idle, usage, 5) AS bottom" ); - let stmt = parse_fields(vec!["top(idle, usage, 5) as foo", "usage"]); + // TOP is in uppercase, to ensure we can expect the function name to be + // uniformly lowercase. + let stmt = parse_fields(vec!["TOP(idle, usage, 5) as foo", "usage"]); assert_eq!( format!("{}", field_by_name(&stmt, "usage").unwrap()), "top(idle, usage, 5) AS foo"