diff --git a/test/test_ast.ml b/test/test_ast.ml index 21ffc2e..a7a188b 100644 --- a/test/test_ast.ml +++ b/test/test_ast.ml @@ -11,70 +11,164 @@ let query_testable = Alcotest.testable Ast.pp_query equal_ast let test_simple_select () = - let q1 = parse "SELECT a FROM t" in - let ast1 = Query(Select([Column("a")], [Table("t")], None)) in - Alcotest.(check query_testable) "Ok" q1 ast1; - - let q2 = parse "SELECT * FROM t" in - let ast2 = Query(Select([Asterisk], [Table("t")], None)) in - Alcotest.(check query_testable) "Ok2" q2 ast2 - -let test_default_join () = - let q1 = parse "SELECT a FROM t1 JOIN t2 ON a = b" in + let query = "SELECT a FROM t" in + let q1 = parse query in let ast1 = Query( Select( - [Column("a")], - [Join( - Table("t1"), - Left, - Table("t2"), - Some( - Condition( - Ref("a"), - Comparison(Equals, Ref("b")) + [ + Column( + Ref("a"), + None + ) + ], + Some( + [ + Table("t") + ] + ), + None + ) + ) in + Alcotest.(check query_testable) query q1 ast1; + + let query = "SELECT * FROM t" in + let q2 = parse query in + let ast2 = Query( + Select( + [ + Asterisk + ], + Some( + [ + Table("t") + ] + t ), + None + ) + ) in + Alcotest.(check query_testable) query q2 ast2 ; + + let query = "SELECT 'a'" in + let q3 = parse query in + let ast3 = Query( + Select( + [ + Column( + StringLiteral("a"), + None + ) + ], + None, + None + ) + ) in + Alcotest.(check query_testable) query q3 ast3; + + let q4 = parse "SELECT DATE '2024-12-25' AS date" in + let ast4 = Query( + Select( + [ + Column( + DateLiteral("2024-12-25"), + Some( + As("date") ) ) - )], + ], + None, + None + ) + ) in + Alcotest.(check query_testable) "OK" q4 ast4 + +let test_default_join () = + let q1 = parse "SELECT a FROM t1 JOIN t2 ON b = c" in + let ast1 = Query( + Select( + [ + Column( + Ref("a"), + None + ) + ], + Some( + [ + Join( + Table("t1"), + Left, + Table("t2"), + Some( + Condition( + Ref("b"), + Comparison( + Equals, + Ref("c")) + ) + ) + ) + ] + ), None ) ) in Alcotest.(check query_testable) "Ok" q1 ast1 let test_left_join () = - let q1 = parse "SELECT a FROM t1 LEFT JOIN t2 ON a = b" in + let query = "SELECT a FROM t1 LEFT JOIN t2 ON a = b" in + let q1 = parse query in let ast1 = Query( - Select([Column("a")], - [Join( - Table("t1"), - Left, - Table("t2"), - Some( - Condition( - Ref("a"), - Comparison(Equals, Ref("b")) - ) + Select( + [ + Column( + Ref("a"), + None ) - )], + ], + Some( + [ + Join( + Table("t1"), + Left, + Table("t2"), + Some( + Condition( + Ref("a"), + Comparison(Equals, Ref("b")) + ) + ) + ) + ] + ), None ) ) in - Alcotest.(check query_testable) "Ok" q1 ast1 + Alcotest.(check query_testable) query q1 ast1 let test_right_join () = let q1 = parse "SELECT a FROM t1 RIGHT JOIN t2 ON a = b" in let ast1 = Query( - Select([Column("a")], - [Join( - Table("t1"), - Right, - Table("t2"), - Some( - Condition( - Ref("a"), - Comparison(Equals, Ref("b")) - ) + Select( + [ + Column( + Ref("a"), + None ) - )], + ], + Some( + [ + Join( + Table("t1"), + Right, + Table("t2"), + Some( + Condition( + Ref("a"), + Comparison(Equals, Ref("b")) + ) + ) + ) + ] + ), None ) ) in @@ -83,18 +177,28 @@ let test_right_join () = let test_inner_join () = let q1 = parse "SELECT a FROM t1 INNER JOIN t2 ON a = b" in let ast1 = Query( - Select([Column("a")], - [Join( - Table("t1"), - Inner, - Table("t2"), - Some( - Condition( - Ref("a"), - Comparison(Equals, Ref("b")) - ) + Select( + [ + Column( + Ref("a"), + None ) - )], + ], + Some( + [ + Join( + Table("t1"), + Inner, + Table("t2"), + Some( + Condition( + Ref("a"), + Comparison(Equals, Ref("b")) + ) + ) + ) + ] + ), None ) ) in @@ -103,13 +207,23 @@ let test_inner_join () = let test_union_join () = let q1 = parse "SELECT a FROM t1 UNION JOIN t2" in let ast1 = Query( - Select([Column("a")], - [Join( - Table("t1"), - Union, - Table("t2"), - None - )], + Select( + [ + Column( + Ref("a"), + None + ) + ], + Some( + [ + Join( + Table("t1"), + Union, + Table("t2"), + None + ) + ] + ), None ) ) in @@ -118,13 +232,23 @@ let test_union_join () = let test_cross_join () = let q1 = parse "SELECT a FROM t1 CROSS JOIN t2" in let ast1 = Query( - Select([Column("a")], - [Join( - Table("t1"), - Cross, - Table("t2"), - None - )], + Select( + [ + Column( + Ref("a"), + None + ) + ], + Some( + [ + Join( + Table("t1"), + Cross, + Table("t2"), + None + ) + ] + ), None ) ) in @@ -133,13 +257,23 @@ let test_cross_join () = let test_natural_join () = let q1 = parse "SELECT a FROM t1 NATURAL JOIN t2" in let ast1 = Query( - Select([Column("a")], - [Join( - Table("t1"), - Natural, - Table("t2"), - None - )], + Select( + [ + Column( + Ref("a"), + None + ) + ], + Some( + [ + Join( + Table("t1"), + Natural, + Table("t2"), + None + ) + ] + ), None ) ) in @@ -148,30 +282,37 @@ let test_natural_join () = let test_join_join () = let q1 = parse "SELECT a FROM t1 JOIN t2 ON a = b JOIN t3 ON a = c" in let ast1 = Query( - Select([Column("a")], [ - Join( + Select( + [ + Column( + Ref("a"), + None + ) + ], + Some([ Join( - Table("t1"), - Left, - Table("t2"), + Join( + Table("t1"), + Left, + Table("t2"), + Some( + Condition( + Ref("a"), + Comparison(Equals, Ref("b")) + ) + ) + ), + Left, + Table("t3"), Some( Condition( Ref("a"), - Comparison(Equals, Ref("b")) + Comparison(Equals, Ref("c")) ) - ) - ), - Left, - Table("t3"), - Some( - Condition( - Ref("a"), - Comparison(Equals, Ref("c")) ) ) - ) - ], - None + ]), + None ) ) in Alcotest.(check query_testable) "Ok" q1 ast1 @@ -180,8 +321,17 @@ let test_where_equals () = let q1 = parse "SELECT a FROM t1 WHERE a = a OR a = b" in let ast1 = Query( Select( - [Column("a")], - [Table("t1")], + [ + Column( + Ref("a"), + None + ) + ], + Some( + [ + Table("t1") + ] + ), None ) ) in