mod display;
use super::*;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Expr {
Identifier(Ident),
Wildcard,
QualifiedWildcard(Vec<Ident>),
CompoundIdentifier(Vec<Ident>),
IsNull(Box<Expr>),
IsNotNull(Box<Expr>),
InList(InList),
InSubquery(InSubquery),
Between(Between),
BinaryOp(BinaryOp),
UnaryOp(UnaryOp),
Cast(Cast),
TryCast(TryCast),
Extract(Extract),
Substring(Substring),
Trim(Trim),
Collate(Collate),
Nested(Box<Expr>),
Value(Value),
TypedString(TypedString),
MapAccess(MapAccess),
Function(Function),
Case(Case),
Exists(Box<Query>),
Subquery(Box<Query>),
ListAgg(ListAgg),
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct Case {
pub operand: Option<Box<Expr>>,
pub conditions: Vec<Expr>,
pub results: Vec<Expr>,
pub else_result: Option<Box<Expr>>,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct InList {
pub expr: Box<Expr>,
pub list: Vec<Expr>,
pub negated: bool,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct InSubquery {
pub expr: Box<Expr>,
pub subquery: Box<Query>,
pub negated: bool,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct Between {
pub expr: Box<Expr>,
pub negated: bool,
pub low: Box<Expr>,
pub high: Box<Expr>,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct BinaryOp {
pub left: Box<Expr>,
pub op: BinaryOperator,
pub right: Box<Expr>,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct UnaryOp {
pub op: UnaryOperator,
pub expr: Box<Expr>,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct Cast {
pub expr: Box<Expr>,
pub data_type: DataType,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct TryCast {
pub expr: Box<Expr>,
pub data_type: DataType,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct Extract {
pub field: DateTimeField,
pub expr: Box<Expr>,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct Substring {
pub expr: Box<Expr>,
pub substring_from: Option<Box<Expr>>,
pub substring_for: Option<Box<Expr>>,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct Trim {
pub expr: Box<Expr>,
pub trim_where: Option<(TrimWhereField, Box<Expr>)>,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct Collate {
pub expr: Box<Expr>,
pub collation: ObjectName,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct TypedString {
pub data_type: DataType,
pub value: String,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct MapAccess {
pub column: Box<Expr>,
pub key: String,
}