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

  1. Use only one __user comparison per query and keep it in a simple supported predicate
  2. Move complex expressions outside the __user filter or pre-compute them
  3. 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

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


AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02). Data as JSON: /api/errors/616a896a711db122. Report an issue: GitHub.