These is the tests for all the bits which aren't in the other files, mainly query exprs except the tablerefs. These tests focus on one part of the query expression. The FullQueries tests focus on parsing more complex query expressions. > module Language.SQL.SimpleSQL.Misc (miscTests) where > import Language.SQL.SimpleSQL.TestTypes > import Language.SQL.SimpleSQL.Syntax > miscTests :: TestItem > miscTests = Group "miscTests" > [duplicates > ,selectLists > ,whereClause > ,groupByClause > ,having > ,orderBy > ,limit > ,combos > ,withQueries > ,queryExprsTests > ] > duplicates :: TestItem > duplicates = Group "duplicates" $ map (uncurry TestQueryExpr) > [("select a from t" ,ms All) > ,("select all a from t" ,ms All) > ,("select distinct a from t", ms Distinct) > ] > where > ms d = makeSelect > {qeDuplicates = d > ,qeSelectList = [(Nothing,Iden "a")] > ,qeFrom = [TRSimple "t"]} > selectLists :: TestItem > selectLists = Group "selectLists" $ map (uncurry TestQueryExpr) > [("select 1", > makeSelect {qeSelectList = [(Nothing,NumLit "1")]}) > ,("select a" > ,makeSelect {qeSelectList = [(Nothing,Iden "a")]}) > ,("select a,b" > ,makeSelect {qeSelectList = [(Nothing,Iden "a") > ,(Nothing,Iden "b")]}) > ,("select 1+2,3+4" > ,makeSelect {qeSelectList = > [(Nothing,BinOp (NumLit "1") "+" (NumLit "2")) > ,(Nothing,BinOp (NumLit "3") "+" (NumLit "4"))]}) > ,("select a as a, /*comment*/ b as b" > ,makeSelect {qeSelectList = [(Just "a", Iden "a") > ,(Just "b", Iden "b")]}) > ,("select a a, b b" > ,makeSelect {qeSelectList = [(Just "a", Iden "a") > ,(Just "b", Iden "b")]}) > ] > whereClause :: TestItem > whereClause = Group "whereClause" $ map (uncurry TestQueryExpr) > [("select a from t where a = 5" > ,makeSelect {qeSelectList = [(Nothing,Iden "a")] > ,qeFrom = [TRSimple "t"] > ,qeWhere = Just $ BinOp (Iden "a") "=" (NumLit "5")}) > ] > groupByClause :: TestItem > groupByClause = Group "groupByClause" $ map (uncurry TestQueryExpr) > [("select a,sum(b) from t group by a" > ,makeSelect {qeSelectList = [(Nothing, Iden "a") > ,(Nothing, App "sum" [Iden "b"])] > ,qeFrom = [TRSimple "t"] > ,qeGroupBy = [Iden "a"] > }) > ,("select a,b,sum(c) from t group by a,b" > ,makeSelect {qeSelectList = [(Nothing, Iden "a") > ,(Nothing, Iden "b") > ,(Nothing, App "sum" [Iden "c"])] > ,qeFrom = [TRSimple "t"] > ,qeGroupBy = [Iden "a",Iden "b"] > }) > ] > having :: TestItem > having = Group "having" $ map (uncurry TestQueryExpr) > [("select a,sum(b) from t group by a having sum(b) > 5" > ,makeSelect {qeSelectList = [(Nothing, Iden "a") > ,(Nothing, App "sum" [Iden "b"])] > ,qeFrom = [TRSimple "t"] > ,qeGroupBy = [Iden "a"] > ,qeHaving = Just $ BinOp (App "sum" [Iden "b"]) > ">" (NumLit "5") > }) > ] > orderBy :: TestItem > orderBy = Group "orderBy" $ map (uncurry TestQueryExpr) > [("select a from t order by a" > ,ms [(Iden "a", Asc)]) > ,("select a from t order by a, b" > ,ms [(Iden "a", Asc), (Iden "b", Asc)]) > ,("select a from t order by a asc" > ,ms [(Iden "a", Asc)]) > ,("select a from t order by a desc, b desc" > ,ms [(Iden "a", Desc), (Iden "b", Desc)]) > ] > where > ms o = makeSelect {qeSelectList = [(Nothing,Iden "a")] > ,qeFrom = [TRSimple "t"] > ,qeOrderBy = o} > limit :: TestItem > limit = Group "limit" $ map (uncurry TestQueryExpr) > [("select a from t limit 10" > ,ms (Just $ NumLit "10") Nothing) > ,("select a from t limit 10 offset 10" > ,ms (Just $ NumLit "10") (Just $ NumLit "10")) > ] > where > ms l o = makeSelect > {qeSelectList = [(Nothing,Iden "a")] > ,qeFrom = [TRSimple "t"] > ,qeLimit = l > ,qeOffset = o} > combos :: TestItem > combos = Group "combos" $ map (uncurry TestQueryExpr) > [("select a from t union select b from u" > ,CombineQueryExpr ms1 Union All Respectively ms2) > ,("select a from t intersect select b from u" > ,CombineQueryExpr ms1 Intersect All Respectively ms2) > ,("select a from t except all select b from u" > ,CombineQueryExpr ms1 Except All Respectively ms2) > ,("select a from t union distinct corresponding \ > \select b from u" > ,CombineQueryExpr ms1 Union Distinct Corresponding ms2) > ,("select a from t union select a from t union select a from t" > -- TODO: union should be left associative. I think the others also > -- so this needs to be fixed (new optionSuffix variation which > -- handles this) > ,CombineQueryExpr ms1 Union All Respectively > (CombineQueryExpr ms1 Union All Respectively ms1)) > ] > where > ms1 = makeSelect > {qeSelectList = [(Nothing,Iden "a")] > ,qeFrom = [TRSimple "t"]} > ms2 = makeSelect > {qeSelectList = [(Nothing,Iden "b")] > ,qeFrom = [TRSimple "u"]} > withQueries :: TestItem > withQueries = Group "with queries" $ map (uncurry TestQueryExpr) > [("with u as (select a from t) select a from u" > ,With [("u", ms1)] ms2) > ,("with x as (select a from t),\n\ > \ u as (select a from x)\n\ > \select a from u" > ,With [("x", ms1), ("u",ms3)] ms2) > ] > where > ms c t = makeSelect > {qeSelectList = [(Nothing,Iden c)] > ,qeFrom = [TRSimple t]} > ms1 = ms "a" "t" > ms2 = ms "a" "u" > ms3 = ms "a" "x" > queryExprsTests :: TestItem > queryExprsTests = Group "query exprs" $ map (uncurry TestQueryExprs) > [("select 1",[ms]) > ,("select 1;",[ms]) > ,("select 1;select 1",[ms,ms]) > ,(" select 1;select 1; ",[ms,ms]) > ] > where > ms = makeSelect {qeSelectList = [(Nothing,NumLit "1")]}