1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 10:28:10 +00:00

LibSQL: Parse ALTER TABLE statement

There are 4 forms an ALTER TABLE statement can take, and each are very
distinct, so they each get their own AST node class.
This commit is contained in:
Timothy Flynn 2021-04-23 22:18:35 -04:00 committed by Linus Groh
parent 0764a68616
commit 1500479a1d
5 changed files with 262 additions and 1 deletions

View file

@ -34,6 +34,8 @@ NonnullRefPtr<Statement> Parser::parse_statement()
switch (m_parser_state.m_token.type()) {
case TokenType::Create:
return parse_create_table_statement();
case TokenType::Alter:
return parse_alter_table_statement();
case TokenType::Drop:
return parse_drop_table_statement();
case TokenType::Insert:
@ -45,7 +47,7 @@ NonnullRefPtr<Statement> Parser::parse_statement()
case TokenType::Select:
return parse_select_statement({});
default:
expected("CREATE, DROP, INSERT, UPDATE, DELETE, or SELECT");
expected("CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, or SELECT");
return create_ast_node<ErrorStatement>();
}
}
@ -102,6 +104,42 @@ NonnullRefPtr<CreateTable> Parser::parse_create_table_statement()
return create_ast_node<CreateTable>(move(schema_name), move(table_name), move(column_definitions), is_temporary, is_error_if_table_exists);
}
NonnullRefPtr<CreateTable> Parser::parse_alter_table_statement()
{
// https://sqlite.org/lang_altertable.html
consume(TokenType::Alter);
consume(TokenType::Table);
String schema_name;
String table_name;
parse_schema_and_table_name(schema_name, table_name);
if (consume_if(TokenType::Add)) {
consume_if(TokenType::Column); // COLUMN is optional.
auto column = parse_column_definition();
return create_ast_node<AddColumn>(move(schema_name), move(table_name), move(column));
}
if (consume_if(TokenType::Drop)) {
consume_if(TokenType::Column); // COLUMN is optional.
auto column = consume(TokenType::Identifier).value();
return create_ast_node<DropColumn>(move(schema_name), move(table_name), move(column));
}
consume(TokenType::Rename);
if (consume_if(TokenType::To)) {
auto new_table_name = consume(TokenType::Identifier).value();
return create_ast_node<RenameTable>(move(schema_name), move(table_name), move(new_table_name));
}
consume_if(TokenType::Column); // COLUMN is optional.
auto column_name = consume(TokenType::Identifier).value();
consume(TokenType::To);
auto new_column_name = consume(TokenType::Identifier).value();
return create_ast_node<RenameColumn>(move(schema_name), move(table_name), move(column_name), move(new_column_name));
}
NonnullRefPtr<DropTable> Parser::parse_drop_table_statement()
{
// https://sqlite.org/lang_droptable.html