matdb 0.1.0

An experimental embedded SQL-like DBMS
Documentation
use crate::ast::{Set, Statement, UpdateStatement};

use super::{rename_default_table, Parser, ParserError};

impl<'a> Parser<'a> {
    fn parse_set(&mut self, table: &str) -> Result<Set, ParserError> {
        let mut lhs = self.parse_column()?;
        if lhs.0.is_empty() {
            lhs.0 = table.to_string();
        }
        self.try_consume_eq()?;
        Ok(Set {
            lhs,
            rhs: rename_default_table(&self.parse_expr()?, table),
        })
    }

    pub(crate) fn parse_update_statement(&mut self) -> Result<Statement, ParserError> {
        self.try_consume_keyword("UPDATE")?;

        let table = self.try_consume_symbol()?;

        self.try_consume_keyword("SET")?;

        let set_list = self.make_parse_list(|s| s.parse_set(&table))?;

        let cond = if let Ok(_) = self.try_consume_keyword("WHERE") {
            Some(rename_default_table(&self.parse_expr()?, &table))
        } else {
            None
        };

        self.try_consume_semi()?;

        Ok(Statement::Update(UpdateStatement {
            table,
            sets: set_list,
            cond,
        }))
    }
}