use super::{
DataType, Extension, Ident, IntervalFields, Literal, NoExt, ObjectName, OrderByExpr, Query,
SetQuantifier, WildcardOptions, WindowSpec,
};
use crate::vocab::{Meta, Symbol};
use thin_vec::ThinVec;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum Expr<X: Extension = NoExt> {
Column {
name: ObjectName,
meta: Meta,
},
Literal {
literal: Literal,
meta: Meta,
},
BinaryOp {
left: Box<Expr<X>>,
op: BinaryOperator,
right: Box<Expr<X>>,
meta: Meta,
},
UnaryOp {
op: UnaryOperator,
expr: Box<Expr<X>>,
meta: Meta,
},
Function {
call: Box<FunctionCall<X>>,
meta: Meta,
},
Case {
case: Box<CaseExpr<X>>,
meta: Meta,
},
Extract {
extract: Box<ExtractExpr<X>>,
meta: Meta,
},
Cast {
expr: Box<Expr<X>>,
data_type: Box<DataType<X>>,
syntax: CastSyntax,
try_cast: bool,
meta: Meta,
},
IsNull {
expr: Box<Expr<X>>,
negated: bool,
spelling: NullTestSpelling,
meta: Meta,
},
IsTruth {
expr: Box<Expr<X>>,
value: TruthValue,
negated: bool,
meta: Meta,
},
IsNormalized {
expr: Box<Expr<X>>,
form: Option<NormalizationForm>,
negated: bool,
meta: Meta,
},
Between {
expr: Box<Expr<X>>,
low: Box<Expr<X>>,
high: Box<Expr<X>>,
negated: bool,
symmetric: bool,
meta: Meta,
},
Like {
expr: Box<Expr<X>>,
pattern: Box<Expr<X>>,
escape: Option<Box<Expr<X>>>,
negated: bool,
spelling: LikeSpelling,
meta: Meta,
},
InList {
expr: Box<Expr<X>>,
list: ThinVec<Expr<X>>,
negated: bool,
meta: Meta,
},
InSubquery {
expr: Box<Expr<X>>,
subquery: Box<Query<X>>,
negated: bool,
meta: Meta,
},
InExpr {
expr: Box<Expr<X>>,
rhs: Box<Expr<X>>,
negated: bool,
meta: Meta,
},
Exists {
query: Box<Query<X>>,
meta: Meta,
},
QuantifiedComparison {
left: Box<Expr<X>>,
op: BinaryOperator,
quantifier: Quantifier,
subquery: Box<Query<X>>,
meta: Meta,
},
QuantifiedList {
left: Box<Expr<X>>,
op: BinaryOperator,
quantifier: Quantifier,
array: Box<Expr<X>>,
meta: Meta,
},
QuantifiedLike {
left: Box<Expr<X>>,
pattern: Box<Expr<X>>,
quantifier: Quantifier,
negated: bool,
spelling: LikeSpelling,
meta: Meta,
},
Subquery {
query: Box<Query<X>>,
meta: Meta,
},
Parameter {
kind: ParameterKind,
meta: Meta,
},
PositionalColumn {
index: u32,
meta: Meta,
},
SessionVariable {
kind: SessionVariableKind,
name: Symbol,
meta: Meta,
},
Subscript {
subscript: Box<SubscriptExpr<X>>,
meta: Meta,
},
SemiStructuredAccess {
semi_structured_access: Box<SemiStructuredAccessExpr<X>>,
meta: Meta,
},
Collate {
collate: Box<CollateExpr<X>>,
meta: Meta,
},
Interval {
value: Box<Expr<X>>,
unit: IntervalFields,
meta: Meta,
},
AtTimeZone {
at_time_zone: Box<AtTimeZoneExpr<X>>,
meta: Meta,
},
Array {
array: Box<ArrayExpr<X>>,
meta: Meta,
},
Struct {
r#struct: Box<StructExpr<X>>,
meta: Meta,
},
StructConstructor {
constructor: Box<StructConstructorExpr<X>>,
meta: Meta,
},
Map {
map: Box<MapExpr<X>>,
meta: Meta,
},
Row {
row: Box<RowExpr<X>>,
meta: Meta,
},
FieldSelection {
field_selection: Box<FieldSelectionExpr<X>>,
meta: Meta,
},
NamedOperator {
named_operator: Box<NamedOperatorExpr<X>>,
meta: Meta,
},
PrefixOperator {
prefix_operator: Box<PrefixOperatorExpr<X>>,
meta: Meta,
},
PostfixOperator {
postfix_operator: Box<PostfixOperatorExpr<X>>,
meta: Meta,
},
Lambda {
lambda: Box<LambdaExpr<X>>,
meta: Meta,
},
Columns {
qualifier: Option<ObjectName>,
pattern: Option<Box<Expr<X>>>,
options: Option<Box<WildcardOptions<X>>>,
spelling: ColumnsSpelling,
meta: Meta,
},
SpecialFunction {
keyword: SpecialFunctionKeyword,
precision: Option<u32>,
meta: Meta,
},
JsonFunc {
json_func: Box<JsonFuncExpr<X>>,
meta: Meta,
},
JsonObject {
json_object: Box<JsonObjectExpr<X>>,
meta: Meta,
},
JsonArray {
json_array: Box<JsonArrayExpr<X>>,
meta: Meta,
},
JsonAggregate {
json_aggregate: Box<JsonAggregateExpr<X>>,
meta: Meta,
},
JsonConstructor {
json_constructor: Box<JsonConstructorExpr<X>>,
meta: Meta,
},
IsJson {
is_json: Box<IsJsonExpr<X>>,
meta: Meta,
},
XmlFunc {
xml_func: Box<XmlFunc<X>>,
meta: Meta,
},
IsDocument {
expr: Box<Expr<X>>,
negated: bool,
meta: Meta,
},
StringFunc {
string_func: Box<StringFunc<X>>,
meta: Meta,
},
Other {
ext: X,
meta: Meta,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ColumnsSpelling {
Columns,
Unpack,
Star,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SpecialFunctionKeyword {
CurrentCatalog,
CurrentDate,
CurrentRole,
CurrentSchema,
CurrentTime,
CurrentTimestamp,
CurrentUser,
LocalTime,
LocalTimestamp,
SessionUser,
SystemUser,
User,
UtcDate,
UtcTime,
UtcTimestamp,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum CastSyntax {
Call,
DoubleColon,
PrefixTyped,
Convert,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct SubscriptExpr<X: Extension = NoExt> {
pub base: Expr<X>,
pub lower: Option<Expr<X>>,
pub upper: Option<Expr<X>>,
pub step: Option<Expr<X>>,
pub kind: SubscriptKind,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SubscriptKind {
Index,
Slice,
SliceWithStep,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct SemiStructuredAccessExpr<X: Extension = NoExt> {
pub base: Expr<X>,
pub path: ThinVec<SemiStructuredPathSegment<X>>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SemiStructuredPathSegment<X: Extension = NoExt> {
Key {
key: Ident,
meta: Meta,
},
Index {
index: Box<Expr<X>>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct CollateExpr<X: Extension = NoExt> {
pub expr: Expr<X>,
pub collation: ObjectName,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct AtTimeZoneExpr<X: Extension = NoExt> {
pub expr: Expr<X>,
pub zone: Expr<X>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ArrayExpr<X: Extension = NoExt> {
Elements {
elements: ThinVec<Expr<X>>,
spelling: ArraySpelling,
meta: Meta,
},
Subquery {
query: Box<Query<X>>,
meta: Meta,
},
Comprehension {
comprehension: Box<ListComprehension<X>>,
meta: Meta,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ArraySpelling {
Keyword,
Bracket,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct ListComprehension<X: Extension = NoExt> {
pub element: Box<Expr<X>>,
pub vars: ThinVec<Ident>,
pub source: ComprehensionSource<X>,
pub filter: Option<Box<Expr<X>>>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ComprehensionSource<X: Extension = NoExt> {
Expr {
expr: Box<Expr<X>>,
meta: Meta,
},
Star {
parenthesized: bool,
options: Option<Box<WildcardOptions<X>>>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct StructExpr<X: Extension = NoExt> {
pub fields: ThinVec<StructField<X>>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct StructField<X: Extension = NoExt> {
pub key: Symbol,
pub key_spelling: StructKeySpelling,
pub value: Expr<X>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum StructKeySpelling {
SingleQuoted,
Bare,
DoubleQuoted,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct StructConstructorExpr<X: Extension = NoExt> {
pub fields: ThinVec<StructConstructorField<X>>,
pub args: ThinVec<StructConstructorArg<X>>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct StructConstructorField<X: Extension = NoExt> {
pub name: Option<Ident>,
pub ty: DataType<X>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct StructConstructorArg<X: Extension = NoExt> {
pub value: Expr<X>,
pub alias: Option<Ident>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct MapExpr<X: Extension = NoExt> {
pub entries: ThinVec<MapEntry<X>>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct MapEntry<X: Extension = NoExt> {
pub key: Expr<X>,
pub value: Expr<X>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct RowExpr<X: Extension = NoExt> {
pub fields: ThinVec<Expr<X>>,
pub explicit: bool,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct FieldSelectionExpr<X: Extension = NoExt> {
pub base: Expr<X>,
pub selector: FieldSelector,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum FieldSelector {
Field {
field: Ident,
meta: Meta,
},
Star {
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct NamedOperatorExpr<X: Extension = NoExt> {
pub left: Expr<X>,
pub schema: ObjectName,
pub op: Symbol,
pub right: Expr<X>,
pub spelling: NamedOperatorSpelling,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum NamedOperatorSpelling {
OperatorKeyword,
Bare,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct PrefixOperatorExpr<X: Extension = NoExt> {
pub op: Symbol,
pub operand: Expr<X>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct PostfixOperatorExpr<X: Extension = NoExt> {
pub operand: Expr<X>,
pub op: Symbol,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct LambdaExpr<X: Extension = NoExt> {
pub params: ThinVec<Ident>,
pub spelling: LambdaParamSpelling,
pub body: Expr<X>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum LambdaParamSpelling {
Bare,
Parenthesized,
RowKeyword,
Keyword,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ParameterKind {
Positional(u32),
PositionalLarge {
digits: Symbol,
},
Numbered(u32),
Anonymous,
Named {
name: Symbol,
sigil: ParameterSigil,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ParameterSigil {
Colon,
At,
Dollar,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SessionVariableKind {
User,
System,
SystemGlobal,
SystemSession,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct FunctionCall<X: Extension = NoExt> {
pub name: ObjectName,
pub quantifier: Option<SetQuantifier>,
pub args: ThinVec<FunctionArg<X>>,
pub wildcard: bool,
pub order_by: ThinVec<OrderByExpr<X>>,
pub within_group: Option<ThinVec<OrderByExpr<X>>>,
pub separator: Option<Literal>,
pub filter: Option<Box<Expr<X>>>,
pub filter_where: FilterWhereSpelling,
pub over: Option<WindowSpec<X>>,
pub null_treatment: Option<NullTreatment>,
pub window_tail: Option<WindowFunctionTail>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct FunctionArg<X: Extension = NoExt> {
pub name: Option<Symbol>,
pub variadic: bool,
pub syntax: ArgSyntax,
pub value: Expr<X>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ArgSyntax {
Positional,
Arrow,
ColonEquals,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum NullTreatment {
IgnoreNulls,
RespectNulls,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct WindowFunctionTail {
pub from_first_last: Option<FromFirstLast>,
pub null_treatment: Option<NullTreatment>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum FromFirstLast {
First,
Last,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct CaseExpr<X: Extension = NoExt> {
pub operand: Option<Box<Expr<X>>>,
pub when_clauses: ThinVec<WhenClause<X>>,
pub else_result: Option<Box<Expr<X>>>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct WhenClause<X: Extension = NoExt> {
pub condition: Expr<X>,
pub result: Expr<X>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct ExtractExpr<X: Extension = NoExt> {
pub field: Ident,
pub source: Box<Expr<X>>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct JsonFormat {
pub encoding: Option<JsonEncoding>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JsonEncoding {
Utf8,
Utf16,
Utf32,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct JsonValueExpr<X: Extension = NoExt> {
pub expr: Box<Expr<X>>,
pub format: Option<JsonFormat>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct JsonReturning<X: Extension = NoExt> {
pub data_type: Box<DataType<X>>,
pub format: Option<JsonFormat>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct JsonPassingArg<X: Extension = NoExt> {
pub value: JsonValueExpr<X>,
pub name: Ident,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct JsonBehavior<X: Extension = NoExt> {
pub kind: JsonBehaviorKind,
pub default_expr: Option<Box<Expr<X>>>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JsonBehaviorKind {
Error,
Null,
True,
False,
Unknown,
Empty,
EmptyArray,
EmptyObject,
Default,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JsonWrapperBehavior {
Unspecified,
Without,
Unconditional,
Conditional,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JsonQuotesBehavior {
Unspecified,
Keep,
Omit,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JsonFuncKind {
Value,
Query,
Exists,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct JsonFuncExpr<X: Extension = NoExt> {
pub kind: JsonFuncKind,
pub context: JsonValueExpr<X>,
pub path: Box<Expr<X>>,
pub passing: ThinVec<JsonPassingArg<X>>,
pub returning: Option<JsonReturning<X>>,
pub wrapper: JsonWrapperBehavior,
pub quotes: JsonQuotesBehavior,
pub on_empty: Option<JsonBehavior<X>>,
pub on_error: Option<JsonBehavior<X>>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JsonKeyValueSpelling {
Colon,
Value,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct JsonKeyValue<X: Extension = NoExt> {
pub key: Box<Expr<X>>,
pub value: JsonValueExpr<X>,
pub spelling: JsonKeyValueSpelling,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JsonNullClause {
AbsentOnNull,
NullOnNull,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct JsonObjectExpr<X: Extension = NoExt> {
pub entries: ThinVec<JsonKeyValue<X>>,
pub null_clause: Option<JsonNullClause>,
pub unique_keys: Option<bool>,
pub returning: Option<JsonReturning<X>>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JsonArrayBody<X: Extension = NoExt> {
Values {
items: ThinVec<JsonValueExpr<X>>,
null_clause: Option<JsonNullClause>,
meta: Meta,
},
Query {
query: Box<Query<X>>,
format: Option<JsonFormat>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct JsonArrayExpr<X: Extension = NoExt> {
pub body: JsonArrayBody<X>,
pub returning: Option<JsonReturning<X>>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JsonAggregateBody<X: Extension = NoExt> {
Object {
entry: JsonKeyValue<X>,
unique_keys: Option<bool>,
meta: Meta,
},
Array {
value: JsonValueExpr<X>,
order_by: ThinVec<OrderByExpr<X>>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct JsonAggregateExpr<X: Extension = NoExt> {
pub body: JsonAggregateBody<X>,
pub null_clause: Option<JsonNullClause>,
pub returning: Option<JsonReturning<X>>,
pub filter: Option<Box<Expr<X>>>,
pub over: Option<Box<WindowSpec<X>>>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JsonConstructorKind {
Json,
Scalar,
Serialize,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct JsonConstructorExpr<X: Extension = NoExt> {
pub kind: JsonConstructorKind,
pub value: JsonValueExpr<X>,
pub unique_keys: Option<bool>,
pub returning: Option<JsonReturning<X>>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JsonItemType {
Any,
Value,
Array,
Object,
Scalar,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct IsJsonExpr<X: Extension = NoExt> {
pub expr: Box<Expr<X>>,
pub negated: bool,
pub item_type: JsonItemType,
pub unique_keys: bool,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum XmlFunc<X: Extension = NoExt> {
Element {
name: Ident,
attributes: ThinVec<XmlAttribute<X>>,
content: ThinVec<Expr<X>>,
meta: Meta,
},
Forest {
elements: ThinVec<XmlAttribute<X>>,
meta: Meta,
},
Concat {
args: ThinVec<Expr<X>>,
meta: Meta,
},
Parse {
option: XmlDocumentOrContent,
arg: Box<Expr<X>>,
whitespace: XmlWhitespaceOption,
meta: Meta,
},
Pi {
name: Ident,
content: Option<Box<Expr<X>>>,
meta: Meta,
},
Root {
arg: Box<Expr<X>>,
version: Option<Box<Expr<X>>>,
standalone: XmlStandalone,
meta: Meta,
},
Serialize {
option: XmlDocumentOrContent,
arg: Box<Expr<X>>,
data_type: Box<DataType<X>>,
indent: XmlIndentOption,
meta: Meta,
},
Exists {
path: Box<Expr<X>>,
mechanism_before: Option<XmlPassingMechanism>,
arg: Box<Expr<X>>,
mechanism_after: Option<XmlPassingMechanism>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct XmlAttribute<X: Extension = NoExt> {
pub value: Box<Expr<X>>,
pub name: Option<Ident>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum XmlDocumentOrContent {
Document,
Content,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum XmlWhitespaceOption {
Unspecified,
Preserve,
Strip,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum XmlIndentOption {
Unspecified,
Indent,
NoIndent,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum XmlStandalone {
Unspecified,
Yes,
No,
NoValue,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum XmlPassingMechanism {
ByRef,
ByValue,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum StringFunc<X: Extension = NoExt> {
Substring {
expr: Box<Expr<X>>,
start: Option<Box<Expr<X>>>,
count: Option<Box<Expr<X>>>,
meta: Meta,
},
SubstringSimilar {
expr: Box<Expr<X>>,
pattern: Box<Expr<X>>,
escape: Box<Expr<X>>,
meta: Meta,
},
Position {
substr: Box<Expr<X>>,
string: Box<Expr<X>>,
meta: Meta,
},
Overlay {
target: Box<Expr<X>>,
replacement: Box<Expr<X>>,
start: Box<Expr<X>>,
count: Option<Box<Expr<X>>>,
meta: Meta,
},
Trim {
side: Option<TrimSide>,
trim_chars: Option<Box<Expr<X>>>,
from: bool,
sources: ThinVec<Expr<X>>,
meta: Meta,
},
CollationFor {
expr: Box<Expr<X>>,
meta: Meta,
},
ConvertUsing {
expr: Box<Expr<X>>,
charset: Ident,
meta: Meta,
},
MatchAgainst {
columns: ThinVec<Expr<X>>,
against: Box<Expr<X>>,
modifier: Option<MatchSearchModifier>,
meta: Meta,
},
CeilTo {
expr: Box<Expr<X>>,
field: Ident,
spelling: CeilSpelling,
meta: Meta,
},
FloorTo {
expr: Box<Expr<X>>,
field: Ident,
meta: Meta,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum MatchSearchModifier {
NaturalLanguage,
NaturalLanguageQueryExpansion,
Boolean,
QueryExpansion,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum TrimSide {
Both,
Leading,
Trailing,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum Quantifier {
Any,
All,
Some,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum BinaryOperator {
Plus,
Minus,
Multiply,
Divide,
Modulo(ModuloSpelling),
IntegerDivide(IntegerDivideSpelling),
Exponent,
StringConcat,
Contains,
ContainedBy,
StartsWith,
Overlap,
JsonGet,
JsonGetText,
JsonExists,
JsonExistsAny,
JsonExistsAll,
JsonPathExists,
JsonPathMatch,
JsonExtractPath,
JsonExtractPathText,
JsonDeletePath,
BitwiseOr,
BitwiseAnd,
BitwiseShiftLeft,
BitwiseShiftRight,
BitwiseXor(BitwiseXorSpelling),
Eq(EqualsSpelling),
NotEq(NotEqSpelling),
Lt,
LtEq,
Gt,
GtEq,
IsDistinctFrom(IsDistinctFromSpelling),
IsNotDistinctFrom(IsNotDistinctFromSpelling),
Regexp(RegexpSpelling),
Glob,
Match,
Overlaps,
And,
Xor,
Or,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ModuloSpelling {
Percent,
Mod,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum IntegerDivideSpelling {
Div,
SlashSlash,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum EqualsSpelling {
Single,
Double,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum FilterWhereSpelling {
Where,
Omitted,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum NotEqSpelling {
AngleBracket,
Bang,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum IsDistinctFromSpelling {
Keyword,
Is,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum IsNotDistinctFromSpelling {
Keyword,
NullSafeEq,
Is,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum TruthValue {
True,
False,
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum BitwiseXorSpelling {
Hash,
Caret,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum RegexpSpelling {
Rlike,
Regexp,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum LikeSpelling {
Like,
ILike,
SimilarTo,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum NullTestSpelling {
Is,
Postfix,
PostfixNotNull,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum CeilSpelling {
Ceil,
Ceiling,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum NormalizationForm {
Nfc,
Nfd,
Nfkc,
Nfkd,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum UnaryOperator {
Not,
Minus,
Plus,
BitwiseNot,
Prior,
}