112 lines
4.3 KiB
Haskell
112 lines
4.3 KiB
Haskell
|
|
{-
|
|
These are the tests for parsing focusing on the from part of query
|
|
expression
|
|
-}
|
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
module Language.SQL.SimpleSQL.TableRefs (tableRefTests) where
|
|
|
|
import Language.SQL.SimpleSQL.TestTypes
|
|
import Language.SQL.SimpleSQL.Syntax
|
|
import Language.SQL.SimpleSQL.TestRunners
|
|
import Data.Text (Text)
|
|
|
|
tableRefTests :: TestItem
|
|
tableRefTests = Group "tableRefTests"
|
|
[q "select a from t"
|
|
$ ms [TRSimple [Name Nothing "t"]]
|
|
|
|
,q "select a from f(a)"
|
|
$ ms [TRFunction [Name Nothing "f"] [Iden [Name Nothing "a"]]]
|
|
|
|
,q "select a from t,u"
|
|
$ ms [TRSimple [Name Nothing "t"], TRSimple [Name Nothing "u"]]
|
|
|
|
,q "select a from s.t"
|
|
$ ms [TRSimple [Name Nothing "s", Name Nothing "t"]]
|
|
|
|
-- these lateral queries make no sense but the syntax is valid
|
|
|
|
,q "select a from lateral a"
|
|
$ ms [TRLateral $ TRSimple [Name Nothing "a"]]
|
|
|
|
,q "select a from lateral a,b"
|
|
$ ms [TRLateral $ TRSimple [Name Nothing "a"], TRSimple [Name Nothing "b"]]
|
|
|
|
,q "select a from a, lateral b"
|
|
$ ms [TRSimple [Name Nothing "a"], TRLateral $ TRSimple [Name Nothing "b"]]
|
|
|
|
,q "select a from a natural join lateral b"
|
|
$ ms [TRJoin (TRSimple [Name Nothing "a"]) True JInner
|
|
(TRLateral $ TRSimple [Name Nothing "b"])
|
|
Nothing]
|
|
|
|
,q "select a from lateral a natural join lateral b"
|
|
$ ms [TRJoin (TRLateral $ TRSimple [Name Nothing "a"]) True JInner
|
|
(TRLateral $ TRSimple [Name Nothing "b"])
|
|
Nothing]
|
|
|
|
|
|
,q "select a from t inner join u on expr"
|
|
$ ms [TRJoin (TRSimple [Name Nothing "t"]) False JInner (TRSimple [Name Nothing "u"])
|
|
(Just $ JoinOn $ Iden [Name Nothing "expr"])]
|
|
|
|
,q "select a from t join u on expr"
|
|
$ ms [TRJoin (TRSimple [Name Nothing "t"]) False JInner (TRSimple [Name Nothing "u"])
|
|
(Just $ JoinOn $ Iden [Name Nothing "expr"])]
|
|
|
|
,q "select a from t left join u on expr"
|
|
$ ms [TRJoin (TRSimple [Name Nothing "t"]) False JLeft (TRSimple [Name Nothing "u"])
|
|
(Just $ JoinOn $ Iden [Name Nothing "expr"])]
|
|
|
|
,q "select a from t right join u on expr"
|
|
$ ms [TRJoin (TRSimple [Name Nothing "t"]) False JRight (TRSimple [Name Nothing "u"])
|
|
(Just $ JoinOn $ Iden [Name Nothing "expr"])]
|
|
|
|
,q "select a from t full join u on expr"
|
|
$ ms [TRJoin (TRSimple [Name Nothing "t"]) False JFull (TRSimple [Name Nothing "u"])
|
|
(Just $ JoinOn $ Iden [Name Nothing "expr"])]
|
|
|
|
,q "select a from t cross join u"
|
|
$ ms [TRJoin (TRSimple [Name Nothing "t"]) False
|
|
JCross (TRSimple [Name Nothing "u"]) Nothing]
|
|
|
|
,q "select a from t natural inner join u"
|
|
$ ms [TRJoin (TRSimple [Name Nothing "t"]) True JInner (TRSimple [Name Nothing "u"])
|
|
Nothing]
|
|
|
|
,q "select a from t inner join u using(a,b)"
|
|
$ ms [TRJoin (TRSimple [Name Nothing "t"]) False JInner (TRSimple [Name Nothing "u"])
|
|
(Just $ JoinUsing [Name Nothing "a", Name Nothing "b"])]
|
|
|
|
,q "select a from (select a from t)"
|
|
$ ms [TRQueryExpr $ ms [TRSimple [Name Nothing "t"]]]
|
|
|
|
,q "select a from t as u"
|
|
$ ms [TRAlias (TRSimple [Name Nothing "t"]) (Alias (Name Nothing "u") Nothing)]
|
|
|
|
,q "select a from t u"
|
|
$ ms [TRAlias (TRSimple [Name Nothing "t"]) (Alias (Name Nothing "u") Nothing)]
|
|
|
|
,q "select a from t u(b)"
|
|
$ ms [TRAlias (TRSimple [Name Nothing "t"]) (Alias (Name Nothing "u") $ Just [Name Nothing "b"])]
|
|
|
|
,q "select a from (t cross join u) as u"
|
|
$ ms [TRAlias (TRParens $
|
|
TRJoin (TRSimple [Name Nothing "t"]) False JCross (TRSimple [Name Nothing "u"]) Nothing)
|
|
(Alias (Name Nothing "u") Nothing)]
|
|
-- todo: not sure if the associativity is correct
|
|
|
|
,q "select a from t cross join u cross join v"
|
|
$ ms [TRJoin
|
|
(TRJoin (TRSimple [Name Nothing "t"]) False
|
|
JCross (TRSimple [Name Nothing "u"]) Nothing)
|
|
False JCross (TRSimple [Name Nothing "v"]) Nothing]
|
|
]
|
|
where
|
|
ms f = toQueryExpr $ makeSelect {msSelectList = [(Iden [Name Nothing "a"],Nothing)]
|
|
,msFrom = f}
|
|
q :: HasCallStack => Text -> QueryExpr -> TestItem
|
|
q src ast = testQueryExpr ansi2011 src ast
|