1
Fork 0
simple-sql-parser/tools/Language/SQL/SimpleSQL/TableRefs.lhs
2014-04-19 11:45:45 +03:00

106 lines
3.8 KiB
Plaintext

These are the tests for parsing focusing on the from part of query
expression
> module Language.SQL.SimpleSQL.TableRefs (tableRefTests) where
> import Language.SQL.SimpleSQL.TestTypes
> import Language.SQL.SimpleSQL.Syntax
> tableRefTests :: TestItem
> tableRefTests = Group "tableRefTests" $ map (uncurry TestQueryExpr)
> [("select a from t"
> ,ms [TRSimple [Name "t"]])
> ,("select a from f(a)"
> ,ms [TRFunction [Name "f"] [Iden [Name "a"]]])
> ,("select a from t,u"
> ,ms [TRSimple [Name "t"], TRSimple [Name "u"]])
> ,("select a from s.t"
> ,ms [TRSimple [Name "s", Name "t"]])
these lateral queries make no sense but the syntax is valid
> ,("select a from lateral a"
> ,ms [TRLateral $ TRSimple [Name "a"]])
> ,("select a from lateral a,b"
> ,ms [TRLateral $ TRSimple [Name "a"], TRSimple [Name "b"]])
> ,("select a from a, lateral b"
> ,ms [TRSimple [Name "a"], TRLateral $ TRSimple [Name "b"]])
> ,("select a from a natural join lateral b"
> ,ms [TRJoin (TRSimple [Name "a"]) True JInner
> (TRLateral $ TRSimple [Name "b"])
> Nothing])
> ,("select a from lateral a natural join lateral b"
> ,ms [TRJoin (TRLateral $ TRSimple [Name "a"]) True JInner
> (TRLateral $ TRSimple [Name "b"])
> Nothing])
> ,("select a from t inner join u on expr"
> ,ms [TRJoin (TRSimple [Name "t"]) False JInner (TRSimple [Name "u"])
> (Just $ JoinOn $ Iden [Name "expr"])])
> ,("select a from t join u on expr"
> ,ms [TRJoin (TRSimple [Name "t"]) False JInner (TRSimple [Name "u"])
> (Just $ JoinOn $ Iden [Name "expr"])])
> ,("select a from t left join u on expr"
> ,ms [TRJoin (TRSimple [Name "t"]) False JLeft (TRSimple [Name "u"])
> (Just $ JoinOn $ Iden [Name "expr"])])
> ,("select a from t right join u on expr"
> ,ms [TRJoin (TRSimple [Name "t"]) False JRight (TRSimple [Name "u"])
> (Just $ JoinOn $ Iden [Name "expr"])])
> ,("select a from t full join u on expr"
> ,ms [TRJoin (TRSimple [Name "t"]) False JFull (TRSimple [Name "u"])
> (Just $ JoinOn $ Iden [Name "expr"])])
> ,("select a from t cross join u"
> ,ms [TRJoin (TRSimple [Name "t"]) False
> JCross (TRSimple [Name "u"]) Nothing])
> ,("select a from t natural inner join u"
> ,ms [TRJoin (TRSimple [Name "t"]) True JInner (TRSimple [Name "u"])
> Nothing])
> ,("select a from t inner join u using(a,b)"
> ,ms [TRJoin (TRSimple [Name "t"]) False JInner (TRSimple [Name "u"])
> (Just $ JoinUsing [Name "a", Name "b"])])
> ,("select a from (select a from t)"
> ,ms [TRQueryExpr $ ms [TRSimple [Name "t"]]])
> ,("select a from t as u"
> ,ms [TRAlias (TRSimple [Name "t"]) (Alias (Name "u") Nothing)])
> ,("select a from t u"
> ,ms [TRAlias (TRSimple [Name "t"]) (Alias (Name "u") Nothing)])
> ,("select a from t u(b)"
> ,ms [TRAlias (TRSimple [Name "t"]) (Alias (Name "u") $ Just [Name "b"])])
> ,("select a from (t cross join u) as u"
> ,ms [TRAlias (TRParens $
> TRJoin (TRSimple [Name "t"]) False JCross (TRSimple [Name "u"]) Nothing)
> (Alias (Name "u") Nothing)])
> -- todo: not sure if the associativity is correct
> ,("select a from t cross join u cross join v",
> ms [TRJoin
> (TRJoin (TRSimple [Name "t"]) False
> JCross (TRSimple [Name "u"]) Nothing)
> False JCross (TRSimple [Name "v"]) Nothing])
> ]
> where
> ms f = makeSelect {qeSelectList = [(Iden [Name "a"],Nothing)]
> ,qeFrom = f}