quill_sql/expression/
util.rs

1use crate::catalog::SchemaRef;
2use crate::error::QuillSQLResult;
3use crate::expression::{Alias, Cast, ColumnExpr, Expr};
4
5/// Convert an expression into Column expression
6pub fn columnize_expr(e: &Expr, input_schema: &SchemaRef) -> QuillSQLResult<Expr> {
7    match e {
8        Expr::Column(_) => Ok(e.clone()),
9        Expr::Alias(Alias { expr, name }) => Ok(Expr::Alias(Alias {
10            expr: Box::new(columnize_expr(expr, input_schema)?),
11            name: name.clone(),
12        })),
13        Expr::Cast(Cast { expr, data_type }) => Ok(Expr::Cast(Cast {
14            expr: Box::new(columnize_expr(expr, input_schema)?),
15            data_type: *data_type,
16        })),
17        _ => {
18            let name = e.to_string();
19            let idx = input_schema.index_of(None, name.as_str())?;
20            let col = input_schema.column_with_index(idx)?;
21            Ok(Expr::Column(ColumnExpr {
22                relation: col.relation.clone(),
23                name,
24            }))
25        }
26    }
27}