use super::{
AliasSpelling, Expr, Extension, Ident, Join, Limit, NoExt, ObjectName, OrderByExpr, Query,
RelationInheritance, SelectItem, TableAlias, TableWithJoins, With,
};
use crate::vocab::Meta;
use thin_vec::ThinVec;
#[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 InsertVerb {
Insert,
Replace,
}
#[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 InsertModifier {
Ignore,
Overwrite,
}
#[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 InsertColumnMatching {
ByName,
ByPosition,
}
#[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 ConflictResolution {
Rollback,
Abort,
Fail,
Ignore,
Replace,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct Insert<X: Extension = NoExt> {
pub verb: InsertVerb,
pub modifier: Option<InsertModifier>,
pub or_action: Option<ConflictResolution>,
pub with: Option<With<X>>,
pub target: InsertTarget,
pub column_matching: Option<InsertColumnMatching>,
pub overriding: Option<InsertOverriding>,
pub source: InsertSource<X>,
pub row_alias: Option<TableAlias>,
pub upsert: Option<Box<Upsert<X>>>,
pub returning: Option<Returning<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 InsertTarget {
pub name: ObjectName,
pub alias: Option<Ident>,
pub alias_spelling: AliasSpelling,
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 InsertOverriding {
SystemValue,
UserValue,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum InsertSource<X: Extension = NoExt> {
DefaultValues {
default: DefaultValue,
meta: Meta,
},
Values {
values: Box<InsertValues<X>>,
meta: Meta,
},
Query {
query: Box<Query<X>>,
meta: Meta,
},
Set {
assignments: ThinVec<UpdateAssignment<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 InsertValues<X: Extension = NoExt> {
pub rows: ThinVec<ThinVec<InsertValue<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 InsertValue<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 DmlTarget {
pub name: ObjectName,
pub inheritance: RelationInheritance,
pub alias: Option<Ident>,
pub alias_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 struct Update<X: Extension = NoExt> {
pub with: Option<With<X>>,
pub or_action: Option<ConflictResolution>,
pub target: DmlTarget,
pub target_joins: ThinVec<Join<X>>,
pub assignments: ThinVec<UpdateAssignment<X>>,
pub from: ThinVec<TableWithJoins<X>>,
pub selection: Option<DmlSelection<X>>,
pub order_by: ThinVec<OrderByExpr<X>>,
pub limit: Option<Limit<X>>,
pub returning: Option<Returning<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 UpdateAssignment<X: Extension = NoExt> {
Single {
target: ObjectName,
value: UpdateValue<X>,
meta: Meta,
},
Tuple {
targets: ThinVec<ObjectName>,
source: UpdateTupleSource<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 UpdateValue<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 enum UpdateTupleSource<X: Extension = NoExt> {
Row {
explicit: bool,
values: ThinVec<UpdateValue<X>>,
meta: Meta,
},
Subquery {
query: Box<Query<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 Delete<X: Extension = NoExt> {
pub with: Option<With<X>>,
pub target: DmlTarget,
pub additional_targets: ThinVec<DmlTarget>,
pub target_joins: ThinVec<Join<X>>,
pub using: ThinVec<TableWithJoins<X>>,
pub selection: Option<DmlSelection<X>>,
pub order_by: ThinVec<OrderByExpr<X>>,
pub limit: Option<Limit<X>>,
pub returning: Option<Returning<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 DmlSelection<X: Extension = NoExt> {
Where {
condition: Expr<X>,
meta: Meta,
},
CurrentOf {
cursor: 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 struct DefaultValue {
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 Returning<X: Extension = NoExt> {
pub items: ThinVec<SelectItem<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 Upsert<X: Extension = NoExt> {
OnConflict {
conflict: OnConflict<X>,
meta: Meta,
},
OnDuplicateKeyUpdate {
assignments: ThinVec<UpdateAssignment<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 OnConflict<X: Extension = NoExt> {
pub target: Option<ConflictTarget<X>>,
pub action: ConflictAction<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 ConflictTarget<X: Extension = NoExt> {
Index {
columns: ThinVec<Expr<X>>,
predicate: Option<Expr<X>>,
meta: Meta,
},
Constraint {
name: 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 enum ConflictAction<X: Extension = NoExt> {
Nothing {
meta: Meta,
},
Update {
assignments: ThinVec<UpdateAssignment<X>>,
selection: Option<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 Merge<X: Extension = NoExt> {
pub with: Option<With<X>>,
pub target: DmlTarget,
pub using: TableWithJoins<X>,
pub on: Expr<X>,
pub clauses: ThinVec<MergeWhenClause<X>>,
pub returning: Option<Returning<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 MergeWhenClause<X: Extension = NoExt> {
pub match_kind: MergeMatchKind,
pub condition: Option<Expr<X>>,
pub action: MergeAction<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 MergeMatchKind {
Matched,
NotMatchedByTarget,
NotMatchedBySource,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum MergeAction<X: Extension = NoExt> {
Insert {
columns: ThinVec<Ident>,
overriding: Option<InsertOverriding>,
values: ThinVec<InsertValue<X>>,
additional_rows: ThinVec<ThinVec<InsertValue<X>>>,
meta: Meta,
},
InsertDefault {
default: DefaultValue,
meta: Meta,
},
Update {
assignments: ThinVec<UpdateAssignment<X>>,
meta: Meta,
},
UpdateStar {
meta: Meta,
},
InsertStar {
meta: Meta,
},
InsertByName {
star: bool,
meta: Meta,
},
Error {
meta: Meta,
},
Delete {
meta: Meta,
},
DoNothing {
meta: Meta,
},
}