Skip to main content

nodedb_sql/
types_expr.rs

1//! SQL value / expression / operator types.
2//!
3//! Extracted from `types.rs` to keep both files under the 500-line limit.
4//! Re-exported from `types` so downstream `use crate::types::*` continues
5//! to resolve these symbols without change.
6
7use crate::types::SqlPlan;
8
9/// SQL value literal.
10#[derive(Debug, Clone, PartialEq)]
11pub enum SqlValue {
12    Int(i64),
13    Float(f64),
14    String(String),
15    Bool(bool),
16    Null,
17    Bytes(Vec<u8>),
18    Array(Vec<SqlValue>),
19}
20
21/// SQL expression tree.
22#[derive(Debug, Clone)]
23pub enum SqlExpr {
24    /// Column reference, optionally qualified: `name` or `users.name`
25    Column { table: Option<String>, name: String },
26    /// Literal value.
27    Literal(SqlValue),
28    /// Binary operation: `a + b`, `x > 5`
29    BinaryOp {
30        left: Box<SqlExpr>,
31        op: BinaryOp,
32        right: Box<SqlExpr>,
33    },
34    /// Unary operation: `-x`, `NOT flag`
35    UnaryOp { op: UnaryOp, expr: Box<SqlExpr> },
36    /// Function call: `COUNT(*)`, `vector_distance(field, ARRAY[...])`
37    Function {
38        name: String,
39        args: Vec<SqlExpr>,
40        distinct: bool,
41    },
42    /// CASE WHEN ... THEN ... ELSE ... END
43    Case {
44        operand: Option<Box<SqlExpr>>,
45        when_then: Vec<(SqlExpr, SqlExpr)>,
46        else_expr: Option<Box<SqlExpr>>,
47    },
48    /// CAST(expr AS type)
49    Cast { expr: Box<SqlExpr>, to_type: String },
50    /// Subquery expression (IN, EXISTS, scalar)
51    Subquery(Box<SqlPlan>),
52    /// Wildcard `*`
53    Wildcard,
54    /// `IS NULL` / `IS NOT NULL`
55    IsNull { expr: Box<SqlExpr>, negated: bool },
56    /// `expr IN (values)`
57    InList {
58        expr: Box<SqlExpr>,
59        list: Vec<SqlExpr>,
60        negated: bool,
61    },
62    /// `expr BETWEEN low AND high`
63    Between {
64        expr: Box<SqlExpr>,
65        low: Box<SqlExpr>,
66        high: Box<SqlExpr>,
67        negated: bool,
68    },
69    /// `expr LIKE pattern`
70    Like {
71        expr: Box<SqlExpr>,
72        pattern: Box<SqlExpr>,
73        negated: bool,
74    },
75    /// Array literal: `ARRAY[1.0, 2.0, 3.0]`
76    ArrayLiteral(Vec<SqlExpr>),
77}
78
79/// Binary operators.
80#[derive(Debug, Clone, Copy, PartialEq, Eq)]
81pub enum BinaryOp {
82    // Arithmetic
83    Add,
84    Sub,
85    Mul,
86    Div,
87    Mod,
88    // Comparison
89    Eq,
90    Ne,
91    Gt,
92    Ge,
93    Lt,
94    Le,
95    // Logical
96    And,
97    Or,
98    // String
99    Concat,
100}
101
102/// Unary operators.
103#[derive(Debug, Clone, Copy, PartialEq, Eq)]
104pub enum UnaryOp {
105    Neg,
106    Not,
107}
108
109/// SQL data type for schema resolution.
110#[derive(Debug, Clone, PartialEq, Eq)]
111pub enum SqlDataType {
112    Int64,
113    Float64,
114    String,
115    Bool,
116    Bytes,
117    Timestamp,
118    Decimal,
119    Uuid,
120    Vector(usize),
121    Geometry,
122}