diff --git a/src/interpreter/tokenizer/mod.rs b/src/interpreter/tokenizer/mod.rs index 2da9292..0076a84 100644 --- a/src/interpreter/tokenizer/mod.rs +++ b/src/interpreter/tokenizer/mod.rs @@ -336,4 +336,23 @@ mod tests { ]; assert_eq!(expected, result); } + + #[test] + fn tokenizer_parses_transaction_keywords() { + let result = tokenize("BEGIN DEFERRED IMMEDIATE EXCLUSIVE COMMIT END ROLLBACK SAVEPOINT RELEASE TRANSACTION"); + let expected = vec![ + token(TokenTypes::Begin, "BEGIN", 0, 1), + token(TokenTypes::Deferred, "DEFERRED", 6, 1), + token(TokenTypes::Immediate, "IMMEDIATE", 15, 1), + token(TokenTypes::Exclusive, "EXCLUSIVE", 25, 1), + token(TokenTypes::Commit, "COMMIT", 35, 1), + token(TokenTypes::End, "END", 42, 1), + token(TokenTypes::Rollback, "ROLLBACK", 46, 1), + token(TokenTypes::Savepoint, "SAVEPOINT", 55, 1), + token(TokenTypes::Release, "RELEASE", 65, 1), + token(TokenTypes::Transaction, "TRANSACTION", 73, 1), + token(TokenTypes::EOF, "", 0, 0), + ]; + assert_eq!(expected, result); + } } \ No newline at end of file diff --git a/src/interpreter/tokenizer/scanner.rs b/src/interpreter/tokenizer/scanner.rs index 868a975..8ef2ce2 100644 --- a/src/interpreter/tokenizer/scanner.rs +++ b/src/interpreter/tokenizer/scanner.rs @@ -134,6 +134,16 @@ impl<'a> Scanner<'a> { slice if slice.eq_ignore_ascii_case("RENAME") => TokenTypes::Rename, slice if slice.eq_ignore_ascii_case("TO") => TokenTypes::To, slice if slice.eq_ignore_ascii_case("COLUMN") => TokenTypes::Column, + slice if slice.eq_ignore_ascii_case("BEGIN") => TokenTypes::Begin, + slice if slice.eq_ignore_ascii_case("DEFERRED") => TokenTypes::Deferred, + slice if slice.eq_ignore_ascii_case("IMMEDIATE") => TokenTypes::Immediate, + slice if slice.eq_ignore_ascii_case("EXCLUSIVE") => TokenTypes::Exclusive, + slice if slice.eq_ignore_ascii_case("COMMIT") => TokenTypes::Commit, + slice if slice.eq_ignore_ascii_case("END") => TokenTypes::End, + slice if slice.eq_ignore_ascii_case("ROLLBACK") => TokenTypes::Rollback, + slice if slice.eq_ignore_ascii_case("SAVEPOINT") => TokenTypes::Savepoint, + slice if slice.eq_ignore_ascii_case("RELEASE") => TokenTypes::Release, + slice if slice.eq_ignore_ascii_case("TRANSACTION") => TokenTypes::Transaction, slice if slice.eq_ignore_ascii_case("INTEGER") => TokenTypes::Integer, slice if slice.eq_ignore_ascii_case("REAL") => TokenTypes::Real, slice if slice.eq_ignore_ascii_case("TEXT") => TokenTypes::Text, @@ -176,7 +186,6 @@ impl<'a> Scanner<'a> { slice if slice.eq_ignore_ascii_case("WHEN") => TokenTypes::When, slice if slice.eq_ignore_ascii_case("THEN") => TokenTypes::Then, slice if slice.eq_ignore_ascii_case("ELSE") => TokenTypes::Else, - slice if slice.eq_ignore_ascii_case("END") => TokenTypes::End, slice if slice.eq_ignore_ascii_case("IS") => TokenTypes::Is, slice if slice.eq_ignore_ascii_case("COUNT") => TokenTypes::Count, slice if slice.eq_ignore_ascii_case("SUM") => TokenTypes::Sum, diff --git a/src/interpreter/tokenizer/token.rs b/src/interpreter/tokenizer/token.rs index 84ea62f..dce52e6 100644 --- a/src/interpreter/tokenizer/token.rs +++ b/src/interpreter/tokenizer/token.rs @@ -3,7 +3,8 @@ pub enum TokenTypes { // Keywords Create, Select, Insert, Table, From, Into, Values, Where, Update, Delete, Add, Drop, Index, Set, Alter, Rename, - To, Column, + To, Column, Begin, Deferred, Immediate, Exclusive, + Commit, End, Rollback, Savepoint, Release, Transaction, // Data Types Integer, Real, Text, Blob, Null, // Constraints @@ -14,7 +15,7 @@ pub enum TokenTypes { Limit, Offset, Union, Intersect, Except, // Logical Operators And, Or, In, Exists, If, - Case, When, Then, Else, End, Is, + Case, When, Then, Else, Is, Equals, NotEquals, LessThan, LessEquals, GreaterThan, GreaterEquals, // Aggregate Functions Count, Sum, Avg, Min, Max,