Skip to main content

oak_sql/kind/
mod.rs

1use oak_core::{UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4/// 统一SQL 语法种类(包含节点与词法
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub enum SqlSyntaxKind {
7    // 节点种类
8    Root,
9    Statement,
10    SelectStatement,
11    InsertStatement,
12    UpdateStatement,
13    DeleteStatement,
14    CreateStatement,
15    DropStatement,
16    AlterStatement,
17    Expression,
18    Identifier,
19    TableName,
20    ColumnName,
21    JoinClause,
22    GroupByClause,
23    HavingClause,
24    OrderByClause,
25    LimitClause,
26    ErrorNode,
27
28    // 空白字符和换
29    Whitespace,
30    Newline,
31
32    // 注释
33    Comment,
34    LineComment,
35    BlockComment,
36
37    // 字面
38    NumberLiteral,
39    FloatLiteral,
40    StringLiteral,
41    BooleanLiteral,
42    NullLiteral,
43
44    // 标识
45    Identifier_,
46
47    // SQL 关键
48    Select,
49    From,
50    Where,
51    Insert,
52    Into,
53    Values,
54    Update,
55    Set,
56    Delete,
57    Create,
58    Table,
59    Drop,
60    Alter,
61    Add,
62    Column,
63    Primary,
64    Key,
65    Foreign,
66    References,
67    Index,
68    Unique,
69    Not,
70    Null,
71    Default,
72    AutoIncrement,
73    And,
74    Or,
75    In,
76    Like,
77    Between,
78    Is,
79    As,
80    Join,
81    Inner,
82    Left,
83    Right,
84    Full,
85    Outer,
86    On,
87    Group,
88    By,
89    Having,
90    Order,
91    Asc,
92    Desc,
93    Limit,
94    Offset,
95    Union,
96    All,
97    Distinct,
98    Count,
99    Sum,
100    Avg,
101    Min,
102    Max,
103    View,
104    Database,
105    Schema,
106    True,
107    False,
108    Exists,
109    Case,
110    When,
111    Then,
112    Else,
113    End,
114    If,
115    Begin,
116    Commit,
117    Rollback,
118    Transaction,
119
120    // 数据类型
121    Int,
122    Integer,
123    Varchar,
124    Char,
125    Text,
126    Date,
127    Time,
128    Timestamp,
129    Decimal,
130    Float,
131    Double,
132    Boolean,
133
134    // 操作符
135    Plus,
136    Minus,
137    Star,
138    Slash,
139    Percent,
140    Equal,
141    NotEqual,
142    Less,
143    Greater,
144    LessEqual,
145    GreaterEqual,
146    Assign,
147    Eq,
148    Ne,
149    Lt,
150    Le,
151    Gt,
152    Ge,
153    Concat,
154
155    // 分隔符
156    LeftParen,
157    RightParen,
158    LeftBracket,
159    RightBracket,
160    LeftBrace,
161    RightBrace,
162    Comma,
163    Semicolon,
164    Dot,
165    Colon,
166    Question,
167
168    // 错误和结
169    Error,
170    Eof,
171}
172
173impl oak_core::TokenType for SqlSyntaxKind {
174    type Role = UniversalTokenRole;
175    const END_OF_STREAM: Self = Self::Eof;
176
177    fn is_ignored(&self) -> bool {
178        matches!(self, SqlSyntaxKind::Whitespace | SqlSyntaxKind::Newline | SqlSyntaxKind::Comment | SqlSyntaxKind::LineComment | SqlSyntaxKind::BlockComment)
179    }
180
181    fn is_comment(&self) -> bool {
182        matches!(self, SqlSyntaxKind::Comment | SqlSyntaxKind::LineComment | SqlSyntaxKind::BlockComment)
183    }
184
185    fn is_whitespace(&self) -> bool {
186        matches!(self, SqlSyntaxKind::Whitespace | SqlSyntaxKind::Newline)
187    }
188
189    fn role(&self) -> Self::Role {
190        use UniversalTokenRole::*;
191        match self {
192            Self::Whitespace | Self::Newline => Whitespace,
193            Self::Comment | Self::LineComment | Self::BlockComment => Comment,
194            Self::NumberLiteral | Self::FloatLiteral | Self::StringLiteral | Self::BooleanLiteral | Self::NullLiteral => Literal,
195            Self::Identifier_ => Name,
196            Self::Select
197            | Self::From
198            | Self::Where
199            | Self::Insert
200            | Self::Into
201            | Self::Values
202            | Self::Update
203            | Self::Set
204            | Self::Delete
205            | Self::Create
206            | Self::Table
207            | Self::Drop
208            | Self::Alter
209            | Self::Add
210            | Self::Column
211            | Self::Primary
212            | Self::Key
213            | Self::Foreign
214            | Self::References
215            | Self::Index
216            | Self::Unique
217            | Self::Not
218            | Self::Null
219            | Self::Default
220            | Self::AutoIncrement
221            | Self::And
222            | Self::Or
223            | Self::In
224            | Self::Like
225            | Self::Between
226            | Self::Is
227            | Self::As
228            | Self::Join
229            | Self::Inner
230            | Self::Left
231            | Self::Right
232            | Self::Full
233            | Self::Outer
234            | Self::On
235            | Self::Group
236            | Self::By
237            | Self::Having
238            | Self::Order
239            | Self::Asc
240            | Self::Desc
241            | Self::Limit
242            | Self::Offset
243            | Self::Union
244            | Self::All
245            | Self::Distinct
246            | Self::Count
247            | Self::Sum
248            | Self::Avg
249            | Self::Min
250            | Self::Max
251            | Self::View
252            | Self::Database
253            | Self::Schema
254            | Self::True
255            | Self::False
256            | Self::Exists
257            | Self::Case
258            | Self::When
259            | Self::Then
260            | Self::Else
261            | Self::End
262            | Self::If
263            | Self::Begin
264            | Self::Commit
265            | Self::Rollback
266            | Self::Transaction => Keyword,
267            Self::Int | Self::Integer | Self::Varchar | Self::Char | Self::Text | Self::Date | Self::Time | Self::Timestamp | Self::Decimal | Self::Float | Self::Double | Self::Boolean => Keyword, // Types are often keywords
268            Self::Plus
269            | Self::Minus
270            | Self::Star
271            | Self::Slash
272            | Self::Percent
273            | Self::Equal
274            | Self::NotEqual
275            | Self::Less
276            | Self::Greater
277            | Self::LessEqual
278            | Self::GreaterEqual
279            | Self::Assign
280            | Self::Eq
281            | Self::Ne
282            | Self::Lt
283            | Self::Le
284            | Self::Gt
285            | Self::Ge
286            | Self::Concat => Operator,
287            Self::LeftParen | Self::RightParen | Self::LeftBracket | Self::RightBracket | Self::LeftBrace | Self::RightBrace | Self::Comma | Self::Semicolon | Self::Dot | Self::Colon | Self::Question => Punctuation,
288            Self::Error => Error,
289            _ => None,
290        }
291    }
292}
293
294impl oak_core::ElementType for SqlSyntaxKind {
295    type Role = UniversalElementRole;
296
297    fn is_root(&self) -> bool {
298        matches!(self, Self::Root)
299    }
300
301    fn is_error(&self) -> bool {
302        matches!(self, Self::ErrorNode)
303    }
304
305    fn role(&self) -> Self::Role {
306        use UniversalElementRole::*;
307        match self {
308            Self::Root => Root,
309            Self::Statement | Self::SelectStatement | Self::InsertStatement | Self::UpdateStatement | Self::DeleteStatement | Self::CreateStatement | Self::DropStatement | Self::AlterStatement => Statement,
310            Self::Expression => Value,
311            Self::Identifier | Self::TableName | Self::ColumnName => Name,
312            Self::ErrorNode => Error,
313            _ => None,
314        }
315    }
316}