Parsing and validation for Option

Add option type and option value parsers

value->literal in parser, implement Option literal
This commit is contained in:
Maxim Svistunov 2024-02-04 13:46:31 +01:00
parent de8c6164cf
commit 6245dba4f0
8 changed files with 322 additions and 109 deletions

View file

@ -59,6 +59,8 @@ fn parse_column_definition(input: &str) -> IResult<&str, ColumnSchema> {
#[cfg(test)]
mod tests {
use minisql::type_system::DbType;
use crate::parsing::create::parse_create;
use crate::syntax::RawQuerySyntax;
@ -112,4 +114,45 @@ mod tests {
_ => {}
}
}
#[test]
fn test_parse_create_option() {
let (_, create) = parse_create("CREATE TABLE games (id UUID PRIMARY KEY, name STRING, year Option(INT), price NUMBER)")
.expect("should parse");
assert!(matches!(create, RawQuerySyntax::CreateTable(_)));
match create {
RawQuerySyntax::CreateTable(schema) => {
assert_eq!(schema.table_name, "games");
assert_eq!(schema.number_of_columns(), 4);
let result_id = schema.get_column(&"id".to_string());
assert!(matches!(result_id, Some(_)));
let Some(id_column) = result_id else { panic!() };
assert_eq!(id_column.column_name, "id".to_string());
let result_column1 = schema.get_column(&"name".to_string());
assert!(matches!(result_column1, Some(_)));
let Some(column1_column) = result_column1 else {
panic!()
};
assert_eq!(column1_column.column_name, "name".to_string());
assert_eq!(column1_column.type_, DbType::String);
let column = schema.get_column(&"year".to_string());
let Some(column) = column else {
panic!()
};
assert_eq!(column.column_name, "year".to_string());
assert_eq!(column.type_, DbType::Option(Box::new(DbType::Int)));
let column = schema.get_column(&"price".to_string());
let Some(column) = column else {
panic!()
};
assert_eq!(column.column_name, "price".to_string());
assert_eq!(column.type_, DbType::Number);
}
_ => {}
}
}
}