1
Fork 0

work on the semicolon handling

This commit is contained in:
Jake Wheat 2013-12-14 11:59:29 +02:00
parent cd7a15c193
commit 3f08adb4c5
3 changed files with 22 additions and 6 deletions

View file

@ -612,7 +612,7 @@ wrapper for query expr which ignores optional trailing semicolon.
> topLevelQueryExpr :: P QueryExpr
> topLevelQueryExpr =
> queryExpr <* (choice [try $ symbol_ ";", return()])
> queryExpr >>= optionSuffix ((symbol ";" *>) . return)
wrapper to parse a series of query exprs from a single source. They
must be separated by semicolon, but for the last expression, the
@ -620,11 +620,9 @@ trailing semicolon is optional.
> queryExprs :: P [QueryExpr]
> queryExprs = do
> qe <- queryExpr
> choice [[qe] <$ eof
> ,symbol_ ";" *>
> choice [[qe] <$ eof
> ,(:) qe <$> queryExprs]]
> ((:[]) <$> queryExpr)
> >>= optionSuffix ((symbol ";" *>) . return)
> >>= optionSuffix (\p -> (p++) <$> queryExprs)
------------------------------------------------

View file

@ -5,6 +5,7 @@ back into SQL source text. It attempts to format the output nicely.
> module Language.SQL.SimpleSQL.Pretty
> (prettyQueryExpr
> ,prettyScalarExpr
> ,prettyQueryExprs
> ) where
> import Language.SQL.SimpleSQL.Syntax
@ -17,6 +18,8 @@ back into SQL source text. It attempts to format the output nicely.
> prettyScalarExpr :: ScalarExpr -> String
> prettyScalarExpr = render . scalarExpr
> prettyQueryExprs :: [QueryExpr] -> String
> prettyQueryExprs = render . vcat . map ((<> text ";") . queryExpr)
= scalar expressions

View file

@ -11,6 +11,7 @@
> data TestItem = Group String [TestItem]
> | TestScalarExpr String ScalarExpr
> | TestQueryExpr String QueryExpr
> | TestQueryExprs String [QueryExpr]
> | ParseQueryExpr String
> deriving (Eq,Show)
@ -440,6 +441,17 @@
> )
> ]
> queryExprsParserTests :: TestItem
> queryExprsParserTests = Group "query exprs" $ map (uncurry TestQueryExprs)
> [("select 1",[ms])
> ,("select 1;",[ms])
> ,("select 1;select 1",[ms,ms])
> ,("select 1;select 1;",[ms,ms])
> ,(" select 1;select 1; ",[ms,ms])
> ]
> where
> ms = makeSelect {qeSelectList = [(Nothing,NumLit "1")]}
> tpchTests :: TestItem
> tpchTests =
> Group "parse tpch"
@ -450,6 +462,7 @@
> Group "parserTest"
> [scalarExprParserTests
> ,queryExprParserTests
> ,queryExprsParserTests
> ,tpchTests
> ]
@ -464,6 +477,8 @@
> toTest parseScalarExpr prettyScalarExpr str expected
> itemToTest (TestQueryExpr str expected) =
> toTest parseQueryExpr prettyQueryExpr str expected
> itemToTest (TestQueryExprs str expected) =
> toTest parseQueryExprs prettyQueryExprs str expected
> itemToTest (ParseQueryExpr str) =
> toPTest parseQueryExpr prettyQueryExpr str