oak_sql/kind/
mod.rs

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