1
Fork 0

Merge pull request #36 from bartoszw/master

Two enhancements of sqlserver dialect
This commit is contained in:
Jake Wheat 2021-12-05 18:20:13 +00:00 committed by GitHub
commit a937424514
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 41 additions and 4 deletions

View file

@ -88,6 +88,8 @@ Data types to represent different dialect options
> ,diPostgresSymbols :: Bool > ,diPostgresSymbols :: Bool
> -- | allow sql server style symbols > -- | allow sql server style symbols
> ,diSqlServerSymbols :: Bool > ,diSqlServerSymbols :: Bool
> -- | allow sql server style for CONVERT function in format CONVERT(data_type(length), expression, style)
> ,diConvertFunction :: Bool
> } > }
> deriving (Eq,Show,Read,Data,Typeable) > deriving (Eq,Show,Read,Data,Typeable)
@ -109,6 +111,7 @@ Data types to represent different dialect options
> ,diEString = False > ,diEString = False
> ,diPostgresSymbols = False > ,diPostgresSymbols = False
> ,diSqlServerSymbols = False > ,diSqlServerSymbols = False
> ,diConvertFunction = False
> } > }
> -- | mysql dialect > -- | mysql dialect
@ -133,7 +136,9 @@ Data types to represent different dialect options
> sqlserver = ansi2011 {diSquareBracketQuotedIden = True > sqlserver = ansi2011 {diSquareBracketQuotedIden = True
> ,diAtIdentifier = True > ,diAtIdentifier = True
> ,diHashIdentifier = True > ,diHashIdentifier = True
> ,diSqlServerSymbols = True } > ,diOdbc = True
> ,diSqlServerSymbols = True
> ,diConvertFunction = True}
> addLimit :: Dialect -> Dialect > addLimit :: Dialect -> Dialect
> addLimit d = d {diKeywords = "limit": diKeywords d > addLimit d = d {diKeywords = "limit": diKeywords d

View file

@ -597,6 +597,16 @@ cast: cast(expr as type)
> parens (Cast <$> scalarExpr > parens (Cast <$> scalarExpr
> <*> (keyword_ "as" *> typeName)) > <*> (keyword_ "as" *> typeName))
=== convert
convertSqlServer: SqlServer dialect CONVERT(data_type(length), expression, style)
> convertSqlServer :: Parser ScalarExpr
> convertSqlServer = guardDialect diConvertFunction
> *> keyword_ "convert" *>
> parens (Convert <$> typeName <*> (comma *> scalarExpr)
> <*> optionMaybe (comma *> unsignedInteger))
=== exists, unique === exists, unique
subquery expression: subquery expression:
@ -1175,6 +1185,7 @@ documenting/fixing.
> ,parensExpr > ,parensExpr
> ,caseExpr > ,caseExpr
> ,cast > ,cast
> ,convertSqlServer
> ,arrayCtor > ,arrayCtor
> ,multisetCtor > ,multisetCtor
> ,nextValueFor > ,nextValueFor

View file

@ -254,6 +254,11 @@ Try to do this when this code is ported to a modern pretty printing lib.
> scalarExpr d (OdbcFunc e) = > scalarExpr d (OdbcFunc e) =
> text "{fn" <+> scalarExpr d e <> text "}" > text "{fn" <+> scalarExpr d e <> text "}"
> scalarExpr d (Convert t e Nothing) =
> text "convert(" <> typeName t <> text "," <+> scalarExpr d e <> text ")"
> scalarExpr d (Convert t e (Just i)) =
> text "convert(" <> typeName t <> text "," <+> scalarExpr d e <> text "," <+> text (show i) <> text ")"
> unname :: Name -> String > unname :: Name -> String
> unname (Name Nothing n) = n > unname (Name Nothing n) = n
> unname (Name (Just (s,e)) n) = > unname (Name (Just (s,e)) n) =

View file

@ -167,6 +167,9 @@
> -- | cast(a as typename) > -- | cast(a as typename)
> | Cast ScalarExpr TypeName > | Cast ScalarExpr TypeName
> -- | convert expression to given datatype @CONVERT(data_type(length), expression, style)@
> | Convert TypeName ScalarExpr (Maybe Integer)
> -- | case expression. both flavours supported > -- | case expression. both flavours supported
> | Case > | Case
> {caseTest :: Maybe ScalarExpr -- ^ test value > {caseTest :: Maybe ScalarExpr -- ^ test value

View file

@ -1,3 +1,5 @@
0.6.1 added odbc handling to sqlsqerver dialect
added sqlserver dialect case for convert function
0.6.0 0.6.0
tested with ghc 8.8.1 also tested with ghc 8.8.1 also
change the dialect handling - now a dialect is a bunch of flags change the dialect handling - now a dialect is a bunch of flags

View file

@ -1,7 +1,7 @@
cabal-version: 2.2 cabal-version: 2.2
name: simple-sql-parser name: simple-sql-parser
version: 0.6.0 version: 0.6.1
synopsis: A parser for SQL. synopsis: A parser for SQL.
description: description:

View file

@ -318,8 +318,8 @@ the + or -.
> [ LexTest sqlserver {diOdbc = True} s t | (s,t) <- > [ LexTest sqlserver {diOdbc = True} s t | (s,t) <-
> [("{}", [Symbol "{", Symbol "}"]) > [("{}", [Symbol "{", Symbol "}"])
> ]] > ]]
> ++ [LexFails sqlserver "{" > ++ [LexFails sqlserver {diOdbc = False} "{"
> ,LexFails sqlserver "}"] > ,LexFails sqlserver {diOdbc = False} "}"]
> combos :: [a] -> Int -> [[a]] > combos :: [a] -> Int -> [[a]]
> combos _ 0 = [[]] > combos _ 0 = [[]]

View file

@ -15,6 +15,7 @@ Tests for parsing scalar expressions
> ,dots > ,dots
> ,app > ,app
> ,caseexp > ,caseexp
> ,convertfun
> ,operators > ,operators
> ,parens > ,parens
> ,subqueries > ,subqueries
@ -110,6 +111,16 @@ Tests for parsing scalar expressions
> ] > ]
> convertfun :: TestItem
> convertfun = Group "convert" $ map (uncurry (TestScalarExpr sqlserver))
> [("CONVERT(varchar, 25.65)"
> ,Convert (TypeName [Name Nothing "varchar"]) (NumLit "25.65") Nothing)
> ,("CONVERT(datetime, '2017-08-25')"
> ,Convert (TypeName [Name Nothing "datetime"]) (StringLit "'" "'" "2017-08-25") Nothing)
> ,("CONVERT(varchar, '2017-08-25', 101)"
> ,Convert (TypeName [Name Nothing "varchar"]) (StringLit "'" "'" "2017-08-25") (Just 101))
> ]
> operators :: TestItem > operators :: TestItem
> operators = Group "operators" > operators = Group "operators"
> [binaryOperators > [binaryOperators