Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ version = "0.1.0"
edition = "2024"

[dependencies]
hex = "0.4.3"
126 changes: 66 additions & 60 deletions src/cli/ast/create_statement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ pub fn build(interpreter: &mut Interpreter) -> Result<SqlStatement, String> {
None => return Err(interpreter.format_error()),
}
// Ensure SemiColon
interpreter.advance();
match interpreter.current_token() {
Some(token) => {
if token.token_type != TokenTypes::SemiColon {
Expand All @@ -38,12 +37,13 @@ fn table_statement(interpreter: &mut Interpreter) -> Result<SqlStatement, String
if token.token_type != TokenTypes::Identifier {
return Err(interpreter.format_error());
}
let name = token.value.to_string();
interpreter.advance();
name
token.value.to_string()

},
None => return Err(interpreter.format_error()),
};
interpreter.advance();

let column_definitions = column_definitions(interpreter)?;
return Ok(CreateTable(CreateTableStatement {
table_name,
Expand Down Expand Up @@ -93,6 +93,7 @@ fn column_definitions(interpreter: &mut Interpreter) -> Result<Vec<ColumnDefinit
data_type: column_data_type,
constraints: vec![] // TODO,
});
interpreter.advance();
break;
},
_ => return Err(interpreter.format_error()),
Expand Down Expand Up @@ -146,30 +147,31 @@ mod tests {
use super::*;
use crate::cli::tokenizer::scanner::Token;

fn token(tt: TokenTypes, val: &'static str, col_num: usize) -> Token<'static> {
fn token(tt: TokenTypes, val: &'static str) -> Token<'static> {
Token {
token_type: tt,
value: val,
col_num: col_num,
col_num: 0,
line_num: 1,
}
}

#[test]
fn create_table_generates_proper_statement(){
// CREATE TABLE users (id INTEGER, name TEXT);
let tokens = vec![
token(TokenTypes::Create, "CREATE", 0),
token(TokenTypes::Table, "TABLE", 7),
token(TokenTypes::Identifier, "users", 13),
token(TokenTypes::LeftParen, "(", 18),
token(TokenTypes::Identifier, "id", 19),
token(TokenTypes::Integer, "INTEGER", 22),
token(TokenTypes::Comma, ",", 29),
token(TokenTypes::Identifier, "name", 31),
token(TokenTypes::Text, "TEXT", 36),
token(TokenTypes::RightParen, ")", 40),
token(TokenTypes::SemiColon, ";", 41),
token(TokenTypes::EOF, "", 0),
token(TokenTypes::Create, "CREATE"),
token(TokenTypes::Table, "TABLE"),
token(TokenTypes::Identifier, "users"),
token(TokenTypes::LeftParen, "("),
token(TokenTypes::Identifier, "id"),
token(TokenTypes::Integer, "INTEGER"),
token(TokenTypes::Comma, ","),
token(TokenTypes::Identifier, "name"),
token(TokenTypes::Text, "TEXT"),
token(TokenTypes::RightParen, ")"),
token(TokenTypes::SemiColon, ";"),
token(TokenTypes::EOF, ""),
];
let mut interpreter = Interpreter::new(tokens);
let result = build(&mut interpreter);
Expand All @@ -193,22 +195,23 @@ mod tests {

#[test]
fn create_table_statement_missing_semicolon() {
// CREATE TABLE users (num REAL, my_blob BLOB, my_null NULL)
let tokens = vec![
token(TokenTypes::Create, "CREATE", 0),
token(TokenTypes::Table, "TABLE", 7),
token(TokenTypes::Identifier, "users", 13),
token(TokenTypes::LeftParen, "(", 18),
token(TokenTypes::Identifier, "num", 19),
token(TokenTypes::Integer, "REAL", 22),
token(TokenTypes::Comma, ",", 29),
token(TokenTypes::Identifier, "my_blob", 31),
token(TokenTypes::Blob, "BLOB", 36),
token(TokenTypes::Comma, ",", 29),
token(TokenTypes::Identifier, "my_null", 31),
token(TokenTypes::Null, "Null", 36),
token(TokenTypes::RightParen, ")", 40),
token(TokenTypes::Create, "CREATE"),
token(TokenTypes::Table, "TABLE"),
token(TokenTypes::Identifier, "users"),
token(TokenTypes::LeftParen, "("),
token(TokenTypes::Identifier, "num"),
token(TokenTypes::Integer, "REAL"),
token(TokenTypes::Comma, ","),
token(TokenTypes::Identifier, "my_blob"),
token(TokenTypes::Blob, "BLOB"),
token(TokenTypes::Comma, ","),
token(TokenTypes::Identifier, "my_null"),
token(TokenTypes::Null, "Null"),
token(TokenTypes::RightParen, ")"),
// Missing SemiColon
token(TokenTypes::EOF, "", 0),
token(TokenTypes::EOF, ""),
];
let mut interpreter = Interpreter::new(tokens);
let result = build(&mut interpreter);
Expand All @@ -217,19 +220,20 @@ mod tests {

#[test]
fn create_table_with_bad_data_type() {
// CREATE TABLE users (id *, name TEXT);
let tokens = vec![
token(TokenTypes::Create, "CREATE", 0),
token(TokenTypes::Table, "TABLE", 7),
token(TokenTypes::Identifier, "users", 13),
token(TokenTypes::LeftParen, "(", 18),
token(TokenTypes::Identifier, "id", 19),
token(TokenTypes::Asterisk, "*", 22), // Bad Data Type
token(TokenTypes::Comma, ",", 23),
token(TokenTypes::Identifier, "name", 25),
token(TokenTypes::Text, "TEXT", 30),
token(TokenTypes::RightParen, ")", 34),
token(TokenTypes::SemiColon, ";", 35),
token(TokenTypes::EOF, "", 0),
token(TokenTypes::Create, "CREATE"),
token(TokenTypes::Table, "TABLE"),
token(TokenTypes::Identifier, "users"),
token(TokenTypes::LeftParen, "("),
token(TokenTypes::Identifier, "id"),
token(TokenTypes::Asterisk, "*"), // Bad Data Type
token(TokenTypes::Comma, ","),
token(TokenTypes::Identifier, "name"),
token(TokenTypes::Text, "TEXT"),
token(TokenTypes::RightParen, ")"),
token(TokenTypes::SemiColon, ";"),
token(TokenTypes::EOF, ""),
];
let mut interpreter = Interpreter::new(tokens);
let result = build(&mut interpreter);
Expand All @@ -238,18 +242,19 @@ mod tests {

#[test]
fn create_table_missing_comma() {
// CREATE TABLE users (id INTEGER name TEXT);
let tokens = vec![
token(TokenTypes::Create, "CREATE", 0),
token(TokenTypes::Table, "TABLE", 7),
token(TokenTypes::Identifier, "users", 13),
token(TokenTypes::LeftParen, "(", 18),
token(TokenTypes::Identifier, "id", 19),
token(TokenTypes::Integer, "INTEGER", 22), // Missing Comma
token(TokenTypes::Identifier, "name", 31),
token(TokenTypes::Text, "TEXT", 36),
token(TokenTypes::RightParen, ")", 40),
token(TokenTypes::SemiColon, ";", 41),
token(TokenTypes::EOF, "", 0),
token(TokenTypes::Create, "CREATE"),
token(TokenTypes::Table, "TABLE"),
token(TokenTypes::Identifier, "users"),
token(TokenTypes::LeftParen, "("),
token(TokenTypes::Identifier, "id"),
token(TokenTypes::Integer, "INTEGER"), // Missing Comma
token(TokenTypes::Identifier, "name"),
token(TokenTypes::Text, "TEXT"),
token(TokenTypes::RightParen, ")"),
token(TokenTypes::SemiColon, ";"),
token(TokenTypes::EOF, ""),
];
let mut interpreter = Interpreter::new(tokens);
let result = build(&mut interpreter);
Expand All @@ -258,12 +263,13 @@ mod tests {

#[test]
fn index_statement_not_implemented() {
// CREATE INDEX my_index;
let tokens = vec![
token(TokenTypes::Create, "CREATE", 0),
token(TokenTypes::Index, "INDEX", 7),
token(TokenTypes::Identifier, "my_index", 13),
token(TokenTypes::SemiColon, ";", 22),
token(TokenTypes::EOF, "", 0),
token(TokenTypes::Create, "CREATE"),
token(TokenTypes::Index, "INDEX"),
token(TokenTypes::Identifier, "my_index"),
token(TokenTypes::SemiColon, ";"),
token(TokenTypes::EOF, ""),
];
let mut interpreter = Interpreter::new(tokens);
let result = build(&mut interpreter);
Expand Down
Loading