Add option type and option value parsers value->literal in parser, implement Option literal
56 lines
1.7 KiB
Rust
56 lines
1.7 KiB
Rust
use nom::{
|
|
bytes::complete::tag,
|
|
character::complete::{multispace0, multispace1},
|
|
IResult,
|
|
};
|
|
|
|
use super::common::{parse_condition, parse_table_name};
|
|
use crate::syntax::RawQuerySyntax;
|
|
|
|
pub fn parse_delete(input: &str) -> IResult<&str, RawQuerySyntax> {
|
|
let (input, _) = tag("DELETE")(input)?;
|
|
let (input, _) = multispace1(input)?;
|
|
let (input, _) = tag("FROM")(input)?;
|
|
let (input, _) = multispace1(input)?;
|
|
let (input, table_name) = parse_table_name(input)?;
|
|
let (input, _) = multispace0(input)?;
|
|
let (input, condition) = parse_condition(input)?;
|
|
Ok((
|
|
input,
|
|
RawQuerySyntax::Delete(table_name.to_string(), condition),
|
|
))
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use crate::parsing::delete::parse_delete;
|
|
use crate::parsing::literal::Literal;
|
|
use crate::syntax::{Condition, RawQuerySyntax};
|
|
|
|
#[test]
|
|
fn test_parse_delete() {
|
|
let (_, sntx) =
|
|
parse_delete("DELETE FROM \"T1\" WHERE id = 1").expect("should parse");
|
|
assert!(matches!(sntx, RawQuerySyntax::Delete(_, _)))
|
|
}
|
|
|
|
#[test]
|
|
fn test_parse_delete_with_spaces() {
|
|
let (_, sntx) =
|
|
parse_delete("DELETE FROM T1 WHERE id = 1").expect("should parse");
|
|
assert!(matches!(sntx, RawQuerySyntax::Delete(_, _)))
|
|
}
|
|
|
|
#[test]
|
|
fn test_parse_delete_none() {
|
|
let (_, sntx) =
|
|
parse_delete("DELETE FROM games WHERE year = None").expect("should parse");
|
|
if let RawQuerySyntax::Delete(tname, Some(Condition::Eq(column_name, lit))) = sntx {
|
|
assert_eq!(tname, "games".to_string());
|
|
assert_eq!(column_name, "year".to_string());
|
|
assert_eq!(lit, Literal::None)
|
|
} else {
|
|
panic!()
|
|
}
|
|
}
|
|
}
|