Skip to main content

uqa_sql/semantics/
windows.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Window expression classification.
8
9use crate::ScalarExpr;
10
11pub fn expr_has_window(expr: &ScalarExpr) -> bool {
12    match expr {
13        ScalarExpr::WindowCall { .. } => true,
14        ScalarExpr::Func {
15            args,
16            order_by,
17            filter,
18            ..
19        } => {
20            args.iter().any(expr_has_window)
21                || order_by.iter().any(|order| expr_has_window(&order.expr))
22                || filter.as_ref().is_some_and(|expr| expr_has_window(expr))
23        }
24        ScalarExpr::Array(items)
25        | ScalarExpr::Row(items)
26        | ScalarExpr::CompositeRow { items, .. }
27        | ScalarExpr::And(items)
28        | ScalarExpr::Or(items) => items.iter().any(expr_has_window),
29        ScalarExpr::Binary { lhs, rhs, .. } => expr_has_window(lhs) || expr_has_window(rhs),
30        ScalarExpr::Not(inner)
31        | ScalarExpr::UnaryMinus(inner)
32        | ScalarExpr::IsNull { expr: inner, .. }
33        | ScalarExpr::Cast { expr: inner, .. }
34        | ScalarExpr::Collated { expr: inner, .. } => expr_has_window(inner),
35        ScalarExpr::Between { expr, low, high } => {
36            expr_has_window(expr) || expr_has_window(low) || expr_has_window(high)
37        }
38        ScalarExpr::InList { expr, list, .. } => {
39            expr_has_window(expr) || list.iter().any(expr_has_window)
40        }
41        ScalarExpr::Case {
42            base,
43            when,
44            else_branch,
45        } => {
46            base.as_ref().is_some_and(|expr| expr_has_window(expr))
47                || when
48                    .iter()
49                    .any(|(cond, result)| expr_has_window(cond) || expr_has_window(result))
50                || else_branch
51                    .as_ref()
52                    .is_some_and(|expr| expr_has_window(expr))
53        }
54        ScalarExpr::Default
55        | ScalarExpr::Star
56        | ScalarExpr::QualifiedStar(_)
57        | ScalarExpr::Column(_)
58        | ScalarExpr::Position(_)
59        | ScalarExpr::InternalColumn(_)
60        | ScalarExpr::QualifiedColumn { .. }
61        | ScalarExpr::Literal(_)
62        | ScalarExpr::TypedLiteral { .. }
63        | ScalarExpr::Param(_)
64        | ScalarExpr::ScalarSubquery(_)
65        | ScalarExpr::Exists { .. }
66        | ScalarExpr::InSubquery { .. } => false,
67    }
68}