From d840ae4219232a020c897d08b7459a928cd8515b Mon Sep 17 00:00:00 2001 From: myyrakle Date: Thu, 21 Mar 2024 11:15:00 +0900 Subject: [PATCH 01/19] =?UTF-8?q?[#63]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20use=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ast/types/function.rs | 2 -- src/errors/execute_error.rs | 1 - src/errors/into_error.rs | 2 -- src/errors/lexing_error.rs | 2 -- src/errors/parsing_error.rs | 2 -- src/errors/server_error.rs | 2 -- src/errors/type_error.rs | 2 +- src/executor/config/table.rs | 2 +- src/executor/implements/dml/insert.rs | 1 - src/lexer/operator_token.rs | 2 +- src/lexer/tokens.rs | 1 - src/parser/implements/dml/expression.rs | 1 - src/parser/implements/dml/select.rs | 1 - src/pgwire/protocol/connection_codec.rs | 1 - src/pgwire/protocol/format_code.rs | 2 -- 15 files changed, 3 insertions(+), 21 deletions(-) diff --git a/src/ast/types/function.rs b/src/ast/types/function.rs index a5f24bba..0458eed0 100644 --- a/src/ast/types/function.rs +++ b/src/ast/types/function.rs @@ -1,5 +1,3 @@ -use std::convert::TryFrom; - use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq)] diff --git a/src/errors/execute_error.rs b/src/errors/execute_error.rs index 6e1a8901..c3c5d957 100644 --- a/src/errors/execute_error.rs +++ b/src/errors/execute_error.rs @@ -1,5 +1,4 @@ use std::error::Error; -use std::string::ToString; #[derive(Clone, Debug, PartialEq, Eq)] pub struct ExecuteError { diff --git a/src/errors/into_error.rs b/src/errors/into_error.rs index 6ac3bd99..840492cf 100644 --- a/src/errors/into_error.rs +++ b/src/errors/into_error.rs @@ -1,5 +1,3 @@ -use std::string::ToString; - #[derive(Clone, Debug, PartialEq, Eq)] pub struct IntoError { pub message: String, diff --git a/src/errors/lexing_error.rs b/src/errors/lexing_error.rs index 35c9ef04..af4034b3 100644 --- a/src/errors/lexing_error.rs +++ b/src/errors/lexing_error.rs @@ -1,5 +1,3 @@ -use std::string::ToString; - #[derive(Clone, Debug, PartialEq, Eq)] pub struct LexingError { pub message: String, diff --git a/src/errors/parsing_error.rs b/src/errors/parsing_error.rs index 228cd351..7bcd31a4 100644 --- a/src/errors/parsing_error.rs +++ b/src/errors/parsing_error.rs @@ -1,5 +1,3 @@ -use std::string::ToString; - #[derive(Clone, Debug, PartialEq, Eq)] pub struct ParsingError { pub message: String, diff --git a/src/errors/server_error.rs b/src/errors/server_error.rs index 9c77e8a3..115bacfd 100644 --- a/src/errors/server_error.rs +++ b/src/errors/server_error.rs @@ -1,5 +1,3 @@ -use std::string::ToString; - #[derive(Clone, Debug, PartialEq, Eq)] pub struct ServerError { pub message: String, diff --git a/src/errors/type_error.rs b/src/errors/type_error.rs index 7d8fe415..c7074240 100644 --- a/src/errors/type_error.rs +++ b/src/errors/type_error.rs @@ -1,4 +1,4 @@ -use std::{error::Error, string::ToString}; +use std::error::Error; #[derive(Clone, Debug, PartialEq, Eq)] pub struct TypeError { diff --git a/src/executor/config/table.rs b/src/executor/config/table.rs index 063bc49a..c3985d2f 100644 --- a/src/executor/config/table.rs +++ b/src/executor/config/table.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, iter::FromIterator}; +use std::collections::HashMap; use serde::{Deserialize, Serialize}; diff --git a/src/executor/implements/dml/insert.rs b/src/executor/implements/dml/insert.rs index e6f6ae78..2f14f7b3 100644 --- a/src/executor/implements/dml/insert.rs +++ b/src/executor/implements/dml/insert.rs @@ -1,7 +1,6 @@ use std::collections::HashSet; use std::error::Error; use std::io::ErrorKind; -use std::iter::FromIterator; use crate::ast::dml::insert::{InsertData, InsertQuery}; use crate::ast::types::SQLExpression; diff --git a/src/lexer/operator_token.rs b/src/lexer/operator_token.rs index 75c5e035..2344c5bf 100644 --- a/src/lexer/operator_token.rs +++ b/src/lexer/operator_token.rs @@ -1,4 +1,4 @@ -use std::{convert::TryInto, error::Error}; +use std::error::Error; use crate::{ ast::dml::expressions::operators::{BinaryOperator, UnaryOperator}, diff --git a/src/lexer/tokens.rs b/src/lexer/tokens.rs index b8422ceb..83b03636 100644 --- a/src/lexer/tokens.rs +++ b/src/lexer/tokens.rs @@ -1,4 +1,3 @@ -use std::convert::TryInto; use std::error::Error; use super::predule::OperatorToken; diff --git a/src/parser/implements/dml/expression.rs b/src/parser/implements/dml/expression.rs index b7989669..9797bc71 100644 --- a/src/parser/implements/dml/expression.rs +++ b/src/parser/implements/dml/expression.rs @@ -1,4 +1,3 @@ -use std::convert::{TryFrom, TryInto}; use std::error::Error; use crate::ast::dml::expressions::between::BetweenExpression; diff --git a/src/parser/implements/dml/select.rs b/src/parser/implements/dml/select.rs index 0506f310..fbcb0531 100644 --- a/src/parser/implements/dml/select.rs +++ b/src/parser/implements/dml/select.rs @@ -1,6 +1,5 @@ use std::collections::HashSet; use std::error::Error; -use std::iter::FromIterator; use crate::ast::dml::parts::_where::WhereClause; use crate::ast::dml::parts::group_by::GroupByItem; diff --git a/src/pgwire/protocol/connection_codec.rs b/src/pgwire/protocol/connection_codec.rs index d2538774..e84fed4f 100644 --- a/src/pgwire/protocol/connection_codec.rs +++ b/src/pgwire/protocol/connection_codec.rs @@ -1,6 +1,5 @@ use bytes::{Buf, BufMut, BytesMut}; use std::collections::HashMap; -use std::convert::TryInto; use tokio_util::codec::{Decoder, Encoder}; use crate::pgwire::protocol::ProtocolError; diff --git a/src/pgwire/protocol/format_code.rs b/src/pgwire/protocol/format_code.rs index 52e3abc2..baea68b1 100644 --- a/src/pgwire/protocol/format_code.rs +++ b/src/pgwire/protocol/format_code.rs @@ -1,5 +1,3 @@ -use std::convert::TryFrom; - use crate::pgwire::protocol::ProtocolError; /// Describes how to format a given value or set of values. From 7a7c1569a69de08030ab46023e13098f46e24bb5 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:38:18 +0900 Subject: [PATCH 02/19] =?UTF-8?q?[#63]=20RRDBError=20=EC=B5=9C=EC=83=81?= =?UTF-8?q?=EC=9C=84=20=EC=97=90=EB=9F=AC=20=ED=83=80=EC=9E=85=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/mod.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/errors/mod.rs b/src/errors/mod.rs index 15185f5b..74354ff4 100644 --- a/src/errors/mod.rs +++ b/src/errors/mod.rs @@ -5,3 +5,13 @@ pub mod parsing_error; pub mod predule; pub mod server_error; pub mod type_error; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum RRDBError { + ExecuteError(execute_error::ExecuteError), + IntoError(into_error::IntoError), + LexingError(lexing_error::LexingError), + ParsingError(parsing_error::ParsingError), + ServerError(server_error::ServerError), + TypeError(type_error::TypeError), +} From d32ccc1da5e1665734072a98010fce5937dc40c9 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:41:20 +0900 Subject: [PATCH 03/19] =?UTF-8?q?[#63]=20ExecuteError=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/execute_error.rs | 16 ++--- src/executor/common.rs | 6 +- src/executor/executor.rs | 6 +- src/executor/implements/ddl/alter_database.rs | 18 ++--- src/executor/implements/ddl/alter_table.rs | 71 +++++++++---------- .../implements/ddl/create_database.rs | 14 ++-- src/executor/implements/ddl/create_table.rs | 12 ++-- src/executor/implements/ddl/drop_database.rs | 6 +- src/executor/implements/ddl/drop_table.rs | 4 +- src/executor/implements/dml/delete.rs | 2 +- src/executor/implements/dml/insert.rs | 22 +++--- src/executor/implements/dml/scan.rs | 18 +++-- src/executor/implements/dml/update.rs | 4 +- src/executor/implements/other/desc_table.rs | 6 +- .../implements/other/show_databases.rs | 4 +- src/executor/implements/other/show_tables.rs | 4 +- src/executor/reduce.rs | 22 +++--- src/server/server.rs | 4 +- 18 files changed, 111 insertions(+), 128 deletions(-) diff --git a/src/errors/execute_error.rs b/src/errors/execute_error.rs index c3c5d957..36019354 100644 --- a/src/errors/execute_error.rs +++ b/src/errors/execute_error.rs @@ -1,23 +1,17 @@ use std::error::Error; +use super::RRDBError; + #[derive(Clone, Debug, PartialEq, Eq)] pub struct ExecuteError { pub message: String, } impl ExecuteError { - pub fn new(message: T) -> Self { - Self { + pub fn new(message: T) -> RRDBError { + RRDBError::ExecuteError(Self { message: message.to_string(), - } - } - - pub fn boxed(message: T) -> Box { - Box::new(Self::new(message)) - } - - pub fn dyn_boxed(message: T) -> Box { - Box::new(Self::new(message)) + }) } } diff --git a/src/executor/common.rs b/src/executor/common.rs index 597cec41..6eefd254 100644 --- a/src/executor/common.rs +++ b/src/executor/common.rs @@ -35,12 +35,12 @@ impl Executor { match table_config { Some(table_config) => Ok(table_config), - None => Err(ExecuteError::boxed("invalid config data")), + None => Err(ExecuteError::new("invalid config data")), } } Err(error) => match error.kind() { - ErrorKind::NotFound => Err(ExecuteError::boxed("table not found")), - _ => Err(ExecuteError::boxed(format!("{:?}", error))), + ErrorKind::NotFound => Err(ExecuteError::new("table not found")), + _ => Err(ExecuteError::new(format!("{:?}", error))), }, } } diff --git a/src/executor/executor.rs b/src/executor/executor.rs index 9b5a442c..9584f9e8 100644 --- a/src/executor/executor.rs +++ b/src/executor/executor.rs @@ -32,7 +32,7 @@ impl Executor { } else { println!("path {:?}", base_path.clone()); println!("error: {:?}", error.to_string()); - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } } @@ -43,7 +43,7 @@ impl Executor { let global_config = toml::to_string(&global_info).unwrap(); if let Err(error) = tokio::fs::write(global_path, global_config.as_bytes()).await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } self.create_database(CreateDatabaseQuery::builder().set_name("rrdb".into())) @@ -95,7 +95,7 @@ impl Executor { match result { Ok(result) => Ok(result), - Err(error) => Err(ExecuteError::boxed(error.to_string())), + Err(error) => Err(ExecuteError::new(error.to_string())), } } } diff --git a/src/executor/implements/ddl/alter_database.rs b/src/executor/implements/ddl/alter_database.rs index 437e076e..be76af48 100644 --- a/src/executor/implements/ddl/alter_database.rs +++ b/src/executor/implements/ddl/alter_database.rs @@ -1,8 +1,8 @@ -use std::error::Error; use std::io::ErrorKind; use crate::ast::ddl::alter_database::{AlterDatabaseAction, AlterDatabaseQuery}; use crate::errors::predule::ExecuteError; +use crate::errors::RRDBError; use crate::executor::config::database::DatabaseConfig; use crate::executor::encoder::storage::StorageEncoder; use crate::executor::predule::{ExecuteResult, Executor}; @@ -12,7 +12,7 @@ impl Executor { pub async fn alter_database( &self, query: AlterDatabaseQuery, - ) -> Result> { + ) -> Result { let encoder = StorageEncoder::new(); let base_path = self.get_base_path(); @@ -25,7 +25,7 @@ impl Executor { let from_database_name = query .database_name .clone() - .ok_or_else(|| ExecuteError::dyn_boxed("no database name"))?; + .ok_or_else(|| ExecuteError::new("no database name"))?; // 변경할 데이터베이스명 let to_database_name = rename.name; @@ -43,10 +43,10 @@ impl Executor { if let Err(error) = result { match error.kind() { ErrorKind::NotFound => { - return Err(ExecuteError::boxed("database not found")) + return Err(ExecuteError::new("database not found")) } _ => { - return Err(ExecuteError::boxed("database alter failed")); + return Err(ExecuteError::new("database alter failed")); } } } @@ -69,20 +69,20 @@ impl Executor { ) .await { - return Err(ExecuteError::dyn_boxed("no database name")); + return Err(ExecuteError::new("no database name")); } } None => { - return Err(ExecuteError::boxed("invalid config data")); + return Err(ExecuteError::new("invalid config data")); } } } Err(error) => match error.kind() { ErrorKind::NotFound => { - return Err(ExecuteError::boxed("database not found")); + return Err(ExecuteError::new("database not found")); } _ => { - return Err(ExecuteError::boxed(format!("{:?}", error))); + return Err(ExecuteError::new(format!("{:?}", error))); } }, } diff --git a/src/executor/implements/ddl/alter_table.rs b/src/executor/implements/ddl/alter_table.rs index 6236ae30..63a8983f 100644 --- a/src/executor/implements/ddl/alter_table.rs +++ b/src/executor/implements/ddl/alter_table.rs @@ -4,6 +4,7 @@ use std::io::ErrorKind; use crate::ast::ddl::alter_table::{AlterColumnAction, AlterTableAction, AlterTableQuery}; use crate::ast::types::TableName; use crate::errors::predule::ExecuteError; +use crate::errors::RRDBError; use crate::executor::config::table::TableConfig; use crate::executor::encoder::storage::StorageEncoder; use crate::executor::predule::{ @@ -11,10 +12,7 @@ use crate::executor::predule::{ }; impl Executor { - pub async fn alter_table( - &self, - query: AlterTableQuery, - ) -> Result> { + pub async fn alter_table(&self, query: AlterTableQuery) -> Result { let encoder = StorageEncoder::new(); let base_path = self.get_base_path(); @@ -36,10 +34,7 @@ impl Executor { // table 디렉터리명 변경 if let Err(error) = tokio::fs::rename(&table_path, &change_path).await { - return Err(ExecuteError::boxed(format!( - "table rename failed: {}", - error - ))); + return Err(ExecuteError::new(format!("table rename failed: {}", error))); } // config data 파일 내용 변경 @@ -51,7 +46,7 @@ impl Executor { if let Err(error) = tokio::fs::write(config_path, encoder.encode(table_config)).await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } } AlterTableAction::AddColumn(action) => { @@ -65,7 +60,7 @@ impl Executor { let mut table_config = self.get_table_config(query.table.unwrap()).await?; if table_config.columns.contains(&column_to_add) { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' already exists ", column_to_add.name ))); @@ -76,7 +71,7 @@ impl Executor { if let Err(error) = tokio::fs::write(config_path, encoder.encode(table_config)).await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } } AlterTableAction::AlterColumn(action) => { @@ -101,7 +96,7 @@ impl Executor { target.default = Some(action.expression); } None => { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' not exists ", column_name ))); @@ -111,7 +106,7 @@ impl Executor { if let Err(error) = tokio::fs::write(config_path, encoder.encode(table_config)).await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } } AlterColumnAction::AlterColumnDropDefault(_) => { @@ -135,7 +130,7 @@ impl Executor { target.default = None; } None => { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' not exists ", column_name ))); @@ -148,20 +143,20 @@ impl Executor { ) .await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } } None => { - return Err(ExecuteError::boxed("invalid config data")); + return Err(ExecuteError::new("invalid config data")); } } } Err(error) => match error.kind() { ErrorKind::NotFound => { - return Err(ExecuteError::boxed("table not found")); + return Err(ExecuteError::new("table not found")); } _ => { - return Err(ExecuteError::boxed(format!("{:?}", error))); + return Err(ExecuteError::new(format!("{:?}", error))); } }, } @@ -187,7 +182,7 @@ impl Executor { target.not_null = true; } None => { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' not exists ", column_name ))); @@ -200,20 +195,20 @@ impl Executor { ) .await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } } None => { - return Err(ExecuteError::boxed("invalid config data")); + return Err(ExecuteError::new("invalid config data")); } } } Err(error) => match error.kind() { ErrorKind::NotFound => { - return Err(ExecuteError::boxed("table not found")); + return Err(ExecuteError::new("table not found")); } _ => { - return Err(ExecuteError::boxed(format!("{:?}", error))); + return Err(ExecuteError::new(format!("{:?}", error))); } }, } @@ -239,7 +234,7 @@ impl Executor { target.not_null = false; } None => { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' not exists ", column_name ))); @@ -252,20 +247,20 @@ impl Executor { ) .await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } } None => { - return Err(ExecuteError::boxed("invalid config data")); + return Err(ExecuteError::new("invalid config data")); } } } Err(error) => match error.kind() { ErrorKind::NotFound => { - return Err(ExecuteError::boxed("table not found")); + return Err(ExecuteError::new("table not found")); } _ => { - return Err(ExecuteError::boxed(format!("{:?}", error))); + return Err(ExecuteError::new(format!("{:?}", error))); } }, } @@ -290,7 +285,7 @@ impl Executor { target.data_type = action.data_type; } None => { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' not exists ", column_name ))); @@ -303,20 +298,20 @@ impl Executor { ) .await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } } None => { - return Err(ExecuteError::boxed("invalid config data")); + return Err(ExecuteError::new("invalid config data")); } } } Err(error) => match error.kind() { ErrorKind::NotFound => { - return Err(ExecuteError::boxed("table not found")); + return Err(ExecuteError::new("table not found")); } _ => { - return Err(ExecuteError::boxed(format!("{:?}", error))); + return Err(ExecuteError::new(format!("{:?}", error))); } }, } @@ -336,7 +331,7 @@ impl Executor { .iter() .any(|e| e.name == action.column_name) { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' not exists ", action.column_name ))); @@ -349,7 +344,7 @@ impl Executor { if let Err(error) = tokio::fs::write(config_path, encoder.encode(table_config)).await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } } AlterTableAction::RenameColumn(action) => { @@ -365,7 +360,7 @@ impl Executor { .iter() .any(|e| e.name == action.to_name) { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' already exists ", action.to_name ))); @@ -381,7 +376,7 @@ impl Executor { target.name = action.to_name; } None => { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' not exists ", action.from_name ))); @@ -391,7 +386,7 @@ impl Executor { if let Err(error) = tokio::fs::write(config_path, encoder.encode(table_config)).await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } } AlterTableAction::None => {} diff --git a/src/executor/implements/ddl/create_database.rs b/src/executor/implements/ddl/create_database.rs index eb595ece..bd315065 100644 --- a/src/executor/implements/ddl/create_database.rs +++ b/src/executor/implements/ddl/create_database.rs @@ -20,17 +20,17 @@ impl Executor { let database_name = query .database_name .clone() - .ok_or_else(|| ExecuteError::dyn_boxed("no database name"))?; + .ok_or_else(|| ExecuteError::new("no database name"))?; let database_path = base_path.clone().join(&database_name); if let Err(error) = tokio::fs::create_dir(database_path.clone()).await { match error.kind() { ErrorKind::AlreadyExists => { - return Err(ExecuteError::boxed("already exists database")) + return Err(ExecuteError::new("already exists database")) } _ => { - return Err(ExecuteError::boxed("database create failed")); + return Err(ExecuteError::new("database create failed")); } } } @@ -40,11 +40,9 @@ impl Executor { if let Err(error) = tokio::fs::create_dir(&tables_path).await { match error.kind() { - ErrorKind::AlreadyExists => { - return Err(ExecuteError::boxed("already exists tables")) - } + ErrorKind::AlreadyExists => return Err(ExecuteError::new("already exists tables")), _ => { - return Err(ExecuteError::boxed("tables create failed")); + return Err(ExecuteError::new("tables create failed")); } } } @@ -56,7 +54,7 @@ impl Executor { }; if let Err(error) = tokio::fs::write(config_path, encoder.encode(database_info)).await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } Ok(ExecuteResult { diff --git a/src/executor/implements/ddl/create_table.rs b/src/executor/implements/ddl/create_table.rs index 7b6f2ce1..0e45e15f 100644 --- a/src/executor/implements/ddl/create_table.rs +++ b/src/executor/implements/ddl/create_table.rs @@ -25,11 +25,9 @@ impl Executor { if let Err(error) = tokio::fs::create_dir(&table_path).await { match error.kind() { - ErrorKind::AlreadyExists => { - return Err(ExecuteError::boxed("already exists table")) - } + ErrorKind::AlreadyExists => return Err(ExecuteError::new("already exists table")), _ => { - return Err(ExecuteError::boxed("table create failed")); + return Err(ExecuteError::new("table create failed")); } } } @@ -39,21 +37,21 @@ impl Executor { let table_info: TableConfig = query.into(); if let Err(error) = tokio::fs::write(&config_path, encoder.encode(table_info)).await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } let rows_path = table_path.clone().join("rows"); // 데이터 경로 생성 if let Err(error) = tokio::fs::create_dir(&rows_path).await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } let index_path = table_path.clone().join("index"); // 인덱스 경로 생성 if let Err(error) = tokio::fs::create_dir(&index_path).await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } // TODO: primary key 데이터 생성 diff --git a/src/executor/implements/ddl/drop_database.rs b/src/executor/implements/ddl/drop_database.rs index a42c5cbe..ede479af 100644 --- a/src/executor/implements/ddl/drop_database.rs +++ b/src/executor/implements/ddl/drop_database.rs @@ -17,15 +17,15 @@ impl Executor { let database_name = query .database_name .clone() - .ok_or_else(|| ExecuteError::dyn_boxed("no database name"))?; + .ok_or_else(|| ExecuteError::new("no database name"))?; database_path.push(&database_name); if let Err(error) = tokio::fs::remove_dir_all(database_path.clone()).await { match error.kind() { - ErrorKind::NotFound => return Err(ExecuteError::boxed("database not found")), + ErrorKind::NotFound => return Err(ExecuteError::new("database not found")), _ => { - return Err(ExecuteError::boxed("database drop failed")); + return Err(ExecuteError::new("database drop failed")); } } } diff --git a/src/executor/implements/ddl/drop_table.rs b/src/executor/implements/ddl/drop_table.rs index 4e4a1158..60aae7bc 100644 --- a/src/executor/implements/ddl/drop_table.rs +++ b/src/executor/implements/ddl/drop_table.rs @@ -27,9 +27,9 @@ impl Executor { if let Err(error) = tokio::fs::remove_dir_all(table_path).await { match error.kind() { - ErrorKind::NotFound => return Err(ExecuteError::boxed("table not found")), + ErrorKind::NotFound => return Err(ExecuteError::new("table not found")), _ => { - return Err(ExecuteError::boxed("table drop failed")); + return Err(ExecuteError::new("table drop failed")); } } } diff --git a/src/executor/implements/dml/delete.rs b/src/executor/implements/dml/delete.rs index 1ab9f96e..7cee7bcf 100644 --- a/src/executor/implements/dml/delete.rs +++ b/src/executor/implements/dml/delete.rs @@ -100,7 +100,7 @@ impl Executor { // 삭제 작업 for (path, _) in rows.into_iter() { if let Err(error) = tokio::fs::remove_file(&path).await { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "file {:?} remove failed: {}", path, error ))); diff --git a/src/executor/implements/dml/insert.rs b/src/executor/implements/dml/insert.rs index 2f14f7b3..bf1536c3 100644 --- a/src/executor/implements/dml/insert.rs +++ b/src/executor/implements/dml/insert.rs @@ -40,16 +40,16 @@ impl Executor { match table_config { Some(table_config) => table_config, None => { - return Err(ExecuteError::boxed("invalid config data")); + return Err(ExecuteError::new("invalid config data")); } } } Err(error) => match error.kind() { ErrorKind::NotFound => { - return Err(ExecuteError::boxed("table not found")); + return Err(ExecuteError::new("table not found")); } _ => { - return Err(ExecuteError::boxed(format!("{:?}", error))); + return Err(ExecuteError::new(format!("{:?}", error))); } }, }; @@ -66,7 +66,7 @@ impl Executor { // 필수 입력 컬럼값 검증 for required_column in required_columns { if !input_columns_set.contains(&required_column.name) { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' is required, but it was not provided", &required_column.name ))); @@ -94,7 +94,7 @@ impl Executor { Some(default) => default.to_owned(), None => { if column_config_info.not_null { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' is not null column ", column_name @@ -114,7 +114,7 @@ impl Executor { if column.data_type.type_code() != data.type_code() && data.type_code() != 0 { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' type mismatch ", column_name @@ -122,7 +122,7 @@ impl Executor { } } None => { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' not exists", column_name ))) @@ -146,7 +146,7 @@ impl Executor { Some(default) => default.to_owned(), None => { if column_config_info.not_null { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' is not null column ", column_name @@ -166,7 +166,7 @@ impl Executor { if column.data_type.type_code() != data.type_code() && data.type_code() != 0 { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' type mismatch ", column_name @@ -174,7 +174,7 @@ impl Executor { } } None => { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' not exists", column_name ))) @@ -200,7 +200,7 @@ impl Executor { let row_file_path = rows_path.join(file_name); if let Err(error) = tokio::fs::write(row_file_path, encoder.encode(row)).await { - return Err(ExecuteError::boxed(error.to_string())); + return Err(ExecuteError::new(error.to_string())); } } } diff --git a/src/executor/implements/dml/scan.rs b/src/executor/implements/dml/scan.rs index a89863f1..4fd41b2f 100644 --- a/src/executor/implements/dml/scan.rs +++ b/src/executor/implements/dml/scan.rs @@ -43,28 +43,26 @@ impl Executor { match encoder.decode::(result.as_slice()) { Some(decoded) => Ok((path.to_path_buf(), decoded)), - None => Err(ExecuteError::boxed(format!( + None => Err(ExecuteError::new(format!( "full scan failed {:?}", path ))), } } - Err(error) => Err(ExecuteError::boxed(format!( + Err(error) => Err(ExecuteError::new(format!( "full scan failed {}", error ))), } } else { - Err(ExecuteError::boxed("full scan failed")) + Err(ExecuteError::new("full scan failed")) } } Err(error) => { - Err(ExecuteError::boxed(format!("full scan failed {}", error))) + Err(ExecuteError::new(format!("full scan failed {}", error))) } }, - Err(error) => { - Err(ExecuteError::boxed(format!("full scan failed {}", error))) - } + Err(error) => Err(ExecuteError::new(format!("full scan failed {}", error))), } }); @@ -75,12 +73,12 @@ impl Executor { match rows { Ok(rows) => Ok(rows), - Err(error) => Err(ExecuteError::boxed(error.to_string())), + Err(error) => Err(ExecuteError::new(error.to_string())), } } Err(error) => match error.kind() { - ErrorKind::NotFound => Err(ExecuteError::boxed("base path not exists (3)")), - _ => Err(ExecuteError::boxed("full scan failed")), + ErrorKind::NotFound => Err(ExecuteError::new("base path not exists (3)")), + _ => Err(ExecuteError::new("full scan failed")), }, } } diff --git a/src/executor/implements/dml/update.rs b/src/executor/implements/dml/update.rs index 3320b1ad..595a4668 100644 --- a/src/executor/implements/dml/update.rs +++ b/src/executor/implements/dml/update.rs @@ -134,7 +134,7 @@ impl Executor { match found { Some(found) => found.data = set_value, None => { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "column '{}' not found in data row", column_name ))); @@ -143,7 +143,7 @@ impl Executor { } if let Err(error) = tokio::fs::write(&path, encoder.encode(row)).await { - return Err(ExecuteError::boxed(format!( + return Err(ExecuteError::new(format!( "path '{:?}' write failed: {}", path, error ))); diff --git a/src/executor/implements/other/desc_table.rs b/src/executor/implements/other/desc_table.rs index c7dfac72..ccdb6b4f 100644 --- a/src/executor/implements/other/desc_table.rs +++ b/src/executor/implements/other/desc_table.rs @@ -30,7 +30,7 @@ impl Executor { Ok(read_result) => { let table_info: TableConfig = encoder .decode(read_result.as_slice()) - .ok_or_else(|| ExecuteError::dyn_boxed("config decode error"))?; + .ok_or_else(|| ExecuteError::new("config decode error"))?; Ok(ExecuteResult { columns: (vec![ @@ -71,11 +71,11 @@ impl Executor { }) } Err(error) => match error.kind() { - ErrorKind::NotFound => Err(ExecuteError::boxed(format!( + ErrorKind::NotFound => Err(ExecuteError::new(format!( "table '{}' not exists", table_name ))), - _ => Err(ExecuteError::boxed("database listup failed")), + _ => Err(ExecuteError::new("database listup failed")), }, } } diff --git a/src/executor/implements/other/show_databases.rs b/src/executor/implements/other/show_databases.rs index 0842b5cb..e3b9cdb0 100644 --- a/src/executor/implements/other/show_databases.rs +++ b/src/executor/implements/other/show_databases.rs @@ -64,8 +64,8 @@ impl Executor { }) } Err(error) => match error.kind() { - ErrorKind::NotFound => Err(ExecuteError::boxed("base path not exists")), - _ => Err(ExecuteError::boxed("database listup failed")), + ErrorKind::NotFound => Err(ExecuteError::new("base path not exists")), + _ => Err(ExecuteError::new("database listup failed")), }, } } diff --git a/src/executor/implements/other/show_tables.rs b/src/executor/implements/other/show_tables.rs index 7ed5278f..f21079d2 100644 --- a/src/executor/implements/other/show_tables.rs +++ b/src/executor/implements/other/show_tables.rs @@ -69,8 +69,8 @@ impl Executor { }) } Err(error) => match error.kind() { - ErrorKind::NotFound => Err(ExecuteError::boxed("base path not exists")), - _ => Err(ExecuteError::boxed("table listup failed")), + ErrorKind::NotFound => Err(ExecuteError::new("base path not exists")), + _ => Err(ExecuteError::new("table listup failed")), }, } } diff --git a/src/executor/reduce.rs b/src/executor/reduce.rs index 9a29daca..35f09d16 100644 --- a/src/executor/reduce.rs +++ b/src/executor/reduce.rs @@ -392,7 +392,7 @@ impl Executor { match aggregate { AggregateFunction::Count => { if call.arguments.len() != 1 { - return Err(ExecuteError::dyn_boxed( + return Err(ExecuteError::new( "Count function takes only one parameter.", )); } @@ -438,7 +438,7 @@ impl Executor { } AggregateFunction::Sum => { if call.arguments.len() != 1 { - return Err(ExecuteError::dyn_boxed( + return Err(ExecuteError::new( "Sum function takes only one parameter.", )); } @@ -477,7 +477,7 @@ impl Executor { } AggregateFunction::Max => { if call.arguments.len() != 1 { - return Err(ExecuteError::dyn_boxed( + return Err(ExecuteError::new( "Max function takes only one parameter.", )); } @@ -486,7 +486,7 @@ impl Executor { } AggregateFunction::Min => { if call.arguments.len() != 1 { - return Err(ExecuteError::dyn_boxed( + return Err(ExecuteError::new( "Min function takes only one parameter.", )); } @@ -514,7 +514,7 @@ impl Executor { // 없으면 오류 if same_name_datas.is_empty() { - return Err(ExecuteError::dyn_boxed( + return Err(ExecuteError::new( format!("1 column select '{:?}' not exists", select_column), )); } @@ -537,14 +537,14 @@ impl Executor { { Ok(found.data.to_owned()) } else{ - Err(ExecuteError::dyn_boxed( + Err(ExecuteError::new( format!("column select '{:?}' is ambiguous", select_column), )) } } None=>{ if same_name_datas.len()>=2 { - Err(ExecuteError::dyn_boxed( + Err(ExecuteError::new( format!("column select '{:?}' is ambiguous", select_column), )) } else { @@ -554,7 +554,7 @@ impl Executor { } } None => { - return Err(ExecuteError::dyn_boxed( + return Err(ExecuteError::new( format!("column select '{:?}' not exists", select_column), )); } @@ -654,7 +654,7 @@ impl Executor { let column_name = select_column.column_name.clone(); if context.config_columns.is_empty() { - return Err(ExecuteError::dyn_boxed( + return Err(ExecuteError::new( format!("column select '{:?}' not exists", select_column), )); } @@ -679,14 +679,14 @@ impl Executor { { Ok(found.1.data_type.to_owned().into()) } else{ - Err(ExecuteError::dyn_boxed( + Err(ExecuteError::new( format!("column select '{:?}' is ambiguous", select_column), )) } } None=>{ if same_name_columns.len()>=2 { - Err(ExecuteError::dyn_boxed( + Err(ExecuteError::new( format!("column select '{:?}' is ambiguous", select_column), )) } else { diff --git a/src/server/server.rs b/src/server/server.rs index a5a4b3b2..5244c0cf 100644 --- a/src/server/server.rs +++ b/src/server/server.rs @@ -51,7 +51,7 @@ impl Server { Err(error) => { let error = error.to_string(); if let Err(_response) = request.response_sender.send(ChannelResponse { - result: Err(ExecuteError::boxed(ExecuteError::boxed(error))), + result: Err(ExecuteError::new(ExecuteError::new(error))), }) { Logger::error("channel send failed"); } @@ -65,7 +65,7 @@ impl Server { // client와의 커넥션 처리 루프 let listener = TcpListener::bind((self.option.host.to_owned(), self.option.port as u16)) .await - .map_err(|error| ExecuteError::dyn_boxed(error.to_string()))?; + .map_err(|error| ExecuteError::new(error.to_string()))?; let connection_task = tokio::spawn(async move { loop { From 96f013598216956afad33ab634e565e8f2df2602 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:45:57 +0900 Subject: [PATCH 04/19] =?UTF-8?q?[#63]=20=EB=A9=94=EC=9D=B8=20=EC=84=9C?= =?UTF-8?q?=EB=B2=84=20=EB=B0=8F=20entrypoint=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20=EC=98=A4=EB=A5=98=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/mod.rs | 13 +++++++++ src/errors/type_error.rs | 2 +- src/executor/common.rs | 6 ++--- src/executor/executor.rs | 5 ++-- src/executor/implements/ddl/alter_table.rs | 1 - .../implements/ddl/create_database.rs | 4 +-- src/executor/implements/ddl/create_table.rs | 7 ++--- src/executor/implements/ddl/drop_database.rs | 4 +-- src/executor/implements/ddl/drop_table.rs | 7 ++--- src/executor/implements/dml/delete.rs | 4 +-- src/executor/implements/dml/insert.rs | 2 +- src/executor/implements/dml/scan.rs | 2 +- src/executor/implements/dml/select.rs | 2 +- src/executor/implements/dml/update.rs | 2 +- src/executor/implements/other/desc_table.rs | 5 +--- .../implements/other/show_databases.rs | 7 ++--- src/executor/implements/other/show_tables.rs | 5 +--- src/executor/implements/other/use_database.rs | 5 +--- src/executor/reduce.rs | 4 +-- src/lexer/operator_token.rs | 4 +-- src/lexer/tokenizer.rs | 4 +-- src/lexer/tokens.rs | 6 ++--- src/main.rs | 5 ++-- src/optimizer/optimizer.rs | 15 +++-------- src/parser/implements/common.rs | 16 +++++------ src/parser/implements/ddl/database.rs | 12 +++------ src/parser/implements/ddl/table.rs | 6 ++--- src/parser/implements/ddl/top_level.rs | 6 ++--- src/parser/implements/dml/delete.rs | 2 +- src/parser/implements/dml/expression.rs | 12 ++++----- src/parser/implements/dml/insert.rs | 6 ++--- src/parser/implements/dml/select.rs | 27 +++++++------------ src/parser/implements/dml/update.rs | 2 +- .../implements/other/backslash_command.rs | 2 +- src/parser/implements/other/desc.rs | 2 +- src/parser/implements/other/show.rs | 2 +- src/parser/implements/other/use.rs | 2 +- src/parser/implements/tcl/begin.rs | 2 +- src/parser/implements/tcl/commit.rs | 2 +- src/parser/implements/tcl/rollback.rs | 2 +- src/parser/parser.rs | 8 +++--- src/server/channel.rs | 6 ++--- src/server/server.rs | 7 +++-- 43 files changed, 104 insertions(+), 141 deletions(-) diff --git a/src/errors/mod.rs b/src/errors/mod.rs index 74354ff4..58e88eca 100644 --- a/src/errors/mod.rs +++ b/src/errors/mod.rs @@ -15,3 +15,16 @@ pub enum RRDBError { ServerError(server_error::ServerError), TypeError(type_error::TypeError), } + +impl ToString for RRDBError { + fn to_string(&self) -> String { + match self { + RRDBError::ExecuteError(e) => e.to_string(), + RRDBError::IntoError(e) => e.to_string(), + RRDBError::LexingError(e) => e.to_string(), + RRDBError::ParsingError(e) => e.to_string(), + RRDBError::ServerError(e) => e.to_string(), + RRDBError::TypeError(e) => e.to_string(), + } + } +} diff --git a/src/errors/type_error.rs b/src/errors/type_error.rs index c7074240..166e5073 100644 --- a/src/errors/type_error.rs +++ b/src/errors/type_error.rs @@ -16,7 +16,7 @@ impl TypeError { Box::new(Self::new(message)) } - pub fn dyn_boxed(message: T) -> Box { + pub fn dyn_boxed(message: T) -> RRDBError { Box::new(Self::new(message)) } } diff --git a/src/executor/common.rs b/src/executor/common.rs index 6eefd254..75083729 100644 --- a/src/executor/common.rs +++ b/src/executor/common.rs @@ -6,12 +6,10 @@ use super::encoder::storage::StorageEncoder; use super::predule::Executor; use crate::ast::types::TableName; use crate::errors::execute_error::ExecuteError; +use crate::errors::RRDBError; impl Executor { - pub async fn get_table_config( - &self, - table_name: TableName, - ) -> Result> { + pub async fn get_table_config(&self, table_name: TableName) -> Result { let encoder = StorageEncoder::new(); let base_path = self.get_base_path(); diff --git a/src/executor/executor.rs b/src/executor/executor.rs index 9584f9e8..20cb93b4 100644 --- a/src/executor/executor.rs +++ b/src/executor/executor.rs @@ -3,6 +3,7 @@ use std::error::Error; use crate::ast::ddl::create_database::CreateDatabaseQuery; use crate::ast::{DDLStatement, DMLStatement, OtherStatement, SQLStatement}; use crate::errors::execute_error::ExecuteError; +use crate::errors::RRDBError; use crate::executor::predule::ExecuteResult; use crate::logger::predule::Logger; use crate::utils::path::get_target_basepath; @@ -23,7 +24,7 @@ impl Executor { } // 기본 설정파일 세팅 - pub async fn init(&self) -> Result<(), Box> { + pub async fn init(&self) -> Result<(), RRDBError> { // 루트 디렉터리 생성 (없다면) let base_path = get_target_basepath(); if let Err(error) = tokio::fs::create_dir(base_path.clone()).await { @@ -57,7 +58,7 @@ impl Executor { &self, statement: SQLStatement, _connection_id: String, - ) -> Result> { + ) -> Result { Logger::info(format!("AST echo: {:?}", statement)); // 쿼리 실행 diff --git a/src/executor/implements/ddl/alter_table.rs b/src/executor/implements/ddl/alter_table.rs index 63a8983f..44f1e186 100644 --- a/src/executor/implements/ddl/alter_table.rs +++ b/src/executor/implements/ddl/alter_table.rs @@ -1,4 +1,3 @@ -use std::error::Error; use std::io::ErrorKind; use crate::ast::ddl::alter_table::{AlterColumnAction, AlterTableAction, AlterTableQuery}; diff --git a/src/executor/implements/ddl/create_database.rs b/src/executor/implements/ddl/create_database.rs index bd315065..4edbcd70 100644 --- a/src/executor/implements/ddl/create_database.rs +++ b/src/executor/implements/ddl/create_database.rs @@ -1,8 +1,8 @@ -use std::error::Error; use std::io::ErrorKind; use crate::ast::ddl::create_database::CreateDatabaseQuery; use crate::errors::predule::ExecuteError; +use crate::errors::RRDBError; use crate::executor::config::database::DatabaseConfig; use crate::executor::encoder::storage::StorageEncoder; use crate::executor::predule::{ExecuteResult, Executor}; @@ -12,7 +12,7 @@ impl Executor { pub async fn create_database( &self, query: CreateDatabaseQuery, - ) -> Result> { + ) -> Result { let encoder = StorageEncoder::new(); let base_path = self.get_base_path(); diff --git a/src/executor/implements/ddl/create_table.rs b/src/executor/implements/ddl/create_table.rs index 0e45e15f..a716b985 100644 --- a/src/executor/implements/ddl/create_table.rs +++ b/src/executor/implements/ddl/create_table.rs @@ -1,18 +1,15 @@ -use std::error::Error; use std::io::ErrorKind; use crate::ast::ddl::create_table::CreateTableQuery; use crate::errors::predule::ExecuteError; +use crate::errors::RRDBError; use crate::executor::config::table::TableConfig; use crate::executor::encoder::storage::StorageEncoder; use crate::executor::predule::{ExecuteResult, Executor}; use crate::executor::result::{ExecuteColumn, ExecuteColumnType, ExecuteField, ExecuteRow}; impl Executor { - pub async fn create_table( - &self, - query: CreateTableQuery, - ) -> Result> { + pub async fn create_table(&self, query: CreateTableQuery) -> Result { let encoder = StorageEncoder::new(); let database_name = query.table.clone().unwrap().database_name.unwrap(); diff --git a/src/executor/implements/ddl/drop_database.rs b/src/executor/implements/ddl/drop_database.rs index ede479af..c177927d 100644 --- a/src/executor/implements/ddl/drop_database.rs +++ b/src/executor/implements/ddl/drop_database.rs @@ -1,8 +1,8 @@ -use std::error::Error; use std::io::ErrorKind; use crate::ast::ddl::drop_database::DropDatabaseQuery; use crate::errors::predule::ExecuteError; +use crate::errors::RRDBError; use crate::executor::predule::{ExecuteResult, Executor}; use crate::executor::result::{ExecuteColumn, ExecuteColumnType, ExecuteField, ExecuteRow}; @@ -10,7 +10,7 @@ impl Executor { pub async fn drop_database( &self, query: DropDatabaseQuery, - ) -> Result> { + ) -> Result { let base_path = self.get_base_path(); let mut database_path = base_path.clone(); diff --git a/src/executor/implements/ddl/drop_table.rs b/src/executor/implements/ddl/drop_table.rs index 60aae7bc..1e8ba4c4 100644 --- a/src/executor/implements/ddl/drop_table.rs +++ b/src/executor/implements/ddl/drop_table.rs @@ -1,17 +1,14 @@ -use std::error::Error; use std::io::ErrorKind; use crate::ast::ddl::drop_table::DropTableQuery; use crate::ast::types::TableName; use crate::errors::predule::ExecuteError; +use crate::errors::RRDBError; use crate::executor::predule::{ExecuteResult, Executor}; use crate::executor::result::{ExecuteColumn, ExecuteColumnType, ExecuteField, ExecuteRow}; impl Executor { - pub async fn drop_table( - &self, - query: DropTableQuery, - ) -> Result> { + pub async fn drop_table(&self, query: DropTableQuery) -> Result { let base_path = self.get_base_path(); let TableName { diff --git a/src/executor/implements/dml/delete.rs b/src/executor/implements/dml/delete.rs index 7cee7bcf..895720c6 100644 --- a/src/executor/implements/dml/delete.rs +++ b/src/executor/implements/dml/delete.rs @@ -1,5 +1,4 @@ use std::collections::HashMap; -use std::error::Error; use futures::future::join_all; @@ -8,6 +7,7 @@ use crate::ast::dml::plan::delete::delete_plan::DeletePlanItem; use crate::ast::dml::plan::select::scan::ScanType; use crate::errors::predule::ExecuteError; use crate::errors::type_error::TypeError; +use crate::errors::RRDBError; use crate::executor::config::row::TableDataFieldType; use crate::executor::predule::{ ExecuteColumn, ExecuteField, ExecuteResult, ExecuteRow, Executor, ReduceContext, @@ -16,7 +16,7 @@ use crate::executor::result::ExecuteColumnType; use crate::optimizer::predule::Optimizer; impl Executor { - pub async fn delete(&self, query: DeleteQuery) -> Result> { + pub async fn delete(&self, query: DeleteQuery) -> Result { let table = query.from_table.as_ref().unwrap().table.clone(); // 최적화 작업 diff --git a/src/executor/implements/dml/insert.rs b/src/executor/implements/dml/insert.rs index bf1536c3..719cbcf3 100644 --- a/src/executor/implements/dml/insert.rs +++ b/src/executor/implements/dml/insert.rs @@ -13,7 +13,7 @@ use crate::executor::predule::{ }; impl Executor { - pub async fn insert(&self, query: InsertQuery) -> Result> { + pub async fn insert(&self, query: InsertQuery) -> Result { let encoder = StorageEncoder::new(); let into_table = query.into_table.as_ref().unwrap(); diff --git a/src/executor/implements/dml/scan.rs b/src/executor/implements/dml/scan.rs index 4fd41b2f..c007a6e1 100644 --- a/src/executor/implements/dml/scan.rs +++ b/src/executor/implements/dml/scan.rs @@ -14,7 +14,7 @@ impl Executor { pub async fn full_scan( &self, table_name: TableName, - ) -> Result, Box> { + ) -> Result, RRDBError> { let encoder = StorageEncoder::new(); let database_name = table_name.database_name.unwrap(); diff --git a/src/executor/implements/dml/select.rs b/src/executor/implements/dml/select.rs index b5b7336c..7d26c865 100644 --- a/src/executor/implements/dml/select.rs +++ b/src/executor/implements/dml/select.rs @@ -18,7 +18,7 @@ use crate::executor::predule::{ use crate::optimizer::predule::Optimizer; impl Executor { - pub async fn select(&self, query: SelectQuery) -> Result> { + pub async fn select(&self, query: SelectQuery) -> Result { // 최적화 작업 let optimizer = Optimizer::new(); diff --git a/src/executor/implements/dml/update.rs b/src/executor/implements/dml/update.rs index 595a4668..a2b15869 100644 --- a/src/executor/implements/dml/update.rs +++ b/src/executor/implements/dml/update.rs @@ -17,7 +17,7 @@ use crate::executor::result::ExecuteColumnType; use crate::optimizer::predule::Optimizer; impl Executor { - pub async fn update(&self, query: UpdateQuery) -> Result> { + pub async fn update(&self, query: UpdateQuery) -> Result { let encoder = StorageEncoder::new(); let table = query.target_table.clone().unwrap().table; diff --git a/src/executor/implements/other/desc_table.rs b/src/executor/implements/other/desc_table.rs index ccdb6b4f..5ca69eff 100644 --- a/src/executor/implements/other/desc_table.rs +++ b/src/executor/implements/other/desc_table.rs @@ -10,10 +10,7 @@ use crate::executor::predule::{ }; impl Executor { - pub async fn desc_table( - &self, - query: DescTableQuery, - ) -> Result> { + pub async fn desc_table(&self, query: DescTableQuery) -> Result { let encoder = StorageEncoder::new(); let database_name = query.table_name.database_name.unwrap(); diff --git a/src/executor/implements/other/show_databases.rs b/src/executor/implements/other/show_databases.rs index e3b9cdb0..7b0397ee 100644 --- a/src/executor/implements/other/show_databases.rs +++ b/src/executor/implements/other/show_databases.rs @@ -15,7 +15,7 @@ impl Executor { pub async fn show_databases( &self, _query: ShowDatabasesQuery, - ) -> Result> { + ) -> Result { let encoder = StorageEncoder::new(); let base_path = self.get_base_path(); @@ -70,10 +70,7 @@ impl Executor { } } - pub async fn find_database( - &self, - database_name: String, - ) -> Result> { + pub async fn find_database(&self, database_name: String) -> Result { let result = self.show_databases(ShowDatabasesQuery {}).await?; Ok(result.rows.iter().any(|e| { diff --git a/src/executor/implements/other/show_tables.rs b/src/executor/implements/other/show_tables.rs index f21079d2..a89bbafc 100644 --- a/src/executor/implements/other/show_tables.rs +++ b/src/executor/implements/other/show_tables.rs @@ -12,10 +12,7 @@ use crate::executor::predule::{ }; impl Executor { - pub async fn show_tables( - &self, - query: ShowTablesQuery, - ) -> Result> { + pub async fn show_tables(&self, query: ShowTablesQuery) -> Result { let encoder = StorageEncoder::new(); let base_path = self.get_base_path(); diff --git a/src/executor/implements/other/use_database.rs b/src/executor/implements/other/use_database.rs index 4cb6c248..2e3a22b3 100644 --- a/src/executor/implements/other/use_database.rs +++ b/src/executor/implements/other/use_database.rs @@ -8,10 +8,7 @@ use crate::{ }; impl Executor { - pub async fn use_databases( - &self, - query: UseDatabaseQuery, - ) -> Result> { + pub async fn use_databases(&self, query: UseDatabaseQuery) -> Result { Ok(ExecuteResult { columns: (vec![ExecuteColumn { name: "desc".into(), diff --git a/src/executor/reduce.rs b/src/executor/reduce.rs index 35f09d16..09d12d10 100644 --- a/src/executor/reduce.rs +++ b/src/executor/reduce.rs @@ -27,7 +27,7 @@ impl Executor { &self, expression: SQLExpression, context: ReduceContext - ) -> Result> { + ) -> Result { match expression { SQLExpression::Integer(value) => Ok(TableDataFieldType::Integer(value)), SQLExpression::Boolean(value) => Ok(TableDataFieldType::Boolean(value)), @@ -568,7 +568,7 @@ impl Executor { &self, expression: SQLExpression, context: ReduceContext - ) -> Result> { + ) -> Result { match expression { SQLExpression::Integer(_) => Ok(ExecuteColumnType::Integer), SQLExpression::Boolean(_) => Ok(ExecuteColumnType::Bool), diff --git a/src/lexer/operator_token.rs b/src/lexer/operator_token.rs index 2344c5bf..143462d0 100644 --- a/src/lexer/operator_token.rs +++ b/src/lexer/operator_token.rs @@ -43,7 +43,7 @@ impl OperatorToken { } impl TryInto for OperatorToken { - type Error = Box; + type Error = RRDBError; fn try_into(self) -> Result { match self { @@ -63,7 +63,7 @@ impl TryInto for OperatorToken { } impl TryInto for OperatorToken { - type Error = Box; + type Error = RRDBError; fn try_into(self) -> Result { match self { diff --git a/src/lexer/tokenizer.rs b/src/lexer/tokenizer.rs index b406f219..d92769fa 100644 --- a/src/lexer/tokenizer.rs +++ b/src/lexer/tokenizer.rs @@ -94,7 +94,7 @@ impl Tokenizer { // 주어진 텍스트에서 토큰을 순서대로 획득해 반환합니다. // 끝을 만날 경우 Token::EOF를 반환합니다. - pub fn get_token(&mut self) -> Result> { + pub fn get_token(&mut self) -> Result { // 화이트 스페이스 삼킴 while self.is_whitespace() && !self.is_eof() { self.read_char(); @@ -404,7 +404,7 @@ impl Tokenizer { } // Tokenizer 생성 없이 토큰 목록을 가져올 수 있는 유틸 함수입니다. - pub fn string_to_tokens(text: String) -> Result, Box> { + pub fn string_to_tokens(text: String) -> Result, RRDBError> { let mut tokenizer = Tokenizer::new(text); let mut tokens = vec![]; diff --git a/src/lexer/tokens.rs b/src/lexer/tokens.rs index 83b03636..2d96c461 100644 --- a/src/lexer/tokens.rs +++ b/src/lexer/tokens.rs @@ -138,7 +138,7 @@ impl Token { pub fn try_into_multi_token_operator( self, second_token: Self, - ) -> Result> { + ) -> Result { match self { Token::Not => match second_token { Token::Like => Ok(BinaryOperator::NotLike), @@ -170,9 +170,9 @@ impl Token { } impl TryInto for Token { - type Error = Box; + type Error = RRDBError; - fn try_into(self) -> Result> { + fn try_into(self) -> Result { match self { Token::Operator(operator) => operator.try_into(), Token::And => Ok(BinaryOperator::And), diff --git a/src/main.rs b/src/main.rs index f502172e..1e514a9d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,3 @@ -use std::error::Error; - pub mod ast; pub mod command; pub mod constants; @@ -14,13 +12,14 @@ pub mod server; pub mod utils; use command::{Command, SubCommand}; +use errors::RRDBError; use executor::predule::Executor; use server::predule::{Server, ServerOption}; use clap::Parser; #[tokio::main] -async fn main() -> Result<(), Box> { +async fn main() -> Result<(), RRDBError> { let args = Command::parse(); match args.action { diff --git a/src/optimizer/optimizer.rs b/src/optimizer/optimizer.rs index d885b925..51016822 100644 --- a/src/optimizer/optimizer.rs +++ b/src/optimizer/optimizer.rs @@ -25,10 +25,7 @@ impl Optimizer { Self {} } - pub async fn optimize_select( - &self, - query: SelectQuery, - ) -> Result> { + pub async fn optimize_select(&self, query: SelectQuery) -> Result { let mut has_from = false; let mut plan = SelectPlan { list: vec![] }; @@ -100,10 +97,7 @@ impl Optimizer { Ok(plan) } - pub async fn optimize_update( - &self, - query: UpdateQuery, - ) -> Result> { + pub async fn optimize_update(&self, query: UpdateQuery) -> Result { let mut plan = UpdatePlan { list: vec![] }; let target_table = query.target_table.clone().unwrap(); @@ -129,10 +123,7 @@ impl Optimizer { Ok(plan) } - pub async fn optimize_delete( - &self, - query: DeleteQuery, - ) -> Result> { + pub async fn optimize_delete(&self, query: DeleteQuery) -> Result { let mut plan = DeletePlan { list: vec![] }; let target_table = query.from_table.clone().unwrap(); diff --git a/src/parser/implements/common.rs b/src/parser/implements/common.rs index 263b4b2a..3b9983be 100644 --- a/src/parser/implements/common.rs +++ b/src/parser/implements/common.rs @@ -9,7 +9,7 @@ use crate::parser::predule::{Parser, ParserContext}; impl Parser { // 테이블 컬럼 정의 분석 - pub(crate) fn parse_table_column(&mut self) -> Result> { + pub(crate) fn parse_table_column(&mut self) -> Result { let mut builder = Column::builder(); if !self.has_next_token() { @@ -115,7 +115,7 @@ impl Parser { } // 데이터 타입 분석 - pub(crate) fn parse_data_type(&mut self) -> Result> { + pub(crate) fn parse_data_type(&mut self) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0006 need more tokens")); } @@ -189,7 +189,7 @@ impl Parser { pub(crate) fn parse_table_name( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { // 테이블명 획득 로직 if !self.has_next_token() { return Err(ParsingError::boxed("E0010 need more tokens")); @@ -245,7 +245,7 @@ impl Parser { } // IF NOT EXISTS 체크 로직 - pub(crate) fn has_if_not_exists(&mut self) -> Result> { + pub(crate) fn has_if_not_exists(&mut self) -> Result { // 테이블명 획득 로직 if !self.has_next_token() { return Err(ParsingError::boxed("E0013 need more tokens")); @@ -288,7 +288,7 @@ impl Parser { } // IF EXISTS 체크 로직 - pub(crate) fn has_if_exists(&mut self) -> Result> { + pub(crate) fn has_if_exists(&mut self) -> Result { // 테이블명 획득 로직 if !self.has_next_token() { return Err(ParsingError::boxed("E0016 need more tokens")); @@ -318,7 +318,7 @@ impl Parser { } // SELECT 컬럼 정의 분석 - pub(crate) fn parse_select_column(&mut self) -> Result> { + pub(crate) fn parse_select_column(&mut self) -> Result { let mut select_column = SelectColumn::new(None, "".to_string()); if !self.has_next_token() { @@ -953,7 +953,7 @@ impl Parser { } // Table Alias 획득 - pub(crate) fn parse_table_alias(&mut self) -> Result> { + pub(crate) fn parse_table_alias(&mut self) -> Result { // 테이블명 획득 로직 if !self.has_next_token() { return Err(ParsingError::boxed("E0024 need more tokens")); @@ -989,7 +989,7 @@ impl Parser { pub(crate) fn parse_subquery( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0019 need more tokens")); } diff --git a/src/parser/implements/ddl/database.rs b/src/parser/implements/ddl/database.rs index 5f91d369..566d5e63 100644 --- a/src/parser/implements/ddl/database.rs +++ b/src/parser/implements/ddl/database.rs @@ -10,9 +10,7 @@ use std::error::Error; impl Parser { // CREATE DATABASE 쿼리 분석 - pub(crate) fn handle_create_database_query( - &mut self, - ) -> Result> { + pub(crate) fn handle_create_database_query(&mut self) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0101 need more tokens")); } @@ -57,9 +55,7 @@ impl Parser { } // DROP DATABASE 쿼리 분석 - pub(crate) fn handle_drop_database_query( - &mut self, - ) -> Result> { + pub(crate) fn handle_drop_database_query(&mut self) -> Result { let mut query_builder = DropDatabaseQuery::builder(); // IF EXISTS 파싱 @@ -102,9 +98,7 @@ impl Parser { } // ALTER DATABASE 쿼리 분석 - pub(crate) fn handle_alter_database_query( - &mut self, - ) -> Result> { + pub(crate) fn handle_alter_database_query(&mut self) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0105 need more tokens")); } diff --git a/src/parser/implements/ddl/table.rs b/src/parser/implements/ddl/table.rs index ddcea0fd..b06d7c75 100644 --- a/src/parser/implements/ddl/table.rs +++ b/src/parser/implements/ddl/table.rs @@ -17,7 +17,7 @@ impl Parser { pub(crate) fn handle_create_table_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E1205 need more tokens")); } @@ -101,7 +101,7 @@ impl Parser { pub(crate) fn handle_alter_table_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E1201 need more tokens")); } @@ -422,7 +422,7 @@ impl Parser { pub(crate) fn handle_drop_table_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { let mut query_builder = DropTableQuery::builder(); // IF EXISTS 파싱 diff --git a/src/parser/implements/ddl/top_level.rs b/src/parser/implements/ddl/top_level.rs index 27e42dfa..e7798dc6 100644 --- a/src/parser/implements/ddl/top_level.rs +++ b/src/parser/implements/ddl/top_level.rs @@ -11,7 +11,7 @@ impl Parser { pub(crate) fn handle_create_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E1101 need more tokens")); } @@ -32,7 +32,7 @@ impl Parser { pub(crate) fn handle_alter_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E1103 need more tokens")); } @@ -51,7 +51,7 @@ impl Parser { pub(crate) fn handle_drop_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E1105 need more tokens")); } diff --git a/src/parser/implements/dml/delete.rs b/src/parser/implements/dml/delete.rs index 02d99126..93bfe9e6 100644 --- a/src/parser/implements/dml/delete.rs +++ b/src/parser/implements/dml/delete.rs @@ -10,7 +10,7 @@ impl Parser { pub(crate) fn handle_delete_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0501 need more tokens")); } diff --git a/src/parser/implements/dml/expression.rs b/src/parser/implements/dml/expression.rs index 9797bc71..c5c329d1 100644 --- a/src/parser/implements/dml/expression.rs +++ b/src/parser/implements/dml/expression.rs @@ -18,7 +18,7 @@ impl Parser { pub(crate) fn parse_expression( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0201 need more tokens")); } @@ -203,7 +203,7 @@ impl Parser { &mut self, operator: UnaryOperator, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0201 need more tokens")); } @@ -246,7 +246,7 @@ impl Parser { pub(crate) fn parse_parentheses_expression( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { let context = context.set_in_parentheses(true); if !self.has_next_token() { @@ -325,7 +325,7 @@ impl Parser { &mut self, lhs: SQLExpression, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0206 need more tokens")); } @@ -411,7 +411,7 @@ impl Parser { database_name: Option, function_name: String, context: ParserContext, - ) -> Result> { + ) -> Result { let function = if database_name.is_some() { UserDefinedFunction { database_name, @@ -493,7 +493,7 @@ impl Parser { &mut self, a: SQLExpression, context: ParserContext, - ) -> Result> { + ) -> Result { let context = context.set_in_between_clause(true); if !self.has_next_token() { diff --git a/src/parser/implements/dml/insert.rs b/src/parser/implements/dml/insert.rs index d08e1a85..fbb72439 100644 --- a/src/parser/implements/dml/insert.rs +++ b/src/parser/implements/dml/insert.rs @@ -10,7 +10,7 @@ impl Parser { pub(crate) fn handle_insert_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { let mut query_builder = InsertQuery::builder(); if !self.has_next_token() { @@ -107,7 +107,7 @@ impl Parser { pub(crate) fn parse_insert_columns( &mut self, _context: ParserContext, - ) -> Result, Box> { + ) -> Result, RRDBError> { let mut names = vec![]; loop { if !self.has_next_token() { @@ -155,7 +155,7 @@ impl Parser { pub(crate) fn parse_insert_values( &mut self, context: ParserContext, - ) -> Result, Box> { + ) -> Result, RRDBError> { // Values 파싱 let mut values: Vec = vec![]; diff --git a/src/parser/implements/dml/select.rs b/src/parser/implements/dml/select.rs index fbcb0531..52f57143 100644 --- a/src/parser/implements/dml/select.rs +++ b/src/parser/implements/dml/select.rs @@ -16,7 +16,7 @@ impl Parser { pub(crate) fn handle_select_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0301: need more tokens")); } @@ -265,7 +265,7 @@ impl Parser { pub(crate) fn parse_select_item( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0305 need more tokens")); } @@ -322,7 +322,7 @@ impl Parser { pub(crate) fn parse_order_by_item( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0313 need more tokens")); } @@ -393,7 +393,7 @@ impl Parser { pub(crate) fn parse_group_by_item( &mut self, _context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0314 need more tokens")); } @@ -410,7 +410,7 @@ impl Parser { &mut self, join_type: JoinType, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0310 need more tokens")); } @@ -447,10 +447,7 @@ impl Parser { Ok(join) } - pub(crate) fn parse_where( - &mut self, - context: ParserContext, - ) -> Result> { + pub(crate) fn parse_where(&mut self, context: ParserContext) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0311 need more tokens")); } @@ -472,7 +469,7 @@ impl Parser { pub(crate) fn parse_having( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0316 need more tokens")); } @@ -493,10 +490,7 @@ impl Parser { }) } - pub(crate) fn parse_offset( - &mut self, - _context: ParserContext, - ) -> Result> { + pub(crate) fn parse_offset(&mut self, _context: ParserContext) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0320 need more tokens")); } @@ -535,10 +529,7 @@ impl Parser { } } - pub(crate) fn parse_limit( - &mut self, - _context: ParserContext, - ) -> Result> { + pub(crate) fn parse_limit(&mut self, _context: ParserContext) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0325 need more tokens")); } diff --git a/src/parser/implements/dml/update.rs b/src/parser/implements/dml/update.rs index ea09e970..a8c1be02 100644 --- a/src/parser/implements/dml/update.rs +++ b/src/parser/implements/dml/update.rs @@ -11,7 +11,7 @@ impl Parser { pub(crate) fn handle_update_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0601: need more tokens")); } diff --git a/src/parser/implements/other/backslash_command.rs b/src/parser/implements/other/backslash_command.rs index 9361b13f..0bb66fdc 100644 --- a/src/parser/implements/other/backslash_command.rs +++ b/src/parser/implements/other/backslash_command.rs @@ -10,7 +10,7 @@ impl Parser { pub(crate) fn parse_backslash_query( &mut self, _context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0801 need more tokens")); } diff --git a/src/parser/implements/other/desc.rs b/src/parser/implements/other/desc.rs index cc4bda97..53cc6432 100644 --- a/src/parser/implements/other/desc.rs +++ b/src/parser/implements/other/desc.rs @@ -9,7 +9,7 @@ impl Parser { pub(crate) fn parse_desc_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E1001 need more tokens")); } diff --git a/src/parser/implements/other/show.rs b/src/parser/implements/other/show.rs index 783d0021..39b20349 100644 --- a/src/parser/implements/other/show.rs +++ b/src/parser/implements/other/show.rs @@ -11,7 +11,7 @@ impl Parser { pub(crate) fn parse_show_query( &mut self, context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0701 need more tokens")); } diff --git a/src/parser/implements/other/use.rs b/src/parser/implements/other/use.rs index d3ac4eac..df5f442a 100644 --- a/src/parser/implements/other/use.rs +++ b/src/parser/implements/other/use.rs @@ -10,7 +10,7 @@ impl Parser { pub(crate) fn parse_use_query( &mut self, _context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E0901 need more tokens")); } diff --git a/src/parser/implements/tcl/begin.rs b/src/parser/implements/tcl/begin.rs index 0914a852..3621581f 100644 --- a/src/parser/implements/tcl/begin.rs +++ b/src/parser/implements/tcl/begin.rs @@ -10,7 +10,7 @@ impl Parser { pub(crate) fn parse_begin_query( &mut self, _context: ParserContext, - ) -> Result> { + ) -> Result { if !self.has_next_token() { return Err(ParsingError::boxed("E2001 need more tokens")); } diff --git a/src/parser/implements/tcl/commit.rs b/src/parser/implements/tcl/commit.rs index e821578d..3616dd88 100644 --- a/src/parser/implements/tcl/commit.rs +++ b/src/parser/implements/tcl/commit.rs @@ -8,7 +8,7 @@ impl Parser { pub(crate) fn parse_commit_query( &mut self, _context: ParserContext, - ) -> Result> { + ) -> Result { Ok(CommitQuery {}.into()) } } diff --git a/src/parser/implements/tcl/rollback.rs b/src/parser/implements/tcl/rollback.rs index dcec139a..49f6f5df 100644 --- a/src/parser/implements/tcl/rollback.rs +++ b/src/parser/implements/tcl/rollback.rs @@ -8,7 +8,7 @@ impl Parser { pub(crate) fn parse_rollback_query( &mut self, _context: ParserContext, - ) -> Result> { + ) -> Result { Ok(RollbackQuery {}.into()) } } diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 116fbbb2..f1731b0b 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -1,6 +1,7 @@ use std::{collections::VecDeque, error::Error}; use crate::ast::SQLStatement; +use crate::errors::RRDBError; use crate::lexer::predule::{Token, Tokenizer}; use crate::parser::predule::ParserContext; @@ -12,7 +13,7 @@ pub struct Parser { impl Parser { // 파서 객체 생성 - pub fn new(text: String) -> Result> { + pub fn new(text: String) -> Result { Ok(Self { current_token: Token::EOF, tokens: VecDeque::from(Tokenizer::string_to_tokens(text)?), @@ -27,10 +28,7 @@ impl Parser { } } - pub fn parse( - &mut self, - context: ParserContext, - ) -> Result, Box> { + pub fn parse(&mut self, context: ParserContext) -> Result, RRDBError> { let mut statements: Vec = vec![]; // Top-Level Parser Loop diff --git a/src/server/channel.rs b/src/server/channel.rs index b21ee27c..30e38ab5 100644 --- a/src/server/channel.rs +++ b/src/server/channel.rs @@ -1,8 +1,6 @@ -use std::error::Error; - use tokio::sync::oneshot::Sender; -use crate::{ast::SQLStatement, executor::result::ExecuteResult}; +use crate::{ast::SQLStatement, errors::RRDBError, executor::result::ExecuteResult}; #[derive(Debug)] pub struct ChannelRequest { @@ -13,5 +11,5 @@ pub struct ChannelRequest { #[derive(Debug)] pub struct ChannelResponse { - pub result: Result>, + pub result: Result, } diff --git a/src/server/server.rs b/src/server/server.rs index 5244c0cf..b8c154eb 100644 --- a/src/server/server.rs +++ b/src/server/server.rs @@ -1,6 +1,5 @@ -use std::error::Error; - use crate::errors::execute_error::ExecuteError; +use crate::errors::RRDBError; use crate::executor::predule::Executor; use crate::logger::predule::Logger; use crate::pgwire::predule::Connection; @@ -24,7 +23,7 @@ impl Server { /// 메인 서버 루프. /// 여러개의 태스크 제어 - pub async fn run(&self) -> Result<(), Box> { + pub async fn run(&self) -> Result<(), RRDBError> { // TODO: 인덱스 로딩 등 기본 로직 실행. let (request_sender, mut request_receiver) = mpsc::channel::(1000); @@ -51,7 +50,7 @@ impl Server { Err(error) => { let error = error.to_string(); if let Err(_response) = request.response_sender.send(ChannelResponse { - result: Err(ExecuteError::new(ExecuteError::new(error))), + result: Err(ExecuteError::new(error)), }) { Logger::error("channel send failed"); } From f2733ca8296f325ce367280f065a99ef08cf5423 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:46:39 +0900 Subject: [PATCH 05/19] =?UTF-8?q?[#63]=20optimizer=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20=EC=98=A4=EB=A5=98=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/optimizer/optimizer.rs | 33 +++++++++++++++++---------------- src/parser/parser.rs | 2 +- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/optimizer/optimizer.rs b/src/optimizer/optimizer.rs index 51016822..1ff30a05 100644 --- a/src/optimizer/optimizer.rs +++ b/src/optimizer/optimizer.rs @@ -1,21 +1,22 @@ -use std::error::Error; - -use crate::ast::dml::{ - delete::DeleteQuery, - parts::from::FromTarget, - plan::{ - delete::{delete_plan::DeletePlan, from::DeleteFromPlan}, - select::{ - filter::FilterPlan, - from::SelectFromPlan, - limit_offset::LimitOffsetPlan, - scan::ScanType, - select_plan::{SelectPlan, SelectPlanItem}, +use crate::{ + ast::dml::{ + delete::DeleteQuery, + parts::from::FromTarget, + plan::{ + delete::{delete_plan::DeletePlan, from::DeleteFromPlan}, + select::{ + filter::FilterPlan, + from::SelectFromPlan, + limit_offset::LimitOffsetPlan, + scan::ScanType, + select_plan::{SelectPlan, SelectPlanItem}, + }, + update::{from::UpdateFromPlan, update_plan::UpdatePlan}, }, - update::{from::UpdateFromPlan, update_plan::UpdatePlan}, + select::SelectQuery, + update::UpdateQuery, }, - select::SelectQuery, - update::UpdateQuery, + errors::RRDBError, }; pub struct Optimizer {} diff --git a/src/parser/parser.rs b/src/parser/parser.rs index f1731b0b..8e22e9c3 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -1,4 +1,4 @@ -use std::{collections::VecDeque, error::Error}; +use std::collections::VecDeque; use crate::ast::SQLStatement; use crate::errors::RRDBError; From 5220fe78729c677d2c6d11c18b70fdc5a54b0bd4 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:48:07 +0900 Subject: [PATCH 06/19] =?UTF-8?q?[#63]=20TypeError=20=EC=9E=AC=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/execute_error.rs | 2 -- src/errors/type_error.rs | 16 ++++------------ src/executor/common.rs | 1 - src/executor/executor.rs | 2 -- src/executor/implements/dml/insert.rs | 2 +- src/executor/reduce.rs | 2 +- 6 files changed, 6 insertions(+), 19 deletions(-) diff --git a/src/errors/execute_error.rs b/src/errors/execute_error.rs index 36019354..e9753fe3 100644 --- a/src/errors/execute_error.rs +++ b/src/errors/execute_error.rs @@ -1,5 +1,3 @@ -use std::error::Error; - use super::RRDBError; #[derive(Clone, Debug, PartialEq, Eq)] diff --git a/src/errors/type_error.rs b/src/errors/type_error.rs index 166e5073..6dc9e155 100644 --- a/src/errors/type_error.rs +++ b/src/errors/type_error.rs @@ -1,4 +1,4 @@ -use std::error::Error; +use super::RRDBError; #[derive(Clone, Debug, PartialEq, Eq)] pub struct TypeError { @@ -6,18 +6,10 @@ pub struct TypeError { } impl TypeError { - pub fn new(message: T) -> Self { - Self { + pub fn new(message: T) -> RRDBError { + RRDBError::TypeError(Self { message: message.to_string(), - } - } - - pub fn boxed(message: T) -> Box { - Box::new(Self::new(message)) - } - - pub fn dyn_boxed(message: T) -> RRDBError { - Box::new(Self::new(message)) + }) } } diff --git a/src/executor/common.rs b/src/executor/common.rs index 75083729..2eafd4c7 100644 --- a/src/executor/common.rs +++ b/src/executor/common.rs @@ -1,4 +1,3 @@ -use std::error::Error; use std::io::ErrorKind; use super::config::table::TableConfig; diff --git a/src/executor/executor.rs b/src/executor/executor.rs index 20cb93b4..f791a066 100644 --- a/src/executor/executor.rs +++ b/src/executor/executor.rs @@ -1,5 +1,3 @@ -use std::error::Error; - use crate::ast::ddl::create_database::CreateDatabaseQuery; use crate::ast::{DDLStatement, DMLStatement, OtherStatement, SQLStatement}; use crate::errors::execute_error::ExecuteError; diff --git a/src/executor/implements/dml/insert.rs b/src/executor/implements/dml/insert.rs index 719cbcf3..72ef8ea4 100644 --- a/src/executor/implements/dml/insert.rs +++ b/src/executor/implements/dml/insert.rs @@ -1,10 +1,10 @@ use std::collections::HashSet; -use std::error::Error; use std::io::ErrorKind; use crate::ast::dml::insert::{InsertData, InsertQuery}; use crate::ast::types::SQLExpression; use crate::errors::predule::ExecuteError; +use crate::errors::RRDBError; use crate::executor::config::row::{TableDataField, TableDataRow}; use crate::executor::config::table::TableConfig; use crate::executor::encoder::storage::StorageEncoder; diff --git a/src/executor/reduce.rs b/src/executor/reduce.rs index 09d12d10..163c157f 100644 --- a/src/executor/reduce.rs +++ b/src/executor/reduce.rs @@ -1,7 +1,6 @@ use std::collections::HashMap; -use std::error::Error; use futures::future::join_all; use itertools::Itertools; @@ -10,6 +9,7 @@ use crate::ast::dml::expressions::binary::BinaryOperatorExpression; use crate::ast::dml::expressions::operators::{BinaryOperator, UnaryOperator}; use crate::ast::types::{ AggregateFunction, BuiltInFunction, Column, Function, SQLExpression, TableName}; use crate::errors::predule::{TypeError, ExecuteError}; +use crate::errors::RRDBError; use crate::executor::predule::{ Executor, ExecuteColumnType}; use super::config::row::{TableDataFieldType, TableDataRow}; From e25e807f7ef43d207d4c99f41c58d5a0d2dad659 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:48:51 +0900 Subject: [PATCH 07/19] =?UTF-8?q?[#63]=20TypeError=20=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=EC=9E=AC=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/executor/implements/dml/delete.rs | 2 +- src/executor/implements/dml/select.rs | 2 +- src/executor/implements/dml/update.rs | 2 +- src/executor/reduce.rs | 30 +++++++++++++-------------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/executor/implements/dml/delete.rs b/src/executor/implements/dml/delete.rs index 895720c6..b5dc345f 100644 --- a/src/executor/implements/dml/delete.rs +++ b/src/executor/implements/dml/delete.rs @@ -76,7 +76,7 @@ impl Executor { match condition { TableDataFieldType::Boolean(boolean) => Ok((path, row, boolean)), TableDataFieldType::Null => Ok((path, row, false)), - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "condition expression is valid only for boolean and null types", )), } diff --git a/src/executor/implements/dml/select.rs b/src/executor/implements/dml/select.rs index 7d26c865..aa6432e9 100644 --- a/src/executor/implements/dml/select.rs +++ b/src/executor/implements/dml/select.rs @@ -82,7 +82,7 @@ impl Executor { match condition { TableDataFieldType::Boolean(boolean) => Ok((e, boolean)), TableDataFieldType::Null => Ok((e, false)), - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "condition expression is valid only for boolean and null types", )), } diff --git a/src/executor/implements/dml/update.rs b/src/executor/implements/dml/update.rs index a2b15869..3e91d290 100644 --- a/src/executor/implements/dml/update.rs +++ b/src/executor/implements/dml/update.rs @@ -79,7 +79,7 @@ impl Executor { match condition { TableDataFieldType::Boolean(boolean) => Ok((path, row, boolean)), TableDataFieldType::Null => Ok((path, row, false)), - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "condition expression is valid only for boolean and null types", )), } diff --git a/src/executor/reduce.rs b/src/executor/reduce.rs index 163c157f..64542acc 100644 --- a/src/executor/reduce.rs +++ b/src/executor/reduce.rs @@ -64,14 +64,14 @@ impl Executor { TableDataFieldType::Float(value) => { *e = TableDataFieldType::Float(-*value); } - _ => return Err(TypeError::dyn_boxed( + _ => return Err(TypeError::new( "unary '!' operator is valid only for integer and float types.", )), } } Ok(TableDataFieldType::Array(array)) } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "unary '-' operator is valid only for integer and float types.", )), } @@ -82,7 +82,7 @@ impl Executor { match operand { TableDataFieldType::Integer(_) => Ok(operand), TableDataFieldType::Float(_) => Ok(operand), - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "unary '+' operator is valid only for integer and float types.", )), } @@ -94,7 +94,7 @@ impl Executor { TableDataFieldType::Boolean(value) => { Ok(TableDataFieldType::Boolean(!value)) } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "unary '!' operator is valid only for integer and float types.", )), } @@ -105,7 +105,7 @@ impl Executor { let rhs = Box::pin(self.reduce_expression(binary.rhs.clone(), context.clone())).await?; if lhs.type_code() != rhs.type_code() { - return Err(TypeError::dyn_boxed( + return Err(TypeError::new( "The types of lhs and rhs do not match.", )); } @@ -190,7 +190,7 @@ impl Executor { } unreachable!() } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "binary '-' operator is valid only for integer and float and string types.", )), }, @@ -207,7 +207,7 @@ impl Executor { } unreachable!() } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "binary '-' operator is valid only for integer and float types.", )), }, @@ -224,7 +224,7 @@ impl Executor { } unreachable!() } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "binary '*' operator is valid only for integer and float types.", )), }, @@ -241,7 +241,7 @@ impl Executor { } unreachable!() } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "binary '/' operator is valid only for integer and float types.", )), }, @@ -252,7 +252,7 @@ impl Executor { } unreachable!() } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "binary 'And' operator is valid only for boolean type.", )), }, @@ -263,7 +263,7 @@ impl Executor { } unreachable!() } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "binary 'Or' operator is valid only for boolean type.", )), }, @@ -286,7 +286,7 @@ impl Executor { } unreachable!() } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "binary '<' operator is valid only for integer and float and string types.", )), }, @@ -309,7 +309,7 @@ impl Executor { } unreachable!() } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "binary '>' operator is valid only for integer and float and string types.", )), }, @@ -332,7 +332,7 @@ impl Executor { } unreachable!() } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "binary '<=' operator is valid only for integer and float and string types.", )), }, @@ -355,7 +355,7 @@ impl Executor { } unreachable!() } - _ => Err(TypeError::dyn_boxed( + _ => Err(TypeError::new( "binary '>=' operator is valid only for integer and float and string types.", )), }, From a62061fa8a5803a2482415c42f16e10212f6e52f Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:49:58 +0900 Subject: [PATCH 08/19] =?UTF-8?q?[#63]=20Executor=EC=97=90=20=EB=82=A8?= =?UTF-8?q?=EC=9D=80=20=EA=B8=B0=EC=A1=B4=20=EC=98=A4=EB=A5=98=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/executor/implements/dml/scan.rs | 2 +- src/executor/implements/dml/select.rs | 2 +- src/executor/implements/dml/update.rs | 2 +- src/executor/implements/other/desc_table.rs | 2 +- src/executor/implements/other/show_databases.rs | 2 +- src/executor/implements/other/show_tables.rs | 2 +- src/executor/implements/other/use_database.rs | 3 +-- 7 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/executor/implements/dml/scan.rs b/src/executor/implements/dml/scan.rs index c007a6e1..1f0ef487 100644 --- a/src/executor/implements/dml/scan.rs +++ b/src/executor/implements/dml/scan.rs @@ -1,4 +1,3 @@ -use std::error::Error; use std::io::ErrorKind; use std::path::PathBuf; @@ -6,6 +5,7 @@ use futures::future::join_all; use crate::ast::types::TableName; use crate::errors::predule::ExecuteError; +use crate::errors::RRDBError; use crate::executor::config::row::TableDataRow; use crate::executor::encoder::storage::StorageEncoder; use crate::executor::predule::Executor; diff --git a/src/executor/implements/dml/select.rs b/src/executor/implements/dml/select.rs index aa6432e9..f8b1ec55 100644 --- a/src/executor/implements/dml/select.rs +++ b/src/executor/implements/dml/select.rs @@ -1,6 +1,5 @@ use std::cmp::Ordering; use std::collections::HashMap; -use std::error::Error; use futures::future::join_all; @@ -11,6 +10,7 @@ use crate::ast::dml::plan::select::select_plan::SelectPlanItem; use crate::ast::dml::select::SelectQuery; use crate::ast::types::{SQLExpression, SelectColumn}; use crate::errors::type_error::TypeError; +use crate::errors::RRDBError; use crate::executor::config::row::{TableDataField, TableDataFieldType, TableDataRow}; use crate::executor::predule::{ ExecuteColumn, ExecuteField, ExecuteResult, ExecuteRow, Executor, ReduceContext, diff --git a/src/executor/implements/dml/update.rs b/src/executor/implements/dml/update.rs index 3e91d290..24104aeb 100644 --- a/src/executor/implements/dml/update.rs +++ b/src/executor/implements/dml/update.rs @@ -1,5 +1,4 @@ use std::collections::HashMap; -use std::error::Error; use futures::future::join_all; @@ -8,6 +7,7 @@ use crate::ast::dml::plan::update::update_plan::UpdatePlanItem; use crate::ast::dml::update::UpdateQuery; use crate::errors::predule::ExecuteError; use crate::errors::type_error::TypeError; +use crate::errors::RRDBError; use crate::executor::config::row::TableDataFieldType; use crate::executor::encoder::storage::StorageEncoder; use crate::executor::predule::{ diff --git a/src/executor/implements/other/desc_table.rs b/src/executor/implements/other/desc_table.rs index 5ca69eff..f74893b3 100644 --- a/src/executor/implements/other/desc_table.rs +++ b/src/executor/implements/other/desc_table.rs @@ -1,8 +1,8 @@ -use std::error::Error; use std::io::ErrorKind; use crate::ast::other::desc_table::DescTableQuery; use crate::errors::predule::ExecuteError; +use crate::errors::RRDBError; use crate::executor::config::table::TableConfig; use crate::executor::encoder::storage::StorageEncoder; use crate::executor::predule::{ diff --git a/src/executor/implements/other/show_databases.rs b/src/executor/implements/other/show_databases.rs index 7b0397ee..ca4a253a 100644 --- a/src/executor/implements/other/show_databases.rs +++ b/src/executor/implements/other/show_databases.rs @@ -1,10 +1,10 @@ -use std::error::Error; use std::io::ErrorKind; use futures::future::join_all; use crate::ast::other::show_databases::ShowDatabasesQuery; use crate::errors::predule::ExecuteError; +use crate::errors::RRDBError; use crate::executor::config::database::DatabaseConfig; use crate::executor::encoder::storage::StorageEncoder; use crate::executor::predule::{ diff --git a/src/executor/implements/other/show_tables.rs b/src/executor/implements/other/show_tables.rs index a89bbafc..c37f1148 100644 --- a/src/executor/implements/other/show_tables.rs +++ b/src/executor/implements/other/show_tables.rs @@ -1,10 +1,10 @@ -use std::error::Error; use std::io::ErrorKind; use futures::future::join_all; use crate::ast::other::show_tables::ShowTablesQuery; use crate::errors::predule::ExecuteError; +use crate::errors::RRDBError; use crate::executor::config::table::TableConfig; use crate::executor::encoder::storage::StorageEncoder; use crate::executor::predule::{ diff --git a/src/executor/implements/other/use_database.rs b/src/executor/implements/other/use_database.rs index 2e3a22b3..2e70c99c 100644 --- a/src/executor/implements/other/use_database.rs +++ b/src/executor/implements/other/use_database.rs @@ -1,7 +1,6 @@ -use std::error::Error; - use crate::{ ast::other::use_database::UseDatabaseQuery, + errors::RRDBError, executor::predule::{ ExecuteColumn, ExecuteColumnType, ExecuteField, ExecuteResult, ExecuteRow, Executor, }, From aa7c65d18be055782451ba1bd3fd1ca4b4f119f1 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:51:03 +0900 Subject: [PATCH 09/19] =?UTF-8?q?[#63]=20IntoError=20=EC=9E=AC=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/into_error.rs | 12 +++++------- src/lexer/operator_token.rs | 8 +++----- src/lexer/tokens.rs | 6 +++--- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/errors/into_error.rs b/src/errors/into_error.rs index 840492cf..92788fc8 100644 --- a/src/errors/into_error.rs +++ b/src/errors/into_error.rs @@ -1,17 +1,15 @@ +use super::RRDBError; + #[derive(Clone, Debug, PartialEq, Eq)] pub struct IntoError { pub message: String, } impl IntoError { - pub fn new(message: T) -> Self { - Self { + pub fn new(message: T) -> RRDBError { + RRDBError::IntoError(Self { message: message.to_string(), - } - } - - pub fn boxed(message: T) -> Box { - Box::new(Self::new(message)) + }) } } diff --git a/src/lexer/operator_token.rs b/src/lexer/operator_token.rs index 143462d0..ad76a8f4 100644 --- a/src/lexer/operator_token.rs +++ b/src/lexer/operator_token.rs @@ -1,8 +1,6 @@ -use std::error::Error; - use crate::{ ast::dml::expressions::operators::{BinaryOperator, UnaryOperator}, - errors::predule::IntoError, + errors::{predule::IntoError, RRDBError}, }; #[derive(Clone, Debug, PartialEq, Eq)] @@ -57,7 +55,7 @@ impl TryInto for OperatorToken { Self::Gte => Ok(BinaryOperator::Gte), Self::Eq => Ok(BinaryOperator::Eq), Self::Neq => Ok(BinaryOperator::Neq), - _ => Err(IntoError::boxed("BinaryOperator Cast Error")), + _ => Err(IntoError::new("BinaryOperator Cast Error")), } } } @@ -70,7 +68,7 @@ impl TryInto for OperatorToken { Self::Plus => Ok(UnaryOperator::Pos), Self::Minus => Ok(UnaryOperator::Neg), Self::Not => Ok(UnaryOperator::Not), - _ => Err(IntoError::boxed("UnaryOperator Cast Error")), + _ => Err(IntoError::new("UnaryOperator Cast Error")), } } } diff --git a/src/lexer/tokens.rs b/src/lexer/tokens.rs index 2d96c461..23ef82b8 100644 --- a/src/lexer/tokens.rs +++ b/src/lexer/tokens.rs @@ -143,13 +143,13 @@ impl Token { Token::Not => match second_token { Token::Like => Ok(BinaryOperator::NotLike), Token::In => Ok(BinaryOperator::NotIn), - _ => Err(IntoError::boxed("BinaryOperator Cast Error")), + _ => Err(IntoError::new("BinaryOperator Cast Error")), }, Token::Is => match second_token { Token::Not => Ok(BinaryOperator::IsNot), _ => Ok(BinaryOperator::Is), }, - _ => Err(IntoError::boxed("BinaryOperator Cast Error")), + _ => Err(IntoError::new("BinaryOperator Cast Error")), } } @@ -180,7 +180,7 @@ impl TryInto for Token { Token::Like => Ok(BinaryOperator::Like), Token::In => Ok(BinaryOperator::In), Token::Is => Ok(BinaryOperator::Is), - _ => Err(IntoError::boxed("BinaryOperator Cast Error")), + _ => Err(IntoError::new("BinaryOperator Cast Error")), } } } From d04bade1e516f7604f586cc3ca4d64ea05ea1c7f Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:52:05 +0900 Subject: [PATCH 10/19] =?UTF-8?q?[#63]=20LexingError=20=EC=9E=AC=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/lexing_error.rs | 12 +++++------- src/lexer/tokenizer.rs | 10 +++++----- src/lexer/tokens.rs | 3 +-- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/errors/lexing_error.rs b/src/errors/lexing_error.rs index af4034b3..8cfdb779 100644 --- a/src/errors/lexing_error.rs +++ b/src/errors/lexing_error.rs @@ -1,17 +1,15 @@ +use super::RRDBError; + #[derive(Clone, Debug, PartialEq, Eq)] pub struct LexingError { pub message: String, } impl LexingError { - pub fn new(message: T) -> Self { - Self { + pub fn new(message: T) -> RRDBError { + RRDBError::LexingError(Self { message: message.to_string(), - } - } - - pub fn boxed(message: T) -> Box { - Box::new(Self::new(message)) + }) } } diff --git a/src/lexer/tokenizer.rs b/src/lexer/tokenizer.rs index d92769fa..2876eaea 100644 --- a/src/lexer/tokenizer.rs +++ b/src/lexer/tokenizer.rs @@ -1,7 +1,7 @@ use crate::errors::predule::LexingError; +use crate::errors::RRDBError; use crate::lexer::predule::{OperatorToken, Token}; use crate::logger::predule::Logger; -use std::error::Error; #[derive(Debug)] pub struct Tokenizer { @@ -210,7 +210,7 @@ impl Tokenizer { match number { Ok(number) => Token::Float(number), Err(_) => { - return Err(LexingError::boxed(format!( + return Err(LexingError::new(format!( "invalid floating point number format: {}", number_string ))) @@ -222,7 +222,7 @@ impl Tokenizer { match number { Ok(number) => Token::Integer(number), Err(_) => { - return Err(LexingError::boxed(format!( + return Err(LexingError::new(format!( "invalid integer number format: {}", number_string ))) @@ -295,7 +295,7 @@ impl Tokenizer { '<' => Token::Operator(OperatorToken::Lt), // TODO: <= 연산자 처리 '>' => Token::Operator(OperatorToken::Gt), // TODO: >= 연산자 처리 _ => { - return Err(LexingError::boxed(format!( + return Err(LexingError::new(format!( "unexpected operator: {:?}", self.last_char ))) @@ -392,7 +392,7 @@ impl Tokenizer { else if self.is_eof() { Token::EOF } else { - return Err(LexingError::boxed(format!( + return Err(LexingError::new(format!( "unexpected character: {:?}", self.last_char ))); diff --git a/src/lexer/tokens.rs b/src/lexer/tokens.rs index 23ef82b8..165e596e 100644 --- a/src/lexer/tokens.rs +++ b/src/lexer/tokens.rs @@ -1,8 +1,7 @@ -use std::error::Error; - use super::predule::OperatorToken; use crate::ast::dml::expressions::operators::BinaryOperator; use crate::errors::predule::IntoError; +use crate::errors::RRDBError; #[derive(Clone, Debug, PartialEq)] pub enum Token { From 17fb0fce94f65a5a3be3ae187fd0865e9bace08d Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:52:46 +0900 Subject: [PATCH 11/19] =?UTF-8?q?[#63]=20ParsingError=20=EC=9E=AC=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/parsing_error.rs | 12 +++++------- src/parser/implements/common.rs | 3 +-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/errors/parsing_error.rs b/src/errors/parsing_error.rs index 7bcd31a4..266526cc 100644 --- a/src/errors/parsing_error.rs +++ b/src/errors/parsing_error.rs @@ -1,17 +1,15 @@ +use super::RRDBError; + #[derive(Clone, Debug, PartialEq, Eq)] pub struct ParsingError { pub message: String, } impl ParsingError { - pub fn new(message: T) -> Self { - Self { + pub fn new(message: T) -> RRDBError { + RRDBError::ParsingError(Self { message: message.to_string(), - } - } - - pub fn boxed(message: T) -> Box { - Box::new(Self::new(message)) + }) } } diff --git a/src/parser/implements/common.rs b/src/parser/implements/common.rs index 3b9983be..92bce71f 100644 --- a/src/parser/implements/common.rs +++ b/src/parser/implements/common.rs @@ -1,9 +1,8 @@ -use std::error::Error; - use crate::ast::dml::expressions::subquery::SubqueryExpression; use crate::ast::dml::parts::join::JoinType; use crate::ast::types::{Column, DataType, SelectColumn, TableName}; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::predule::{OperatorToken, Token}; use crate::parser::predule::{Parser, ParserContext}; From d68c4c26def21c8c8b2c10b501253eae43595e3a Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:55:35 +0900 Subject: [PATCH 12/19] =?UTF-8?q?[#63]=20ParsingError=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser/implements/common.rs | 84 +++++++++---------- src/parser/implements/ddl/database.rs | 32 ++++--- src/parser/implements/ddl/table.rs | 78 ++++++++--------- src/parser/implements/ddl/top_level.rs | 15 ++-- src/parser/implements/dml/delete.rs | 13 ++- src/parser/implements/dml/expression.rs | 47 +++++------ src/parser/implements/dml/insert.rs | 37 ++++---- src/parser/implements/dml/select.rs | 66 +++++++-------- src/parser/implements/dml/update.rs | 21 +++-- .../implements/other/backslash_command.rs | 9 +- src/parser/implements/other/desc.rs | 5 +- src/parser/implements/other/show.rs | 7 +- src/parser/implements/other/use.rs | 7 +- src/parser/implements/tcl/begin.rs | 7 +- src/parser/implements/tcl/commit.rs | 3 +- src/parser/implements/tcl/rollback.rs | 3 +- 16 files changed, 210 insertions(+), 224 deletions(-) diff --git a/src/parser/implements/common.rs b/src/parser/implements/common.rs index 92bce71f..6c8fa2fa 100644 --- a/src/parser/implements/common.rs +++ b/src/parser/implements/common.rs @@ -12,7 +12,7 @@ impl Parser { let mut builder = Column::builder(); if !self.has_next_token() { - return Err(ParsingError::boxed("E0001 need more tokens")); + return Err(ParsingError::new("E0001 need more tokens")); } let current_token = self.get_next_token(); @@ -20,7 +20,7 @@ impl Parser { if let Token::Identifier(name) = current_token { builder = builder.set_name(name); } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0028 expected identifier. but your input word is '{:?}'", current_token ))); @@ -48,7 +48,7 @@ impl Parser { } Token::Primary => { if !self.has_next_token() { - return Err(ParsingError::boxed("E0003 need more tokens")); + return Err(ParsingError::new("E0003 need more tokens")); } let current_token = self.get_next_token(); @@ -58,7 +58,7 @@ impl Parser { builder = builder.set_primary_key(true).set_not_null(true); } _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "expected 'PRIMARY KEY'. but your input word is '{:?}'", current_token ))); @@ -67,7 +67,7 @@ impl Parser { } Token::Not => { if !self.has_next_token() { - return Err(ParsingError::boxed("E0004 need more tokens")); + return Err(ParsingError::new("E0004 need more tokens")); } let current_token = self.get_next_token(); @@ -77,7 +77,7 @@ impl Parser { builder = builder.set_not_null(true); } _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "expected 'NOT NULL'. but your input word is '{:?}'", current_token ))); @@ -89,7 +89,7 @@ impl Parser { } Token::Comment => { if !self.has_next_token() { - return Err(ParsingError::boxed("E0005 need more tokens")); + return Err(ParsingError::new("E0005 need more tokens")); } let current_token = self.get_next_token(); @@ -97,14 +97,14 @@ impl Parser { if let Token::String(comment) = current_token { builder = builder.set_comment(comment); } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "expected comment string. but your input word is '{:?}'", current_token ))); } } Token::Default => { - return Err(ParsingError::boxed("not supported yet")); + return Err(ParsingError::new("not supported yet")); } _ => {} } @@ -116,7 +116,7 @@ impl Parser { // 데이터 타입 분석 pub(crate) fn parse_data_type(&mut self) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0006 need more tokens")); + return Err(ParsingError::new("E0006 need more tokens")); } let current_token = self.get_next_token(); @@ -129,13 +129,13 @@ impl Parser { "VARCHAR" => { // 여는 괄호 체크 if !self.has_next_token() { - return Err(ParsingError::boxed("E0007 need more tokens")); + return Err(ParsingError::new("E0007 need more tokens")); } let current_token = self.get_next_token(); if Token::LeftParentheses != current_token { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "expected '('. but your input word is '{:?}'", current_token ))); @@ -143,7 +143,7 @@ impl Parser { // 문자열 길이 체크 if !self.has_next_token() { - return Err(ParsingError::boxed("E0008 need more tokens")); + return Err(ParsingError::new("E0008 need more tokens")); } let current_token = self.get_next_token(); @@ -151,13 +151,13 @@ impl Parser { if let Token::Integer(integer) = current_token { // 닫는 괄호 체크 if !self.has_next_token() { - return Err(ParsingError::boxed("E0009 need more tokens")); + return Err(ParsingError::new("E0009 need more tokens")); } let current_token = self.get_next_token(); if Token::RightParentheses != current_token { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "expected ')'. but your input word is '{:?}'", current_token ))); @@ -165,19 +165,19 @@ impl Parser { Ok(DataType::Varchar(integer)) } else { - Err(ParsingError::boxed(format!( + Err(ParsingError::new(format!( "expected integer number. but your input word is '{:?}'", current_token ))) } } - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "unknown data type '{}'", type_name ))), } } else { - Err(ParsingError::boxed(format!( + Err(ParsingError::new(format!( "E0029 expected identifier. but your input word is '{:?}'", current_token ))) @@ -191,7 +191,7 @@ impl Parser { ) -> Result { // 테이블명 획득 로직 if !self.has_next_token() { - return Err(ParsingError::boxed("E0010 need more tokens")); + return Err(ParsingError::new("E0010 need more tokens")); } // 첫번째로 오는 이름은 테이블명으로 추정 @@ -201,7 +201,7 @@ impl Parser { let mut table_name = if let Token::Identifier(name) = current_token { name } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0030 expected identifier. but your input word is '{:?}'", current_token ))); @@ -219,7 +219,7 @@ impl Parser { // .가 있을 경우 "데이터베이스명"."테이블명"의 형태로 추정 if current_token == Token::Period { if !self.has_next_token() { - return Err(ParsingError::boxed("E0012 need more tokens")); + return Err(ParsingError::new("E0012 need more tokens")); } let current_token = self.get_next_token(); @@ -228,7 +228,7 @@ impl Parser { database_name = Some(table_name); table_name = name; } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0031 expected identifier. but your input word is '{:?}'", current_token ))); @@ -247,21 +247,21 @@ impl Parser { pub(crate) fn has_if_not_exists(&mut self) -> Result { // 테이블명 획득 로직 if !self.has_next_token() { - return Err(ParsingError::boxed("E0013 need more tokens")); + return Err(ParsingError::new("E0013 need more tokens")); } let current_token = self.get_next_token(); if Token::If == current_token { if !self.has_next_token() { - return Err(ParsingError::boxed("E0014 need more tokens")); + return Err(ParsingError::new("E0014 need more tokens")); } let current_token = self.get_next_token(); if Token::Not == current_token { if !self.has_next_token() { - return Err(ParsingError::boxed("E0015 need more tokens")); + return Err(ParsingError::new("E0015 need more tokens")); } let current_token = self.get_next_token(); @@ -269,13 +269,13 @@ impl Parser { if Token::Exists == current_token { Ok(true) } else { - Err(ParsingError::boxed(format!( + Err(ParsingError::new(format!( "expected keyword is 'exists'. but your input word is '{:?}'", current_token ))) } } else { - Err(ParsingError::boxed(format!( + Err(ParsingError::new(format!( "expected keyword is 'not'. but your input word is '{:?}'", current_token ))) @@ -290,14 +290,14 @@ impl Parser { pub(crate) fn has_if_exists(&mut self) -> Result { // 테이블명 획득 로직 if !self.has_next_token() { - return Err(ParsingError::boxed("E0016 need more tokens")); + return Err(ParsingError::new("E0016 need more tokens")); } let current_token = self.get_next_token(); if Token::If == current_token { if !self.has_next_token() { - return Err(ParsingError::boxed("E0017 need more tokens")); + return Err(ParsingError::new("E0017 need more tokens")); } let current_token = self.get_next_token(); @@ -305,7 +305,7 @@ impl Parser { if Token::Exists == current_token { Ok(true) } else { - Err(ParsingError::boxed(format!( + Err(ParsingError::new(format!( "expected keyword is 'exists'. but your input word is '{:?}'", current_token ))) @@ -321,7 +321,7 @@ impl Parser { let mut select_column = SelectColumn::new(None, "".to_string()); if !self.has_next_token() { - return Err(ParsingError::boxed("E0018 need more tokens")); + return Err(ParsingError::new("E0018 need more tokens")); } let current_token = self.get_next_token(); @@ -329,7 +329,7 @@ impl Parser { if let Token::Identifier(name) = current_token { select_column.column_name = name; } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0032 expected identifier. but your input word is '{:?}'", current_token ))); @@ -348,7 +348,7 @@ impl Parser { select_column.column_name = name; Ok(select_column) } else { - Err(ParsingError::boxed(format!( + Err(ParsingError::new(format!( "E0033 expected identifier. but your input word is '{:?}'", current_token ))) @@ -955,7 +955,7 @@ impl Parser { pub(crate) fn parse_table_alias(&mut self) -> Result { // 테이블명 획득 로직 if !self.has_next_token() { - return Err(ParsingError::boxed("E0024 need more tokens")); + return Err(ParsingError::new("E0024 need more tokens")); } let current_token = self.get_next_token(); @@ -963,21 +963,21 @@ impl Parser { match current_token { Token::As => { if !self.has_next_token() { - return Err(ParsingError::boxed("E0026 need more tokens")); + return Err(ParsingError::new("E0026 need more tokens")); } let current_token = self.get_next_token(); match current_token { Token::Identifier(id) => Ok(id), - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E0027 expected identifier. but your input is {:?}", current_token ))), } } Token::Identifier(id) => Ok(id), - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E0025 expected AS. but your input is {:?}", current_token ))), @@ -990,35 +990,35 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0019 need more tokens")); + return Err(ParsingError::new("E0019 need more tokens")); } // ( 삼킴 let current_token = self.get_next_token(); if current_token != Token::LeftParentheses { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0020 expected left parentheses. but your input is {:?}", current_token ))); } if !self.has_next_token() { - return Err(ParsingError::boxed("E0021 need more tokens")); + return Err(ParsingError::new("E0021 need more tokens")); } // 서브쿼리 파싱 let select = self.handle_select_query(context)?; if !self.has_next_token() { - return Err(ParsingError::boxed("E0022 need more tokens")); + return Err(ParsingError::new("E0022 need more tokens")); } // ) 삼킴 let current_token = self.get_next_token(); if current_token != Token::RightParentheses { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0023 expected right parentheses. but your input is {:?}", current_token ))); diff --git a/src/parser/implements/ddl/database.rs b/src/parser/implements/ddl/database.rs index 566d5e63..0452b651 100644 --- a/src/parser/implements/ddl/database.rs +++ b/src/parser/implements/ddl/database.rs @@ -4,15 +4,15 @@ use crate::ast::ddl::alter_database::{ use crate::ast::ddl::create_database::CreateDatabaseQuery; use crate::ast::ddl::drop_database::{DropDatabaseQuery, SQLStatement}; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::predule::Token; use crate::parser::predule::Parser; -use std::error::Error; impl Parser { // CREATE DATABASE 쿼리 분석 pub(crate) fn handle_create_database_query(&mut self) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0101 need more tokens")); + return Err(ParsingError::new("E0101 need more tokens")); } let mut query_builder = CreateDatabaseQuery::builder(); @@ -22,7 +22,7 @@ impl Parser { query_builder = query_builder.set_if_not_exists(if_not_exists); if !self.has_next_token() { - return Err(ParsingError::boxed("E0102 need more tokens")); + return Err(ParsingError::new("E0102 need more tokens")); } let current_token = self.get_next_token(); @@ -32,7 +32,7 @@ impl Parser { query_builder = query_builder.set_name(identifier); } _ => { - return Err(ParsingError::boxed( + return Err(ParsingError::new( "not supported command. possible commands: (create database)", )); } @@ -45,7 +45,7 @@ impl Parser { let current_token = self.get_next_token(); if Token::SemiColon != current_token { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "expected ';'. but your input word is '{:?}'", current_token ))); @@ -64,7 +64,7 @@ impl Parser { // 테이블명 획득 로직 if !self.has_next_token() { - return Err(ParsingError::boxed("E0104 need more tokens")); + return Err(ParsingError::new("E0104 need more tokens")); } let current_token = self.get_next_token(); @@ -74,7 +74,7 @@ impl Parser { query_builder = query_builder.set_name(identifier); } _ => { - return Err(ParsingError::boxed( + return Err(ParsingError::new( "not supported command. possible commands: (create database)", )); } @@ -88,7 +88,7 @@ impl Parser { let current_token = self.get_next_token(); if Token::SemiColon != current_token { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "expected ';'. but your input word is '{:?}'", current_token ))); @@ -100,7 +100,7 @@ impl Parser { // ALTER DATABASE 쿼리 분석 pub(crate) fn handle_alter_database_query(&mut self) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0105 need more tokens")); + return Err(ParsingError::new("E0105 need more tokens")); } let mut query_builder = AlterDatabaseQuery::builder(); @@ -112,7 +112,7 @@ impl Parser { query_builder = query_builder.set_name(identifier); } _ => { - return Err(ParsingError::boxed( + return Err(ParsingError::new( "not supported command. possible commands: (alter database)", )); } @@ -127,22 +127,20 @@ impl Parser { match current_token { Token::Rename => { if !self.has_next_token() { - return Err(ParsingError::boxed( - "E106: expected 'TO'. but no more token", - )); + return Err(ParsingError::new("E106: expected 'TO'. but no more token")); } let current_token = self.get_next_token(); if current_token != Token::To { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E107: expected 'TO'. but your input word is '{:?}'", current_token ))); } if !self.has_next_token() { - return Err(ParsingError::boxed( + return Err(ParsingError::new( "E108: expected identifier. but no more token", )); } @@ -156,7 +154,7 @@ impl Parser { )); } _ => { - return Err(ParsingError::boxed( + return Err(ParsingError::new( "E109: not supported command. possible commands: (alter database)", )); } @@ -164,7 +162,7 @@ impl Parser { } Token::SemiColon => {} _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E107: not supported syntax'{:?}'", current_token ))); diff --git a/src/parser/implements/ddl/table.rs b/src/parser/implements/ddl/table.rs index b06d7c75..d05aa3cd 100644 --- a/src/parser/implements/ddl/table.rs +++ b/src/parser/implements/ddl/table.rs @@ -7,10 +7,10 @@ use crate::ast::ddl::create_table::CreateTableQuery; use crate::ast::ddl::drop_database::SQLStatement; use crate::ast::ddl::drop_table::DropTableQuery; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::predule::Token; use crate::parser::context::ParserContext; use crate::parser::predule::Parser; -use std::error::Error; impl Parser { // CREATE TABLE 쿼리 분석 @@ -19,7 +19,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E1205 need more tokens")); + return Err(ParsingError::new("E1205 need more tokens")); } let mut query_builder = CreateTableQuery::builder(); @@ -34,13 +34,13 @@ impl Parser { // 여는 괄호 체크 if !self.has_next_token() { - return Err(ParsingError::boxed("E1206 need more tokens")); + return Err(ParsingError::new("E1206 need more tokens")); } let current_token = self.get_next_token(); if Token::LeftParentheses != current_token { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1207 expected '('. but your input word is '{:?}'", current_token ))); @@ -49,7 +49,7 @@ impl Parser { // 닫는 괄호 나올때까지 행 파싱 반복 loop { if !self.has_next_token() { - return Err(ParsingError::boxed("E1208 need more tokens")); + return Err(ParsingError::new("E1208 need more tokens")); } let current_token = self.get_next_token(); @@ -69,13 +69,13 @@ impl Parser { // 닫는 괄호 체크 if !self.has_next_token() { - return Err(ParsingError::boxed("E1209 need more tokens")); + return Err(ParsingError::new("E1209 need more tokens")); } let current_token = self.get_next_token(); if Token::RightParentheses != current_token { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1210 expected ')'. but your input word is '{:?}'", current_token ))); @@ -88,7 +88,7 @@ impl Parser { let current_token = self.get_next_token(); if Token::SemiColon != current_token { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1211 expected ';'. but your input word is '{:?}'", current_token ))); @@ -103,7 +103,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E1201 need more tokens")); + return Err(ParsingError::new("E1201 need more tokens")); } let mut query_builder = AlterTableQuery::builder(); @@ -122,7 +122,7 @@ impl Parser { Token::SemiColon => return Ok(query_builder.build()), Token::Rename => { if !self.has_next_token() { - return Err(ParsingError::boxed("E1212 need more tokens")); + return Err(ParsingError::new("E1212 need more tokens")); } let current_token = self.get_next_token(); @@ -131,7 +131,7 @@ impl Parser { // table name rename Token::To => { if !self.has_next_token() { - return Err(ParsingError::boxed("E1213 need more tokens")); + return Err(ParsingError::new("E1213 need more tokens")); } let current_token = self.get_next_token(); @@ -142,7 +142,7 @@ impl Parser { .set_action(AlterTableRenameTo { name: identifier }.into()); } _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1214 unexpected token {:?}", current_token ))) @@ -152,27 +152,27 @@ impl Parser { // table column name rename Token::Column => { if !self.has_next_token() { - return Err(ParsingError::boxed("E1217 need more tokens")); + return Err(ParsingError::new("E1217 need more tokens")); } let current_token = self.get_next_token(); if let Token::Identifier(from_name) = current_token { if !self.has_next_token() { - return Err(ParsingError::boxed("E1219 need more tokens")); + return Err(ParsingError::new("E1219 need more tokens")); } let current_token = self.get_next_token(); if Token::To != current_token { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1220 expected token is 'TO', but you input is {:?}", current_token ))); } if !self.has_next_token() { - return Err(ParsingError::boxed("E1221 need more tokens")); + return Err(ParsingError::new("E1221 need more tokens")); } let current_token = self.get_next_token(); @@ -182,13 +182,13 @@ impl Parser { AlterTableRenameColumn { from_name, to_name }.into(), ); } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1222 expected token is 'identifer', but you input is {:?}", current_token ))); } } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1218 expected token {:?}", current_token ))); @@ -197,20 +197,20 @@ impl Parser { // table column name rename Token::Identifier(from_name) => { if !self.has_next_token() { - return Err(ParsingError::boxed("E1218 need more tokens")); + return Err(ParsingError::new("E1218 need more tokens")); } let current_token = self.get_next_token(); if Token::To != current_token { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1223 expected token is 'TO', but you input is {:?}", current_token ))); } if !self.has_next_token() { - return Err(ParsingError::boxed("E1224 need more tokens")); + return Err(ParsingError::new("E1224 need more tokens")); } let current_token = self.get_next_token(); @@ -219,14 +219,14 @@ impl Parser { query_builder = query_builder .set_action(AlterTableRenameColumn { from_name, to_name }.into()); } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1225 expected token is 'identifer', but you input is {:?}", current_token ))); } } _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1213 expected token is 'TO' or 'COLUMN', but you input is {:?}", current_token ))) @@ -235,7 +235,7 @@ impl Parser { } Token::Add => { if !self.has_next_token() { - return Err(ParsingError::boxed("E1215 need more tokens")); + return Err(ParsingError::new("E1215 need more tokens")); } let current_token = self.get_next_token(); @@ -256,7 +256,7 @@ impl Parser { query_builder.set_action(AlterTableAddColumn { column }.into()); } _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1216 unexpected keyword '{:?}'", current_token ))) @@ -269,7 +269,7 @@ impl Parser { } if !self.has_next_token() { - return Err(ParsingError::boxed("E1226 need more tokens")); + return Err(ParsingError::new("E1226 need more tokens")); } let current_token = self.get_next_token(); @@ -278,7 +278,7 @@ impl Parser { query_builder = query_builder.set_action(AlterTableDropColumn { column_name }.into()); } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1227 unexpected token {:?}", current_token ))); @@ -290,14 +290,14 @@ impl Parser { } if !self.has_next_token() { - return Err(ParsingError::boxed("E1228 need more tokens")); + return Err(ParsingError::new("E1228 need more tokens")); } let current_token = self.get_next_token(); if let Token::Identifier(column_name) = current_token { if !self.has_next_token() { - return Err(ParsingError::boxed("E1230 need more tokens")); + return Err(ParsingError::new("E1230 need more tokens")); } let current_token = self.get_next_token(); @@ -320,7 +320,7 @@ impl Parser { self.get_next_token(); if !self.has_next_token() { - return Err(ParsingError::boxed("E1233 need more tokens")); + return Err(ParsingError::new("E1233 need more tokens")); } let data_type = self.parse_data_type()?; @@ -336,7 +336,7 @@ impl Parser { self.get_next_token(); if !self.has_next_token() { - return Err(ParsingError::boxed("E1234 need more tokens")); + return Err(ParsingError::new("E1234 need more tokens")); } let expression = self.parse_expression(context)?; @@ -349,7 +349,7 @@ impl Parser { .into(), ); } else { - return Err(ParsingError::boxed("E1231 unexpected tokens")); + return Err(ParsingError::new("E1231 unexpected tokens")); } } Token::Drop => { @@ -375,12 +375,12 @@ impl Parser { .into(), ); } else { - return Err(ParsingError::boxed("E1231 unexpected tokens")); + return Err(ParsingError::new("E1231 unexpected tokens")); } } Token::Type => { if !self.has_next_token() { - return Err(ParsingError::boxed("E1232 need more tokens")); + return Err(ParsingError::new("E1232 need more tokens")); } let data_type = self.parse_data_type()?; @@ -394,21 +394,21 @@ impl Parser { ); } _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1229 unexpected token {:?}", current_token ))) } } } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1229 unexpected token {:?}", current_token ))); } } _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1202 unexpected keyword '{:?}'", current_token ))) @@ -431,7 +431,7 @@ impl Parser { // 테이블명 획득 로직 if !self.has_next_token() { - return Err(ParsingError::boxed("E1203 need more tokens")); + return Err(ParsingError::new("E1203 need more tokens")); } let table = self.parse_table_name(context)?; @@ -446,7 +446,7 @@ impl Parser { let current_token = self.get_next_token(); if Token::SemiColon != current_token { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E1204 expected ';'. but your input word is '{:?}'", current_token ))); diff --git a/src/parser/implements/ddl/top_level.rs b/src/parser/implements/ddl/top_level.rs index e7798dc6..8dd2c655 100644 --- a/src/parser/implements/ddl/top_level.rs +++ b/src/parser/implements/ddl/top_level.rs @@ -1,11 +1,10 @@ use crate::ast::SQLStatement; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::predule::Token; use crate::parser::context::ParserContext; use crate::parser::predule::Parser; -use std::error::Error; - impl Parser { // CREATE...로 시작되는 쿼리 분석 pub(crate) fn handle_create_query( @@ -13,7 +12,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E1101 need more tokens")); + return Err(ParsingError::new("E1101 need more tokens")); } let current_token = self.get_next_token(); @@ -21,7 +20,7 @@ impl Parser { match current_token { Token::Table => self.handle_create_table_query(context), Token::Database => self.handle_create_database_query(), - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E1102 not supported command. possible commands: (create table). but your input is {:?}", current_token ))), @@ -34,7 +33,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E1103 need more tokens")); + return Err(ParsingError::new("E1103 need more tokens")); } let current_token = self.get_next_token(); @@ -42,7 +41,7 @@ impl Parser { match current_token { Token::Table => self.handle_alter_table_query(context), Token::Database => self.handle_alter_database_query(), - _ => Err(ParsingError::boxed( + _ => Err(ParsingError::new( "E1104 not supported command. possible commands: (alter table)", )), } @@ -53,7 +52,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E1105 need more tokens")); + return Err(ParsingError::new("E1105 need more tokens")); } let current_token = self.get_next_token(); @@ -61,7 +60,7 @@ impl Parser { match current_token { Token::Table => self.handle_drop_table_query(context), Token::Database => self.handle_drop_database_query(), - _ => Err(ParsingError::boxed( + _ => Err(ParsingError::new( "E1106 not supported command. possible commands: (create table)", )), } diff --git a/src/parser/implements/dml/delete.rs b/src/parser/implements/dml/delete.rs index 93bfe9e6..579e1cdd 100644 --- a/src/parser/implements/dml/delete.rs +++ b/src/parser/implements/dml/delete.rs @@ -1,6 +1,5 @@ -use std::error::Error; - use crate::ast::dml::delete::DeleteQuery; +use crate::errors::RRDBError; use crate::parser::predule::{Parser, ParserContext}; use crate::errors::predule::ParsingError; @@ -12,28 +11,28 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0501 need more tokens")); + return Err(ParsingError::new("E0501 need more tokens")); } // DELETE 토큰 삼키기 let current_token = self.get_next_token(); if current_token != Token::Delete { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0502: expected 'DELETE'. but your input word is '{:?}'", current_token ))); } if !self.has_next_token() { - return Err(ParsingError::boxed("E0503 need more tokens")); + return Err(ParsingError::new("E0503 need more tokens")); } // FROM 토큰 삼키기 let current_token = self.get_next_token(); if current_token != Token::From { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0504: expected 'FROM'. but your input word is '{:?}'", current_token ))); @@ -42,7 +41,7 @@ impl Parser { let mut query_builder = DeleteQuery::builder(); if !self.has_next_token() { - return Err(ParsingError::boxed("E0505 need more tokens")); + return Err(ParsingError::new("E0505 need more tokens")); } // 테이블명 파싱 diff --git a/src/parser/implements/dml/expression.rs b/src/parser/implements/dml/expression.rs index c5c329d1..4ab34ee8 100644 --- a/src/parser/implements/dml/expression.rs +++ b/src/parser/implements/dml/expression.rs @@ -1,5 +1,3 @@ -use std::error::Error; - use crate::ast::dml::expressions::between::BetweenExpression; use crate::ast::dml::expressions::binary::BinaryOperatorExpression; use crate::ast::dml::expressions::call::CallExpression; @@ -10,6 +8,7 @@ use crate::ast::dml::expressions::parentheses::ParenthesesExpression; use crate::ast::dml::expressions::unary::UnaryOperatorExpression; use crate::ast::types::{BuiltInFunction, SQLExpression, SelectColumn, UserDefinedFunction}; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::predule::Token; use crate::parser::predule::Parser; use crate::parser::predule::ParserContext; @@ -20,7 +19,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0201 need more tokens")); + return Err(ParsingError::new("E0201 need more tokens")); } let current_token = self.get_next_token(); @@ -33,7 +32,7 @@ impl Parser { Ok(expression) } else { - Err(ParsingError::boxed(format!( + Err(ParsingError::new(format!( "E0212 unexpected operator: {:?}", operator ))) @@ -113,7 +112,7 @@ impl Parser { } Token::LeftParentheses => { if !self.has_next_token() { - return Err(ParsingError::boxed("E0214 need more tokens")); + return Err(ParsingError::new("E0214 need more tokens")); } let second_token = self.get_next_token(); @@ -151,7 +150,7 @@ impl Parser { } } } - Token::RightParentheses => Err(ParsingError::boxed(format!( + Token::RightParentheses => Err(ParsingError::new(format!( "E0213 unexpected token: {:?}", current_token ))), @@ -192,7 +191,7 @@ impl Parser { Ok(lhs) } } - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E0202 unexpected token: {:?}", current_token ))), @@ -205,7 +204,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0201 need more tokens")); + return Err(ParsingError::new("E0201 need more tokens")); } let expression = self.parse_expression(context)?; @@ -250,28 +249,28 @@ impl Parser { let context = context.set_in_parentheses(true); if !self.has_next_token() { - return Err(ParsingError::boxed("E0203 need more tokens")); + return Err(ParsingError::new("E0203 need more tokens")); } // ( 삼킴 let current_token = self.get_next_token(); if current_token != Token::LeftParentheses { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "expected left parentheses. but your input is {:?}", current_token ))); } if !self.has_next_token() { - return Err(ParsingError::boxed("E0204 need more tokens")); + return Err(ParsingError::new("E0204 need more tokens")); } // 표현식 파싱 let expression = self.parse_expression(context.clone())?; if !self.has_next_token() { - return Err(ParsingError::boxed("E0205 need more tokens")); + return Err(ParsingError::new("E0205 need more tokens")); } // ) 삼킴 @@ -292,7 +291,7 @@ impl Parser { loop { if !self.has_next_token() { - return Err(ParsingError::boxed("E0215 need more tokens")); + return Err(ParsingError::new("E0215 need more tokens")); } let current_token = self.get_next_token(); @@ -311,7 +310,7 @@ impl Parser { Ok(list.into()) } - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "expected right parentheses. but your input is {:?}", current_token ))), @@ -327,7 +326,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0206 need more tokens")); + return Err(ParsingError::new("E0206 need more tokens")); } // 연산자 획득 @@ -435,21 +434,21 @@ impl Parser { }; if !self.has_next_token() { - return Err(ParsingError::boxed("E0207 need more tokens")); + return Err(ParsingError::new("E0207 need more tokens")); } // ( 삼킴 let current_token = self.get_next_token(); if current_token != Token::LeftParentheses { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "expected left parentheses. but your input is {:?}", current_token ))); } if !self.has_next_token() { - return Err(ParsingError::boxed("E0208 need more tokens")); + return Err(ParsingError::new("E0208 need more tokens")); } // 닫는 괄호가 나올때까지 인자 파싱 @@ -470,14 +469,14 @@ impl Parser { } if !self.has_next_token() { - return Err(ParsingError::boxed("E0209 need more tokens")); + return Err(ParsingError::new("E0209 need more tokens")); } // ) 삼킴 let current_token = self.get_next_token(); if current_token != Token::RightParentheses { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "expected right parentheses. but your input is {:?}", current_token ))); @@ -497,7 +496,7 @@ impl Parser { let context = context.set_in_between_clause(true); if !self.has_next_token() { - return Err(ParsingError::boxed("E0210 need more tokens")); + return Err(ParsingError::new("E0210 need more tokens")); } let current_token = self.get_next_token(); @@ -517,7 +516,7 @@ impl Parser { } Token::Not => { if !self.has_next_token() { - return Err(ParsingError::boxed("E0211 need more tokens")); + return Err(ParsingError::new("E0211 need more tokens")); } let current_token = self.get_next_token(); @@ -535,13 +534,13 @@ impl Parser { Ok(expression.into()) } - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "expected between. but your input is {:?}", current_token ))), } } - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "expected between. but your input is {:?}", current_token ))), diff --git a/src/parser/implements/dml/insert.rs b/src/parser/implements/dml/insert.rs index fbb72439..13b6d323 100644 --- a/src/parser/implements/dml/insert.rs +++ b/src/parser/implements/dml/insert.rs @@ -1,8 +1,7 @@ -use std::error::Error; - use crate::ast::dml::insert::InsertQuery; use crate::ast::dml::parts::insert_values::InsertValue; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::predule::Token; use crate::parser::predule::{Parser, ParserContext}; @@ -14,19 +13,19 @@ impl Parser { let mut query_builder = InsertQuery::builder(); if !self.has_next_token() { - return Err(ParsingError::boxed("E0401 need more tokens")); + return Err(ParsingError::new("E0401 need more tokens")); } // INSERT 토큰 삼키기 let current_token = self.get_next_token(); if current_token != Token::Insert { - return Err(ParsingError::boxed("E0402 expected INSERT")); + return Err(ParsingError::new("E0402 expected INSERT")); } // INTO 토큰 삼키기 let current_token = self.get_next_token(); if current_token != Token::Into { - return Err(ParsingError::boxed("E0403 expected INTO")); + return Err(ParsingError::new("E0403 expected INTO")); } // 테이블명 파싱 @@ -35,20 +34,20 @@ impl Parser { // 컬럼명 지정 파싱 if !self.has_next_token() { - return Err(ParsingError::boxed("E0404 need more tokens")); + return Err(ParsingError::new("E0404 need more tokens")); } let current_token = self.get_next_token(); if current_token != Token::LeftParentheses { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "expected '('. but your input word is '{:?}'", current_token ))); } if !self.has_next_token() { - return Err(ParsingError::boxed("E0405 need more tokens")); + return Err(ParsingError::new("E0405 need more tokens")); } // 컬럼명 지정 파싱 @@ -56,7 +55,7 @@ impl Parser { query_builder = query_builder.set_columns(columns.clone()); if !self.has_next_token() { - return Err(ParsingError::boxed("E0413 need more tokens")); + return Err(ParsingError::new("E0413 need more tokens")); } let current_token = self.get_next_token(); @@ -67,7 +66,7 @@ impl Parser { let values = self.parse_insert_values(context)?; if values.iter().any(|e| e.list.len() != columns.len()) { - return Err(ParsingError::boxed( + return Err(ParsingError::new( "E0415 The number of values in insert and the number of columns do not match.", )); } @@ -79,7 +78,7 @@ impl Parser { let select = self.handle_select_query(context)?; if select.select_items.len() != columns.len() { - return Err(ParsingError::boxed( + return Err(ParsingError::new( "E0416 The number of values in insert and the number of columns do not match.", )); } @@ -87,7 +86,7 @@ impl Parser { query_builder = query_builder.set_select(select); } _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0414 expected 'Values'. but your input word is '{:?}'", current_token ))) @@ -111,7 +110,7 @@ impl Parser { let mut names = vec![]; loop { if !self.has_next_token() { - return Err(ParsingError::boxed("E0406 need more tokens")); + return Err(ParsingError::new("E0406 need more tokens")); } let current_token = self.get_next_token(); @@ -129,7 +128,7 @@ impl Parser { break; } _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0407 unexpected input word '{:?}'", current_token ))); @@ -140,7 +139,7 @@ impl Parser { let current_token = self.get_next_token(); if current_token != Token::RightParentheses { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0408 expected ')'. but your input word is '{:?}'", current_token ))); @@ -160,13 +159,13 @@ impl Parser { let mut values: Vec = vec![]; if !self.has_next_token() { - return Err(ParsingError::boxed("E0409 need more tokens")); + return Err(ParsingError::new("E0409 need more tokens")); } let current_token = self.get_next_token(); if current_token != Token::Values { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0408 expected 'Values'. but your input word is '{:?}'", current_token ))); @@ -187,13 +186,13 @@ impl Parser { } if !self.has_next_token() { - return Err(ParsingError::boxed("E0411 need more tokens")); + return Err(ParsingError::new("E0411 need more tokens")); } // 각 Value 절 파싱. (A, B, C, D...) loop { if !self.has_next_token() { - return Err(ParsingError::boxed("E0412 need more tokens")); + return Err(ParsingError::new("E0412 need more tokens")); } let current_token = self.get_next_token(); diff --git a/src/parser/implements/dml/select.rs b/src/parser/implements/dml/select.rs index 52f57143..6465d37c 100644 --- a/src/parser/implements/dml/select.rs +++ b/src/parser/implements/dml/select.rs @@ -1,5 +1,4 @@ use std::collections::HashSet; -use std::error::Error; use crate::ast::dml::parts::_where::WhereClause; use crate::ast::dml::parts::group_by::GroupByItem; @@ -9,6 +8,7 @@ use crate::ast::dml::parts::order_by::{OrderByItem, OrderByNulls, OrderByType}; use crate::ast::dml::parts::select_item::{SelectItem, SelectWildCard}; use crate::ast::dml::select::SelectQuery; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::predule::{OperatorToken, Token}; use crate::parser::predule::{Parser, ParserContext}; @@ -18,21 +18,21 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0301: need more tokens")); + return Err(ParsingError::new("E0301: need more tokens")); } // SELECT 토큰 삼키기 let current_token = self.get_next_token(); if current_token != Token::Select { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0302: expected 'SELECT'. but your input word is '{:?}'", current_token ))); } if !self.has_next_token() { - return Err(ParsingError::boxed("E0303: need more tokens")); + return Err(ParsingError::new("E0303: need more tokens")); } let mut query_builder = SelectQuery::builder(); @@ -92,7 +92,7 @@ impl Parser { } } _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0304 expected 'FROM' clause. but your input word is '{:?}'", current_token ))); @@ -139,7 +139,7 @@ impl Parser { let group_by_item = self.parse_group_by_item(context.clone())?; query_builder = query_builder.add_group_by(group_by_item); } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0319 unexpected token '{:?}'", current_token ))); @@ -167,7 +167,7 @@ impl Parser { // 집계함수가 사용되지 않은 컬럼이 group by에 없다면 오류 for non_aggregate_column in non_aggregate_columns { if !group_by_columns.contains(&non_aggregate_column) { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0331: column '{:?}' must be in a GROUP BY clause or used within an aggregate function", non_aggregate_column ))); @@ -180,7 +180,7 @@ impl Parser { // 집계함수가 사용된 컬럼이 group by에 있다면 오류 for aggregate_column in aggregate_columns { if group_by_columns.contains(&aggregate_column) { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0332: column '{:?}' cannot be in a GROUP BY clause", group_by_columns ))); @@ -195,7 +195,7 @@ impl Parser { let having_clause = self.parse_having(context.clone())?; query_builder = query_builder.set_having(having_clause); } else { - return Err(ParsingError::boxed( + return Err(ParsingError::new( "E0315 Having without group by is invalid.", )); } @@ -229,7 +229,7 @@ impl Parser { let order_by_item = self.parse_order_by_item(context.clone())?; query_builder = query_builder.add_order_by(order_by_item); } else { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0318 unexpected token '{:?}'", current_token ))); @@ -267,7 +267,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0305 need more tokens")); + return Err(ParsingError::new("E0305 need more tokens")); } let select_item = SelectItem::builder(); @@ -286,7 +286,7 @@ impl Parser { Token::As => { // 더 없을 경우 바로 반환 if !self.has_next_token() { - return Err(ParsingError::boxed("E0306 expected alias. need more")); + return Err(ParsingError::new("E0306 expected alias. need more")); } let current_token = self.get_next_token(); @@ -296,7 +296,7 @@ impl Parser { let select_item = select_item.set_alias(identifier); Ok(select_item.build()) } - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E0307 expected alias, but your input word is '{:?}'", current_token ))), @@ -312,7 +312,7 @@ impl Parser { // 현재 select_item은 종료된 것으로 판단. Ok(select_item.build()) } - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E0308 expected expression. but your input word is '{:?}'", current_token ))), @@ -324,7 +324,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0313 need more tokens")); + return Err(ParsingError::new("E0313 need more tokens")); } // 표현식 파싱 @@ -365,7 +365,7 @@ impl Parser { match current_token { Token::Nulls => { if !self.has_next_token() { - return Err(ParsingError::boxed("E0329 need more tokens")); + return Err(ParsingError::new("E0329 need more tokens")); } let current_token = self.get_next_token(); @@ -374,7 +374,7 @@ impl Parser { Token::First => {} Token::Last => order_by_item.nulls = OrderByNulls::Last, _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0330 expected keyword is FIRST or LAST, but your input is {:?}", current_token ))) @@ -395,7 +395,7 @@ impl Parser { _context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0314 need more tokens")); + return Err(ParsingError::new("E0314 need more tokens")); } // 표현식 파싱 @@ -412,7 +412,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0310 need more tokens")); + return Err(ParsingError::new("E0310 need more tokens")); } let right = self.parse_table_name(context.clone())?; @@ -449,13 +449,13 @@ impl Parser { pub(crate) fn parse_where(&mut self, context: ParserContext) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0311 need more tokens")); + return Err(ParsingError::new("E0311 need more tokens")); } let current_token = self.get_next_token(); if current_token != Token::Where { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0312 expected 'WHERE'. but your input word is '{:?}'", current_token ))); @@ -471,13 +471,13 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0316 need more tokens")); + return Err(ParsingError::new("E0316 need more tokens")); } let current_token = self.get_next_token(); if current_token != Token::Having { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0317 expected 'Having'. but your input word is '{:?}'", current_token ))); @@ -492,14 +492,14 @@ impl Parser { pub(crate) fn parse_offset(&mut self, _context: ParserContext) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0320 need more tokens")); + return Err(ParsingError::new("E0320 need more tokens")); } // OFFSET 삼키기 let current_token = self.get_next_token(); if current_token != Token::Offset { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0321 expected 'Offset'. but your input word is '{:?}'", current_token ))); @@ -507,7 +507,7 @@ impl Parser { // OFFSET 숫자값 획득 if !self.has_next_token() { - return Err(ParsingError::boxed("E0322 need more tokens")); + return Err(ParsingError::new("E0322 need more tokens")); } let current_token = self.get_next_token(); @@ -517,12 +517,12 @@ impl Parser { if integer >= 0 { Ok(integer as u32) } else { - Err(ParsingError::boxed( + Err(ParsingError::new( "E0323 Offset can only contain positive numbers.", )) } } - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E0324 expected positive numbers. but your input word is '{:?}'", current_token ))), @@ -531,14 +531,14 @@ impl Parser { pub(crate) fn parse_limit(&mut self, _context: ParserContext) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0325 need more tokens")); + return Err(ParsingError::new("E0325 need more tokens")); } // OFFSET 삼키기 let current_token = self.get_next_token(); if current_token != Token::Limit { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0326 expected 'Limit'. but your input word is '{:?}'", current_token ))); @@ -546,7 +546,7 @@ impl Parser { // OFFSET 숫자값 획득 if !self.has_next_token() { - return Err(ParsingError::boxed("E0327 need more tokens")); + return Err(ParsingError::new("E0327 need more tokens")); } let current_token = self.get_next_token(); @@ -556,12 +556,12 @@ impl Parser { if integer >= 0 { Ok(integer as u32) } else { - Err(ParsingError::boxed( + Err(ParsingError::new( "E0327 Limit can only contain positive numbers.", )) } } - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E0328 expected positive numbers. but your input word is '{:?}'", current_token ))), diff --git a/src/parser/implements/dml/update.rs b/src/parser/implements/dml/update.rs index a8c1be02..2c278a43 100644 --- a/src/parser/implements/dml/update.rs +++ b/src/parser/implements/dml/update.rs @@ -1,9 +1,8 @@ -use std::error::Error; - use crate::ast::dml::parts::_where::WhereClause; use crate::ast::dml::parts::update_item::UpdateItem; use crate::ast::dml::update::UpdateQuery; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::predule::{OperatorToken, Token}; use crate::parser::predule::{Parser, ParserContext}; @@ -13,13 +12,13 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0601: need more tokens")); + return Err(ParsingError::new("E0601: need more tokens")); } let current_token = self.get_next_token(); if current_token != Token::Update { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0602: expected 'UPDATE'. but your input word is '{:?}'", current_token ))); @@ -28,7 +27,7 @@ impl Parser { let mut query_builder = UpdateQuery::builder(); if !self.has_next_token() { - return Err(ParsingError::boxed("E0603: need more tokens")); + return Err(ParsingError::new("E0603: need more tokens")); } // 테이블명 파싱 @@ -41,13 +40,13 @@ impl Parser { } if !self.has_next_token() { - return Err(ParsingError::boxed("E0604: need more tokens")); + return Err(ParsingError::new("E0604: need more tokens")); } let current_token = self.get_next_token(); if current_token != Token::Set { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0605: expected 'SET'. but your input word is '{:?}'", current_token ))); @@ -71,20 +70,20 @@ impl Parser { } Token::Identifier(identifier) => { if !self.has_next_token() { - return Err(ParsingError::boxed("E0606: need more tokens")); + return Err(ParsingError::new("E0606: need more tokens")); } let current_token = self.get_next_token(); if current_token != Token::Operator(OperatorToken::Eq) { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0607: expected '='. but your input word is '{:?}'", current_token ))); } if !self.has_next_token() { - return Err(ParsingError::boxed("E0608: need more tokens")); + return Err(ParsingError::new("E0608: need more tokens")); } let expression = self.parse_expression(context.clone())?; @@ -97,7 +96,7 @@ impl Parser { query_builder = query_builder.add_update_item(update_item) } _ => { - return Err(ParsingError::boxed(format!( + return Err(ParsingError::new(format!( "E0609: unexpected input word: '{:?}'", current_token ))); diff --git a/src/parser/implements/other/backslash_command.rs b/src/parser/implements/other/backslash_command.rs index 0bb66fdc..93da4565 100644 --- a/src/parser/implements/other/backslash_command.rs +++ b/src/parser/implements/other/backslash_command.rs @@ -1,8 +1,7 @@ -use std::error::Error; - use crate::ast::other::show_databases::ShowDatabasesQuery; use crate::ast::SQLStatement; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::predule::Token; use crate::parser::predule::{Parser, ParserContext}; @@ -12,7 +11,7 @@ impl Parser { _context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0801 need more tokens")); + return Err(ParsingError::new("E0801 need more tokens")); } let current_token = self.get_next_token(); @@ -20,12 +19,12 @@ impl Parser { match current_token { Token::Identifier(identifier) => match identifier.as_str() { "l" => Ok(ShowDatabasesQuery {}.into()), - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E0803: unexpected identifier '{:?}'", identifier ))), }, - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E0802: unexpected token '{:?}'", current_token ))), diff --git a/src/parser/implements/other/desc.rs b/src/parser/implements/other/desc.rs index 53cc6432..783efc81 100644 --- a/src/parser/implements/other/desc.rs +++ b/src/parser/implements/other/desc.rs @@ -1,8 +1,7 @@ -use std::error::Error; - use crate::ast::other::desc_table::DescTableQuery; use crate::ast::SQLStatement; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::parser::predule::{Parser, ParserContext}; impl Parser { @@ -11,7 +10,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E1001 need more tokens")); + return Err(ParsingError::new("E1001 need more tokens")); } let table_name = self.parse_table_name(context)?; diff --git a/src/parser/implements/other/show.rs b/src/parser/implements/other/show.rs index 39b20349..a2ee8279 100644 --- a/src/parser/implements/other/show.rs +++ b/src/parser/implements/other/show.rs @@ -1,9 +1,8 @@ -use std::error::Error; - use crate::ast::other::show_databases::ShowDatabasesQuery; use crate::ast::other::show_tables::ShowTablesQuery; use crate::ast::SQLStatement; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::predule::Token; use crate::parser::predule::{Parser, ParserContext}; @@ -13,7 +12,7 @@ impl Parser { context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0701 need more tokens")); + return Err(ParsingError::new("E0701 need more tokens")); } let current_token = self.get_next_token(); @@ -24,7 +23,7 @@ impl Parser { database: context.default_database.unwrap_or_else(|| "None".into()), } .into()), - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E0702: unexpected token '{:?}'", current_token ))), diff --git a/src/parser/implements/other/use.rs b/src/parser/implements/other/use.rs index df5f442a..d1ccd986 100644 --- a/src/parser/implements/other/use.rs +++ b/src/parser/implements/other/use.rs @@ -1,8 +1,7 @@ -use std::error::Error; - use crate::ast::other::use_database::UseDatabaseQuery; use crate::ast::SQLStatement; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::predule::Token; use crate::parser::predule::{Parser, ParserContext}; @@ -12,7 +11,7 @@ impl Parser { _context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E0901 need more tokens")); + return Err(ParsingError::new("E0901 need more tokens")); } let current_token = self.get_next_token(); @@ -22,7 +21,7 @@ impl Parser { database_name: identifier, } .into()), - _ => Err(ParsingError::boxed(format!( + _ => Err(ParsingError::new(format!( "E0902: unexpected token '{:?}'", current_token ))), diff --git a/src/parser/implements/tcl/begin.rs b/src/parser/implements/tcl/begin.rs index 3621581f..1d352341 100644 --- a/src/parser/implements/tcl/begin.rs +++ b/src/parser/implements/tcl/begin.rs @@ -1,8 +1,7 @@ -use std::error::Error; - use crate::ast::tcl::BeginTransactionQuery; use crate::ast::SQLStatement; use crate::errors::predule::ParsingError; +use crate::errors::RRDBError; use crate::lexer::tokens::Token; use crate::parser::predule::{Parser, ParserContext}; @@ -12,13 +11,13 @@ impl Parser { _context: ParserContext, ) -> Result { if !self.has_next_token() { - return Err(ParsingError::boxed("E2001 need more tokens")); + return Err(ParsingError::new("E2001 need more tokens")); } let current_token = self.get_next_token(); if current_token != Token::Transaction { - return Err(ParsingError::boxed("E2002 Expected BEGIN")); + return Err(ParsingError::new("E2002 Expected BEGIN")); } Ok(BeginTransactionQuery {}.into()) diff --git a/src/parser/implements/tcl/commit.rs b/src/parser/implements/tcl/commit.rs index 3616dd88..c32b3cce 100644 --- a/src/parser/implements/tcl/commit.rs +++ b/src/parser/implements/tcl/commit.rs @@ -1,7 +1,6 @@ -use std::error::Error; - use crate::ast::tcl::CommitQuery; use crate::ast::SQLStatement; +use crate::errors::RRDBError; use crate::parser::predule::{Parser, ParserContext}; impl Parser { diff --git a/src/parser/implements/tcl/rollback.rs b/src/parser/implements/tcl/rollback.rs index 49f6f5df..7ca3f815 100644 --- a/src/parser/implements/tcl/rollback.rs +++ b/src/parser/implements/tcl/rollback.rs @@ -1,7 +1,6 @@ -use std::error::Error; - use crate::ast::tcl::RollbackQuery; use crate::ast::SQLStatement; +use crate::errors::RRDBError; use crate::parser::predule::{Parser, ParserContext}; impl Parser { From 022d81bd09c78d8d7c5ced0a236ce1746c227785 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 10:59:44 +0900 Subject: [PATCH 13/19] =?UTF-8?q?[#63]=20ExecuteError=EC=97=90=20backtrace?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/execute_error.rs | 4 +++- src/errors/mod.rs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/errors/execute_error.rs b/src/errors/execute_error.rs index e9753fe3..04aab47e 100644 --- a/src/errors/execute_error.rs +++ b/src/errors/execute_error.rs @@ -1,14 +1,16 @@ use super::RRDBError; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Debug)] pub struct ExecuteError { pub message: String, + pub backtrace: std::backtrace::Backtrace, } impl ExecuteError { pub fn new(message: T) -> RRDBError { RRDBError::ExecuteError(Self { message: message.to_string(), + backtrace: std::backtrace::Backtrace::capture(), }) } } diff --git a/src/errors/mod.rs b/src/errors/mod.rs index 58e88eca..a2de2d8a 100644 --- a/src/errors/mod.rs +++ b/src/errors/mod.rs @@ -6,7 +6,7 @@ pub mod predule; pub mod server_error; pub mod type_error; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Debug)] pub enum RRDBError { ExecuteError(execute_error::ExecuteError), IntoError(into_error::IntoError), From dbc9959d629bc8f97293f80fd95e1ce35410ae8e Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 11:00:12 +0900 Subject: [PATCH 14/19] =?UTF-8?q?[#63]=20IntoError=EC=97=90=20backtrace=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/into_error.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/errors/into_error.rs b/src/errors/into_error.rs index 92788fc8..f7ef0d47 100644 --- a/src/errors/into_error.rs +++ b/src/errors/into_error.rs @@ -1,14 +1,16 @@ use super::RRDBError; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Debug)] pub struct IntoError { pub message: String, + pub backtrace: std::backtrace::Backtrace, } impl IntoError { pub fn new(message: T) -> RRDBError { RRDBError::IntoError(Self { message: message.to_string(), + backtrace: std::backtrace::Backtrace::capture(), }) } } From 6b752ffd1a960c597a5b1e874c62febd1b5ca57c Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 11:00:31 +0900 Subject: [PATCH 15/19] =?UTF-8?q?[#63]=20LexingError=EC=97=90=20backtrace?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/lexing_error.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/errors/lexing_error.rs b/src/errors/lexing_error.rs index 8cfdb779..68699899 100644 --- a/src/errors/lexing_error.rs +++ b/src/errors/lexing_error.rs @@ -1,14 +1,16 @@ use super::RRDBError; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Debug)] pub struct LexingError { pub message: String, + pub backtrace: std::backtrace::Backtrace, } impl LexingError { pub fn new(message: T) -> RRDBError { RRDBError::LexingError(Self { message: message.to_string(), + backtrace: std::backtrace::Backtrace::capture(), }) } } From 4bc3ab67f37df6ac4c15ed48933eab3289d2f6de Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 11:00:48 +0900 Subject: [PATCH 16/19] =?UTF-8?q?[#63]=20ParsingError=EC=97=90=20backtrace?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/parsing_error.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/errors/parsing_error.rs b/src/errors/parsing_error.rs index 266526cc..dd35e2b4 100644 --- a/src/errors/parsing_error.rs +++ b/src/errors/parsing_error.rs @@ -1,14 +1,16 @@ use super::RRDBError; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Debug)] pub struct ParsingError { pub message: String, + pub backtrace: std::backtrace::Backtrace, } impl ParsingError { pub fn new(message: T) -> RRDBError { RRDBError::ParsingError(Self { message: message.to_string(), + backtrace: std::backtrace::Backtrace::capture(), }) } } From a201cc18ff2988961c6d382666f128fac7329aa7 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 11:01:09 +0900 Subject: [PATCH 17/19] =?UTF-8?q?[#63]=20ServerError=EC=97=90=20backtrace?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/server_error.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/errors/server_error.rs b/src/errors/server_error.rs index 115bacfd..fb9370ea 100644 --- a/src/errors/server_error.rs +++ b/src/errors/server_error.rs @@ -1,12 +1,14 @@ -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Debug)] pub struct ServerError { pub message: String, + pub backtrace: std::backtrace::Backtrace, } impl ServerError { pub fn new(message: T) -> Self { Self { message: message.to_string(), + backtrace: std::backtrace::Backtrace::capture(), } } From 9a3a4a359b847b30cb84d4f39f0d2ce29016b1ef Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 11:01:26 +0900 Subject: [PATCH 18/19] =?UTF-8?q?[#63]=20TypeError=EC=97=90=20backtrace=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/errors/type_error.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/errors/type_error.rs b/src/errors/type_error.rs index 6dc9e155..0a195ddb 100644 --- a/src/errors/type_error.rs +++ b/src/errors/type_error.rs @@ -1,14 +1,16 @@ use super::RRDBError; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Debug)] pub struct TypeError { pub message: String, + pub backtrace: std::backtrace::Backtrace, } impl TypeError { pub fn new(message: T) -> RRDBError { RRDBError::TypeError(Self { message: message.to_string(), + backtrace: std::backtrace::Backtrace::capture(), }) } } From e602df510e40a9259fd37c116052e7113572e488 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sun, 24 Mar 2024 11:04:00 +0900 Subject: [PATCH 19/19] =?UTF-8?q?[#63]=20docs:=20README=EC=97=90=20psql=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EB=B2=95=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f6625c15..252869a1 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ cargo run --bin rrdb run #### Client ``` -psql -U rrdb -p 55555 +psql -U rrdb -p 55555 --host 0.0.0.0 ``` ---