diff --git a/Language/SQL/SimpleSQL/Lex.lhs b/Language/SQL/SimpleSQL/Lex.lhs index 6fecbfe..9e82665 100644 --- a/Language/SQL/SimpleSQL/Lex.lhs +++ b/Language/SQL/SimpleSQL/Lex.lhs @@ -171,22 +171,26 @@ u&"unicode quoted identifier" > identifier :: Dialect -> Parser Token > identifier d = > choice -> [Identifier (Just ("\"","\"")) <$> qiden -> -- try is used here to avoid a conflict with identifiers -> -- and quoted strings which also start with a 'u' -> ,Identifier (Just ("u&\"","\"")) <$> (try (string "u&") *> qiden) -> ,Identifier (Just ("U&\"","\"")) <$> (try (string "U&") *> qiden) -> ,Identifier Nothing <$> identifierString -> -- todo: dialect protection -> ,guard (diSyntaxFlavour d == MySQL) >> -> Identifier (Just ("`","`")) -> <$> (char '`' *> takeWhile1 (/='`') <* char '`') -> ,guard (diSyntaxFlavour d == SQLServer) >> -> Identifier (Just ("[","]")) -> <$> (char '[' *> takeWhile1 (`notElem` "[]") <* char ']') +> [quotedIden +> ,unicodeQuotedIden +> ,regularIden +> ,guard (diSyntaxFlavour d == MySQL) >> mySqlQuotedIden +> ,guard (diSyntaxFlavour d == SQLServer) >> sqlServerQuotedIden > ] > where -> qiden = char '"' *> qidenSuffix "" +> regularIden = Identifier Nothing <$> identifierString +> quotedIden = Identifier (Just ("\"","\"")) <$> qidenPart +> mySqlQuotedIden = Identifier (Just ("`","`")) +> <$> (char '`' *> takeWhile1 (/='`') <* char '`') +> sqlServerQuotedIden = Identifier (Just ("[","]")) +> <$> (char '[' *> takeWhile1 (`notElem` "[]") <* char ']') +> -- 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 "&")) +> <*> qidenPart +> where f x = Just (x: "&\"", "\"") +> qidenPart = char '"' *> qidenSuffix "" > qidenSuffix t = do > s <- takeTill (=='"') > void $ char '"' @@ -330,18 +334,7 @@ constant. Symbols A symbol is an operator, or one of the misc symbols which include: -. -.. -:= -: -:: -( -) -? -; -, -{ (for odbc) -} +. .. := : :: ( ) ? ; , { } (for odbc) The postgresql operator syntax allows a huge range of operators compared with ansi and other dialects @@ -502,9 +495,9 @@ isn't there. This is to improve user experience: provide an error if we see */ outside a comment. This could potentially break postgres ops with */ -in (which is a stupid thing to do). In other cases, the user should -write * / instead (I can't think of any cases when this would be valid -syntax though). +in them (which is a stupid thing to do). In other cases, the user +should write * / instead (I can't think of any cases when this would +be valid syntax though). > dontParseEndBlockComment :: Dialect -> Parser Token > dontParseEndBlockComment _ =