Parsing and validation for Option
Add option type and option value parsers value->literal in parser, implement Option literal
This commit is contained in:
parent
de8c6164cf
commit
6245dba4f0
8 changed files with 322 additions and 109 deletions
|
|
@ -1,9 +1,8 @@
|
|||
use super::{
|
||||
common::{parse_identifier, parse_table_name},
|
||||
literal::parse_db_value,
|
||||
literal::{parse_literal, Literal},
|
||||
};
|
||||
use crate::syntax::RawQuerySyntax;
|
||||
use minisql::type_system::Value;
|
||||
use nom::{
|
||||
bytes::complete::tag,
|
||||
character::complete::{char, multispace0, multispace1},
|
||||
|
|
@ -49,16 +48,14 @@ pub fn parse_columns(input: &str) -> IResult<&str, Vec<String>> {
|
|||
)(input)
|
||||
}
|
||||
|
||||
pub fn parse_values(input: &str) -> IResult<&str, Vec<Value>> {
|
||||
separated_list0(terminated(char(','), multispace0), parse_db_value)(input)
|
||||
pub fn parse_values(input: &str) -> IResult<&str, Vec<Literal>> {
|
||||
separated_list0(terminated(char(','), multispace0), parse_literal)(input)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use minisql::type_system::Value;
|
||||
|
||||
use super::parse_insert;
|
||||
use crate::syntax::RawQuerySyntax;
|
||||
use crate::{parsing::literal::Literal, syntax::RawQuerySyntax};
|
||||
|
||||
#[test]
|
||||
fn test_parse_insert() {
|
||||
|
|
@ -70,10 +67,10 @@ mod tests {
|
|||
assert_eq!(
|
||||
insertion_values,
|
||||
vec![
|
||||
("id".to_string(), Value::Int(1)),
|
||||
("id".to_string(), Literal::Int(1)),
|
||||
(
|
||||
"data".to_string(),
|
||||
Value::String("Text".to_string())
|
||||
Literal::String("Text".to_string())
|
||||
)
|
||||
]
|
||||
);
|
||||
|
|
@ -95,10 +92,10 @@ mod tests {
|
|||
assert_eq!(
|
||||
insertion_values,
|
||||
vec![
|
||||
("id".to_string(), Value::Int(1)),
|
||||
("id".to_string(), Literal::Int(1)),
|
||||
(
|
||||
"data".to_string(),
|
||||
Value::String("Text".to_string())
|
||||
Literal::String("Text".to_string())
|
||||
)
|
||||
]
|
||||
);
|
||||
|
|
@ -108,4 +105,36 @@ mod tests {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_insert_option() {
|
||||
let sql = r#"INSERT INTO games (id, name, year, price) VALUES (u12345, "Doom", Some(1993), 6.5);"#;
|
||||
let syntax = parse_insert(sql).expect("should parse");
|
||||
match syntax {
|
||||
(";", RawQuerySyntax::Insert(table_name, insertion_values)) => {
|
||||
assert_eq!(table_name, "games");
|
||||
assert_eq!(
|
||||
insertion_values,
|
||||
vec![
|
||||
("id".to_string(), Literal::Uuid(12345)),
|
||||
(
|
||||
"name".to_string(),
|
||||
Literal::String("Doom".to_string())
|
||||
),
|
||||
(
|
||||
"year".to_string(),
|
||||
Literal::Some(Box::new(Literal::Int(1993)))
|
||||
),
|
||||
(
|
||||
"price".to_string(),
|
||||
Literal::Number(6.5)
|
||||
)
|
||||
]
|
||||
);
|
||||
}
|
||||
_ => {
|
||||
panic!()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue