Skip to main content

drizzle_core/builder/
states.rs

1//! Shared typestate markers for dialect query builders.
2
3use super::{ClauseAllowed, ExecutableState, clause};
4
5//------------------------------------------------------------------------------
6// SELECT states
7//------------------------------------------------------------------------------
8
9/// Marker for the initial state of `SelectBuilder`.
10#[derive(Debug, Clone, Copy, Default)]
11pub struct SelectInitial;
12
13/// Marker for the state after FROM clause.
14#[derive(Debug, Clone, Copy, Default)]
15pub struct SelectFromSet;
16
17/// Marker for the state after JOIN clause.
18#[derive(Debug, Clone, Copy, Default)]
19pub struct SelectJoinSet;
20
21/// Marker for the state after WHERE clause.
22#[derive(Debug, Clone, Copy, Default)]
23pub struct SelectWhereSet;
24
25/// Marker for the state after GROUP BY clause.
26#[derive(Debug, Clone, Copy, Default)]
27pub struct SelectGroupSet;
28
29/// Marker for the state after ORDER BY clause.
30#[derive(Debug, Clone, Copy, Default)]
31pub struct SelectOrderSet;
32
33/// Marker for the state after LIMIT clause.
34#[derive(Debug, Clone, Copy, Default)]
35pub struct SelectLimitSet;
36
37/// Marker for the state after OFFSET clause.
38#[derive(Debug, Clone, Copy, Default)]
39pub struct SelectOffsetSet;
40
41/// Marker for the state after set operations (UNION/INTERSECT/EXCEPT).
42#[derive(Debug, Clone, Copy, Default)]
43pub struct SelectSetOpSet;
44
45impl ExecutableState for SelectFromSet {
46    type Rows<R: crate::row::RowCount> = R;
47}
48impl ExecutableState for SelectWhereSet {
49    type Rows<R: crate::row::RowCount> = R;
50}
51impl ExecutableState for SelectLimitSet {
52    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
53}
54impl ExecutableState for SelectOffsetSet {
55    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
56}
57// A compound query reaches ORDER BY too, so it cannot keep an aggregate's
58// one row.
59impl ExecutableState for SelectOrderSet {
60    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
61}
62impl ExecutableState for SelectGroupSet {
63    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
64}
65impl ExecutableState for SelectJoinSet {
66    type Rows<R: crate::row::RowCount> = R;
67}
68impl ExecutableState for SelectSetOpSet {
69    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
70}
71
72impl ClauseAllowed<clause::Where> for SelectFromSet {}
73impl ClauseAllowed<clause::Where> for SelectJoinSet {}
74
75impl ClauseAllowed<clause::GroupBy> for SelectFromSet {}
76impl ClauseAllowed<clause::GroupBy> for SelectJoinSet {}
77impl ClauseAllowed<clause::GroupBy> for SelectWhereSet {}
78
79impl ClauseAllowed<clause::OrderBy> for SelectFromSet {}
80impl ClauseAllowed<clause::OrderBy> for SelectJoinSet {}
81impl ClauseAllowed<clause::OrderBy> for SelectWhereSet {}
82impl ClauseAllowed<clause::OrderBy> for SelectGroupSet {}
83// `SelectSetOpSet` is deliberately absent: a compound query orders by output
84// column names, so each dialect builder provides its own `order_by` there.
85
86impl ClauseAllowed<clause::Limit> for SelectFromSet {}
87impl ClauseAllowed<clause::Limit> for SelectJoinSet {}
88impl ClauseAllowed<clause::Limit> for SelectWhereSet {}
89impl ClauseAllowed<clause::Limit> for SelectGroupSet {}
90impl ClauseAllowed<clause::Limit> for SelectOrderSet {}
91impl ClauseAllowed<clause::Limit> for SelectSetOpSet {}
92
93impl ClauseAllowed<clause::Offset> for SelectFromSet {}
94impl ClauseAllowed<clause::Offset> for SelectLimitSet {}
95impl ClauseAllowed<clause::Offset> for SelectSetOpSet {}
96
97impl ClauseAllowed<clause::Join> for SelectFromSet {}
98impl ClauseAllowed<clause::Join> for SelectJoinSet {}
99
100impl ClauseAllowed<clause::Having> for SelectGroupSet {}
101
102impl ClauseAllowed<clause::Simple> for SelectFromSet {}
103impl ClauseAllowed<clause::Simple> for SelectJoinSet {}
104impl ClauseAllowed<clause::Simple> for SelectWhereSet {}
105impl ClauseAllowed<clause::Simple> for SelectGroupSet {}
106impl ClauseAllowed<clause::Simple> for SelectOrderSet {}
107impl ClauseAllowed<clause::Simple> for SelectLimitSet {}
108impl ClauseAllowed<clause::Simple> for SelectOffsetSet {}
109
110impl ClauseAllowed<clause::Compound> for SelectFromSet {}
111impl ClauseAllowed<clause::Compound> for SelectJoinSet {}
112impl ClauseAllowed<clause::Compound> for SelectWhereSet {}
113impl ClauseAllowed<clause::Compound> for SelectGroupSet {}
114impl ClauseAllowed<clause::Compound> for SelectOrderSet {}
115impl ClauseAllowed<clause::Compound> for SelectLimitSet {}
116impl ClauseAllowed<clause::Compound> for SelectOffsetSet {}
117impl ClauseAllowed<clause::Compound> for SelectSetOpSet {}
118
119impl ClauseAllowed<clause::Source> for SelectFromSet {}
120impl ClauseAllowed<clause::Source> for SelectJoinSet {}
121impl ClauseAllowed<clause::Source> for SelectWhereSet {}
122impl ClauseAllowed<clause::Source> for SelectGroupSet {}
123impl ClauseAllowed<clause::Source> for SelectOrderSet {}
124impl ClauseAllowed<clause::Source> for SelectLimitSet {}
125impl ClauseAllowed<clause::Source> for SelectOffsetSet {}
126impl ClauseAllowed<clause::Source> for SelectSetOpSet {}
127
128//------------------------------------------------------------------------------
129// INSERT states
130//------------------------------------------------------------------------------
131
132/// Marker for the initial state of `InsertBuilder`.
133#[derive(Debug, Clone, Copy, Default)]
134pub struct InsertInitial;
135
136/// Marker for the state after VALUES are set.
137#[derive(Debug, Clone, Copy, Default)]
138pub struct InsertValuesSet;
139
140/// Marker for the state after RETURNING clause is added.
141#[derive(Debug, Clone, Copy, Default)]
142pub struct InsertReturningSet;
143
144/// Marker for the state after ON CONFLICT is set.
145#[derive(Debug, Clone, Copy, Default)]
146pub struct InsertOnConflictSet;
147
148/// Marker for the state after DO UPDATE SET (before optional WHERE).
149#[derive(Debug, Clone, Copy, Default)]
150pub struct InsertDoUpdateSet;
151
152impl ExecutableState for InsertValuesSet {
153    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
154}
155impl ExecutableState for InsertReturningSet {
156    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
157}
158impl ExecutableState for InsertOnConflictSet {
159    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
160}
161impl ExecutableState for InsertDoUpdateSet {
162    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
163}
164
165//------------------------------------------------------------------------------
166// DELETE states
167//------------------------------------------------------------------------------
168
169/// Marker for the initial state of `DeleteBuilder`.
170#[derive(Debug, Clone, Copy, Default)]
171pub struct DeleteInitial;
172
173/// Marker for the state after WHERE clause.
174#[derive(Debug, Clone, Copy, Default)]
175pub struct DeleteWhereSet;
176
177/// Marker for the state after RETURNING clause.
178#[derive(Debug, Clone, Copy, Default)]
179pub struct DeleteReturningSet;
180
181impl ExecutableState for DeleteWhereSet {
182    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
183}
184impl ExecutableState for DeleteReturningSet {
185    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
186}
187
188//------------------------------------------------------------------------------
189// UPDATE states
190//------------------------------------------------------------------------------
191
192/// Marker for the initial state of `UpdateBuilder`.
193#[derive(Debug, Clone, Copy, Default)]
194pub struct UpdateInitial;
195
196/// Marker for the state after SET clause.
197#[derive(Debug, Clone, Copy, Default)]
198pub struct UpdateSetClauseSet;
199
200/// Marker for the state after WHERE clause.
201#[derive(Debug, Clone, Copy, Default)]
202pub struct UpdateWhereSet;
203
204/// Marker for the state after RETURNING clause.
205#[derive(Debug, Clone, Copy, Default)]
206pub struct UpdateReturningSet;
207
208impl ExecutableState for UpdateWhereSet {
209    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
210}
211impl ExecutableState for UpdateReturningSet {
212    type Rows<R: crate::row::RowCount> = crate::row::ZeroOrMore;
213}