implement NOT

This commit is contained in:
Andy Grove 2018-12-16 14:03:03 -07:00
parent 2240dd09ff
commit 7aab880387
3 changed files with 17 additions and 0 deletions

View file

@ -14,6 +14,7 @@ pub enum SQLOperator {
NotEq,
And,
Or,
Not,
Like,
}
@ -33,6 +34,7 @@ impl ToString for SQLOperator {
SQLOperator::NotEq => "!=".to_string(),
SQLOperator::And => "AND".to_string(),
SQLOperator::Or => "OR".to_string(),
SQLOperator::Not => "NOT".to_string(),
SQLOperator::Like => "LIKE".to_string(),
}
}

View file

@ -108,6 +108,10 @@ impl Parser {
self.parse_sql_value()
}
"CASE" => self.parse_case_expression(),
"NOT" => Ok(ASTNode::SQLUnary {
operator: SQLOperator::Not,
rex: Box::new(self.parse_expr(0)?),
}),
_ => return parser_err!(format!("No prefix parser for keyword {}", k)),
},
Token::Mult => Ok(ASTNode::SQLWildcard),
@ -329,6 +333,7 @@ impl Parser {
&Token::Mod => Ok(SQLOperator::Modulus),
&Token::Keyword(ref k) if k == "AND" => Ok(SQLOperator::And),
&Token::Keyword(ref k) if k == "OR" => Ok(SQLOperator::Or),
&Token::Keyword(ref k) if k == "NOT" => Ok(SQLOperator::Not),
&Token::Keyword(ref k) if k == "LIKE" => Ok(SQLOperator::Like),
_ => parser_err!(format!("Unsupported SQL operator {:?}", tok)),
}

View file

@ -105,6 +105,16 @@ fn parse_select_count_wildcard() {
}
}
#[test]
fn parse_not() {
let sql = String::from(
"SELECT id FROM customer \
WHERE NOT salary = ''",
);
let _ast = parse_sql(&sql);
//TODO: add assertions
}
#[test]
fn parse_select_string_predicate() {
let sql = String::from(