From efd4dea6ff18e60c273d892556e19d4c62781c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20W=C3=B3jcik?= Date: Wed, 1 Dec 2021 21:33:02 +0100 Subject: [PATCH] minor enhancements for sqlserver dialect --- Language/SQL/SimpleSQL/Dialect.lhs | 7 ++++++- Language/SQL/SimpleSQL/Parse.lhs | 13 ++++++++++++- Language/SQL/SimpleSQL/Syntax.lhs | 3 +++ changelog | 2 ++ simple-sql-parser.cabal | 2 +- stack.yaml.lock | 12 ++++++++++++ 6 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 stack.yaml.lock diff --git a/Language/SQL/SimpleSQL/Dialect.lhs b/Language/SQL/SimpleSQL/Dialect.lhs index 05ab39f..d396022 100644 --- a/Language/SQL/SimpleSQL/Dialect.lhs +++ b/Language/SQL/SimpleSQL/Dialect.lhs @@ -88,6 +88,8 @@ Data types to represent different dialect options > ,diPostgresSymbols :: Bool > -- | allow sql server style symbols > ,diSqlServerSymbols :: Bool +> -- | allow sql server style forCONVERT function in format @CONVERT(data_type(length), expression, style)@ +> ,diConvertFunction :: Bool > } > deriving (Eq,Show,Read,Data,Typeable) @@ -109,6 +111,7 @@ Data types to represent different dialect options > ,diEString = False > ,diPostgresSymbols = False > ,diSqlServerSymbols = False +> ,diConvertFunction = False > } > -- | mysql dialect @@ -133,7 +136,9 @@ Data types to represent different dialect options > sqlserver = ansi2011 {diSquareBracketQuotedIden = True > ,diAtIdentifier = True > ,diHashIdentifier = True -> ,diSqlServerSymbols = True } +> ,diOdbc = True +> ,diSqlServerSymbols = True +> ,diConvertFunction = True} > addLimit :: Dialect -> Dialect > addLimit d = d {diKeywords = "limit": diKeywords d diff --git a/Language/SQL/SimpleSQL/Parse.lhs b/Language/SQL/SimpleSQL/Parse.lhs index 76eefab..284be37 100644 --- a/Language/SQL/SimpleSQL/Parse.lhs +++ b/Language/SQL/SimpleSQL/Parse.lhs @@ -597,6 +597,16 @@ cast: cast(expr as type) > parens (Cast <$> scalarExpr > <*> (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 subquery expression: @@ -1175,6 +1185,7 @@ documenting/fixing. > ,parensExpr > ,caseExpr > ,cast +> ,convertSqlServer > ,arrayCtor > ,multisetCtor > ,nextValueFor @@ -2027,7 +2038,7 @@ It is only allowed when all the strings are quoted with ' atm. > L.Identifier q p | map toLower p `notElem` blackList -> Just (q,p) > _ -> Nothing) -> unquotedIdentifierTok :: [String] -> Maybe String -> Parser String +> unquotedIdentifierTok :: [String] -> Maybe String -> Parser String > unquotedIdentifierTok blackList kw = mytoken (\tok -> > case (kw,tok) of > (Nothing, L.Identifier Nothing p) | map toLower p `notElem` blackList -> Just p diff --git a/Language/SQL/SimpleSQL/Syntax.lhs b/Language/SQL/SimpleSQL/Syntax.lhs index 5c669da..6c90cdc 100644 --- a/Language/SQL/SimpleSQL/Syntax.lhs +++ b/Language/SQL/SimpleSQL/Syntax.lhs @@ -167,6 +167,9 @@ > -- | cast(a as 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 > {caseTest :: Maybe ScalarExpr -- ^ test value diff --git a/changelog b/changelog index 060028d..645c4ba 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,5 @@ +0.6.1 added odbc handling to sqlsqerver dialect + added sqlserver dialect case for convert function 0.6.0 tested with ghc 8.8.1 also change the dialect handling - now a dialect is a bunch of flags diff --git a/simple-sql-parser.cabal b/simple-sql-parser.cabal index afe4a4f..5f2e7c1 100644 --- a/simple-sql-parser.cabal +++ b/simple-sql-parser.cabal @@ -1,7 +1,7 @@ cabal-version: 2.2 name: simple-sql-parser -version: 0.6.0 +version: 0.6.1 synopsis: A parser for SQL. description: diff --git a/stack.yaml.lock b/stack.yaml.lock new file mode 100644 index 0000000..7fb2c31 --- /dev/null +++ b/stack.yaml.lock @@ -0,0 +1,12 @@ +# This file was autogenerated by Stack. +# You should not edit this file by hand. +# For more information, please see the documentation at: +# https://docs.haskellstack.org/en/stable/lock_files + +packages: [] +snapshots: +- completed: + size: 500539 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/13/27.yaml + sha256: 690db832392afe55733b4c7023fd29b1b1c660ee42f1fb505b86b07394ca994e + original: lts-13.27