1
Fork 0

work on haddock and a few renames

This commit is contained in:
Jake Wheat 2013-12-14 14:10:46 +02:00
parent c28db4d470
commit b001276337
4 changed files with 151 additions and 75 deletions
Language/SQL/SimpleSQL

View file

@ -24,12 +24,14 @@ The public api functions.
> -> Either ParseError QueryExpr
> parseQueryExpr = wrapParse topLevelQueryExpr
> -- | Parses a list of query exprs, with semi colons between them. The final semicolon is optional.
> parseQueryExprs :: FilePath -- ^ filename to use in errors
> -> Maybe (Int,Int) -- ^ line number and column number to use in errors
> -> String -- ^ the sql source to parse
> -> Either ParseError [QueryExpr]
> parseQueryExprs = wrapParse queryExprs
> -- | Parses a scalar expression.
> parseScalarExpr :: FilePath -- ^ filename to use in errors
> -> Maybe (Int,Int) -- ^ line number and column number to use in errors
> -> String -- ^ the sql source to parse
@ -480,20 +482,20 @@ tref
> from = try (keyword_ "from") *> commaSep1 tref
> where
> tref = nonJoinTref >>= optionSuffix joinTrefSuffix
> nonJoinTref = choice [try (JoinQueryExpr <$> parens queryExpr)
> ,JoinParens <$> parens tref
> ,SimpleTableRef <$> identifierString]
> nonJoinTref = choice [try (TRQueryExpr <$> parens queryExpr)
> ,TRParens <$> parens tref
> ,TRSimple <$> identifierString]
> >>= optionSuffix aliasSuffix
> aliasSuffix j =
> let tableAlias = optional (try $ keyword_ "as") *> identifierString
> columnAliases = optionMaybe $ try $ parens
> $ commaSep1 identifierString
> in option j (JoinAlias j <$> try tableAlias <*> try columnAliases)
> in option j (TRAlias j <$> try tableAlias <*> try columnAliases)
> joinTrefSuffix t = (do
> nat <- option False $ try (True <$ (try $ keyword_ "natural"))
> JoinTableRef t <$> joinType
> <*> nonJoinTref
> <*> optionMaybe (joinCondition nat))
> TRJoin t <$> joinType
> <*> nonJoinTref
> <*> optionMaybe (joinCondition nat))
> >>= optionSuffix joinTrefSuffix
> joinType = choice
> [JCross <$ try (keyword_ "cross")

View file

@ -169,13 +169,13 @@ back into SQL source text. It attempts to format the output nicely.
> sep [text "from"
> ,nest 4 $ commaSep $ map tr ts]
> where
> tr (SimpleTableRef t) = text t
> tr (JoinAlias t a cs) =
> tr (TRSimple t) = text t
> tr (TRAlias t a cs) =
> tr t <+> text "as" <+> text a
> <+> maybe empty (parens . commaSep . map text) cs
> tr (JoinParens t) = parens $ tr t
> tr (JoinQueryExpr q) = parens $ queryExpr q
> tr (JoinTableRef t0 jt t1 jc) =
> tr (TRParens t) = parens $ tr t
> tr (TRQueryExpr q) = parens $ queryExpr q
> tr (TRJoin t0 jt t1 jc) =
> sep [tr t0
> ,joinText jt jc
> ,tr t1

View file

@ -20,62 +20,133 @@
> ) where
> -- | Represents a scalar expression
> data ScalarExpr = NumLit String
> data ScalarExpr = -- | a numeric literal optional decimal point, e+-
> -- integral exponent, e.g
> --
> -- * 10
> --
> -- * 10.
> --
> -- * .1
> --
> -- * 10.1
> --
> -- * 1e5
> --
> -- * 12.34e-6
> NumLit String
> -- | string literal, currently only basic strings
> -- between single quotes without escapes (no
> -- single quotes in strings then)
> | StringLit String
> | IntervalLit String -- text of interval
> String -- units of interval
> (Maybe Int) -- precision
> -- | text of interval literal, units of interval
> -- precision, e.g. interval 3 days (3)
> | IntervalLit String
> String
> (Maybe Int)
> -- | identifier without dots
> | Iden String
> -- | identifier with one dot
> | Iden2 String String
> -- | star
> | Star
> -- | star with qualifier, e.g t.*
> | Star2 String
> -- | function application (anything that looks
> -- like c style function application syntactically)
> | App String [ScalarExpr]
> -- | aggregate application, which adds distinct or
> -- all, and order by, to regular function
> -- application
> | AggregateApp String (Maybe Duplicates)
> [ScalarExpr]
> [(ScalarExpr,Direction)]
> -- | window application, which adds over
> -- (partition by a order by b) to regular function
> -- application. Explicit frames are not currently
> -- supported
> | WindowApp String [ScalarExpr] [ScalarExpr] [(ScalarExpr,Direction)]
> -- the binop, prefixop and postfix op
> -- are used for symbol and keyword operators
> -- these are used even for the multiple keyword
> -- operators
> -- | Infix binary operators. This is used for
> -- symbol operators (a + b), keyword operators (a
> -- and b) and multiple keyword operators (a is
> -- similar to b)
> | BinOp ScalarExpr String ScalarExpr
> -- | Prefix unary operators. This is used for
> -- symbol operators, keyword operators and
> -- multiple keyword operators
> | PrefixOp String ScalarExpr
> -- | Postfix unary operators. This is used for
> -- symbol operators, keyword operators and multiple
> -- keyword operators
> | PostfixOp String ScalarExpr
> -- the special op is used for ternary, mixfix and other non orthodox operators
> -- | Used for ternary, mixfix and other non
> -- orthodox operators, including the function
> -- looking calls which use keywords instead of
> -- commas to separate the arguments,
> -- e.g. substring(t from 1 to 5)
> | SpecialOp String [ScalarExpr]
> -- | case expression. both flavours
> -- supported. Multiple condition when branches not
> -- currently supported (case when a=4,b=5 then x
> -- end)
> | Case (Maybe ScalarExpr) -- test value
> [(ScalarExpr,ScalarExpr)] -- when branches
> (Maybe ScalarExpr) -- else value
> | Parens ScalarExpr
> -- | cast(a as typename)
> | Cast ScalarExpr TypeName
> -- | prefix 'typed literal', e.g. int '42'
> | CastOp TypeName String
> -- | exists, all, any, some subqueries
> | SubQueryExpr SubQueryExprType QueryExpr
> -- | in list literal and in subquery, if the bool
> -- is false it means not in was used ('a not in
> -- (1,2)')
> | In Bool -- true if in, false if not in
> ScalarExpr InThing
> deriving (Eq,Show)
> -- | Represents a type name, used in casts.
> data TypeName = TypeName String deriving (Eq,Show)
> -- Represents 'expr in (scalar expression list)', and 'expr in
> -- (subquery)' syntax
> -- | Used for 'expr in (scalar expression list)', and 'expr in
> -- | (subquery)' syntax
> data InThing = InList [ScalarExpr]
> | InQueryExpr QueryExpr
> deriving (Eq,Show)
> -- | A subquery in a scalar expression
> data SubQueryExprType = SqExists | SqSq | SqAll | SqSome | SqAny
> data SubQueryExprType
> = -- | exists (query expr)
> SqExists
> -- | a scalar subquery
> | SqSq
> -- | all (query expr)
> | SqAll
> -- | some (query expr)
> | SqSome
> -- | any (query expr)
> | SqAny
> deriving (Eq,Show)
> -- | Represents a query expression, which can be a select, a 'set
> -- operator' (union/except/intersect), a common table expression
> -- (with), a values expression (not yet supported) or the table
> -- syntax - 'table t', shorthand for 'select * from t' (not yet
> -- supported).
> -- | Represents a query expression, which can be:
> --
> -- * a regular select;
> --
> -- * a set operator (union, except, intersect);
> --
> -- * a common table expression (with);
> --
> -- * a values expression (not yet supported);
> --
> -- * or the table syntax - 'table t', shorthand for 'select * from
> -- t' (not yet supported).
> data QueryExpr
> = Select
> {qeDuplicates :: Duplicates
> ,qeSelectList :: [(Maybe String,ScalarExpr)]
> ,qeSelectList :: [(Maybe String,ScalarExpr)] -- ^ the column aliases and the expressions
> ,qeFrom :: [TableRef]
> ,qeWhere :: Maybe ScalarExpr
> ,qeGroupBy :: [ScalarExpr]
@ -101,14 +172,14 @@ I'm not sure if this is valid syntax or not
> -- | represents the Distinct or All keywords, which can be used
> -- before a select list, in an aggregate/window function
> -- application, or in a query expression 'set operator'
> -- application, or in a query expression set operator
> data Duplicates = Distinct | All deriving (Eq,Show)
> -- | The direction for a column in order by.
> data Direction = Asc | Desc deriving (Eq,Show)
> -- | Query expression 'set operators'
> -- | Query expression set operators
> data CombineOp = Union | Except | Intersect deriving (Eq,Show)
> -- | Corresponding, an option for the 'set operators'
> -- | Corresponding, an option for the set operators
> data Corresponding = Corresponding | Respectively deriving (Eq,Show)
> -- | helper/'default' value for query exprs to make creating query expr values a little easier
@ -124,11 +195,16 @@ I'm not sure if this is valid syntax or not
> ,qeOffset = Nothing}
> -- | Represents a entry in the csv of tables in the from clause.
> data TableRef = SimpleTableRef String -- from t
> | JoinTableRef TableRef JoinType TableRef (Maybe JoinCondition) -- from a join b
> | JoinParens TableRef -- from (a)
> | JoinAlias TableRef String (Maybe [String]) -- from a as b(c,d)
> | JoinQueryExpr QueryExpr -- from (query expr)
> data TableRef = -- | from t
> TRSimple String
> -- | from a join b
> | TRJoin TableRef JoinType TableRef (Maybe JoinCondition)
> -- | from (a)
> | TRParens TableRef
> -- | from a as b(c,d)
> | TRAlias TableRef String (Maybe [String])
> -- | from (query expr)
> | TRQueryExpr QueryExpr
> deriving (Eq,Show)
TODO: add function table ref
@ -140,5 +216,5 @@ TODO: add function table ref
> -- | The join condition.
> data JoinCondition = JoinOn ScalarExpr -- ^ on expr
> | JoinUsing [String] -- ^ using (column list)
> | JoinNatural -- ^ natural join was specified
> | JoinNatural -- ^ natural join was used
> deriving (Eq,Show)