diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/sql_call.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/sql_call.rs index b8698b2f0babf..4b496c4153855 100644 --- a/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/sql_call.rs +++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/planner/sql_call.rs @@ -337,6 +337,26 @@ impl SqlCall { .collect::, _>>()?; let context_values = self.eval_security_context_values(&query_tools); + + // A FILTER_PARAMS column can itself be a template referencing this + // call's members (e.g. `.filter(`${CUBE.col}`)`), so the rendered + // predicate may still carry `{arg:N}`/`{sv:N}` placeholders. Resolve + // them against the just-computed dependencies before the predicate is + // spliced into the outer template, which would otherwise leave them + // untouched (the outer pass never rescans substituted values). + let filter_params = filter_params + .iter() + .map(|s| { + Self::substitute_template(s, &deps, &filter_params, &filter_groups, &context_values) + }) + .collect::, _>>()?; + let filter_groups = filter_groups + .iter() + .map(|s| { + Self::substitute_template(s, &deps, &filter_params, &filter_groups, &context_values) + }) + .collect::, _>>()?; + Ok((filter_params, filter_groups, deps, context_values)) }