unify parsing of sql_values

This commit is contained in:
Jovansonlee Cesar 2018-09-26 15:41:57 +08:00
parent 6aca4de658
commit 8dbb62cddd

View file

@ -103,9 +103,18 @@ impl Parser {
"DELETE" => Ok(self.parse_delete()?), "DELETE" => Ok(self.parse_delete()?),
"INSERT" => Ok(self.parse_insert()?), "INSERT" => Ok(self.parse_insert()?),
"COPY" => Ok(self.parse_copy()?), "COPY" => Ok(self.parse_copy()?),
"TRUE" => Ok(ASTNode::SQLValue(Value::Boolean(true))), "TRUE" => {
"FALSE" => Ok(ASTNode::SQLValue(Value::Boolean(false))), self.prev_token();
"NULL" => Ok(ASTNode::SQLValue(Value::Null)), self.parse_sql_value()
}
"FALSE" => {
self.prev_token();
self.parse_sql_value()
}
"NULL" => {
self.prev_token();
self.parse_sql_value()
}
_ => 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),
@ -136,15 +145,14 @@ impl Parser {
} }
} }
} }
Token::Number(ref n) if n.contains(".") => match n.parse::<f64>() { Token::Number(ref n) => {
Ok(n) => Ok(ASTNode::SQLValue(Value::Double(n))), self.prev_token();
Err(e) => parser_err!(format!("Could not parse '{}' as i64: {}", n, e)), self.parse_sql_value()
}, },
Token::Number(ref n) => match n.parse::<i64>() { Token::String(ref s) => {
Ok(n) => Ok(ASTNode::SQLValue(Value::Long(n))), self.prev_token();
Err(e) => parser_err!(format!("Could not parse '{}' as i64: {}", n, e)), self.parse_sql_value()
}, }
Token::String(ref s) => Ok(ASTNode::SQLValue(Value::String(s.to_string()))),
_ => parser_err!(format!( _ => parser_err!(format!(
"Prefix parser expected a keyword but found {:?}", "Prefix parser expected a keyword but found {:?}",
t t
@ -489,14 +497,18 @@ impl Parser {
//TODO: handle escape of values in characters //TODO: handle escape of values in characters
} }
}else{ }else{
values.push(self.parse_sql_value()?); values.push(self.parse_value()?);
} }
} }
Ok(values) Ok(values)
} }
fn parse_sql_value(&mut self) -> Result<Value, ParserError> { fn parse_sql_value(&mut self) -> Result<ASTNode, ParserError> {
Ok(ASTNode::SQLValue(self.parse_value()?))
}
fn parse_value(&mut self) -> Result<Value, ParserError> {
match self.next_token() { match self.next_token() {
Some(t) => { Some(t) => {
match t { match t {