diff --git a/src/cli/ast/delete_statement.rs b/src/cli/ast/delete_statement.rs
index 185fde9..5f80b8c 100644
--- a/src/cli/ast/delete_statement.rs
+++ b/src/cli/ast/delete_statement.rs
@@ -34,7 +34,8 @@ mod tests {
use crate::cli::ast::OrderByDirection;
use crate::cli::ast::LimitClause;
use crate::cli::ast::Operator;
- use crate::cli::ast::WhereClause;
+ use crate::cli::ast::WhereStackElement;
+ use crate::cli::ast::WhereCondition;
use crate::db::table::Value;
#[test]
@@ -86,15 +87,19 @@ mod tests {
let statement = result.unwrap();
let expected = SqlStatement::DeleteStatement(DeleteStatement {
table_name: "users".to_string(),
- where_clause: Some(WhereClause {
- column: "id".to_string(),
- operator: Operator::Equals,
- value: Value::Integer(1),
- }),
- order_by_clause: Some(vec![OrderByClause {
- column: "id".to_string(),
- direction: OrderByDirection::Asc,
- }]),
+ where_clause: Some(vec![
+ WhereStackElement::Condition(WhereCondition {
+ column: "id".to_string(),
+ operator: Operator::Equals,
+ value: Value::Integer(1),
+ })
+ ]),
+ order_by_clause: Some(vec![
+ OrderByClause {
+ column: "id".to_string(),
+ direction: OrderByDirection::Asc,
+ }
+ ]),
limit_clause: Some(LimitClause {
limit: Value::Integer(10),
offset: Some(Value::Integer(5)),
diff --git a/src/cli/ast/helpers/where_clause.rs b/src/cli/ast/helpers/where_clause.rs
index 790e4f1..0df3090 100644
--- a/src/cli/ast/helpers/where_clause.rs
+++ b/src/cli/ast/helpers/where_clause.rs
@@ -1,42 +1,196 @@
-use crate::cli::ast::{parser::Parser, WhereClause, Operator, helpers::common::{expect_token_type, token_to_value}};
+use crate::cli::ast::{
+ helpers::common::{expect_token_type, token_to_value},
+ parser::Parser,
+ Operator, WhereCondition, WhereStackElement, LogicalOperator, Parentheses, WhereStackOperators,
+};
use crate::cli::tokenizer::token::TokenTypes;
-pub fn get_where_clause(parser: &mut Parser) -> Result