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

View file

@ -108,6 +108,10 @@ impl Parser {
self.parse_sql_value() self.parse_sql_value()
} }
"CASE" => self.parse_case_expression(), "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)), _ => return parser_err!(format!("No prefix parser for keyword {}", k)),
}, },
Token::Mult => Ok(ASTNode::SQLWildcard), Token::Mult => Ok(ASTNode::SQLWildcard),
@ -329,6 +333,7 @@ impl Parser {
&Token::Mod => Ok(SQLOperator::Modulus), &Token::Mod => Ok(SQLOperator::Modulus),
&Token::Keyword(ref k) if k == "AND" => Ok(SQLOperator::And), &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 == "OR" => Ok(SQLOperator::Or),
&Token::Keyword(ref k) if k == "NOT" => Ok(SQLOperator::Not),
&Token::Keyword(ref k) if k == "LIKE" => Ok(SQLOperator::Like), &Token::Keyword(ref k) if k == "LIKE" => Ok(SQLOperator::Like),
_ => parser_err!(format!("Unsupported SQL operator {:?}", tok)), _ => 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] #[test]
fn parse_select_string_predicate() { fn parse_select_string_predicate() {
let sql = String::from( let sql = String::from(