>
> module Language.SQL.SimpleSQL.Syntax
> (
> ScalarExpr(..)
> ,Name(..)
> ,TypeName(..)
> ,Duplicates(..)
> ,OrderField(..)
> ,Direction(..)
> ,NullsOrder(..)
> ,InThing(..)
> ,SubQueryExprType(..)
> ,Frame(..)
> ,FrameRows(..)
> ,FramePos(..)
>
> ,QueryExpr(..)
> ,makeSelect
> ,CombineOp(..)
> ,Corresponding(..)
> ,Alias(..)
> ,GroupingExpr(..)
>
> ,TableRef(..)
> ,JoinType(..)
> ,JoinCondition(..)
> ) where
>
> data ScalarExpr
> =
>
>
>
>
>
>
>
>
>
>
>
>
>
> NumLit String
>
>
> | StringLit String
>
>
> | IntervalLit
> {ilLiteral :: String
> ,ilUnits :: String
> ,ilPrecision :: Maybe Int
> }
>
> | Iden Name
>
> | Star
>
>
> | App Name [ScalarExpr]
>
>
> | AggregateApp
> {aggName :: Name
> ,aggDistinct :: Maybe Duplicates
> ,aggArgs :: [ScalarExpr]
> ,aggOrderBy :: [OrderField]
> }
>
>
>
> | WindowApp
> {wnName :: Name
> ,wnArgs :: [ScalarExpr]
> ,wnPartition :: [ScalarExpr]
> ,wnOrderBy :: [OrderField]
> ,wnFrame :: Maybe Frame
> }
>
>
>
> | BinOp ScalarExpr Name ScalarExpr
>
>
> | PrefixOp Name ScalarExpr
>
>
> | PostfixOp Name ScalarExpr
>
>
>
>
> | SpecialOp Name [ScalarExpr]
>
> | Case
> {caseTest :: Maybe ScalarExpr
> ,caseWhens :: [([ScalarExpr],ScalarExpr)]
> ,caseElse :: Maybe ScalarExpr
> }
> | Parens ScalarExpr
>
> | Cast ScalarExpr TypeName
>
> | TypedLit TypeName String
>
> | SubQueryExpr SubQueryExprType QueryExpr
>
>
> | In Bool ScalarExpr InThing
> deriving (Eq,Show,Read)
>
> data Name = Name String
> | QName String
> deriving (Eq,Show,Read)
>
> data TypeName = TypeName String
> | PrecTypeName String Int
> | PrecScaleTypeName String Int Int
> deriving (Eq,Show,Read)
>
>
> data InThing = InList [ScalarExpr]
> | InQueryExpr QueryExpr
> deriving (Eq,Show,Read)
>
> data SubQueryExprType
> =
> SqExists
>
> | SqSq
>
> | SqAll
>
> | SqSome
>
> | SqAny
> deriving (Eq,Show,Read)
>
> data OrderField = OrderField ScalarExpr Direction NullsOrder
> deriving (Eq,Show,Read)
>
> data NullsOrder = NullsOrderDefault
> | NullsFirst
> | NullsLast
> deriving (Eq,Show,Read)
>
>
>
> data Frame = FrameFrom FrameRows FramePos
> | FrameBetween FrameRows FramePos FramePos
> deriving (Eq,Show,Read)
>
> data FrameRows = FrameRows | FrameRange
> deriving (Eq,Show,Read)
>
> data FramePos = UnboundedPreceding
> | Preceding ScalarExpr
> | Current
> | Following ScalarExpr
> | UnboundedFollowing
> deriving (Eq,Show,Read)
>
>
>
>
>
>
>
>
>
>
>
>
> data QueryExpr
> = Select
> {qeDuplicates :: Duplicates
> ,qeSelectList :: [(Maybe Name,ScalarExpr)]
>
> ,qeFrom :: [TableRef]
> ,qeWhere :: Maybe ScalarExpr
> ,qeGroupBy :: [GroupingExpr]
> ,qeHaving :: Maybe ScalarExpr
> ,qeOrderBy :: [OrderField]
> ,qeOffset :: Maybe ScalarExpr
> ,qeFetch :: Maybe ScalarExpr
> }
> | CombineQueryExpr
> {qe0 :: QueryExpr
> ,qeCombOp :: CombineOp
> ,qeDuplicates :: Duplicates
> ,qeCorresponding :: Corresponding
> ,qe1 :: QueryExpr
> }
> | With
> {qeWithRecursive :: Bool
> ,qeViews :: [(Alias,QueryExpr)]
> ,qeQueryExpression :: QueryExpr}
> | Values [[ScalarExpr]]
> | Table Name
> deriving (Eq,Show,Read)
TODO: add queryexpr parens to deal with e.g.
(select 1 union select 2) union select 3
I'm not sure if this is valid syntax or not.
>
>
> makeSelect :: QueryExpr
> makeSelect = Select {qeDuplicates = All
> ,qeSelectList = []
> ,qeFrom = []
> ,qeWhere = Nothing
> ,qeGroupBy = []
> ,qeHaving = Nothing
> ,qeOrderBy = []
> ,qeOffset = Nothing
> ,qeFetch = Nothing}
>
>
>
> data Duplicates = Distinct | All deriving (Eq,Show,Read)
>
> data Direction = Asc | Desc deriving (Eq,Show,Read)
>
> data CombineOp = Union | Except | Intersect deriving (Eq,Show,Read)
>
> data Corresponding = Corresponding | Respectively deriving (Eq,Show,Read)
>
> data GroupingExpr
> = GroupingParens [GroupingExpr]
> | Cube [GroupingExpr]
> | Rollup [GroupingExpr]
> | GroupingSets [GroupingExpr]
> | SimpleGroup ScalarExpr
> deriving (Eq,Show,Read)
>
> data TableRef =
> TRSimple Name
>
> | TRJoin TableRef JoinType TableRef (Maybe JoinCondition)
>
> | TRParens TableRef
>
> | TRAlias TableRef Alias
>
> | TRQueryExpr QueryExpr
>
> | TRFunction Name [ScalarExpr]
>
> | TRLateral TableRef
> deriving (Eq,Show,Read)
>
>
>
> data Alias = Alias Name (Maybe [Name])
> deriving (Eq,Show,Read)
>
> data JoinType = JInner | JLeft | JRight | JFull | JCross
> deriving (Eq,Show,Read)
>
> data JoinCondition = JoinOn ScalarExpr
> | JoinUsing [Name]
> | JoinNatural
> deriving (Eq,Show,Read)