From 677fd19bece270ad89513d7862c3aa8501880ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jind=C5=99ich=20Moravec?= Date: Sat, 27 Jan 2024 16:34:23 +0100 Subject: [PATCH 1/2] fix: NUMBER type name --- parser/src/parsing/common.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parser/src/parsing/common.rs b/parser/src/parsing/common.rs index 23fb866..f71d587 100644 --- a/parser/src/parsing/common.rs +++ b/parser/src/parsing/common.rs @@ -32,12 +32,12 @@ pub fn parse_column_name(input: &str) -> IResult<&str, String> { } pub fn parse_db_type(input: &str) -> IResult<&str, DbType> { - let (input, type_name) = alt((tag("STRING"), tag("INT"), tag("Float"), tag("UUID")))(input)?; + let (input, type_name) = alt((tag("STRING"), tag("INT"), tag("NUMBER"), tag("UUID")))(input)?; let db_type = match type_name { "STRING" => DbType::String, "INT" => DbType::Int, "UUID" => DbType::Uuid, - "Float" => DbType::Number, + "NUMBER" => DbType::Number, _ => return Err(nom::Err::Failure(make_error(input, nom::error::ErrorKind::IsNot))) }; Ok((input, db_type)) From 5ced11c40d0fab7f952a163fb5303ec34cf48e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jind=C5=99ich=20Moravec?= Date: Sat, 27 Jan 2024 16:34:44 +0100 Subject: [PATCH 2/2] feat: integrate thiserror --- parser/src/core.rs | 9 ++++++--- parser/src/validation.rs | 10 +++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/parser/src/core.rs b/parser/src/core.rs index 1f97797..248c5c6 100644 --- a/parser/src/core.rs +++ b/parser/src/core.rs @@ -1,12 +1,15 @@ use minisql::{operation::Operation, schema::TableSchema}; use nom::{branch::alt, multi::many0, IResult}; +use thiserror::Error; use crate::{parsing::{create::parse_create, delete::parse_delete, index::parse_create_index, insert::parse_insert, select::parse_select}, validation::{validate_operation, ValidationError}}; -#[derive(Debug)] +#[derive(Debug, Error)] pub enum Error { + #[error("parsing error: {0}")] ParsingError(String), - ValidationError(ValidationError) + #[error("validation error: {0}")] + ValidationError(#[from] ValidationError) } pub fn parse_statement<'a>(input: &'a str) -> IResult<&str, Operation> { @@ -31,7 +34,7 @@ pub fn parse_and_validate(query: String, db_metadata: &Vec<(String, &TableSchema Error::ParsingError(err.to_string()) })?; - validate_operation(&op, db_metadata).map_err(|err| Error::ValidationError(err))?; + validate_operation(&op, db_metadata)?; Ok(op) } diff --git a/parser/src/validation.rs b/parser/src/validation.rs index 2be6dce..795e04f 100644 --- a/parser/src/validation.rs +++ b/parser/src/validation.rs @@ -1,17 +1,25 @@ use std::collections::HashSet; +use thiserror::Error; use minisql::{operation::{ColumnSelection, Condition, InsertionValues, Operation}, schema::TableSchema, type_system::{DbType, IndexableValue, Value}}; -#[derive(Debug)] +#[derive(Debug, Error)] pub enum ValidationError { + #[error("table {0} does not exist")] TableDoesNotExist(String), + #[error("table {0} already exists")] TableExists(String), + #[error("column {0} does not exist")] ColumnDoesNotExist(String), + #[error("bad column position {0}")] BadColumnPosition(usize), + #[error("duplicate column {0}")] DuplicateColumn(String), + #[error("type mismatch")] TypeMismatch, + #[error("value for required column {0} is missing")] ValueForRequiredColumnIsMissing(String) }