use phf::phf_map;
static KEYWORDS: phf::Map<&'static str, TokenType> = phf_map! {
"select" => TokenType::Select,
"from" => TokenType::From,
"where" => TokenType::Where,
"insert" => TokenType::Insert,
"into" => TokenType::Into,
"values" => TokenType::Values,
"update" => TokenType::Update,
"set" => TokenType::Set,
"delete" => TokenType::Delete,
"create" => TokenType::Create,
"table" => TokenType::Table,
"index" => TokenType::Index,
"drop" => TokenType::Drop,
"and" => TokenType::And,
"or" => TokenType::Or,
"not" => TokenType::Not,
"like" => TokenType::Like,
"in" => TokenType::In,
"between" => TokenType::Between,
"is" => TokenType::Is,
"null" => TokenType::Null,
"as" => TokenType::As,
"order" => TokenType::Order,
"by" => TokenType::By,
"asc" => TokenType::Asc,
"desc" => TokenType::Desc,
"limit" => TokenType::Limit,
"offset" => TokenType::Offset,
"latest" => TokenType::Latest,
"distinct" => TokenType::Distinct,
"group" => TokenType::Group,
"having" => TokenType::Having,
"join" => TokenType::Join,
"left" => TokenType::Left,
"right" => TokenType::Right,
"inner" => TokenType::Inner,
"outer" => TokenType::Outer,
"full" => TokenType::Full,
"on" => TokenType::On,
"primary" => TokenType::Primary,
"key" => TokenType::Key,
"using" => TokenType::Using,
"array" => TokenType::Array,
"show" => TokenType::Show,
"describe" => TokenType::Describe,
"tables" => TokenType::Tables,
"alter" => TokenType::Alter,
"integer" => TokenType::Integer,
"int" => TokenType::Integer,
"bigint" => TokenType::BigInt,
"float" => TokenType::Float,
"real" => TokenType::Float,
"double" => TokenType::Float,
"text" => TokenType::Text,
"varchar" => TokenType::Text,
"string" => TokenType::Text,
"timestamp" => TokenType::Timestamp,
"datetime" => TokenType::Timestamp,
"vector" => TokenType::Vector,
"geometry" => TokenType::Geometry,
"geom" => TokenType::Geometry,
"boolean" => TokenType::Boolean,
"bool" => TokenType::Boolean,
"true" => TokenType::True,
"false" => TokenType::False,
"auto_increment" => TokenType::AutoIncrement,
"timeseries" => TokenType::Timeseries,
"ttl" => TokenType::Ttl,
"begin" => TokenType::Begin,
"commit" => TokenType::Commit,
"rollback" => TokenType::Rollback,
"case" => TokenType::Case,
"when" => TokenType::When,
"then" => TokenType::Then,
"else" => TokenType::Else,
"end" => TokenType::End,
"union" => TokenType::Union,
"intersect" => TokenType::Intersect,
"except" => TokenType::Except,
"all" => TokenType::All,
"add" => TokenType::Add,
"default" => TokenType::Default,
"with" => TokenType::With,
"recursive" => TokenType::Recursive,
"over" => TokenType::Over,
"partition" => TokenType::Partition,
};
#[derive(Debug, Clone, PartialEq)]
pub enum TokenType {
Select,
From,
Where,
Insert,
Into,
Values,
Update,
Set,
Delete,
Create,
Table,
Index,
Drop,
And,
Or,
Not,
Like,
In,
Between,
Is,
Null,
As,
Order,
By,
Asc,
Desc,
Limit,
Offset,
Latest, Distinct, Group,
Having,
Join,
Left,
Right,
Inner,
Full,
Outer,
On,
Primary, Key, Using, Array, Show, Describe, Tables, Alter, AutoIncrement, Timeseries, Ttl, Begin, Commit, Rollback, Case, When, Then, Else, End, Union, Intersect, Except, Over, Partition, All, Add, Default, With, Recursive,
Integer,
BigInt, Float,
Text,
Timestamp,
Vector,
Geometry,
Boolean,
Eq, Ne, Lt, Gt, Le, Ge, Plus, Minus, Star, Slash, Percent, DoublePipe,
L2Distance, CosineDistance, DotProduct,
LParen, RParen, LBracket, RBracket, Comma, Semicolon, Dot,
Number(f64),
PureInteger(i64),
OverflowInteger(i128),
String(String),
Identifier(String),
True,
False,
Parameter(usize), Eof,
}
#[derive(Debug, Clone)]
pub struct Token {
pub token_type: TokenType,
pub line: usize,
pub column: usize,
}
impl Token {
pub fn new(token_type: TokenType, line: usize, column: usize) -> Self {
Self {
token_type,
line,
column,
}
}
}
impl TokenType {
pub fn from_keyword(s: &str) -> Option<Self> {
let len = s.len();
if len > 14 || len == 0 {
return None;
}
let mut buf = [0u8; 16];
let bytes = s.as_bytes();
for i in 0..len {
buf[i] = bytes[i].to_ascii_lowercase();
}
let lower = unsafe { std::str::from_utf8_unchecked(&buf[..len]) };
KEYWORDS.get(lower).cloned()
}
}