update handling of fetch first and limit wrt dialects
This commit is contained in:
parent
eb45eb8705
commit
ee432d79ba
|
@ -45,7 +45,8 @@ hack for now, later will expand to flags on a feature by feature basis
|
||||||
|
|
||||||
> -- | mysql dialect
|
> -- | mysql dialect
|
||||||
> mysql :: Dialect
|
> mysql :: Dialect
|
||||||
> mysql = addLimit ansi2011 {diSyntaxFlavour = MySQL}
|
> mysql = addLimit ansi2011 {diSyntaxFlavour = MySQL
|
||||||
|
> ,diFetchFirst = False }
|
||||||
|
|
||||||
> -- | postgresql dialect
|
> -- | postgresql dialect
|
||||||
> postgres :: Dialect
|
> postgres :: Dialect
|
||||||
|
|
|
@ -1457,12 +1457,12 @@ allows offset and fetch in either order
|
||||||
> fetch :: Parser ScalarExpr
|
> fetch :: Parser ScalarExpr
|
||||||
> fetch = fetchFirst <|> limit
|
> fetch = fetchFirst <|> limit
|
||||||
> where
|
> where
|
||||||
> fetchFirst = guardDialect [ANSI2011]
|
> fetchFirst = guardDialect diFetchFirst
|
||||||
> *> fs *> scalarExpr <* ro
|
> *> fs *> scalarExpr <* ro
|
||||||
> fs = makeKeywordTree ["fetch first", "fetch next"]
|
> fs = makeKeywordTree ["fetch first", "fetch next"]
|
||||||
> ro = makeKeywordTree ["rows only", "row only"]
|
> ro = makeKeywordTree ["rows only", "row only"]
|
||||||
> -- todo: not in ansi sql dialect
|
> -- todo: not in ansi sql dialect
|
||||||
> limit = guardDialect [MySQL] *>
|
> limit = guardDialect diLimit *>
|
||||||
> keyword_ "limit" *> scalarExpr
|
> keyword_ "limit" *> scalarExpr
|
||||||
|
|
||||||
== common table expressions
|
== common table expressions
|
||||||
|
@ -2216,7 +2216,14 @@ that looks identical to this), then it isn't treated as a keyword at
|
||||||
all. When there is some overlap (e.g. 'set'), then there is either
|
all. When there is some overlap (e.g. 'set'), then there is either
|
||||||
special case parsing code to handle this (in the case of set), or it
|
special case parsing code to handle this (in the case of set), or it
|
||||||
is not treated as a keyword (not perfect, but if it more or less
|
is not treated as a keyword (not perfect, but if it more or less
|
||||||
works, ok for now)
|
works, ok for now).
|
||||||
|
|
||||||
|
It is possible to have a problem if you remove something which is a
|
||||||
|
keyword from this list, and still want to parse statements using it
|
||||||
|
as a keyword - for instance, removing things like 'from' or 'as',
|
||||||
|
will likely mean many things don't parse anymore.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
@ -2229,10 +2236,10 @@ different parsers can be used for different dialects
|
||||||
|
|
||||||
> type Parser = GenParser Token ParseState
|
> type Parser = GenParser Token ParseState
|
||||||
|
|
||||||
> guardDialect :: [SyntaxFlavour] -> Parser ()
|
> guardDialect :: (Dialect -> Bool) -> Parser ()
|
||||||
> guardDialect ds = do
|
> guardDialect f = do
|
||||||
> d <- getState
|
> d <- getState
|
||||||
> guard (diSyntaxFlavour d `elem` ds)
|
> guard (f d)
|
||||||
|
|
||||||
TODO: the ParseState and the Dialect argument should be turned into a
|
TODO: the ParseState and the Dialect argument should be turned into a
|
||||||
flags struct. Part (or all?) of this struct is the dialect
|
flags struct. Part (or all?) of this struct is the dialect
|
||||||
|
|
|
@ -337,7 +337,7 @@ which have been changed to try to improve the layout of the output.
|
||||||
> ]
|
> ]
|
||||||
> where
|
> where
|
||||||
> fetchFirst =
|
> fetchFirst =
|
||||||
> me (\e -> if diSyntaxFlavour dia == MySQL
|
> me (\e -> if diLimit dia
|
||||||
> then text "limit" <+> scalarExpr dia e
|
> then text "limit" <+> scalarExpr dia e
|
||||||
> else text "fetch first" <+> scalarExpr dia e
|
> else text "fetch first" <+> scalarExpr dia e
|
||||||
> <+> text "rows only") fe
|
> <+> text "rows only") fe
|
||||||
|
|
Loading…
Reference in a new issue