1
Fork 0

hlint pass

This commit is contained in:
Jake Wheat 2024-01-11 15:34:07 +00:00
parent 858c7723b0
commit fe6b71fa2a
3 changed files with 52 additions and 53 deletions

View file

@ -71,7 +71,6 @@ try again to add annotation to the ast
-}
-- | Lexer for SQL.
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeFamilies #-}
@ -150,6 +149,7 @@ import Data.Char
import Control.Monad (void, guard)
import Data.Text (Text)
import qualified Data.Text as T
import Data.Maybe (fromMaybe)
------------------------------------------------------------------------------
@ -223,13 +223,13 @@ lexSQL
-- ^ the SQL source to lex
-> Either ParseError [Token]
lexSQL dialect fn p src =
fmap (map tokenVal) $ lexSQLWithPositions dialect fn p src
map tokenVal <$> lexSQLWithPositions dialect fn p src
myParse :: Text -> (Maybe (Int,Int)) -> Parser a -> Text -> Either ParseError a
myParse :: Text -> Maybe (Int,Int) -> Parser a -> Text -> Either ParseError a
myParse name sp' p s =
let sp = maybe (1,1) id sp'
let sp = fromMaybe (1,1) sp'
ps = SourcePos (T.unpack name) (mkPos $ fst sp) (mkPos $ snd sp)
is = (initialState (T.unpack name) s)
is = initialState (T.unpack name) s
sps = (statePosState is) {pstateSourcePos = ps}
is' = is {statePosState = sps}
in snd $ runParser' p is'
@ -352,7 +352,7 @@ sqlString d = dollarString <|> csString <|> normalString
<$> try cs
<*> pure "'"
<*> normalStringSuffix False ""
csPrefixes = (map (flip T.cons "'") "nNbBxX") ++ ["u&'", "U&'"]
csPrefixes = map (`T.cons` "'") "nNbBxX" ++ ["u&'", "U&'"]
cs :: Parser Text
cs = choice $ map string csPrefixes
@ -387,7 +387,7 @@ identifier d =
-- try is used here to avoid a conflict with identifiers
-- and quoted strings which also start with a 'u'
unicodeQuotedIden = Identifier
<$> (f <$> try ((oneOf "uU") <* string "&"))
<$> (f <$> try (oneOf "uU" <* string "&"))
<*> qidenPart
where f x = Just (T.cons x "&\"", "\"")
qidenPart = char '"' *> qidenSuffix ""
@ -404,7 +404,7 @@ identifierString :: Parser Text
identifierString = (do
c <- satisfy isFirstLetter
choice
[T.cons c <$> (takeWhileP (Just "identifier char") isIdentifierChar)
[T.cons c <$> takeWhileP (Just "identifier char") isIdentifierChar
,pure $ T.singleton c]) <?> "identifier"
where
isFirstLetter c = c == '_' || isAlpha c
@ -486,7 +486,7 @@ sqlNumber d =
-- this is for definitely avoiding possibly ambiguous source
<* choice [-- special case to allow e.g. 1..2
guard (diPostgresSymbols d)
*> (void $ lookAhead $ try $ (string ".." <?> ""))
*> void (lookAhead $ try (string ".." <?> ""))
<|> void (notFollowedBy (oneOf "eE."))
,notFollowedBy (oneOf "eE.")
]
@ -737,7 +737,7 @@ two symbols next to eachother will fail if the symbols can combine and
| diPostgresSymbols d
, Symbol a' <- a
, Symbol b' <- b
, b' `notElem` ["+", "-"] || or (map (`T.elem` a') "~!@#%^&|`?") = False
, b' `notElem` ["+", "-"] || any (`T.elem` a') ("~!@#%^&|`?" :: [Char]) = False
{-
check two adjacent symbols in non postgres where the combination

View file

@ -217,6 +217,7 @@ import Control.Monad.Reader
(Reader
,runReader
,ask
,asks
)
import qualified Data.Set as Set
@ -227,7 +228,7 @@ import Control.Applicative ((<**>))
import Data.Char (isDigit)
import Data.List (sort,groupBy)
import Data.Function (on)
import Data.Maybe (catMaybes, isJust)
import Data.Maybe (catMaybes, isJust, mapMaybe)
import Data.Text (Text)
import qualified Data.Text as T
@ -379,7 +380,7 @@ u&"example quoted"
name :: Parser Name
name = do
bl <- queryDialect diKeywords
bl <- askDialect diKeywords
uncurry Name <$> identifierTok bl
-- todo: replace (:[]) with a named function all over
@ -561,7 +562,7 @@ typeName =
-- type names, plus all the type names which are
-- reserved words
reservedTypeNames = do
stn <- queryDialect diSpecialTypeNames
stn <- askDialect diSpecialTypeNames
(:[]) . Name Nothing . T.unwords <$> makeKeywordTree stn
@ -771,7 +772,7 @@ idenExpr =
-- special cases for keywords that can be parsed as an iden or app
keywordFunctionOrIden = try $ do
x <- unquotedIdentifierTok [] Nothing
d <- queryDialect id
d <- askDialect id
let i = T.toLower x `elem` diIdentifierKeywords d
a = T.toLower x `elem` diAppKeywords d
case () of
@ -923,7 +924,7 @@ app =
openParen *> choice
[duplicates
<**> (commaSep1 scalarExpr
<**> (((option [] orderBy) <* closeParen)
<**> ((option [] orderBy <* closeParen)
<**> (optional afilter <$$$$$> AggregateApp)))
-- separate cases with no all or distinct which must have at
-- least one scalar expr
@ -967,17 +968,17 @@ window :: Parser ([ScalarExpr] -> [Name] -> ScalarExpr)
window =
keyword_ "over" *> openParen *> option [] partitionBy
<**> (option [] orderBy
<**> (((optional frameClause) <* closeParen) <$$$$$> WindowApp))
<**> ((optional frameClause <* closeParen) <$$$$$> WindowApp))
where
partitionBy = keywords_ ["partition","by"] *> commaSep1 scalarExpr
frameClause =
frameRowsRange -- TODO: this 'and' could be an issue
<**> (choice [(keyword_ "between" *> frameLimit True)
<**> choice [(keyword_ "between" *> frameLimit True)
<**> ((keyword_ "and" *> frameLimit True)
<$$$> FrameBetween)
-- maybe this should still use a b expression
-- for consistency
,frameLimit False <**> pure (flip FrameFrom)])
,frameLimit False <**> pure (flip FrameFrom)]
frameRowsRange = FrameRows <$ keyword_ "rows"
<|> FrameRange <$ keyword_ "range"
frameLimit useB =
@ -1013,7 +1014,7 @@ inSuffix =
where
inty = choice [True <$ keyword_ "in"
,False <$ keywords_ ["not","in"]]
mkIn i v = \e -> In i e v
mkIn i v e = In i e v
{-
=== between
@ -1034,14 +1035,15 @@ and operator. This is the call to scalarExprB.
betweenSuffix :: Parser (ScalarExpr -> ScalarExpr)
betweenSuffix =
makeOp <$> Name Nothing <$> opName
makeOp . Name Nothing
<$> opName
<*> scalarExprB
<*> (keyword_ "and" *> scalarExprB)
where
opName = choice
["between" <$ keyword_ "between"
,"not between" <$ try (keywords_ ["not","between"])]
makeOp n b c = \a -> SpecialOp [n] [a,b,c]
makeOp n b c a = SpecialOp [n] [a,b,c]
{-
=== quantified comparison
@ -1224,7 +1226,7 @@ opTable bExpr =
,[prefixKeyword "not"]
,if bExpr then [] else [binaryKeywordL "and"]
,[binaryKeywordL "and" | not bExpr]
,[binaryKeywordL "or"]
@ -1368,7 +1370,7 @@ from = keyword_ "from" *> commaSep1 tref
where
-- TODO: use P (a->) for the join tref suffix
-- chainl or buildexpressionparser
tref = (nonJoinTref <?> "table ref") >>= optionSuffix (joinTrefSuffix)
tref = (nonJoinTref <?> "table ref") >>= optionSuffix joinTrefSuffix
nonJoinTref = choice
[parens $ choice
[TRQueryExpr <$> queryExpr
@ -1519,7 +1521,7 @@ queryExpr = E.makeExprParser qeterm qeOpTable
mkSelect
<$> option SQDefault duplicates
<*> selectList
<*> (optional tableExpression) <?> "table expression"
<*> optional tableExpression <?> "table expression"
mkSelect d sl Nothing =
toQueryExpr $ makeSelect {msSetQuantifier = d, msSelectList = sl}
mkSelect d sl (Just (TableExpression f w g h od ofs fe)) =
@ -1621,7 +1623,7 @@ statementWithoutSemicolon = choice
]
statement :: Parser Statement
statement = statementWithoutSemicolon <* optional semi <|> semi *> pure EmptyStatement
statement = statementWithoutSemicolon <* optional semi <|> EmptyStatement <$ semi
createSchema :: Parser Statement
createSchema = keyword_ "schema" >>
@ -1629,7 +1631,7 @@ createSchema = keyword_ "schema" >>
createTable :: Parser Statement
createTable = do
d <- queryDialect id
d <- askDialect id
let
parseColumnDef = TableColumnDef <$> columnDef
parseConstraintDef = uncurry TableConstraintDef <$> tableConstraintDef
@ -1675,7 +1677,7 @@ columnDef = ColumnDef <$> name <*> typeName
tableConstraintDef :: Parser (Maybe [Name], TableConstraint)
tableConstraintDef =
(,)
<$> (optional (keyword_ "constraint" *> names))
<$> optional (keyword_ "constraint" *> names)
<*> (unique <|> primaryKey <|> check <|> references)
where
unique = keyword_ "unique" >>
@ -1725,7 +1727,7 @@ colConstraintDef =
unique = ColUniqueConstraint <$ keyword_ "unique"
primaryKey = do
keywords_ ["primary", "key"]
d <- queryDialect id
d <- askDialect id
autoincrement <- if diAutoincrement d
then optional (keyword_ "autoincrement")
else pure Nothing
@ -2099,9 +2101,9 @@ makeKeywordTree sets =
parseGroup :: [[Text]] -> Parser [Text]
parseGroup l@((k:_):_) = do
keyword_ k
let tls = catMaybes $ map safeTail l
let tls = mapMaybe safeTail l
pr = (k:) <$> parseTrees tls
if (or $ map null tls)
if any null tls
then pr <|> pure [k]
else pr
parseGroup _ = guard False >> fail "impossible"
@ -2175,7 +2177,7 @@ unsignedInteger = read . T.unpack <$> sqlNumberTok True <?> "natural number"
-- todo: work out the symbol parsing better
symbol :: Text -> Parser Text
symbol s = symbolTok (Just s) <?> (T.unpack s)
symbol s = symbolTok (Just s) <?> T.unpack s
singleCharSymbol :: Char -> Parser Char
singleCharSymbol c = c <$ symbol (T.singleton c)
@ -2205,12 +2207,12 @@ semi = singleCharSymbol ';' <?> ""
-- = helper functions
keyword :: Text -> Parser Text
keyword k = unquotedIdentifierTok [] (Just k) <?> (T.unpack k)
keyword k = unquotedIdentifierTok [] (Just k) <?> T.unpack k
-- helper function to improve error messages
keywords_ :: [Text] -> Parser ()
keywords_ ks = mapM_ keyword_ ks <?> (T.unpack (T.unwords ks))
keywords_ ks = mapM_ keyword_ ks <?> T.unpack (T.unwords ks)
parens :: Parser a -> Parser a
@ -2270,7 +2272,7 @@ stringTokExtend = do
guard (s == "'" && e == "'")
(s',e',y) <- stringTokExtend
guard (s' == "'" && e' == "'")
pure $ (s,e,x <> y)
pure (s,e,x <> y)
,pure (s,e,x)
]
@ -2361,12 +2363,8 @@ unquotedIdentifierTok blackList kw = token test Set.empty <?> ""
-- dialect
guardDialect :: (Dialect -> Bool) -> Parser ()
guardDialect p = do
d <- ask
guard (p d)
guardDialect p = guard . p =<< ask
queryDialect :: (Dialect -> a) -> Parser a
queryDialect f = do
d <- ask
pure $ f d
askDialect :: (Dialect -> a) -> Parser a
askDialect = asks

View file

@ -3,6 +3,7 @@
-- source from ASTs. The code attempts to format the output in a
-- readable way.
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE LambdaCase #-}
module Language.SQL.SimpleSQL.Pretty
(prettyQueryExpr
,prettyScalarExpr
@ -120,7 +121,7 @@ scalarExpr d (WindowApp f es pb od fr) =
<+> pretty "over"
<+> parens ((case pb of
[] -> mempty
_ -> (pretty "partition by") <+> align
_ -> pretty "partition by" <+> align
(commaSep $ map (scalarExpr d) pb))
<+> orderBy d od
<+> me frd fr)
@ -142,7 +143,7 @@ scalarExpr dia (SpecialOp nm [a,b,c])
| nm `elem` [[Name Nothing "between"]
,[Name Nothing "not between"]] =
sep [scalarExpr dia a
,names nm <+> nest ((T.length (unnames nm) - 3)) (sep
,names nm <+> nest (T.length (unnames nm) - 3) (sep
[scalarExpr dia b
,pretty "and" <+> scalarExpr dia c])]
@ -206,10 +207,10 @@ scalarExpr d (SubQueryExpr ty qe) =
scalarExpr d (QuantifiedComparison v c cp sq) =
scalarExpr d v
<+> names c
<+> (pretty $ case cp of
CPAny -> "any"
CPSome -> "some"
CPAll -> "all")
<+> pretty (case cp of
CPAny -> "any"
CPSome -> "some"
CPAll -> "all")
<+> parens (queryExpr d sq)
scalarExpr d (Match v u sq) =
@ -306,13 +307,13 @@ typeName (PrecScaleTypeName t a b) =
typeName (PrecLengthTypeName t i m u) =
names t
<> parens (pretty (show i)
<> me (\x -> case x of
<> me (\case
PrecK -> pretty "K"
PrecM -> pretty "M"
PrecG -> pretty "G"
PrecT -> pretty "T"
PrecP -> pretty "P") m
<+> me (\x -> case x of
<+> me (\case
PrecCharacters -> pretty "CHARACTERS"
PrecOctets -> pretty "OCTETS") u)
typeName (CharTypeName t i cs col) =
@ -350,7 +351,7 @@ intervalTypeField (Itf n p) =
pretty n
<+> me (\(x,x1) ->
parens (pretty (show x)
<+> me (\y -> (sep [comma,pretty (show y)])) x1)) p
<+> me (\y -> sep [comma,pretty (show y)]) x1)) p
-- = query expressions
@ -524,7 +525,7 @@ statement d (AlterDomain nm act) =
<+> a act
where
a (ADSetDefault v) = texts ["set","default"] <+> scalarExpr d v
a (ADDropDefault) = texts ["drop","default"]
a ADDropDefault = texts ["drop","default"]
a (ADAddConstraint cnm e) =
pretty "add"
<+> maybe mempty (\cnm' -> pretty "constraint" <+> names cnm') cnm
@ -603,7 +604,7 @@ statement _ (DropTable n b) =
statement d (CreateView r nm al q co) =
pretty "create" <+> (if r then pretty "recursive" else mempty)
<+> pretty "view" <+> names nm
<+> (maybe mempty (\al' -> parens $ commaSep $ map name al')) al
<+> maybe mempty (parens . commaSep . map name) al
<+> pretty "as"
<+> queryExpr d q
<+> case co of
@ -731,7 +732,7 @@ columnDef d (ColumnDef n t mdef cons) =
pcon (ColReferencesConstraint tb c m u del) =
pretty "references"
<+> names tb
<+> maybe mempty (\c' -> parens (name c')) c
<+> maybe mempty (parens . name) c
<+> refMatch m
<+> refAct "update" u
<+> refAct "delete" del