use super::super::{
comment::shouldbespace,
part::{cond, data, output, timeout},
value::whats,
IResult,
};
use crate::statements::UpdateStatement;
use nom::{bytes::complete::tag_no_case, combinator::opt, sequence::preceded};
pub fn update(i: &str) -> IResult<&str, UpdateStatement> {
let (i, _) = tag_no_case("UPDATE")(i)?;
let (i, only) = opt(preceded(shouldbespace, tag_no_case("ONLY")))(i)?;
let (i, _) = shouldbespace(i)?;
let (i, what) = whats(i)?;
let (i, data) = opt(preceded(shouldbespace, data))(i)?;
let (i, cond) = opt(preceded(shouldbespace, cond))(i)?;
let (i, output) = opt(preceded(shouldbespace, output))(i)?;
let (i, timeout) = opt(preceded(shouldbespace, timeout))(i)?;
let (i, parallel) = opt(preceded(shouldbespace, tag_no_case("PARALLEL")))(i)?;
Ok((
i,
UpdateStatement {
only: only.is_some(),
what,
data,
cond,
output,
timeout,
parallel: parallel.is_some(),
},
))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn update_statement() {
let sql = "UPDATE test";
let res = update(sql);
let out = res.unwrap().1;
assert_eq!("UPDATE test", format!("{}", out))
}
}