use super::{
DataType, DefaultValue, Delete, Expr, Extension, FunctionCall, Ident, Insert, JsonBehavior,
JsonFormat, JsonPassingArg, JsonQuotesBehavior, JsonValueExpr, JsonWrapperBehavior, Literal,
MatchRecognize, Merge, NamedWindow, NoExt, ObjectName, PipeOperator, Pivot,
SemiStructuredPathSegment, SpecialFunctionKeyword, TemporaryTableKind, Unpivot, Update,
XmlPassingMechanism,
};
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 struct Query<X: Extension = NoExt> {
pub with: Option<With<X>>,
pub body: SetExpr<X>,
pub order_by: ThinVec<OrderByExpr<X>>,
pub order_by_all: Option<Box<OrderByAll>>,
pub limit_by: Option<Box<LimitBy<X>>>,
pub limit: Option<Limit<X>>,
pub settings: ThinVec<Setting<X>>,
pub format: Option<Box<FormatClause>>,
pub locking: ThinVec<LockingClause>,
pub pipe_operators: ThinVec<PipeOperator<X>>,
pub for_clause: Option<Box<ForClause>>,
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 LockingClause {
pub strength: LockStrength,
pub of: ThinVec<ObjectName>,
pub wait: Option<LockWait>,
pub spelling: LockingSpelling,
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 LockStrength {
Update,
NoKeyUpdate,
Share,
KeyShare,
}
#[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 LockWait {
NoWait,
SkipLocked,
}
#[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 LockingSpelling {
Modern,
LockInShareMode,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SetExpr<X: Extension = NoExt> {
Select {
select: Box<Select<X>>,
meta: Meta,
},
Values {
values: Box<Values<X>>,
meta: Meta,
},
Query {
query: Box<Query<X>>,
meta: Meta,
},
SetOperation {
op: SetOperator,
all: bool,
by_name: bool,
left: Box<SetExpr<X>>,
right: Box<SetExpr<X>>,
meta: Meta,
},
Pivot {
pivot: Box<Pivot<X>>,
meta: Meta,
},
Unpivot {
unpivot: Box<Unpivot<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 enum SetOperator {
Union,
Intersect,
Except,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct With<X: Extension = NoExt> {
pub recursive: bool,
pub ctes: ThinVec<Cte<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 Cte<X: Extension = NoExt> {
pub name: Ident,
pub columns: ThinVec<Ident>,
pub using_key: Option<ThinVec<Ident>>,
pub materialized: Option<bool>,
pub body: CteBody<X>,
pub search: Option<Box<CteSearchClause>>,
pub cycle: Option<Box<CteCycleClause<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 CteSearchClause {
pub breadth_first: bool,
pub columns: ThinVec<Ident>,
pub set_column: 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 CteCycleClause<X: Extension = NoExt> {
pub columns: ThinVec<Ident>,
pub mark_column: Ident,
pub mark: Option<CteCycleMark<X>>,
pub path_column: 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 CteCycleMark<X: Extension = NoExt> {
pub value: Box<Expr<X>>,
pub default: 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 CteBody<X: Extension = NoExt> {
Query {
query: Box<Query<X>>,
meta: Meta,
},
Insert {
insert: Box<Insert<X>>,
meta: Meta,
},
Update {
update: Box<Update<X>>,
meta: Meta,
},
Delete {
delete: Box<Delete<X>>,
meta: Meta,
},
Merge {
merge: Box<Merge<X>>,
meta: Meta,
},
}
impl<X: Extension> CteBody<X> {
pub fn as_query(&self) -> Option<&Query<X>> {
match self {
Self::Query { query, .. } => Some(query),
Self::Insert { .. }
| Self::Update { .. }
| Self::Delete { .. }
| Self::Merge { .. } => None,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct Values<X: Extension = NoExt> {
pub explicit_row: bool,
pub rows: ThinVec<ThinVec<ValuesItem<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 ValuesItem<X: Extension = NoExt> {
Expr {
expr: Expr<X>,
meta: Meta,
},
Default {
default: DefaultValue,
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 Select<X: Extension = NoExt> {
pub distinct: Option<SelectDistinct<X>>,
pub straight_join: bool,
pub projection: ThinVec<SelectItem<X>>,
pub into: Option<Box<IntoTarget>>,
pub from: ThinVec<TableWithJoins<X>>,
pub lateral_views: ThinVec<LateralView<X>>,
pub selection: Option<Expr<X>>,
pub connect_by: Option<Box<HierarchicalClause<X>>>,
pub group_by: ThinVec<GroupByItem<X>>,
pub group_by_quantifier: Option<SetQuantifier>,
pub group_by_all: Option<GroupByAllSpelling>,
pub having: Option<Expr<X>>,
pub windows: ThinVec<NamedWindow<X>>,
pub qualify: Option<Box<Expr<X>>>,
pub sample: Option<Box<SampleClause>>,
pub spelling: SelectSpelling,
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 SelectSpelling {
Select,
TableCommand,
FromFirst,
}
#[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 GroupByAllSpelling {
Keyword,
Star,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct IntoTarget {
pub temporary: Option<TemporaryTableKind>,
pub name: 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 enum GroupByItem<X: Extension = NoExt> {
Expr {
expr: Expr<X>,
meta: Meta,
},
Rollup {
exprs: ThinVec<Expr<X>>,
spelling: RollupSpelling,
meta: Meta,
},
Cube {
exprs: ThinVec<Expr<X>>,
meta: Meta,
},
GroupingSets {
sets: ThinVec<GroupByItem<X>>,
meta: Meta,
},
Empty {
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 RollupSpelling {
Function,
WithRollup,
}
#[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 AliasSpelling {
Bare,
As,
PrefixColon,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SelectItem<X: Extension = NoExt> {
Wildcard {
options: Option<Box<WildcardOptions<X>>>,
alias: Option<Ident>,
alias_spelling: AliasSpelling,
meta: Meta,
},
QualifiedWildcard {
name: ObjectName,
options: Option<Box<WildcardOptions<X>>>,
alias: Option<Ident>,
alias_spelling: AliasSpelling,
meta: Meta,
},
Expr {
expr: Expr<X>,
alias: Option<Ident>,
alias_spelling: AliasSpelling,
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 WildcardOptions<X: Extension = NoExt> {
pub exclude: ThinVec<ObjectName>,
pub replace: ThinVec<WildcardReplace<X>>,
pub rename: ThinVec<WildcardRename>,
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 WildcardReplace<X: Extension = NoExt> {
pub expr: Expr<X>,
pub column: 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 WildcardRename {
pub column: ObjectName,
pub alias: 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 SetQuantifier {
All,
Distinct,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SelectDistinct<X: Extension = NoExt> {
Quantifier {
quantifier: SetQuantifier,
meta: Meta,
},
On {
exprs: ThinVec<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 TableWithJoins<X: Extension = NoExt> {
pub relation: TableFactor<X>,
pub joins: ThinVec<Join<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 TableAlias {
pub name: Ident,
pub columns: ThinVec<Ident>,
pub spelling: AliasSpelling,
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 OnlySyntax {
Bare,
Parenthesized,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum RelationInheritance {
Plain,
Descendants,
Only(OnlySyntax),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct TableSample<X: Extension = NoExt> {
pub method: ObjectName,
pub args: ThinVec<Expr<X>>,
pub repeatable: 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 TableVersion<X: Extension = NoExt> {
ForSystemTimeAsOf {
point: Box<Expr<X>>,
meta: Meta,
},
ForSystemTimeFromTo {
start: Box<Expr<X>>,
end: Box<Expr<X>>,
meta: Meta,
},
ForSystemTimeBetween {
start: Box<Expr<X>>,
end: Box<Expr<X>>,
meta: Meta,
},
ForSystemTimeContainedIn {
start: Box<Expr<X>>,
end: Box<Expr<X>>,
meta: Meta,
},
ForSystemTimeAll {
meta: Meta,
},
VersionAsOf {
version: Box<Expr<X>>,
meta: Meta,
},
TimestampAsOf {
point: 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 SampleClause {
pub method: Option<ObjectName>,
pub size: Literal,
pub unit: SampleUnit,
pub seed: Option<Literal>,
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 SampleUnit {
Count,
Rows,
Percent,
PercentSign,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct TableFunctionColumn<X: Extension = NoExt> {
pub name: Ident,
pub data_type: 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 RowsFromItem<X: Extension = NoExt> {
pub function: FunctionCall<X>,
pub column_defs: ThinVec<TableFunctionColumn<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 IndexHint {
pub action: IndexHintAction,
pub keyword: IndexHintKeyword,
pub scope: Option<IndexHintScope>,
pub indexes: ThinVec<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 IndexHintAction {
Use,
Ignore,
Force,
}
#[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 IndexHintKeyword {
Index,
Key,
}
#[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 IndexHintScope {
Join,
OrderBy,
GroupBy,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum IndexedBy {
Named {
index: Ident,
meta: Meta,
},
NotIndexed {
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 TableHint {
Keyword {
keyword: TableHintKeyword,
meta: Meta,
},
Index {
equals: bool,
indexes: ThinVec<Ident>,
meta: Meta,
},
ForceSeek {
target: Option<ForceSeekTarget>,
meta: Meta,
},
Other {
ident: Ident,
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 ForceSeekTarget {
pub index: Ident,
pub columns: ThinVec<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 TableHintKeyword {
NoLock,
HoldLock,
UpdLock,
XLock,
RowLock,
PagLock,
TabLock,
TabLockX,
ReadPast,
ReadUncommitted,
ReadCommitted,
ReadCommittedLock,
RepeatableRead,
Serializable,
Snapshot,
NoWait,
NoExpand,
ForceScan,
KeepIdentity,
KeepDefaults,
IgnoreConstraints,
IgnoreTriggers,
}
impl TableHintKeyword {
pub fn as_str(self) -> &'static str {
match self {
Self::NoLock => "NOLOCK",
Self::HoldLock => "HOLDLOCK",
Self::UpdLock => "UPDLOCK",
Self::XLock => "XLOCK",
Self::RowLock => "ROWLOCK",
Self::PagLock => "PAGLOCK",
Self::TabLock => "TABLOCK",
Self::TabLockX => "TABLOCKX",
Self::ReadPast => "READPAST",
Self::ReadUncommitted => "READUNCOMMITTED",
Self::ReadCommitted => "READCOMMITTED",
Self::ReadCommittedLock => "READCOMMITTEDLOCK",
Self::RepeatableRead => "REPEATABLEREAD",
Self::Serializable => "SERIALIZABLE",
Self::Snapshot => "SNAPSHOT",
Self::NoWait => "NOWAIT",
Self::NoExpand => "NOEXPAND",
Self::ForceScan => "FORCESCAN",
Self::KeepIdentity => "KEEPIDENTITY",
Self::KeepDefaults => "KEEPDEFAULTS",
Self::IgnoreConstraints => "IGNORE_CONSTRAINTS",
Self::IgnoreTriggers => "IGNORE_TRIGGERS",
}
}
pub fn from_upper(word: &str) -> Option<Self> {
Some(match word {
"NOLOCK" => Self::NoLock,
"HOLDLOCK" => Self::HoldLock,
"UPDLOCK" => Self::UpdLock,
"XLOCK" => Self::XLock,
"ROWLOCK" => Self::RowLock,
"PAGLOCK" => Self::PagLock,
"TABLOCK" => Self::TabLock,
"TABLOCKX" => Self::TabLockX,
"READPAST" => Self::ReadPast,
"READUNCOMMITTED" => Self::ReadUncommitted,
"READCOMMITTED" => Self::ReadCommitted,
"READCOMMITTEDLOCK" => Self::ReadCommittedLock,
"REPEATABLEREAD" => Self::RepeatableRead,
"SERIALIZABLE" => Self::Serializable,
"SNAPSHOT" => Self::Snapshot,
"NOWAIT" => Self::NoWait,
"NOEXPAND" => Self::NoExpand,
"FORCESCAN" => Self::ForceScan,
"KEEPIDENTITY" => Self::KeepIdentity,
"KEEPDEFAULTS" => Self::KeepDefaults,
"IGNORE_CONSTRAINTS" => Self::IgnoreConstraints,
"IGNORE_TRIGGERS" => Self::IgnoreTriggers,
_ => return None,
})
}
}
#[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 DerivedSpelling {
Parenthesized,
BareValues,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum TableFactor<X: Extension = NoExt> {
Table {
name: ObjectName,
inheritance: RelationInheritance,
json_path: ThinVec<SemiStructuredPathSegment<X>>,
version: Option<Box<TableVersion<X>>>,
partition: ThinVec<Ident>,
alias: Option<Box<TableAlias>>,
indexed_by: Option<Box<IndexedBy>>,
index_hints: ThinVec<IndexHint>,
sample: Option<TableSample<X>>,
table_hints: ThinVec<TableHint>,
meta: Meta,
},
Derived {
lateral: bool,
subquery: Box<Query<X>>,
alias: Option<Box<TableAlias>>,
spelling: DerivedSpelling,
meta: Meta,
},
Function {
lateral: bool,
function: Box<FunctionCall<X>>,
with_ordinality: bool,
alias: Option<Box<TableAlias>>,
column_defs: ThinVec<TableFunctionColumn<X>>,
meta: Meta,
},
RowsFrom {
lateral: bool,
functions: ThinVec<RowsFromItem<X>>,
with_ordinality: bool,
alias: Option<Box<TableAlias>>,
meta: Meta,
},
Unnest {
lateral: bool,
array_exprs: ThinVec<Expr<X>>,
with_ordinality: bool,
alias: Option<Box<TableAlias>>,
column_defs: ThinVec<TableFunctionColumn<X>>,
with_offset: bool,
with_offset_alias: Option<Ident>,
meta: Meta,
},
NestedJoin {
table: Box<TableWithJoins<X>>,
alias: Option<Box<TableAlias>>,
meta: Meta,
},
SpecialFunction {
keyword: SpecialFunctionKeyword,
precision: Option<u32>,
alias: Option<Box<TableAlias>>,
meta: Meta,
},
Pivot {
pivot: Box<Pivot<X>>,
alias: Option<Box<TableAlias>>,
meta: Meta,
},
Unpivot {
unpivot: Box<Unpivot<X>>,
alias: Option<Box<TableAlias>>,
meta: Meta,
},
MatchRecognize {
match_recognize: Box<MatchRecognize<X>>,
alias: Option<Box<TableAlias>>,
meta: Meta,
},
ShowRef {
show: Box<ShowRef<X>>,
alias: Option<Box<TableAlias>>,
meta: Meta,
},
JsonTable {
json_table: Box<JsonTable<X>>,
alias: Option<Box<TableAlias>>,
meta: Meta,
},
XmlTable {
xml_table: Box<XmlTable<X>>,
alias: Option<Box<TableAlias>>,
meta: Meta,
},
OpenJson {
open_json: Box<OpenJson<X>>,
alias: Option<Box<TableAlias>>,
meta: Meta,
},
TableExpr {
expr: Box<Expr<X>>,
alias: Option<Box<TableAlias>>,
meta: Meta,
},
Other {
ext: X,
meta: Meta,
},
}
impl<X: Extension> TableFactor<X> {
pub fn alias_slot_mut(&mut self) -> Option<&mut Option<Box<TableAlias>>> {
match self {
Self::Table { alias, .. }
| Self::Derived { alias, .. }
| Self::Function { alias, .. }
| Self::RowsFrom { alias, .. }
| Self::Unnest { alias, .. }
| Self::NestedJoin { alias, .. }
| Self::SpecialFunction { alias, .. }
| Self::Pivot { alias, .. }
| Self::Unpivot { alias, .. }
| Self::MatchRecognize { alias, .. }
| Self::ShowRef { alias, .. }
| Self::JsonTable { alias, .. }
| Self::XmlTable { alias, .. }
| Self::OpenJson { alias, .. }
| Self::TableExpr { alias, .. } => Some(alias),
Self::Other { .. } => None,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct ShowRef<X: Extension = NoExt> {
pub kind: ShowRefKind,
pub target: ShowRefTarget<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 ShowRefKind {
Describe,
Desc,
Show,
Summarize,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ShowRefTarget<X: Extension = NoExt> {
Empty {
meta: Meta,
},
Query {
query: Box<Query<X>>,
meta: Meta,
},
Name {
name: ObjectName,
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 JsonTable<X: Extension = NoExt> {
pub lateral: bool,
pub context: JsonValueExpr<X>,
pub path: Box<Expr<X>>,
pub path_name: Option<Ident>,
pub passing: ThinVec<JsonPassingArg<X>>,
pub columns: ThinVec<JsonTableColumn<X>>,
pub on_error: Option<JsonBehavior<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 JsonTableColumn<X: Extension = NoExt> {
ForOrdinality {
name: Ident,
meta: Meta,
},
Regular {
name: Ident,
data_type: Box<DataType<X>>,
format: Option<JsonFormat>,
path: Option<Box<Expr<X>>>,
wrapper: JsonWrapperBehavior,
quotes: JsonQuotesBehavior,
on_empty: Option<JsonBehavior<X>>,
on_error: Option<JsonBehavior<X>>,
meta: Meta,
},
Exists {
name: Ident,
data_type: Box<DataType<X>>,
path: Option<Box<Expr<X>>>,
on_error: Option<JsonBehavior<X>>,
meta: Meta,
},
Nested {
path: Box<Expr<X>>,
path_name: Option<Ident>,
columns: ThinVec<JsonTableColumn<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 XmlTable<X: Extension = NoExt> {
pub lateral: bool,
pub namespaces: ThinVec<XmlNamespace<X>>,
pub row_expr: Box<Expr<X>>,
pub document: Box<Expr<X>>,
pub passing_mechanism_before: Option<XmlPassingMechanism>,
pub passing_mechanism_after: Option<XmlPassingMechanism>,
pub columns: ThinVec<XmlTableColumn<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 XmlNamespace<X: Extension = NoExt> {
pub uri: Box<Expr<X>>,
pub name: 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 enum XmlTableColumn<X: Extension = NoExt> {
ForOrdinality {
name: Ident,
meta: Meta,
},
Regular {
name: Ident,
data_type: Box<DataType<X>>,
path: Option<Box<Expr<X>>>,
default: Option<Box<Expr<X>>>,
not_null: Option<bool>,
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 OpenJson<X: Extension = NoExt> {
pub json_expr: Box<Expr<X>>,
pub path: Option<Box<Expr<X>>>,
pub columns: ThinVec<OpenJsonColumn<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 OpenJsonColumn<X: Extension = NoExt> {
pub name: Ident,
pub data_type: Box<DataType<X>>,
pub path: Option<Box<Expr<X>>>,
pub as_json: 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 Join<X: Extension = NoExt> {
pub relation: TableFactor<X>,
pub operator: JoinOperator<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 JoinOperator<X: Extension = NoExt> {
Inner {
straight: bool,
inner: bool,
constraint: JoinConstraint<X>,
meta: Meta,
},
LeftOuter {
outer: bool,
constraint: JoinConstraint<X>,
meta: Meta,
},
RightOuter {
outer: bool,
constraint: JoinConstraint<X>,
meta: Meta,
},
FullOuter {
outer: bool,
constraint: JoinConstraint<X>,
meta: Meta,
},
AsOf {
kind: AsOfJoinKind,
constraint: JoinConstraint<X>,
meta: Meta,
},
Cross {
meta: Meta,
},
Positional {
meta: Meta,
},
Semi {
asof: bool,
side: SemiAntiSide,
constraint: JoinConstraint<X>,
meta: Meta,
},
Anti {
asof: bool,
side: SemiAntiSide,
constraint: JoinConstraint<X>,
meta: Meta,
},
Apply {
kind: ApplyKind,
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 ApplyKind {
Cross,
Outer,
}
#[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 SemiAntiSide {
Sideless,
Left,
Right,
}
#[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 AsOfJoinKind {
Inner,
Left,
Right,
Full,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum JoinConstraint<X: Extension = NoExt> {
On {
expr: Expr<X>,
meta: Meta,
},
Using {
columns: ThinVec<Ident>,
alias: Option<Ident>,
meta: Meta,
},
Natural {
meta: Meta,
},
None {
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 OrderByExpr<X: Extension = NoExt> {
pub expr: Expr<X>,
pub asc: Option<bool>,
pub using: Option<Box<OrderByUsing>>,
pub nulls_first: Option<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 OrderByUsing {
pub schema: Option<ObjectName>,
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 OrderByAll {
pub asc: Option<bool>,
pub nulls_first: Option<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 Limit<X: Extension = NoExt> {
pub limit: Option<Expr<X>>,
pub offset: Option<Expr<X>>,
pub syntax: LimitSyntax,
pub with_ties: Option<bool>,
pub percent: Option<LimitPercent>,
pub fetch_spelling: FetchSpelling,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum FetchSpelling {
#[default]
FirstRows,
FirstRow,
NextRows,
NextRow,
}
impl FetchSpelling {
pub fn from_axes(next: bool, row_singular: bool) -> Self {
match (next, row_singular) {
(false, false) => Self::FirstRows,
(false, true) => Self::FirstRow,
(true, false) => Self::NextRows,
(true, true) => Self::NextRow,
}
}
pub fn fetch_keyword(self) -> &'static str {
match self {
Self::NextRows | Self::NextRow => "FETCH NEXT",
Self::FirstRows | Self::FirstRow => "FETCH FIRST",
}
}
pub fn row_word(self) -> &'static str {
match self {
Self::FirstRow | Self::NextRow => " ROW ",
Self::FirstRows | Self::NextRows => " ROWS ",
}
}
}
#[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 LimitSyntax {
LimitOffset,
CommaOffset,
FetchFirst,
}
#[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 LimitPercent {
Symbol,
Keyword,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct LimitBy<X: Extension = NoExt> {
pub limit: Expr<X>,
pub offset: Option<Expr<X>>,
pub by: ThinVec<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 Setting<X: Extension = NoExt> {
pub name: Ident,
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 FormatClause {
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 enum ForClause {
Xml {
mode: ForXmlMode,
elements: Option<ForXmlElements>,
binary_base64: bool,
typed: bool,
root: Option<ForRoot>,
meta: Meta,
},
Json {
mode: ForJsonMode,
root: Option<ForRoot>,
include_null_values: bool,
without_array_wrapper: bool,
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 ForXmlMode {
Raw {
name: Option<Literal>,
meta: Meta,
},
Auto {
meta: Meta,
},
Explicit {
meta: Meta,
},
Path {
name: Option<Literal>,
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 ForXmlElements {
Plain,
XsiNil,
Absent,
}
#[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 ForJsonMode {
Auto,
Path,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct ForRoot {
pub name: Option<Literal>,
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 LateralView<X: Extension = NoExt> {
pub outer: bool,
pub function: FunctionCall<X>,
pub alias: Ident,
pub columns: ThinVec<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 HierarchicalClause<X: Extension = NoExt> {
pub start_with: Option<Expr<X>>,
pub nocycle: bool,
pub connect_by: Expr<X>,
pub start_with_leads: bool,
pub meta: Meta,
}