Add SQLOrderBy struct to replace ASTNode::OrderByExpr

This commit is contained in:
Andy Grove 2018-09-08 08:09:32 -06:00
parent e19d559073
commit d58e59324b
2 changed files with 21 additions and 10 deletions

View file

@ -72,7 +72,7 @@ pub enum ASTNode {
/// WHERE /// WHERE
selection: Option<Box<ASTNode>>, selection: Option<Box<ASTNode>>,
/// ORDER BY /// ORDER BY
order_by: Option<Vec<ASTNode>>, order_by: Option<Vec<SQLOrderByExpr>>,
/// GROUP BY /// GROUP BY
group_by: Option<Vec<ASTNode>>, group_by: Option<Vec<ASTNode>>,
/// HAVING /// HAVING
@ -105,7 +105,7 @@ pub enum ASTNode {
/// WHERE /// WHERE
selection: Option<Box<ASTNode>>, selection: Option<Box<ASTNode>>,
/// ORDER BY /// ORDER BY
order_by: Option<Vec<ASTNode>>, order_by: Option<Vec<SQLOrderByExpr>>,
limit: Option<Box<ASTNode>>, limit: Option<Box<ASTNode>>,
}, },
/// CREATE TABLE /// CREATE TABLE
@ -124,6 +124,20 @@ pub struct SQLAssigment {
value: Box<ASTNode> value: Box<ASTNode>
} }
/// SQL ORDER BY expression
#[derive(Debug, Clone, PartialEq)]
pub struct SQLOrderByExpr {
pub expr: Box<ASTNode>,
pub asc: bool
}
impl SQLOrderByExpr {
pub fn new(expr: Box<ASTNode>,
asc: bool) -> Self {
SQLOrderByExpr { expr, asc }
}
}
/// SQL column definition /// SQL column definition
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
pub struct SQLColumnDef { pub struct SQLColumnDef {

View file

@ -563,8 +563,8 @@ impl Parser {
} }
/// Parse a comma-delimited list of SQL ORDER BY expressions /// Parse a comma-delimited list of SQL ORDER BY expressions
pub fn parse_order_by_expr_list(&mut self) -> Result<Vec<ASTNode>, ParserError> { pub fn parse_order_by_expr_list(&mut self) -> Result<Vec<SQLOrderByExpr>, ParserError> {
let mut expr_list: Vec<ASTNode> = vec![]; let mut expr_list: Vec<SQLOrderByExpr> = vec![];
loop { loop {
let expr = self.parse_expr(0)?; let expr = self.parse_expr(0)?;
@ -590,10 +590,7 @@ impl Parser {
None => true, None => true,
}; };
expr_list.push(ASTNode::SQLOrderBy { expr_list.push(SQLOrderByExpr::new(Box::new(expr),asc));
expr: Box::new(expr),
asc,
});
if let Some(t) = self.peek_token() { if let Some(t) = self.peek_token() {
if t == Token::Comma { if t == Token::Comma {
@ -805,11 +802,11 @@ mod tests {
ASTNode::SQLSelect { order_by, .. } => { ASTNode::SQLSelect { order_by, .. } => {
assert_eq!( assert_eq!(
Some(vec![ Some(vec![
ASTNode::SQLOrderBy { SQLOrderByExpr {
expr: Box::new(ASTNode::SQLIdentifier("lname".to_string())), expr: Box::new(ASTNode::SQLIdentifier("lname".to_string())),
asc: true, asc: true,
}, },
ASTNode::SQLOrderBy { SQLOrderByExpr {
expr: Box::new(ASTNode::SQLIdentifier("fname".to_string())), expr: Box::new(ASTNode::SQLIdentifier("fname".to_string())),
asc: false, asc: false,
}, },