cube-js/cube · error
Expected filter but found {:?}
Error message
Expected filter but found {:?} What it means
While collecting __user (ChangeUserMember) filter constraints, to_filter expects every sibling IR node in the filter group to be a filter-language node. Any other node type in that position panics with 'Expected filter but found'.
Source
Thrown at rust/cubesql/cubesql/src/compile/rewrite/converter.rs:1948
} else {
None
},
or: None,
and: None,
});
}
}
LogicalPlanLanguage::SegmentMember(params) => {
let member =
match_data_node!(node_by_id, params[0], SegmentMemberMember);
segments_result.push(member);
}
LogicalPlanLanguage::ChangeUserMember(params) => {
let member =
match_data_node!(node_by_id, params[0], ChangeUserMemberValue);
change_user_result.push(member);
}
x => panic!("Expected filter but found {:?}", x),
}
}
if change_user_result.len() > 1 {
return Err(CubeError::rewrite(
"Unable to use multiple __user in one Cube query".to_string(),
));
}
Ok((result, segments_result, change_user_result.pop()))
}
let (filters, segments, change_user) =
to_filter(&mut query_time_dimensions, filters, node_by_id, false)?;
query.filters = if filters.len() > 0 {
Some(filters)
} else {View on GitHub (pinned to 7d981676b3)
Solutions
- Use only one __user comparison per query and keep it in a simple supported predicate
- Move complex expressions outside the __user filter or pre-compute them
- Upgrade CubeSQL / report the IR node shown in the message
Example fix
// before WHERE __user = id OR __user = owner_id // after WHERE __user = id
Defensive patterns
Strategy: validation
Validate before calling
// Ensure at most one __user predicate and only simple comparisons
fn validate_user_filter(where_clause: &str) -> Result<(), String> {
let count = where_clause.match_indices("__user").count();
if count > 1 { return Err("only one __user predicate allowed".into()); }
if count == 1 && (where_clause.contains("__user OR") || where_clause.contains("OR __user")) {
return Err("__user cannot be combined with OR".into());
}
Ok(())
} Try / catch
match run_query(q) {
Err(e) if e.message().contains("Expected filter but found") => respond_bad_request("invalid __user filter structure"),
other => other,
} Prevention
- Use exactly one __user comparison per query
- Keep __user predicates as simple equality/member checks in WHERE or security context
- Let permission rules generate __user filters rather than hand-writing them
When it happens
Trigger: A filter sub-tree mixing a __user reference (ChangeUserMember) with an IR node that isn't one of the expected filter languages — e.g. a malformed WHERE clause referencing __user alongside an unrecognized expression node.
Common situations: Security-context filters using __user composed with unsupported expression shapes; hand-written SQL using __user incorrectly; bugs in views/permissions-generated filters.
Related errors
- Unsupported filter operator: {}
- Unexpected join node: {:?}
- Unexpected logical plan node: {:?}
- This query doesnt have a plan, because it already has values
- Should be rewritten with UtcTimestamp function
AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02).
Data as JSON: /api/errors/616a896a711db122.
Report an issue: GitHub.