1use crate::error::{DdbError, Result};
3use crate::lexer::{Token, TokenType};
4use super::ast::*;
5
6pub struct Parser {
7 tokens: Vec<Token>,
8 position: usize,
9}
10
11impl Parser {
12 pub fn new(tokens: Vec<Token>) -> Self {
13 Parser { tokens, position: 0 }
14 }
15
16 pub fn parse(&mut self) -> Result<Statement> {
18 let token = self.peek()?;
19
20 match &token.token_type {
21 TokenType::Select => self.parse_select(),
22 TokenType::Insert => self.parse_insert(),
23 TokenType::Update => self.parse_update(),
24 TokenType::Delete => self.parse_delete(),
25 TokenType::Upsert => self.parse_upsert(),
26 TokenType::Create => self.parse_create(),
27 TokenType::Drop => self.parse_drop(),
28 TokenType::Use => self.parse_use(),
29 TokenType::Show => self.parse_show(),
30 TokenType::Set => self.parse_set(),
31 TokenType::Begin => {
32 self.advance()?;
33 Ok(Statement::Begin)
34 }
35 TokenType::Commit => {
36 self.advance()?;
37 Ok(Statement::Commit)
38 }
39 TokenType::Rollback => {
40 self.advance()?;
41 Ok(Statement::Rollback)
42 }
43 _ => Err(DdbError::ParseError(format!(
44 "Unexpected token: {:?}",
45 token.token_type
46 ))),
47 }
48 }
49
50 fn parse_select(&mut self) -> Result<Statement> {
52 self.expect(TokenType::Select)?;
53
54 let distinct = self.match_token(TokenType::Distinct);
56
57 let columns = self.parse_select_columns()?;
59
60 let from = if self.match_token(TokenType::From) {
62 Some(self.expect_identifier()?)
63 } else {
64 None
65 };
66
67 let joins = self.parse_joins()?;
69
70 let where_clause = if self.match_token(TokenType::Where) {
72 Some(self.parse_expression()?)
73 } else {
74 None
75 };
76
77 let group_by = if self.match_token(TokenType::Group) {
79 self.expect(TokenType::By)?;
80 self.parse_group_by()?
81 } else if self.match_token(TokenType::GroupBy) {
82 self.parse_group_by()?
83 } else {
84 Vec::new()
85 };
86
87 let having = if self.match_token(TokenType::Having) {
89 Some(self.parse_expression()?)
90 } else {
91 None
92 };
93
94 let order_by = if self.match_token(TokenType::OrderBy) {
96 self.parse_order_by()?
97 } else if self.match_token(TokenType::Order) {
98 self.expect(TokenType::By)?;
99 self.parse_order_by()?
100 } else {
101 Vec::new()
102 };
103
104 let limit = if self.match_token(TokenType::Limit) {
106 Some(self.parse_limit()?)
107 } else {
108 None
109 };
110
111 Ok(Statement::Select(SelectStatement {
112 distinct,
113 columns,
114 from,
115 joins,
116 where_clause,
117 group_by,
118 having,
119 order_by,
120 limit,
121 }))
122 }
123
124 fn parse_select_columns(&mut self) -> Result<Vec<SelectColumn>> {
126 let mut columns = Vec::new();
127
128 loop {
129 if self.match_token(TokenType::Star) {
131 columns.push(SelectColumn::Wildcard);
132 } else if matches!(self.peek()?.token_type, TokenType::Identifier(_)) {
133 let name = self.expect_identifier()?;
134
135 if self.match_token(TokenType::LeftParen) {
137 let args = self.parse_function_args()?;
138 self.expect(TokenType::RightParen)?;
139
140 let alias = if self.match_token(TokenType::As) {
141 Some(self.expect_identifier()?)
142 } else {
143 None
144 };
145
146 columns.push(SelectColumn::Function { name, args, alias });
147 } else {
148 let alias = if self.match_token(TokenType::As) {
150 Some(self.expect_identifier()?)
151 } else {
152 None
153 };
154
155 columns.push(SelectColumn::Column { name, alias });
156 }
157 } else {
158 return Err(DdbError::ParseError(
159 "Expected column name or *".to_string()
160 ));
161 }
162
163 if !self.match_token(TokenType::Comma) {
164 break;
165 }
166 }
167
168 Ok(columns)
169 }
170
171 fn parse_order_by(&mut self) -> Result<Vec<OrderByColumn>> {
173 let mut order_by = Vec::new();
174
175 loop {
176 let column = self.expect_identifier()?;
177 let direction = if self.match_token(TokenType::Desc) {
178 OrderDirection::Desc
179 } else {
180 self.match_token(TokenType::Asc); OrderDirection::Asc
182 };
183
184 order_by.push(OrderByColumn { column, direction });
185
186 if !self.match_token(TokenType::Comma) {
187 break;
188 }
189 }
190
191 Ok(order_by)
192 }
193
194 fn parse_limit(&mut self) -> Result<Limit> {
196 let first = self.expect_integer()?;
197
198 if self.match_token(TokenType::Comma) {
199 let count = self.expect_integer()?;
201 Ok(Limit {
202 offset: Some(first as usize),
203 count: count as usize,
204 })
205 } else if self.match_token(TokenType::Offset) {
206 let offset = self.expect_integer()?;
208 Ok(Limit {
209 offset: Some(offset as usize),
210 count: first as usize,
211 })
212 } else {
213 Ok(Limit {
215 offset: None,
216 count: first as usize,
217 })
218 }
219 }
220
221 fn parse_joins(&mut self) -> Result<Vec<JoinClause>> {
223 let mut joins = Vec::new();
224
225 loop {
226 let join_type = if self.match_token(TokenType::Inner) {
228 self.expect(TokenType::Join)?;
229 JoinType::Inner
230 } else if self.match_token(TokenType::Left) {
231 self.match_token(TokenType::Outer); self.expect(TokenType::Join)?;
233 JoinType::Left
234 } else if self.match_token(TokenType::Right) {
235 self.match_token(TokenType::Outer); self.expect(TokenType::Join)?;
237 JoinType::Right
238 } else if self.match_token(TokenType::Full) {
239 self.match_token(TokenType::Outer); self.expect(TokenType::Join)?;
241 JoinType::Full
242 } else if self.match_token(TokenType::Join) {
243 JoinType::Inner
245 } else {
246 break;
248 };
249
250 let table = self.expect_identifier()?;
252
253 self.expect(TokenType::On)?;
255 let on_condition = self.parse_expression()?;
256
257 joins.push(JoinClause {
258 join_type,
259 table,
260 on_condition,
261 });
262 }
263
264 Ok(joins)
265 }
266
267 fn parse_group_by(&mut self) -> Result<Vec<String>> {
269 let mut group_by = Vec::new();
270
271 loop {
272 group_by.push(self.expect_identifier()?);
273
274 if !self.match_token(TokenType::Comma) {
275 break;
276 }
277 }
278
279 Ok(group_by)
280 }
281
282 fn parse_insert(&mut self) -> Result<Statement> {
284 self.expect(TokenType::Insert)?;
285 self.expect(TokenType::Into)?;
286
287 let table = self.expect_identifier()?;
288
289 let columns = if self.match_token(TokenType::LeftParen) {
291 let cols = self.parse_identifier_list()?;
292 self.expect(TokenType::RightParen)?;
293 cols
294 } else {
295 Vec::new()
296 };
297
298 self.expect(TokenType::Values)?;
299
300 let mut values = Vec::new();
302 loop {
303 self.expect(TokenType::LeftParen)?;
304 let value_row = self.parse_expression_list()?;
305 self.expect(TokenType::RightParen)?;
306 values.push(value_row);
307
308 if !self.match_token(TokenType::Comma) {
309 break;
310 }
311 }
312
313 Ok(Statement::Insert(InsertStatement {
314 table,
315 columns,
316 values,
317 }))
318 }
319
320 fn parse_upsert(&mut self) -> Result<Statement> {
323 self.expect(TokenType::Upsert)?;
324 self.expect(TokenType::Into)?;
325
326 let table = self.expect_identifier()?;
327
328 self.expect(TokenType::LeftParen)?;
330 let columns = self.parse_identifier_list()?;
331 self.expect(TokenType::RightParen)?;
332
333 self.expect(TokenType::Values)?;
334
335 let mut values = Vec::new();
337 loop {
338 self.expect(TokenType::LeftParen)?;
339 let value_row = self.parse_expression_list()?;
340 self.expect(TokenType::RightParen)?;
341 values.push(value_row);
342
343 if !self.match_token(TokenType::Comma) {
344 break;
345 }
346 }
347
348 self.expect(TokenType::On)?;
350 let key_column = self.expect_identifier()?;
351
352 Ok(Statement::Upsert(UpsertStatement {
353 table,
354 columns,
355 values,
356 key_column,
357 }))
358 }
359
360 fn parse_update(&mut self) -> Result<Statement> {
362 self.expect(TokenType::Update)?;
363 let table = self.expect_identifier()?;
364 self.expect(TokenType::Set)?;
365
366 let mut assignments = Vec::new();
368 loop {
369 let column = self.expect_identifier()?;
370 self.expect(TokenType::Equal)?;
371 let value = self.parse_expression()?;
372 assignments.push((column, value));
373
374 if !self.match_token(TokenType::Comma) {
375 break;
376 }
377 }
378
379 let where_clause = if self.match_token(TokenType::Where) {
381 Some(self.parse_expression()?)
382 } else {
383 None
384 };
385
386 Ok(Statement::Update(UpdateStatement {
387 table,
388 assignments,
389 where_clause,
390 }))
391 }
392
393 fn parse_delete(&mut self) -> Result<Statement> {
395 self.expect(TokenType::Delete)?;
396 self.expect(TokenType::From)?;
397 let table = self.expect_identifier()?;
398
399 let where_clause = if self.match_token(TokenType::Where) {
400 Some(self.parse_expression()?)
401 } else {
402 None
403 };
404
405 Ok(Statement::Delete(DeleteStatement {
406 table,
407 where_clause,
408 }))
409 }
410
411 fn parse_create(&mut self) -> Result<Statement> {
413 self.expect(TokenType::Create)?;
414 self.expect(TokenType::Table)?;
415
416 let if_not_exists = if self.match_token(TokenType::If) {
418 self.expect(TokenType::Not)?;
419 self.expect(TokenType::Exists)?;
420 true
421 } else {
422 false
423 };
424
425 let name = self.expect_identifier()?;
426
427 self.expect(TokenType::LeftParen)?;
428 let columns = self.parse_column_definitions()?;
429 self.expect(TokenType::RightParen)?;
430
431 let mut file_path = String::new();
433 let mut delimiter = None;
434 let mut data_starts_on = None;
435 let mut comment_char = None;
436 let mut quote_char = None;
437
438 if self.match_token(TokenType::File) {
439 file_path = self.expect_string()?;
440 }
441
442 if self.match_token(TokenType::Delimiter) {
443 let delim_str = self.expect_string()?;
444 delimiter = delim_str.chars().next();
445 }
446
447 while let Ok(token) = self.peek() {
449 if let TokenType::Identifier(ref id) = token.token_type {
450 match id.to_uppercase().as_str() {
451 "DATA_STARTS_ON" => {
452 self.advance()?;
453 data_starts_on = Some(self.expect_integer()? as usize);
454 }
455 "COMMENT_CHAR" => {
456 self.advance()?;
457 let comment_str = self.expect_string()?;
458 comment_char = comment_str.chars().next();
459 }
460 "QUOTE_CHAR" => {
461 self.advance()?;
462 let quote_str = self.expect_string()?;
463 quote_char = quote_str.chars().next();
464 }
465 _ => break,
466 }
467 } else {
468 break;
469 }
470 }
471
472 Ok(Statement::CreateTable(CreateTableStatement {
473 name,
474 columns,
475 file_path,
476 delimiter,
477 data_starts_on,
478 comment_char,
479 quote_char,
480 if_not_exists,
481 }))
482 }
483
484 fn parse_column_definitions(&mut self) -> Result<Vec<ColumnDefinition>> {
486 let mut columns = Vec::new();
487
488 loop {
489 let col_name = self.expect_identifier()?;
490
491 let type_str = self.expect_identifier()?;
493 let data_type = self.parse_column_type(&type_str)?;
494
495 let nullable = if self.match_token(TokenType::Not) {
497 self.expect(TokenType::Null)?;
498 false
499 } else {
500 self.match_token(TokenType::Null); true
502 };
503
504 columns.push(ColumnDefinition {
505 name: col_name,
506 data_type,
507 nullable,
508 });
509
510 if !self.match_token(TokenType::Comma) {
511 break;
512 }
513 }
514
515 Ok(columns)
516 }
517
518 fn parse_column_type(&self, type_str: &str) -> Result<ColumnType> {
520 match type_str.to_uppercase().as_str() {
521 "INTEGER" | "INT" => Ok(ColumnType::Integer),
522 "FLOAT" | "DOUBLE" | "REAL" => Ok(ColumnType::Float),
523 "STRING" | "VARCHAR" | "TEXT" | "CHAR" => Ok(ColumnType::String),
524 "BOOLEAN" | "BOOL" => Ok(ColumnType::Boolean),
525 "DATE" => Ok(ColumnType::Date),
526 "DATETIME" | "TIMESTAMP" => Ok(ColumnType::DateTime),
527 "TIME" => Ok(ColumnType::Time),
528 _ => Err(DdbError::ParseError(format!(
529 "Unknown column type: {}",
530 type_str
531 ))),
532 }
533 }
534
535 fn parse_drop(&mut self) -> Result<Statement> {
537 self.expect(TokenType::Drop)?;
538 self.expect(TokenType::Table)?;
539
540 let if_exists = if self.match_token(TokenType::If) {
542 self.expect(TokenType::Exists)?;
543 true
544 } else {
545 false
546 };
547
548 let name = self.expect_identifier()?;
549
550 Ok(Statement::DropTable(DropTableStatement { name, if_exists }))
551 }
552
553 fn parse_use(&mut self) -> Result<Statement> {
555 self.expect(TokenType::Use)?;
556 let database = self.expect_identifier()?;
557
558 Ok(Statement::Use(UseStatement { database }))
559 }
560
561 fn parse_show(&mut self) -> Result<Statement> {
563 self.expect(TokenType::Show)?;
564
565 let token = self.peek()?;
566 let show_stmt = match &token.token_type {
567 TokenType::Tables => {
568 self.advance()?;
569 ShowStatement::Tables
570 }
571 TokenType::Columns => {
572 self.advance()?;
573 self.expect(TokenType::From)?;
574 let table = self.expect_identifier()?;
575 ShowStatement::Columns(table)
576 }
577 TokenType::Variables => {
578 self.advance()?;
579 ShowStatement::Variables
580 }
581 _ => {
582 return Err(DdbError::ParseError(format!(
583 "Expected TABLES, COLUMNS, or VARIABLES after SHOW, got {:?}",
584 token.token_type
585 )))
586 }
587 };
588
589 Ok(Statement::Show(show_stmt))
590 }
591
592 fn parse_set(&mut self) -> Result<Statement> {
594 self.expect(TokenType::Set)?;
595 let variable = self.expect_identifier()?;
596 self.expect(TokenType::Equal)?;
597 let value = self.parse_expression()?;
598
599 Ok(Statement::Set(SetStatement { variable, value }))
600 }
601
602 fn parse_expression(&mut self) -> Result<Expression> {
604 self.parse_or_expression()
605 }
606
607 fn parse_or_expression(&mut self) -> Result<Expression> {
609 let mut left = self.parse_and_expression()?;
610
611 while self.match_token(TokenType::Or) {
612 let right = self.parse_and_expression()?;
613 left = Expression::BinaryOp {
614 left: Box::new(left),
615 op: BinaryOperator::Or,
616 right: Box::new(right),
617 };
618 }
619
620 Ok(left)
621 }
622
623 fn parse_and_expression(&mut self) -> Result<Expression> {
625 let mut left = self.parse_comparison_expression()?;
626
627 while self.match_token(TokenType::And) {
628 let right = self.parse_comparison_expression()?;
629 left = Expression::BinaryOp {
630 left: Box::new(left),
631 op: BinaryOperator::And,
632 right: Box::new(right),
633 };
634 }
635
636 Ok(left)
637 }
638
639 fn parse_comparison_expression(&mut self) -> Result<Expression> {
641 let mut left = self.parse_primary_expression()?;
642
643 while let Some(op) = self.match_comparison_op() {
644 let right = self.parse_primary_expression()?;
645 left = Expression::BinaryOp {
646 left: Box::new(left),
647 op,
648 right: Box::new(right),
649 };
650 }
651
652 Ok(left)
653 }
654
655 fn match_comparison_op(&mut self) -> Option<BinaryOperator> {
657 let token = self.peek().ok()?;
658
659 let op = match &token.token_type {
660 TokenType::Equal => Some(BinaryOperator::Equal),
661 TokenType::NotEqual => Some(BinaryOperator::NotEqual),
662 TokenType::GreaterThan => Some(BinaryOperator::GreaterThan),
663 TokenType::GreaterEqual => Some(BinaryOperator::GreaterEqual),
664 TokenType::LessThan => Some(BinaryOperator::LessThan),
665 TokenType::LessEqual => Some(BinaryOperator::LessEqual),
666 TokenType::Like => Some(BinaryOperator::Like),
667 _ => None,
668 };
669
670 if op.is_some() {
671 self.advance().ok();
672 }
673
674 op
675 }
676
677 fn parse_primary_expression(&mut self) -> Result<Expression> {
679 let token = self.peek()?;
680
681 match &token.token_type {
682 TokenType::Not => {
683 self.advance()?;
684 let operand = self.parse_primary_expression()?;
685 Ok(Expression::UnaryOp {
686 op: UnaryOperator::Not,
687 operand: Box::new(operand),
688 })
689 }
690 TokenType::String(s) => {
691 let s = s.clone();
692 self.advance()?;
693 Ok(Expression::Literal(Literal::String(s)))
694 }
695 TokenType::Number(n_str) => {
696 let n_str = n_str.clone();
697 self.advance()?;
698
699 if let Ok(i) = n_str.parse::<i64>() {
701 Ok(Expression::Literal(Literal::Integer(i)))
702 } else if let Ok(f) = n_str.parse::<f64>() {
703 Ok(Expression::Literal(Literal::Number(f)))
704 } else {
705 Err(DdbError::ParseError(format!("Invalid number: {}", n_str)))
706 }
707 }
708 TokenType::True => {
709 self.advance()?;
710 Ok(Expression::Literal(Literal::Boolean(true)))
711 }
712 TokenType::False => {
713 self.advance()?;
714 Ok(Expression::Literal(Literal::Boolean(false)))
715 }
716 TokenType::Null => {
717 self.advance()?;
718 Ok(Expression::Literal(Literal::Null))
719 }
720 TokenType::Identifier(_) => {
721 let name = self.expect_identifier()?;
722
723 if name.starts_with("@@") {
725 let var_name = name[2..].to_string();
726 return Ok(Expression::SystemVariable(var_name));
727 }
728
729 if self.match_token(TokenType::LeftParen) {
731 let args = self.parse_function_args()?;
732 self.expect(TokenType::RightParen)?;
733 Ok(Expression::Function { name, args })
734 } else {
735 if self.match_token(TokenType::Is) {
737 self.expect(TokenType::Null)?;
738 Ok(Expression::UnaryOp {
739 op: UnaryOperator::IsNull,
740 operand: Box::new(Expression::Column(name)),
741 })
742 } else {
743 Ok(Expression::Column(name))
744 }
745 }
746 }
747 TokenType::LeftParen => {
748 self.advance()?;
749 let expr = self.parse_expression()?;
750 self.expect(TokenType::RightParen)?;
751 Ok(expr)
752 }
753 _ => Err(DdbError::ParseError(format!(
754 "Unexpected token in expression: {:?}",
755 token.token_type
756 ))),
757 }
758 }
759
760 fn parse_function_args(&mut self) -> Result<Vec<Expression>> {
762 let mut args = Vec::new();
763
764 if matches!(self.peek()?.token_type, TokenType::RightParen) {
766 return Ok(args);
767 }
768
769 if self.match_token(TokenType::Star) {
771 args.push(Expression::Column("*".to_string()));
772 return Ok(args);
773 }
774
775 loop {
776 args.push(self.parse_expression()?);
777
778 if !self.match_token(TokenType::Comma) {
779 break;
780 }
781 }
782
783 Ok(args)
784 }
785
786 fn parse_expression_list(&mut self) -> Result<Vec<Expression>> {
788 let mut exprs = Vec::new();
789
790 loop {
791 exprs.push(self.parse_expression()?);
792
793 if !self.match_token(TokenType::Comma) {
794 break;
795 }
796 }
797
798 Ok(exprs)
799 }
800
801 fn parse_identifier_list(&mut self) -> Result<Vec<String>> {
803 let mut identifiers = Vec::new();
804
805 loop {
806 identifiers.push(self.expect_identifier()?);
807
808 if self.peek().ok().map(|t| matches!(t.token_type, TokenType::Identifier(_))).unwrap_or(false) {
810 self.advance()?;
811 }
812
813 if !self.match_token(TokenType::Comma) {
814 break;
815 }
816 }
817
818 Ok(identifiers)
819 }
820
821 fn peek(&self) -> Result<&Token> {
825 self.tokens.get(self.position).ok_or_else(|| {
826 DdbError::ParseError("Unexpected end of input".to_string())
827 })
828 }
829
830 fn advance(&mut self) -> Result<&Token> {
832 let pos = self.position;
833 if pos >= self.tokens.len() {
834 return Err(DdbError::ParseError("Unexpected end of input".to_string()));
835 }
836 self.position += 1;
837 Ok(&self.tokens[pos])
838 }
839
840 fn match_token(&mut self, expected: TokenType) -> bool {
842 if let Ok(token) = self.peek() {
843 if std::mem::discriminant(&token.token_type) == std::mem::discriminant(&expected) {
844 self.advance().ok();
845 return true;
846 }
847 }
848 false
849 }
850
851 fn expect(&mut self, expected: TokenType) -> Result<()> {
853 let token = self.peek()?;
854 if std::mem::discriminant(&token.token_type) == std::mem::discriminant(&expected) {
855 self.advance()?;
856 Ok(())
857 } else {
858 Err(DdbError::ParseError(format!(
859 "Expected {:?}, got {:?}",
860 expected, token.token_type
861 )))
862 }
863 }
864
865 fn expect_identifier(&mut self) -> Result<String> {
867 let token = self.advance()?;
868 match &token.token_type {
869 TokenType::Identifier(name) => Ok(name.clone()),
870 _ => Err(DdbError::ParseError(format!(
871 "Expected identifier, got {:?}",
872 token.token_type
873 ))),
874 }
875 }
876
877 fn expect_string(&mut self) -> Result<String> {
879 let token = self.advance()?;
880 match &token.token_type {
881 TokenType::String(s) => Ok(s.clone()),
882 _ => Err(DdbError::ParseError(format!(
883 "Expected string, got {:?}",
884 token.token_type
885 ))),
886 }
887 }
888
889 fn expect_integer(&mut self) -> Result<i64> {
891 let token = self.advance()?;
892 match &token.token_type {
893 TokenType::Number(n_str) => {
894 n_str.parse::<i64>().map_err(|_| {
895 DdbError::ParseError(format!("Expected integer, got: {}", n_str))
896 })
897 }
898 _ => Err(DdbError::ParseError(format!(
899 "Expected integer, got {:?}",
900 token.token_type
901 ))),
902 }
903 }
904}
905
906#[cfg(test)]
907mod tests {
908 use super::*;
909 use crate::lexer::Tokenizer;
910
911 fn parse_sql(sql: &str) -> Result<Statement> {
912 let mut tokenizer = Tokenizer::new();
913 let tokens = tokenizer.tokenize(sql)?;
914 let mut parser = Parser::new(tokens);
915 parser.parse()
916 }
917
918 #[test]
919 fn test_parse_simple_select() {
920 let stmt = parse_sql("SELECT * FROM users").unwrap();
921
922 match stmt {
923 Statement::Select(sel) => {
924 assert!(!sel.distinct);
925 assert_eq!(sel.columns.len(), 1);
926 assert!(matches!(sel.columns[0], SelectColumn::Wildcard));
927 assert_eq!(sel.from, Some("users".to_string()));
928 assert!(sel.where_clause.is_none());
929 }
930 _ => panic!("Expected SELECT statement"),
931 }
932 }
933
934 #[test]
935 fn test_parse_select_with_columns() {
936 let stmt = parse_sql("SELECT id, name, email FROM users").unwrap();
937
938 match stmt {
939 Statement::Select(sel) => {
940 assert_eq!(sel.columns.len(), 3);
941 }
942 _ => panic!("Expected SELECT statement"),
943 }
944 }
945
946 #[test]
947 fn test_parse_select_with_where() {
948 let stmt = parse_sql("SELECT * FROM users WHERE age > 18").unwrap();
949
950 match stmt {
951 Statement::Select(sel) => {
952 assert!(sel.where_clause.is_some());
953 }
954 _ => panic!("Expected SELECT statement"),
955 }
956 }
957
958 #[test]
959 fn test_parse_select_with_functions() {
960 let stmt = parse_sql("SELECT COUNT(*), AVG(age) FROM users").unwrap();
961
962 match stmt {
963 Statement::Select(sel) => {
964 assert_eq!(sel.columns.len(), 2);
965 }
966 _ => panic!("Expected SELECT statement"),
967 }
968 }
969
970 #[test]
971 fn test_parse_select_with_order_by() {
972 let stmt = parse_sql("SELECT * FROM users ORDER BY name ASC, age DESC").unwrap();
973
974 match stmt {
975 Statement::Select(sel) => {
976 assert_eq!(sel.order_by.len(), 2);
977 assert!(matches!(sel.order_by[0].direction, OrderDirection::Asc));
978 assert!(matches!(sel.order_by[1].direction, OrderDirection::Desc));
979 }
980 _ => panic!("Expected SELECT statement"),
981 }
982 }
983
984 #[test]
985 fn test_parse_select_with_limit() {
986 let stmt = parse_sql("SELECT * FROM users LIMIT 10").unwrap();
987
988 match stmt {
989 Statement::Select(sel) => {
990 assert!(sel.limit.is_some());
991 let limit = sel.limit.unwrap();
992 assert_eq!(limit.count, 10);
993 assert!(limit.offset.is_none());
994 }
995 _ => panic!("Expected SELECT statement"),
996 }
997 }
998
999 #[test]
1000 fn test_parse_insert() {
1001 let stmt = parse_sql("INSERT INTO users (name, email) VALUES ('John', 'john@test.com')").unwrap();
1002
1003 match stmt {
1004 Statement::Insert(ins) => {
1005 assert_eq!(ins.table, "users");
1006 assert_eq!(ins.columns.len(), 2);
1007 assert_eq!(ins.values.len(), 1);
1008 }
1009 _ => panic!("Expected INSERT statement"),
1010 }
1011 }
1012
1013 #[test]
1014 fn test_parse_update() {
1015 let stmt = parse_sql("UPDATE users SET name = 'Jane' WHERE id = 1").unwrap();
1016
1017 match stmt {
1018 Statement::Update(upd) => {
1019 assert_eq!(upd.table, "users");
1020 assert_eq!(upd.assignments.len(), 1);
1021 assert!(upd.where_clause.is_some());
1022 }
1023 _ => panic!("Expected UPDATE statement"),
1024 }
1025 }
1026
1027 #[test]
1028 fn test_parse_delete() {
1029 let stmt = parse_sql("DELETE FROM users WHERE id = 1").unwrap();
1030
1031 match stmt {
1032 Statement::Delete(del) => {
1033 assert_eq!(del.table, "users");
1034 assert!(del.where_clause.is_some());
1035 }
1036 _ => panic!("Expected DELETE statement"),
1037 }
1038 }
1039
1040 #[test]
1041 fn test_parse_create_table() {
1042 let stmt = parse_sql(
1043 "CREATE TABLE users (id INTEGER NOT NULL, name STRING, age INTEGER)"
1044 ).unwrap();
1045
1046 match stmt {
1047 Statement::CreateTable(create) => {
1048 assert_eq!(create.name, "users");
1049 assert_eq!(create.columns.len(), 3);
1050 assert_eq!(create.columns[0].name, "id");
1051 assert!(matches!(create.columns[0].data_type, ColumnType::Integer));
1052 assert!(!create.columns[0].nullable);
1053 assert_eq!(create.columns[1].name, "name");
1054 assert!(matches!(create.columns[1].data_type, ColumnType::String));
1055 assert!(create.columns[1].nullable);
1056 assert_eq!(create.columns[2].name, "age");
1057 assert!(matches!(create.columns[2].data_type, ColumnType::Integer));
1058 assert!(create.columns[2].nullable);
1059 assert!(!create.if_not_exists);
1060 }
1061 _ => panic!("Expected CREATE TABLE statement"),
1062 }
1063 }
1064
1065 #[test]
1066 fn test_parse_create_table_if_not_exists() {
1067 let stmt = parse_sql(
1068 "CREATE TABLE IF NOT EXISTS users (id INTEGER NOT NULL)"
1069 ).unwrap();
1070
1071 match stmt {
1072 Statement::CreateTable(create) => {
1073 assert_eq!(create.name, "users");
1074 assert!(create.if_not_exists);
1075 assert_eq!(create.columns.len(), 1);
1076 }
1077 _ => panic!("Expected CREATE TABLE statement"),
1078 }
1079 }
1080
1081 #[test]
1082 fn test_parse_create_table_with_options() {
1083 let stmt = parse_sql(
1084 "CREATE TABLE users (id INTEGER, name STRING) FILE '/path/to/file.csv' DELIMITER ',' DATA_STARTS_ON 2 COMMENT_CHAR '#' QUOTE_CHAR '\"'"
1085 ).unwrap();
1086
1087 match stmt {
1088 Statement::CreateTable(create) => {
1089 assert_eq!(create.name, "users");
1090 assert_eq!(create.file_path, "/path/to/file.csv");
1091 assert_eq!(create.delimiter, Some(','));
1092 assert_eq!(create.data_starts_on, Some(2));
1093 assert_eq!(create.comment_char, Some('#'));
1094 assert_eq!(create.quote_char, Some('"'));
1095 }
1096 _ => panic!("Expected CREATE TABLE statement"),
1097 }
1098 }
1099
1100 #[test]
1101 fn test_parse_drop_table() {
1102 let stmt = parse_sql("DROP TABLE users").unwrap();
1103
1104 match stmt {
1105 Statement::DropTable(drop) => {
1106 assert_eq!(drop.name, "users");
1107 assert!(!drop.if_exists);
1108 }
1109 _ => panic!("Expected DROP TABLE statement"),
1110 }
1111 }
1112
1113 #[test]
1114 fn test_parse_drop_table_if_exists() {
1115 let stmt = parse_sql("DROP TABLE IF EXISTS users").unwrap();
1116
1117 match stmt {
1118 Statement::DropTable(drop) => {
1119 assert_eq!(drop.name, "users");
1120 assert!(drop.if_exists);
1121 }
1122 _ => panic!("Expected DROP TABLE statement"),
1123 }
1124 }
1125
1126 #[test]
1127 fn test_parse_set() {
1128 let stmt = parse_sql("SET output_format = 'json'").unwrap();
1129
1130 match stmt {
1131 Statement::Set(set) => {
1132 assert_eq!(set.variable, "output_format");
1133 match set.value {
1134 Expression::Literal(Literal::String(s)) => assert_eq!(s, "json"),
1135 _ => panic!("Expected string literal"),
1136 }
1137 }
1138 _ => panic!("Expected SET statement"),
1139 }
1140 }
1141
1142 #[test]
1143 fn test_parse_set_with_number() {
1144 let stmt = parse_sql("SET max_rows = 100").unwrap();
1145
1146 match stmt {
1147 Statement::Set(set) => {
1148 assert_eq!(set.variable, "max_rows");
1149 match set.value {
1150 Expression::Literal(Literal::Integer(i)) => assert_eq!(i, 100),
1151 _ => panic!("Expected integer literal"),
1152 }
1153 }
1154 _ => panic!("Expected SET statement"),
1155 }
1156 }
1157}