mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:12:43 +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:
		
							parent
							
								
									0764a68616
								
							
						
					
					
						commit
						1500479a1d
					
				
					 5 changed files with 262 additions and 1 deletions
				
			
		|  | @ -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
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy Flynn
						Timothy Flynn