use super::{DataType, Expr, Extension, Ident, Literal, NoExt, Query, Statement};
use crate::vocab::Meta;
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 CompoundStatement<X: Extension = NoExt> {
pub label: Option<Ident>,
pub declarations: ThinVec<Declaration<X>>,
pub body: ThinVec<Statement<X>>,
pub end_label: 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 Declaration<X: Extension = NoExt> {
Variable {
names: ThinVec<Ident>,
data_type: DataType<X>,
default: Option<Expr<X>>,
meta: Meta,
},
Condition {
name: Ident,
value: ConditionValue,
meta: Meta,
},
Cursor {
name: Ident,
query: Box<Query<X>>,
meta: Meta,
},
Handler {
action: HandlerAction,
conditions: ThinVec<HandlerCondition>,
body: Box<Statement<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 HandlerAction {
Continue,
Exit,
Undo,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ConditionValue {
SqlState {
value_keyword: bool,
sqlstate: Literal,
meta: Meta,
},
ErrorCode {
code: Literal,
meta: Meta,
},
ConditionName {
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 HandlerCondition {
SqlState {
value_keyword: bool,
sqlstate: Literal,
meta: Meta,
},
ErrorCode {
code: Literal,
meta: Meta,
},
ConditionName {
name: Ident,
meta: Meta,
},
SqlWarning {
meta: Meta,
},
NotFound {
meta: Meta,
},
SqlException {
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 IfStatement<X: Extension = NoExt> {
pub branches: ThinVec<ConditionalBranch<X>>,
pub else_body: Option<ThinVec<Statement<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 ConditionalBranch<X: Extension = NoExt> {
pub guard: Expr<X>,
pub body: ThinVec<Statement<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 CaseStatement<X: Extension = NoExt> {
pub operand: Option<Box<Expr<X>>>,
pub when_branches: ThinVec<ConditionalBranch<X>>,
pub else_body: Option<ThinVec<Statement<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 LoopStatement<X: Extension = NoExt> {
pub label: Option<Ident>,
pub body: ThinVec<Statement<X>>,
pub end_label: 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 WhileStatement<X: Extension = NoExt> {
pub label: Option<Ident>,
pub condition: Box<Expr<X>>,
pub body: ThinVec<Statement<X>>,
pub end_label: 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 RepeatStatement<X: Extension = NoExt> {
pub label: Option<Ident>,
pub body: ThinVec<Statement<X>>,
pub condition: Box<Expr<X>>,
pub end_label: 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 LeaveStatement {
pub label: 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 IterateStatement {
pub label: 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 ReturnStatement<X: Extension = NoExt> {
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 OpenCursorStatement {
pub cursor: 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 CloseCursorStatement {
pub cursor: 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 FetchCursorStatement {
pub next_keyword: bool,
pub from_keyword: bool,
pub cursor: Ident,
pub targets: 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 SignalStatement<X: Extension = NoExt> {
pub condition: Option<ConditionValue>,
pub set_items: ThinVec<SignalItem<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 SignalItem<X: Extension = NoExt> {
pub name: SignalItemName,
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 SignalItemName {
ClassOrigin,
SubclassOrigin,
ConstraintCatalog,
ConstraintSchema,
ConstraintName,
CatalogName,
SchemaName,
TableName,
ColumnName,
CursorName,
MessageText,
MysqlErrno,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct GetDiagnosticsStatement<X: Extension = NoExt> {
pub area: DiagnosticsArea,
pub info: DiagnosticsInfo<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 DiagnosticsArea {
Implicit,
Current,
Stacked,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum DiagnosticsInfo<X: Extension = NoExt> {
Statement {
items: ThinVec<StatementInfoItem<X>>,
meta: Meta,
},
Condition {
number: Box<Expr<X>>,
items: ThinVec<ConditionInfoItem<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 StatementInfoItem<X: Extension = NoExt> {
pub target: Expr<X>,
pub name: StatementInfoItemName,
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 StatementInfoItemName {
Number,
RowCount,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct ConditionInfoItem<X: Extension = NoExt> {
pub target: Expr<X>,
pub name: ConditionInfoItemName,
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 ConditionInfoItemName {
ClassOrigin,
SubclassOrigin,
ConstraintCatalog,
ConstraintSchema,
ConstraintName,
CatalogName,
SchemaName,
TableName,
ColumnName,
CursorName,
MessageText,
MysqlErrno,
ReturnedSqlstate,
}