Skip to main content

radixdb_sql/statements/
dispatch.rs

1// Copyright 2026 RadixDB Contributors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use super::*;
16
17impl Parser {
18    /// Parse a statement
19    pub fn parse_statement(&mut self) -> Option<Statement> {
20        // Skip comments
21        while self.cur_token_is(TokenType::Comment) {
22            self.next_token();
23        }
24
25        if self.cur_token_is(TokenType::Eof) {
26            return None;
27        }
28
29        if self.cur_token_is(TokenType::Keyword) {
30            let keyword = self.cur_token.literal.to_uppercase();
31            match keyword.as_str() {
32                "SELECT" => self.parse_select_statement().map(Statement::Select),
33                "WITH" => self.parse_with_statement(),
34                "INSERT" => self.parse_insert_statement().map(Statement::Insert),
35                "UPDATE" => self.parse_update_statement().map(Statement::Update),
36                "DELETE" => self.parse_delete_statement().map(Statement::Delete),
37                "TRUNCATE" => self.parse_truncate_statement().map(Statement::Truncate),
38                "CREATE" => self.parse_create_statement(),
39                "DROP" => self.parse_drop_statement(),
40                "ALTER" => self.parse_alter_statement(),
41                "BEGIN" => self.parse_begin_statement().map(Statement::Begin),
42                "COMMIT" => self.parse_commit_statement().map(Statement::Commit),
43                "ROLLBACK" => self.parse_rollback_statement().map(Statement::Rollback),
44                "SAVEPOINT" => self.parse_savepoint_statement().map(Statement::Savepoint),
45                "RELEASE" => self
46                    .parse_release_savepoint_statement()
47                    .map(Statement::ReleaseSavepoint),
48                "SET" => self
49                    .parse_set_statement()
50                    .map(|s| Statement::Set(Box::new(s))),
51                "PRAGMA" => self.parse_pragma_statement().map(Statement::Pragma),
52                "VACUUM" => self.parse_vacuum_statement().map(Statement::Vacuum),
53                "SHOW" => self.parse_show_statement(),
54                "DESCRIBE" | "DESC" => self.parse_describe_statement().map(Statement::Describe),
55                "EXPLAIN" => self.parse_explain_statement().map(Statement::Explain),
56                "ANALYZE" => self.parse_analyze_statement().map(Statement::Analyze),
57                "COPY" => self.parse_copy_statement().map(Statement::Copy),
58                "CALL" => self
59                    .parse_outer_call_statement()
60                    .map(|statement| Statement::Call(Box::new(statement))),
61                "GRANT" => self
62                    .parse_grant_statement()
63                    .map(|statement| Statement::Grant(Box::new(statement))),
64                "REVOKE" => self
65                    .parse_revoke_statement()
66                    .map(|statement| Statement::Revoke(Box::new(statement))),
67                _ => {
68                    // Try to parse as expression statement
69                    self.parse_expression_statement().map(Statement::Expression)
70                }
71            }
72        } else {
73            // Try to parse as expression statement
74            self.parse_expression_statement().map(Statement::Expression)
75        }
76    }
77}