-- |
--
-- Our parsing strategy is to port the original Postgres parser as closely as possible.
--
-- We're using the @gram.y@ Postgres source file, which is the closest thing we have
-- to a Postgres syntax spec. Here's a link to it:
-- https://github.com/postgres/postgres/blob/master/src/backend/parser/gram.y.
--
-- Here's the essence of how the original parser is implemented, citing from
-- [PostgreSQL Wiki](https://wiki.postgresql.org/wiki/Developer_FAQ):
--
--     scan.l defines the lexer, i.e. the algorithm that splits a string
--     (containing an SQL statement) into a stream of tokens.
--     A token is usually a single word
--     (i.e., doesn't contain spaces but is delimited by spaces),
--     but can also be a whole single or double-quoted string for example.
--     The lexer is basically defined in terms of regular expressions
--     which describe the different token types.
--
--     gram.y defines the grammar (the syntactical structure) of SQL statements,
--     using the tokens generated by the lexer as basic building blocks.
--     The grammar is defined in BNF notation.
--     BNF resembles regular expressions but works on the level of tokens, not characters.
--     Also, patterns (called rules or productions in BNF) are named, and may be recursive,
--     i.e. use themselves as sub-patterns.
module PostgresqlSyntax.Parsing where

import Control.Applicative.Combinators hiding (some)
import Control.Applicative.Combinators.NonEmpty
import qualified Data.HashSet as HashSet
import qualified Data.List.NonEmpty as NonEmpty
import qualified Data.Text as Text
import HeadedMegaparsec hiding (string)
import PostgresqlSyntax.Ast
import PostgresqlSyntax.Extras.HeadedMegaparsec hiding (run)
import qualified PostgresqlSyntax.Extras.HeadedMegaparsec as Extras
import qualified PostgresqlSyntax.Extras.NonEmpty as NonEmpty
import qualified PostgresqlSyntax.KeywordSet as KeywordSet
import qualified PostgresqlSyntax.Predicate as Predicate
import PostgresqlSyntax.Prelude hiding (bit, expr, filter, fromList, head, many, option, some, sortBy, tail, try)
import qualified PostgresqlSyntax.Validation as Validation
import qualified Text.Builder as TextBuilder
import Text.Megaparsec (Parsec, Stream)
import qualified Text.Megaparsec as Megaparsec
import qualified Text.Megaparsec.Char as MegaparsecChar
import qualified Text.Megaparsec.Char.Lexer as MegaparsecLexer

-- $setup
-- >>> testParser parser = either putStr print . run parser

type Parser = HeadedParsec Void Text

-- * Executors

run :: Parser a -> Text -> Either String a
run :: Parser a -> Text -> Either String a
run = Parser a -> Text -> Either String a
forall err strm a.
(Ord err, VisualStream strm, TraversableStream strm,
 ShowErrorComponent err) =>
HeadedParsec err strm a -> strm -> Either String a
Extras.run

-- * Helpers

commaSeparator :: Parser ()
commaSeparator :: Parser ()
commaSeparator = Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Char -> HeadedParsec Void Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
',' HeadedParsec Void Text Char -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space

dotSeparator :: Parser ()
dotSeparator :: Parser ()
dotSeparator = Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Char -> HeadedParsec Void Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'.' HeadedParsec Void Text Char -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space

inBrackets :: Parser a -> Parser a
inBrackets :: Parser a -> Parser a
inBrackets Parser a
p = Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'[' HeadedParsec Void Text Char -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> Parser a -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
p Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser a -> HeadedParsec Void Text Char -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
']'

inBracketsCont :: Parser a -> Parser (Parser a)
inBracketsCont :: Parser a -> Parser (Parser a)
inBracketsCont Parser a
p = Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'[' HeadedParsec Void Text Char -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser (Parser a) -> Parser (Parser a)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a -> Parser (Parser a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> Parser a -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
p Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser a -> HeadedParsec Void Text Char -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
']')

inParens :: Parser a -> Parser a
inParens :: Parser a -> Parser a
inParens Parser a
p = Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'(' HeadedParsec Void Text Char -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> Parser a -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
p Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser a -> HeadedParsec Void Text Char -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
')'

inParensCont :: Parser a -> Parser (Parser a)
inParensCont :: Parser a -> Parser (Parser a)
inParensCont Parser a
p = Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'(' HeadedParsec Void Text Char -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser (Parser a) -> Parser (Parser a)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a -> Parser (Parser a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> Parser a -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
p Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser a -> HeadedParsec Void Text Char -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
')')

inParensWithLabel :: (label -> content -> result) -> Parser label -> Parser content -> Parser result
inParensWithLabel :: (label -> content -> result)
-> Parser label -> Parser content -> Parser result
inParensWithLabel label -> content -> result
_result Parser label
_labelParser Parser content
_contentParser = do
  label
_label <- Parser label -> Parser label
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead Parser label
_labelParser
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
  Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'('
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
  content
_content <- Parser content
_contentParser
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
  Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
')'
  pure (label -> content -> result
_result label
_label content
_content)

inParensWithClause :: Parser clause -> Parser content -> Parser content
inParensWithClause :: Parser clause -> Parser content -> Parser content
inParensWithClause = (clause -> content -> content)
-> Parser clause -> Parser content -> Parser content
forall label content result.
(label -> content -> result)
-> Parser label -> Parser content -> Parser result
inParensWithLabel ((content -> content) -> clause -> content -> content
forall a b. a -> b -> a
const content -> content
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id)

trueIfPresent :: Parser a -> Parser Bool
trueIfPresent :: Parser a -> Parser Bool
trueIfPresent Parser a
p = Bool -> Parser Bool -> Parser Bool
forall (m :: * -> *) a. Alternative m => a -> m a -> m a
option Bool
False (Bool
True Bool -> Parser a -> Parser Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Parser a
p)

-- |
-- >>> testParser (quotedString '\'') "'abc''d'"
-- "abc'd"
quotedString :: Char -> Parser Text
quotedString :: Char -> Parser Text
quotedString Char
q = do
  Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
q
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Text
_tail <-
    Parsec Void Text Text -> Parser Text
forall err strm a.
(Ord err, Stream strm) =>
Parsec err strm a -> HeadedParsec err strm a
parse (Parsec Void Text Text -> Parser Text)
-> Parsec Void Text Text -> Parser Text
forall a b. (a -> b) -> a -> b
$
      let collectChunks :: Builder -> Parsec Void Text Text
collectChunks !Builder
bdr = do
            Text
chunk <- Maybe String
-> (Token Text -> Bool) -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Maybe String -> (Token s -> Bool) -> m (Tokens s)
Megaparsec.takeWhileP Maybe String
forall a. Maybe a
Nothing (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
q)
            let bdr' :: Builder
bdr' = Builder
bdr Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
TextBuilder.text Text
chunk
            Parsec Void Text Text -> Parsec Void Text Text
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
Megaparsec.try (Builder -> Parsec Void Text Text
consumeEscapedQuote Builder
bdr') Parsec Void Text Text
-> Parsec Void Text Text -> Parsec Void Text Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Builder -> Parsec Void Text Text
finish Builder
bdr'
          consumeEscapedQuote :: Builder -> Parsec Void Text Text
consumeEscapedQuote Builder
bdr = do
            Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
MegaparsecChar.char Char
Token Text
q
            Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
MegaparsecChar.char Char
Token Text
q
            Builder -> Parsec Void Text Text
collectChunks (Builder
bdr Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Char -> Builder
TextBuilder.char Char
q)
          finish :: Builder -> Parsec Void Text Text
finish Builder
bdr = do
            Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
MegaparsecChar.char Char
Token Text
q
            return (Builder -> Text
TextBuilder.run Builder
bdr)
       in Builder -> Parsec Void Text Text
collectChunks Builder
forall a. Monoid a => a
mempty
  return Text
_tail

atEnd :: Parser a -> Parser a
atEnd :: Parser a -> Parser a
atEnd Parser a
p = Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> Parser a -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser a
p Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm. (Ord err, Stream strm) => HeadedParsec err strm ()
eof

-- * PreparableStmt

preparableStmt :: Parser PreparableStmt
preparableStmt =
  [Parser PreparableStmt] -> Parser PreparableStmt
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ SelectStmt -> PreparableStmt
SelectPreparableStmt (SelectStmt -> PreparableStmt)
-> HeadedParsec Void Text SelectStmt -> Parser PreparableStmt
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SelectStmt
selectStmt,
      InsertStmt -> PreparableStmt
InsertPreparableStmt (InsertStmt -> PreparableStmt)
-> HeadedParsec Void Text InsertStmt -> Parser PreparableStmt
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text InsertStmt
insertStmt,
      UpdateStmt -> PreparableStmt
UpdatePreparableStmt (UpdateStmt -> PreparableStmt)
-> HeadedParsec Void Text UpdateStmt -> Parser PreparableStmt
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text UpdateStmt
updateStmt,
      DeleteStmt -> PreparableStmt
DeletePreparableStmt (DeleteStmt -> PreparableStmt)
-> HeadedParsec Void Text DeleteStmt -> Parser PreparableStmt
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text DeleteStmt
deleteStmt,
      CallStmt -> PreparableStmt
CallPreparableStmt (CallStmt -> PreparableStmt)
-> HeadedParsec Void Text CallStmt -> Parser PreparableStmt
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text CallStmt
callStmt
    ]

-- * Call

callStmt :: HeadedParsec Void Text CallStmt
callStmt = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"call"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  FuncApplication -> CallStmt
CallStmt (FuncApplication -> CallStmt)
-> HeadedParsec Void Text FuncApplication
-> HeadedParsec Void Text CallStmt
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text FuncApplication
funcApplication

-- * Insert

insertStmt :: HeadedParsec Void Text InsertStmt
insertStmt = do
  Maybe WithClause
a <- HeadedParsec Void Text WithClause
-> HeadedParsec Void Text (Maybe WithClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text WithClause
-> HeadedParsec Void Text WithClause
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text WithClause
withClause HeadedParsec Void Text WithClause
-> Parser () -> HeadedParsec Void Text WithClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"insert"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"into"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  InsertTarget
b <- HeadedParsec Void Text InsertTarget
insertTarget
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  InsertRest
c <- HeadedParsec Void Text InsertRest
insertRest
  Maybe OnConflict
d <- HeadedParsec Void Text OnConflict
-> HeadedParsec Void Text (Maybe OnConflict)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text OnConflict
-> HeadedParsec Void Text OnConflict
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text OnConflict
onConflict)
  Maybe ReturningClause
e <- HeadedParsec Void Text ReturningClause
-> HeadedParsec Void Text (Maybe ReturningClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text ReturningClause
-> HeadedParsec Void Text ReturningClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text ReturningClause
returningClause)
  return (Maybe WithClause
-> InsertTarget
-> InsertRest
-> Maybe OnConflict
-> Maybe ReturningClause
-> InsertStmt
InsertStmt Maybe WithClause
a InsertTarget
b InsertRest
c Maybe OnConflict
d Maybe ReturningClause
e)

insertTarget :: HeadedParsec Void Text InsertTarget
insertTarget = do
  QualifiedName
a <- HeadedParsec Void Text QualifiedName
qualifiedName
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe Ident
b <- HeadedParsec Void Text Ident
-> HeadedParsec Void Text (Maybe Ident)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"as" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Ident
colId)
  return (QualifiedName -> Maybe Ident -> InsertTarget
InsertTarget QualifiedName
a Maybe Ident
b)

insertRest :: HeadedParsec Void Text InsertRest
insertRest =
  [HeadedParsec Void Text InsertRest]
-> HeadedParsec Void Text InsertRest
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ InsertRest
DefaultValuesInsertRest InsertRest -> Parser Text -> HeadedParsec Void Text InsertRest
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"default" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"values"),
      do
        Maybe InsertColumnList
a <- HeadedParsec Void Text InsertColumnList
-> HeadedParsec Void Text (Maybe InsertColumnList)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text InsertColumnList
-> HeadedParsec Void Text InsertColumnList
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text InsertColumnList
insertColumnList HeadedParsec Void Text InsertColumnList
-> Parser () -> HeadedParsec Void Text InsertColumnList
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
        Maybe OverrideKind
b <- HeadedParsec Void Text OverrideKind
-> HeadedParsec Void Text (Maybe OverrideKind)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text OverrideKind
 -> HeadedParsec Void Text (Maybe OverrideKind))
-> HeadedParsec Void Text OverrideKind
-> HeadedParsec Void Text (Maybe OverrideKind)
forall a b. (a -> b) -> a -> b
$ do
          Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"overriding"
          Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
          Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
          OverrideKind
b <- HeadedParsec Void Text OverrideKind
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s OverrideKind
overrideKind
          Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
          Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"value"
          Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
          return OverrideKind
b
        SelectStmt
c <- HeadedParsec Void Text SelectStmt
selectStmt
        return (Maybe InsertColumnList
-> Maybe OverrideKind -> SelectStmt -> InsertRest
SelectInsertRest Maybe InsertColumnList
a Maybe OverrideKind
b SelectStmt
c)
    ]

overrideKind :: HeadedParsec e s OverrideKind
overrideKind =
  [HeadedParsec e s OverrideKind] -> HeadedParsec e s OverrideKind
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ OverrideKind
UserOverrideKind OverrideKind
-> HeadedParsec e s Text -> HeadedParsec e s OverrideKind
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"user",
      OverrideKind
SystemOverrideKind OverrideKind
-> HeadedParsec e s Text -> HeadedParsec e s OverrideKind
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"system"
    ]

insertColumnList :: HeadedParsec Void Text InsertColumnList
insertColumnList = Parser ()
-> HeadedParsec Void Text InsertColumnItem
-> HeadedParsec Void Text InsertColumnList
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text InsertColumnItem
insertColumnItem

insertColumnItem :: HeadedParsec Void Text InsertColumnItem
insertColumnItem = do
  Ident
a <- HeadedParsec Void Text Ident
colId
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe Indirection
b <- HeadedParsec Void Text Indirection
-> HeadedParsec Void Text (Maybe Indirection)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text Indirection
-> HeadedParsec Void Text Indirection
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Indirection
indirection)
  return (Ident -> Maybe Indirection -> InsertColumnItem
InsertColumnItem Ident
a Maybe Indirection
b)

onConflict :: HeadedParsec Void Text OnConflict
onConflict = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"on"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"conflict"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe ConfExpr
a <- HeadedParsec Void Text ConfExpr
-> HeadedParsec Void Text (Maybe ConfExpr)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text ConfExpr
confExpr HeadedParsec Void Text ConfExpr
-> Parser () -> HeadedParsec Void Text ConfExpr
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"do"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  OnConflictDo
b <- HeadedParsec Void Text OnConflictDo
onConflictDo
  return (Maybe ConfExpr -> OnConflictDo -> OnConflict
OnConflict Maybe ConfExpr
a OnConflictDo
b)

confExpr :: HeadedParsec Void Text ConfExpr
confExpr =
  [HeadedParsec Void Text ConfExpr]
-> HeadedParsec Void Text ConfExpr
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ IndexParams -> Maybe WhereClause -> ConfExpr
WhereConfExpr (IndexParams -> Maybe WhereClause -> ConfExpr)
-> HeadedParsec Void Text IndexParams
-> HeadedParsec Void Text (Maybe WhereClause -> ConfExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text IndexParams
-> HeadedParsec Void Text IndexParams
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text IndexParams
indexParams HeadedParsec Void Text (Maybe WhereClause -> ConfExpr)
-> HeadedParsec Void Text (Maybe WhereClause)
-> HeadedParsec Void Text ConfExpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
whereClause),
      Ident -> ConfExpr
ConstraintConfExpr (Ident -> ConfExpr)
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text ConfExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"on" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"constraint" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Ident
name)
    ]

onConflictDo :: HeadedParsec Void Text OnConflictDo
onConflictDo =
  [HeadedParsec Void Text OnConflictDo]
-> HeadedParsec Void Text OnConflictDo
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ OnConflictDo
NothingOnConflictDo OnConflictDo -> Parser Text -> HeadedParsec Void Text OnConflictDo
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"nothing",
      do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"update"
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"set"
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        NonEmpty SetClause
a <- HeadedParsec Void Text (NonEmpty SetClause)
setClauseList
        Maybe WhereClause
b <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
whereClause)
        return (NonEmpty SetClause -> Maybe WhereClause -> OnConflictDo
UpdateOnConflictDo NonEmpty SetClause
a Maybe WhereClause
b)
    ]

returningClause :: HeadedParsec Void Text ReturningClause
returningClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"returning"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  HeadedParsec Void Text ReturningClause
targetList

-- * Update

updateStmt :: HeadedParsec Void Text UpdateStmt
updateStmt = do
  Maybe WithClause
a <- HeadedParsec Void Text WithClause
-> HeadedParsec Void Text (Maybe WithClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text WithClause
-> HeadedParsec Void Text WithClause
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text WithClause
withClause HeadedParsec Void Text WithClause
-> Parser () -> HeadedParsec Void Text WithClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"update"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  RelationExprOptAlias
b <- [Text] -> HeadedParsec Void Text RelationExprOptAlias
relationExprOptAlias [Text
"set"]
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"set"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  NonEmpty SetClause
c <- HeadedParsec Void Text (NonEmpty SetClause)
setClauseList
  Maybe FromClause
d <- HeadedParsec Void Text FromClause
-> HeadedParsec Void Text (Maybe FromClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text FromClause
-> HeadedParsec Void Text FromClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text FromClause
fromClause)
  Maybe WhereOrCurrentClause
e <- HeadedParsec Void Text WhereOrCurrentClause
-> HeadedParsec Void Text (Maybe WhereOrCurrentClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereOrCurrentClause
-> HeadedParsec Void Text WhereOrCurrentClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereOrCurrentClause
whereOrCurrentClause)
  Maybe ReturningClause
f <- HeadedParsec Void Text ReturningClause
-> HeadedParsec Void Text (Maybe ReturningClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text ReturningClause
-> HeadedParsec Void Text ReturningClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text ReturningClause
returningClause)
  return (Maybe WithClause
-> RelationExprOptAlias
-> NonEmpty SetClause
-> Maybe FromClause
-> Maybe WhereOrCurrentClause
-> Maybe ReturningClause
-> UpdateStmt
UpdateStmt Maybe WithClause
a RelationExprOptAlias
b NonEmpty SetClause
c Maybe FromClause
d Maybe WhereOrCurrentClause
e Maybe ReturningClause
f)

setClauseList :: HeadedParsec Void Text (NonEmpty SetClause)
setClauseList = Parser ()
-> HeadedParsec Void Text SetClause
-> HeadedParsec Void Text (NonEmpty SetClause)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text SetClause
setClause

setClause :: HeadedParsec Void Text SetClause
setClause =
  [HeadedParsec Void Text SetClause]
-> HeadedParsec Void Text SetClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        SetTargetList
a <- Parser SetTargetList -> Parser SetTargetList
forall a. Parser a -> Parser a
inParens Parser SetTargetList
setTargetList
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'='
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        WhereClause
b <- HeadedParsec Void Text WhereClause
aExpr
        return (SetTargetList -> WhereClause -> SetClause
TargetListSetClause SetTargetList
a WhereClause
b),
      do
        SetTarget
a <- HeadedParsec Void Text SetTarget
setTarget
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'='
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        WhereClause
b <- HeadedParsec Void Text WhereClause
aExpr
        return (SetTarget -> WhereClause -> SetClause
TargetSetClause SetTarget
a WhereClause
b)
    ]

setTarget :: HeadedParsec Void Text SetTarget
setTarget = do
  Ident
a <- HeadedParsec Void Text Ident
colId
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe Indirection
b <- HeadedParsec Void Text Indirection
-> HeadedParsec Void Text (Maybe Indirection)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text Indirection
-> HeadedParsec Void Text Indirection
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Indirection
indirection)
  return (Ident -> Maybe Indirection -> SetTarget
SetTarget Ident
a Maybe Indirection
b)

setTargetList :: Parser SetTargetList
setTargetList = Parser ()
-> HeadedParsec Void Text SetTarget -> Parser SetTargetList
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text SetTarget
setTarget

-- * Delete

deleteStmt :: HeadedParsec Void Text DeleteStmt
deleteStmt = do
  Maybe WithClause
a <- HeadedParsec Void Text WithClause
-> HeadedParsec Void Text (Maybe WithClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text WithClause
-> HeadedParsec Void Text WithClause
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text WithClause
withClause HeadedParsec Void Text WithClause
-> Parser () -> HeadedParsec Void Text WithClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"delete"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"from"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  RelationExprOptAlias
b <- [Text] -> HeadedParsec Void Text RelationExprOptAlias
relationExprOptAlias [Text
"using", Text
"where", Text
"returning"]
  Maybe FromClause
c <- HeadedParsec Void Text FromClause
-> HeadedParsec Void Text (Maybe FromClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text FromClause
-> HeadedParsec Void Text FromClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text FromClause
usingClause)
  Maybe WhereOrCurrentClause
d <- HeadedParsec Void Text WhereOrCurrentClause
-> HeadedParsec Void Text (Maybe WhereOrCurrentClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereOrCurrentClause
-> HeadedParsec Void Text WhereOrCurrentClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereOrCurrentClause
whereOrCurrentClause)
  Maybe ReturningClause
e <- HeadedParsec Void Text ReturningClause
-> HeadedParsec Void Text (Maybe ReturningClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text ReturningClause
-> HeadedParsec Void Text ReturningClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text ReturningClause
returningClause)
  return (Maybe WithClause
-> RelationExprOptAlias
-> Maybe FromClause
-> Maybe WhereOrCurrentClause
-> Maybe ReturningClause
-> DeleteStmt
DeleteStmt Maybe WithClause
a RelationExprOptAlias
b Maybe FromClause
c Maybe WhereOrCurrentClause
d Maybe ReturningClause
e)

usingClause :: HeadedParsec Void Text FromClause
usingClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"using"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  HeadedParsec Void Text FromClause
fromList

-- * Select

-- |
-- >>> test = testParser selectStmt
--
-- >>> test "select id from as"
-- ...
--   |
-- 1 | select id from as
--   |                  ^
-- Reserved keyword "as" used as an identifier. If that's what you intend, you have to wrap it in double quotes.
selectStmt :: HeadedParsec Void Text SelectStmt
selectStmt = SelectNoParens -> SelectStmt
forall a b. a -> Either a b
Left (SelectNoParens -> SelectStmt)
-> HeadedParsec Void Text SelectNoParens
-> HeadedParsec Void Text SelectStmt
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SelectNoParens
selectNoParens HeadedParsec Void Text SelectStmt
-> HeadedParsec Void Text SelectStmt
-> HeadedParsec Void Text SelectStmt
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> SelectWithParens -> SelectStmt
forall a b. b -> Either a b
Right (SelectWithParens -> SelectStmt)
-> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text SelectStmt
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SelectWithParens
selectWithParens

selectWithParens :: HeadedParsec Void Text SelectWithParens
selectWithParens = HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text SelectWithParens
forall a. Parser a -> Parser a
inParens (SelectWithParens -> SelectWithParens
WithParensSelectWithParens (SelectWithParens -> SelectWithParens)
-> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text SelectWithParens
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SelectWithParens
selectWithParens HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text SelectWithParens
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> SelectNoParens -> SelectWithParens
NoParensSelectWithParens (SelectNoParens -> SelectWithParens)
-> HeadedParsec Void Text SelectNoParens
-> HeadedParsec Void Text SelectWithParens
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SelectNoParens
selectNoParens)

selectNoParens :: HeadedParsec Void Text SelectNoParens
selectNoParens = HeadedParsec Void Text SelectNoParens
withSelectNoParens HeadedParsec Void Text SelectNoParens
-> HeadedParsec Void Text SelectNoParens
-> HeadedParsec Void Text SelectNoParens
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HeadedParsec Void Text SelectNoParens
simpleSelectNoParens

sharedSelectNoParens :: Maybe WithClause -> HeadedParsec Void Text SelectNoParens
sharedSelectNoParens Maybe WithClause
_with = do
  SelectClause
_select <- HeadedParsec Void Text SelectClause
selectClause
  Maybe SortClause
_sort <- HeadedParsec Void Text SortClause
-> HeadedParsec Void Text (Maybe SortClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SortClause
-> HeadedParsec Void Text SortClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SortClause
sortClause)
  Maybe SelectLimit
_limit <- HeadedParsec Void Text SelectLimit
-> HeadedParsec Void Text (Maybe SelectLimit)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SelectLimit
-> HeadedParsec Void Text SelectLimit
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SelectLimit
selectLimit)
  Maybe ForLockingClause
_forLocking <- HeadedParsec Void Text ForLockingClause
-> HeadedParsec Void Text (Maybe ForLockingClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text ForLockingClause
-> HeadedParsec Void Text ForLockingClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text ForLockingClause
forLockingClause)
  return (Maybe WithClause
-> SelectClause
-> Maybe SortClause
-> Maybe SelectLimit
-> Maybe ForLockingClause
-> SelectNoParens
SelectNoParens Maybe WithClause
_with SelectClause
_select Maybe SortClause
_sort Maybe SelectLimit
_limit Maybe ForLockingClause
_forLocking)

-- |
-- The one that doesn't start with \"WITH\".
--
-- ==== References
-- @
--   | simple_select
--   | select_clause sort_clause
--   | select_clause opt_sort_clause for_locking_clause opt_select_limit
--   | select_clause opt_sort_clause select_limit opt_for_locking_clause
-- @
simpleSelectNoParens :: HeadedParsec Void Text SelectNoParens
simpleSelectNoParens = Maybe WithClause -> HeadedParsec Void Text SelectNoParens
sharedSelectNoParens Maybe WithClause
forall a. Maybe a
Nothing

withSelectNoParens :: HeadedParsec Void Text SelectNoParens
withSelectNoParens = do
  WithClause
_with <- HeadedParsec Void Text WithClause
-> HeadedParsec Void Text WithClause
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text WithClause
withClause
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Maybe WithClause -> HeadedParsec Void Text SelectNoParens
sharedSelectNoParens (WithClause -> Maybe WithClause
forall a. a -> Maybe a
Just WithClause
_with)

selectClause :: HeadedParsec Void Text SelectClause
selectClause = HeadedParsec Void Text SelectClause
-> (SelectClause -> HeadedParsec Void Text SelectClause)
-> HeadedParsec Void Text SelectClause
forall (m :: * -> *) a.
(Monad m, Alternative m) =>
m a -> (a -> m a) -> m a
suffixRec HeadedParsec Void Text SelectClause
base SelectClause -> HeadedParsec Void Text SelectClause
suffix
  where
    base :: HeadedParsec Void Text SelectClause
base =
      [HeadedParsec Void Text SelectClause]
-> HeadedParsec Void Text SelectClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
        [ SelectWithParens -> SelectClause
forall a b. b -> Either a b
Right (SelectWithParens -> SelectClause)
-> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text SelectClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SelectWithParens
selectWithParens,
          SimpleSelect -> SelectClause
forall a b. a -> Either a b
Left (SimpleSelect -> SelectClause)
-> HeadedParsec Void Text SimpleSelect
-> HeadedParsec Void Text SelectClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SimpleSelect
baseSimpleSelect
        ]
    suffix :: SelectClause -> HeadedParsec Void Text SelectClause
suffix SelectClause
a = SimpleSelect -> SelectClause
forall a b. a -> Either a b
Left (SimpleSelect -> SelectClause)
-> HeadedParsec Void Text SimpleSelect
-> HeadedParsec Void Text SelectClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SelectClause -> HeadedParsec Void Text SimpleSelect
extensionSimpleSelect SelectClause
a

baseSimpleSelect :: HeadedParsec Void Text SimpleSelect
baseSimpleSelect =
  [HeadedParsec Void Text SimpleSelect]
-> HeadedParsec Void Text SimpleSelect
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"select"
        HeadedParsec Void Text Char -> Parser ()
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm ()
notFollowedBy (HeadedParsec Void Text Char -> Parser ())
-> HeadedParsec Void Text Char -> Parser ()
forall a b. (a -> b) -> a -> b
$ (Token Text -> Bool) -> HeadedParsec Void Text (Token Text)
forall err strm.
(Ord err, Stream strm) =>
(Token strm -> Bool) -> HeadedParsec err strm (Token strm)
satisfy ((Token Text -> Bool) -> HeadedParsec Void Text (Token Text))
-> (Token Text -> Bool) -> HeadedParsec Void Text (Token Text)
forall a b. (a -> b) -> a -> b
$ Char -> Bool
Token Text -> Bool
isAlphaNum
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Maybe Targeting
_targeting <- HeadedParsec Void Text Targeting
-> HeadedParsec Void Text (Maybe Targeting)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text Targeting
-> HeadedParsec Void Text Targeting
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Targeting
targeting)
        Maybe IntoClause
_intoClause <- HeadedParsec Void Text IntoClause
-> HeadedParsec Void Text (Maybe IntoClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"into" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text IntoClause
-> HeadedParsec Void Text IntoClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text IntoClause
optTempTableName)
        Maybe FromClause
_fromClause <- HeadedParsec Void Text FromClause
-> HeadedParsec Void Text (Maybe FromClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text FromClause
-> HeadedParsec Void Text FromClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text FromClause
fromClause)
        Maybe WhereClause
_whereClause <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
whereClause)
        Maybe (NonEmpty GroupByItem)
_groupClause <- HeadedParsec Void Text (NonEmpty GroupByItem)
-> HeadedParsec Void Text (Maybe (NonEmpty GroupByItem))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"group by" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text (NonEmpty GroupByItem)
-> HeadedParsec Void Text (NonEmpty GroupByItem)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
-> HeadedParsec Void Text GroupByItem
-> HeadedParsec Void Text (NonEmpty GroupByItem)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text GroupByItem
groupByItem)
        Maybe WhereClause
_havingClause <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"having" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr)
        Maybe (NonEmpty WindowDefinition)
_windowClause <- HeadedParsec Void Text (NonEmpty WindowDefinition)
-> HeadedParsec Void Text (Maybe (NonEmpty WindowDefinition))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"window" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text (NonEmpty WindowDefinition)
-> HeadedParsec Void Text (NonEmpty WindowDefinition)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
-> HeadedParsec Void Text WindowDefinition
-> HeadedParsec Void Text (NonEmpty WindowDefinition)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text WindowDefinition
windowDefinition)
        return (Maybe Targeting
-> Maybe IntoClause
-> Maybe FromClause
-> Maybe WhereClause
-> Maybe (NonEmpty GroupByItem)
-> Maybe WhereClause
-> Maybe (NonEmpty WindowDefinition)
-> SimpleSelect
NormalSimpleSelect Maybe Targeting
_targeting Maybe IntoClause
_intoClause Maybe FromClause
_fromClause Maybe WhereClause
_whereClause Maybe (NonEmpty GroupByItem)
_groupClause Maybe WhereClause
_havingClause Maybe (NonEmpty WindowDefinition)
_windowClause),
      do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"table"
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        RelationExpr -> SimpleSelect
TableSimpleSelect (RelationExpr -> SimpleSelect)
-> HeadedParsec Void Text RelationExpr
-> HeadedParsec Void Text SimpleSelect
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text RelationExpr
relationExpr,
      ValuesClause -> SimpleSelect
ValuesSimpleSelect (ValuesClause -> SimpleSelect)
-> HeadedParsec Void Text ValuesClause
-> HeadedParsec Void Text SimpleSelect
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ValuesClause
valuesClause
    ]

extensionSimpleSelect :: SelectClause -> HeadedParsec Void Text SimpleSelect
extensionSimpleSelect SelectClause
_headSelectClause = do
  SelectBinOp
_op <- Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SelectBinOp
-> HeadedParsec Void Text SelectBinOp
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SelectBinOp
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s SelectBinOp
selectBinOp HeadedParsec Void Text SelectBinOp
-> Parser () -> HeadedParsec Void Text SelectBinOp
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe Bool
_allOrDistinct <- Parser Bool -> HeadedParsec Void Text (Maybe Bool)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Bool
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s Bool
allOrDistinct Parser Bool -> Parser () -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
  SelectClause
_selectClause <- HeadedParsec Void Text SelectClause
selectClause
  return (SelectBinOp
-> SelectClause -> Maybe Bool -> SelectClause -> SimpleSelect
BinSimpleSelect SelectBinOp
_op SelectClause
_headSelectClause Maybe Bool
_allOrDistinct SelectClause
_selectClause)

allOrDistinct :: HeadedParsec e s Bool
allOrDistinct = Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"all" HeadedParsec e s Text -> Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
False HeadedParsec e s Bool
-> HeadedParsec e s Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"distinct" HeadedParsec e s Text -> Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
True

selectBinOp :: HeadedParsec e s SelectBinOp
selectBinOp =
  [HeadedParsec e s SelectBinOp] -> HeadedParsec e s SelectBinOp
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"union" HeadedParsec e s Text
-> SelectBinOp -> HeadedParsec e s SelectBinOp
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SelectBinOp
UnionSelectBinOp,
      Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"intersect" HeadedParsec e s Text
-> SelectBinOp -> HeadedParsec e s SelectBinOp
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SelectBinOp
IntersectSelectBinOp,
      Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"except" HeadedParsec e s Text
-> SelectBinOp -> HeadedParsec e s SelectBinOp
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> SelectBinOp
ExceptSelectBinOp
    ]

valuesClause :: HeadedParsec Void Text ValuesClause
valuesClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"values"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
  Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text ValuesClause
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator (HeadedParsec Void Text (NonEmpty WhereClause)
 -> HeadedParsec Void Text ValuesClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text ValuesClause
forall a b. (a -> b) -> a -> b
$ do
    Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'('
    Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
    Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
    NonEmpty WhereClause
_a <- Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text WhereClause
aExpr
    Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
    Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
')'
    return NonEmpty WhereClause
_a

withClause :: HeadedParsec Void Text WithClause
withClause = String
-> HeadedParsec Void Text WithClause
-> HeadedParsec Void Text WithClause
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"with clause" (HeadedParsec Void Text WithClause
 -> HeadedParsec Void Text WithClause)
-> HeadedParsec Void Text WithClause
-> HeadedParsec Void Text WithClause
forall a b. (a -> b) -> a -> b
$ do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"with"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Bool
_recursive <- Bool -> Parser Bool -> Parser Bool
forall (m :: * -> *) a. Alternative m => a -> m a -> m a
option Bool
False (Bool
True Bool -> Parser Text -> Parser Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"recursive" Parser Bool -> Parser () -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
  NonEmpty CommonTableExpr
_cteList <- Parser ()
-> HeadedParsec Void Text CommonTableExpr
-> HeadedParsec Void Text (NonEmpty CommonTableExpr)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text CommonTableExpr
commonTableExpr
  return (Bool -> NonEmpty CommonTableExpr -> WithClause
WithClause Bool
_recursive NonEmpty CommonTableExpr
_cteList)

commonTableExpr :: HeadedParsec Void Text CommonTableExpr
commonTableExpr = String
-> HeadedParsec Void Text CommonTableExpr
-> HeadedParsec Void Text CommonTableExpr
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"common table expression" (HeadedParsec Void Text CommonTableExpr
 -> HeadedParsec Void Text CommonTableExpr)
-> HeadedParsec Void Text CommonTableExpr
-> HeadedParsec Void Text CommonTableExpr
forall a b. (a -> b) -> a -> b
$ do
  Ident
_name <- HeadedParsec Void Text Ident
colId HeadedParsec Void Text Ident
-> Parser () -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space HeadedParsec Void Text Ident
-> Parser () -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe (NonEmpty Ident)
_nameList <- HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text (Maybe (NonEmpty Ident))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text (NonEmpty Ident)
forall a. Parser a -> Parser a
inParens (Parser ()
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text (NonEmpty Ident)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text Ident
colId) HeadedParsec Void Text (NonEmpty Ident)
-> Parser () -> HeadedParsec Void Text (NonEmpty Ident)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"as"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Maybe Bool
_materialized <- Parser Bool -> HeadedParsec Void Text (Maybe Bool)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Bool
forall e s.
(Ord e, Stream s, FoldCase (Tokens s), Tokens s ~ Text,
 Token s ~ Char) =>
HeadedParsec e s Bool
materialized Parser Bool -> Parser () -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
  PreparableStmt
_stmt <- Parser PreparableStmt -> Parser PreparableStmt
forall a. Parser a -> Parser a
inParens Parser PreparableStmt
preparableStmt
  return (Ident
-> Maybe (NonEmpty Ident)
-> Maybe Bool
-> PreparableStmt
-> CommonTableExpr
CommonTableExpr Ident
_name Maybe (NonEmpty Ident)
_nameList Maybe Bool
_materialized PreparableStmt
_stmt)

materialized :: HeadedParsec e s Bool
materialized =
  Bool
True Bool -> HeadedParsec e s Text -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"materialized"
    HeadedParsec e s Bool
-> HeadedParsec e s Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool
False Bool -> HeadedParsec e s Text -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"not materialized"

targeting :: HeadedParsec Void Text Targeting
targeting = HeadedParsec Void Text Targeting
distinct HeadedParsec Void Text Targeting
-> HeadedParsec Void Text Targeting
-> HeadedParsec Void Text Targeting
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HeadedParsec Void Text Targeting
allWithTargetList HeadedParsec Void Text Targeting
-> HeadedParsec Void Text Targeting
-> HeadedParsec Void Text Targeting
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HeadedParsec Void Text Targeting
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s Targeting
all HeadedParsec Void Text Targeting
-> HeadedParsec Void Text Targeting
-> HeadedParsec Void Text Targeting
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HeadedParsec Void Text Targeting
normal
  where
    normal :: HeadedParsec Void Text Targeting
normal = ReturningClause -> Targeting
NormalTargeting (ReturningClause -> Targeting)
-> HeadedParsec Void Text ReturningClause
-> HeadedParsec Void Text Targeting
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ReturningClause
targetList
    allWithTargetList :: HeadedParsec Void Text Targeting
allWithTargetList = do
      Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"all"
      Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
      Maybe ReturningClause -> Targeting
AllTargeting (Maybe ReturningClause -> Targeting)
-> (ReturningClause -> Maybe ReturningClause)
-> ReturningClause
-> Targeting
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReturningClause -> Maybe ReturningClause
forall a. a -> Maybe a
Just (ReturningClause -> Targeting)
-> HeadedParsec Void Text ReturningClause
-> HeadedParsec Void Text Targeting
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ReturningClause
targetList
    all :: HeadedParsec e s Targeting
all = Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"all" HeadedParsec e s Text -> Targeting -> HeadedParsec e s Targeting
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Maybe ReturningClause -> Targeting
AllTargeting Maybe ReturningClause
forall a. Maybe a
Nothing
    distinct :: HeadedParsec Void Text Targeting
distinct = do
      Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"distinct"
      Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
      Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
      Maybe (NonEmpty WhereClause)
_optOn <- HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text (NonEmpty WhereClause)
onExpressionsClause HeadedParsec Void Text (NonEmpty WhereClause)
-> Parser () -> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
      ReturningClause
_targetList <- HeadedParsec Void Text ReturningClause
targetList
      return (Maybe (NonEmpty WhereClause) -> ReturningClause -> Targeting
DistinctTargeting Maybe (NonEmpty WhereClause)
_optOn ReturningClause
_targetList)

targetList :: HeadedParsec Void Text ReturningClause
targetList = Parser ()
-> HeadedParsec Void Text TargetEl
-> HeadedParsec Void Text ReturningClause
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text TargetEl
targetEl

-- |
-- >>> testParser targetEl "a.b as c"
-- AliasedExprTargetEl (CExprAExpr (ColumnrefCExpr (Columnref (UnquotedIdent "a") (Just (AttrNameIndirectionEl (UnquotedIdent "b") :| []))))) (UnquotedIdent "c")
targetEl :: HeadedParsec Void Text TargetEl
targetEl =
  String
-> HeadedParsec Void Text TargetEl
-> HeadedParsec Void Text TargetEl
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"target" (HeadedParsec Void Text TargetEl
 -> HeadedParsec Void Text TargetEl)
-> HeadedParsec Void Text TargetEl
-> HeadedParsec Void Text TargetEl
forall a b. (a -> b) -> a -> b
$
    [HeadedParsec Void Text TargetEl]
-> HeadedParsec Void Text TargetEl
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
      [ do
          WhereClause
_expr <- HeadedParsec Void Text WhereClause
aExpr
          [HeadedParsec Void Text TargetEl]
-> HeadedParsec Void Text TargetEl
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
            [ do
                Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
                [HeadedParsec Void Text TargetEl]
-> HeadedParsec Void Text TargetEl
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
                  [ WhereClause -> Ident -> TargetEl
AliasedExprTargetEl WhereClause
_expr (Ident -> TargetEl)
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text TargetEl
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"as" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Ident
colLabel),
                    WhereClause -> Ident -> TargetEl
ImplicitlyAliasedExprTargetEl WhereClause
_expr (Ident -> TargetEl)
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text TargetEl
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Ident
ident
                  ],
              TargetEl -> HeadedParsec Void Text TargetEl
forall (f :: * -> *) a. Applicative f => a -> f a
pure (WhereClause -> TargetEl
ExprTargetEl WhereClause
_expr)
            ],
        TargetEl
AsteriskTargetEl TargetEl
-> HeadedParsec Void Text Char -> HeadedParsec Void Text TargetEl
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'*'
      ]

onExpressionsClause :: HeadedParsec Void Text (NonEmpty WhereClause)
onExpressionsClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"on"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall a. Parser a -> Parser a
inParens (Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text WhereClause
aExpr)

-- * Into clause details

-- |
-- ==== References
-- @
-- OptTempTableName:
--   | TEMPORARY opt_table qualified_name
--   | TEMP opt_table qualified_name
--   | LOCAL TEMPORARY opt_table qualified_name
--   | LOCAL TEMP opt_table qualified_name
--   | GLOBAL TEMPORARY opt_table qualified_name
--   | GLOBAL TEMP opt_table qualified_name
--   | UNLOGGED opt_table qualified_name
--   | TABLE qualified_name
--   | qualified_name
-- @
optTempTableName :: HeadedParsec Void Text IntoClause
optTempTableName =
  [HeadedParsec Void Text IntoClause]
-> HeadedParsec Void Text IntoClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Bool -> QualifiedName -> IntoClause
a <-
          [HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)]
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
            [ Bool -> QualifiedName -> IntoClause
TemporaryOptTempTableName (Bool -> QualifiedName -> IntoClause)
-> Parser Text
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"temporary" HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
-> Parser ()
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1,
              Bool -> QualifiedName -> IntoClause
TempOptTempTableName (Bool -> QualifiedName -> IntoClause)
-> Parser Text
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"temp" HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
-> Parser ()
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1,
              Bool -> QualifiedName -> IntoClause
LocalTemporaryOptTempTableName (Bool -> QualifiedName -> IntoClause)
-> Parser Text
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"local temporary" HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
-> Parser ()
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1,
              Bool -> QualifiedName -> IntoClause
LocalTempOptTempTableName (Bool -> QualifiedName -> IntoClause)
-> Parser Text
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"local temp" HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
-> Parser ()
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1,
              Bool -> QualifiedName -> IntoClause
GlobalTemporaryOptTempTableName (Bool -> QualifiedName -> IntoClause)
-> Parser Text
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"global temporary" HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
-> Parser ()
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1,
              Bool -> QualifiedName -> IntoClause
GlobalTempOptTempTableName (Bool -> QualifiedName -> IntoClause)
-> Parser Text
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"global temp" HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
-> Parser ()
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1,
              Bool -> QualifiedName -> IntoClause
UnloggedOptTempTableName (Bool -> QualifiedName -> IntoClause)
-> Parser Text
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"unlogged" HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
-> Parser ()
-> HeadedParsec Void Text (Bool -> QualifiedName -> IntoClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            ]
        Bool
b <- Bool -> Parser Bool -> Parser Bool
forall (m :: * -> *) a. Alternative m => a -> m a -> m a
option Bool
False (Bool
True Bool -> Parser Text -> Parser Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"table" Parser Bool -> Parser () -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
        QualifiedName
c <- HeadedParsec Void Text QualifiedName
qualifiedName
        return (Bool -> QualifiedName -> IntoClause
a Bool
b QualifiedName
c),
      do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"table"
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        QualifiedName -> IntoClause
TableOptTempTableName (QualifiedName -> IntoClause)
-> HeadedParsec Void Text QualifiedName
-> HeadedParsec Void Text IntoClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text QualifiedName
qualifiedName,
      QualifiedName -> IntoClause
QualifedOptTempTableName (QualifiedName -> IntoClause)
-> HeadedParsec Void Text QualifiedName
-> HeadedParsec Void Text IntoClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text QualifiedName
qualifiedName
    ]

-- * Group by details

groupByItem :: HeadedParsec Void Text GroupByItem
groupByItem =
  [HeadedParsec Void Text GroupByItem]
-> HeadedParsec Void Text GroupByItem
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ GroupByItem
EmptyGroupingSetGroupByItem GroupByItem
-> HeadedParsec Void Text Char
-> HeadedParsec Void Text GroupByItem
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ (Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'(' HeadedParsec Void Text Char -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Char -> HeadedParsec Void Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
')'),
      NonEmpty WhereClause -> GroupByItem
RollupGroupByItem (NonEmpty WhereClause -> GroupByItem)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text GroupByItem
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"rollup" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall a. Parser a -> Parser a
inParens (Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text WhereClause
aExpr)),
      NonEmpty WhereClause -> GroupByItem
CubeGroupByItem (NonEmpty WhereClause -> GroupByItem)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text GroupByItem
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"cube" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall a. Parser a -> Parser a
inParens (Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text WhereClause
aExpr)),
      NonEmpty GroupByItem -> GroupByItem
GroupingSetsGroupByItem (NonEmpty GroupByItem -> GroupByItem)
-> HeadedParsec Void Text (NonEmpty GroupByItem)
-> HeadedParsec Void Text GroupByItem
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"grouping sets" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text (NonEmpty GroupByItem)
-> HeadedParsec Void Text (NonEmpty GroupByItem)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty GroupByItem)
-> HeadedParsec Void Text (NonEmpty GroupByItem)
forall a. Parser a -> Parser a
inParens (Parser ()
-> HeadedParsec Void Text GroupByItem
-> HeadedParsec Void Text (NonEmpty GroupByItem)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text GroupByItem
groupByItem)),
      WhereClause -> GroupByItem
ExprGroupByItem (WhereClause -> GroupByItem)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text GroupByItem
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
aExpr
    ]

-- * Window clause details

windowDefinition :: HeadedParsec Void Text WindowDefinition
windowDefinition = Ident -> WindowSpecification -> WindowDefinition
WindowDefinition (Ident -> WindowSpecification -> WindowDefinition)
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text (WindowSpecification -> WindowDefinition)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (HeadedParsec Void Text Ident
colId HeadedParsec Void Text Ident
-> Parser () -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 HeadedParsec Void Text Ident
-> Parser Text -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"as" HeadedParsec Void Text Ident
-> Parser () -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 HeadedParsec Void Text Ident
-> Parser () -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead) HeadedParsec Void Text (WindowSpecification -> WindowDefinition)
-> HeadedParsec Void Text WindowSpecification
-> HeadedParsec Void Text WindowDefinition
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HeadedParsec Void Text WindowSpecification
windowSpecification

-- |
-- ==== References
-- @
-- window_specification:
--   |  '(' opt_existing_window_name opt_partition_clause
--             opt_sort_clause opt_frame_clause ')'
-- @
windowSpecification :: HeadedParsec Void Text WindowSpecification
windowSpecification =
  HeadedParsec Void Text WindowSpecification
-> HeadedParsec Void Text WindowSpecification
forall a. Parser a -> Parser a
inParens (HeadedParsec Void Text WindowSpecification
 -> HeadedParsec Void Text WindowSpecification)
-> HeadedParsec Void Text WindowSpecification
-> HeadedParsec Void Text WindowSpecification
forall a b. (a -> b) -> a -> b
$
    [HeadedParsec Void Text WindowSpecification]
-> HeadedParsec Void Text WindowSpecification
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
      [ do
          FrameClause
a <- HeadedParsec Void Text FrameClause
frameClause
          return (Maybe Ident
-> Maybe (NonEmpty WhereClause)
-> Maybe SortClause
-> Maybe FrameClause
-> WindowSpecification
WindowSpecification Maybe Ident
forall a. Maybe a
Nothing Maybe (NonEmpty WhereClause)
forall a. Maybe a
Nothing Maybe SortClause
forall a. Maybe a
Nothing (FrameClause -> Maybe FrameClause
forall a. a -> Maybe a
Just FrameClause
a)),
        do
          SortClause
a <- HeadedParsec Void Text SortClause
sortClause
          Maybe FrameClause
b <- HeadedParsec Void Text FrameClause
-> HeadedParsec Void Text (Maybe FrameClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text FrameClause
-> HeadedParsec Void Text FrameClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text FrameClause
frameClause)
          return (Maybe Ident
-> Maybe (NonEmpty WhereClause)
-> Maybe SortClause
-> Maybe FrameClause
-> WindowSpecification
WindowSpecification Maybe Ident
forall a. Maybe a
Nothing Maybe (NonEmpty WhereClause)
forall a. Maybe a
Nothing (SortClause -> Maybe SortClause
forall a. a -> Maybe a
Just SortClause
a) Maybe FrameClause
b),
        do
          NonEmpty WhereClause
a <- HeadedParsec Void Text (NonEmpty WhereClause)
partitionByClause
          Maybe SortClause
b <- HeadedParsec Void Text SortClause
-> HeadedParsec Void Text (Maybe SortClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SortClause
-> HeadedParsec Void Text SortClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SortClause
sortClause)
          Maybe FrameClause
c <- HeadedParsec Void Text FrameClause
-> HeadedParsec Void Text (Maybe FrameClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text FrameClause
-> HeadedParsec Void Text FrameClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text FrameClause
frameClause)
          return (Maybe Ident
-> Maybe (NonEmpty WhereClause)
-> Maybe SortClause
-> Maybe FrameClause
-> WindowSpecification
WindowSpecification Maybe Ident
forall a. Maybe a
Nothing (NonEmpty WhereClause -> Maybe (NonEmpty WhereClause)
forall a. a -> Maybe a
Just NonEmpty WhereClause
a) Maybe SortClause
b Maybe FrameClause
c),
        do
          Ident
a <- HeadedParsec Void Text Ident
colId
          Maybe (NonEmpty WhereClause)
b <- HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
partitionByClause)
          Maybe SortClause
c <- HeadedParsec Void Text SortClause
-> HeadedParsec Void Text (Maybe SortClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SortClause
-> HeadedParsec Void Text SortClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SortClause
sortClause)
          Maybe FrameClause
d <- HeadedParsec Void Text FrameClause
-> HeadedParsec Void Text (Maybe FrameClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text FrameClause
-> HeadedParsec Void Text FrameClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text FrameClause
frameClause)
          return (Maybe Ident
-> Maybe (NonEmpty WhereClause)
-> Maybe SortClause
-> Maybe FrameClause
-> WindowSpecification
WindowSpecification (Ident -> Maybe Ident
forall a. a -> Maybe a
Just Ident
a) Maybe (NonEmpty WhereClause)
b Maybe SortClause
c Maybe FrameClause
d),
        WindowSpecification -> HeadedParsec Void Text WindowSpecification
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Ident
-> Maybe (NonEmpty WhereClause)
-> Maybe SortClause
-> Maybe FrameClause
-> WindowSpecification
WindowSpecification Maybe Ident
forall a. Maybe a
Nothing Maybe (NonEmpty WhereClause)
forall a. Maybe a
Nothing Maybe SortClause
forall a. Maybe a
Nothing Maybe FrameClause
forall a. Maybe a
Nothing)
      ]

partitionByClause :: HeadedParsec Void Text (NonEmpty WhereClause)
partitionByClause = Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"partition by" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text WhereClause
aExpr

-- |
-- ==== References
-- @
-- opt_frame_clause:
--   |  RANGE frame_extent opt_window_exclusion_clause
--   |  ROWS frame_extent opt_window_exclusion_clause
--   |  GROUPS frame_extent opt_window_exclusion_clause
--   |  EMPTY
-- @
frameClause :: HeadedParsec Void Text FrameClause
frameClause = do
  FrameClauseMode
a <- HeadedParsec Void Text FrameClauseMode
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s FrameClauseMode
frameClauseMode HeadedParsec Void Text FrameClauseMode
-> Parser () -> HeadedParsec Void Text FrameClauseMode
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 HeadedParsec Void Text FrameClauseMode
-> Parser () -> HeadedParsec Void Text FrameClauseMode
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  FrameExtent
b <- HeadedParsec Void Text FrameExtent
frameExtent
  Maybe WindowExclusionClause
c <- HeadedParsec Void Text WindowExclusionClause
-> HeadedParsec Void Text (Maybe WindowExclusionClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WindowExclusionClause
-> HeadedParsec Void Text WindowExclusionClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WindowExclusionClause
forall e s.
(Ord e, Stream s, FoldCase (Tokens s), Tokens s ~ Text,
 Token s ~ Char) =>
HeadedParsec e s WindowExclusionClause
windowExclusionClause)
  return (FrameClauseMode
-> FrameExtent -> Maybe WindowExclusionClause -> FrameClause
FrameClause FrameClauseMode
a FrameExtent
b Maybe WindowExclusionClause
c)

frameClauseMode :: HeadedParsec e s FrameClauseMode
frameClauseMode =
  [HeadedParsec e s FrameClauseMode]
-> HeadedParsec e s FrameClauseMode
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ FrameClauseMode
RangeFrameClauseMode FrameClauseMode
-> HeadedParsec e s Text -> HeadedParsec e s FrameClauseMode
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"range",
      FrameClauseMode
RowsFrameClauseMode FrameClauseMode
-> HeadedParsec e s Text -> HeadedParsec e s FrameClauseMode
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"rows",
      FrameClauseMode
GroupsFrameClauseMode FrameClauseMode
-> HeadedParsec e s Text -> HeadedParsec e s FrameClauseMode
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"groups"
    ]

frameExtent :: HeadedParsec Void Text FrameExtent
frameExtent =
  FrameBound -> FrameBound -> FrameExtent
BetweenFrameExtent (FrameBound -> FrameBound -> FrameExtent)
-> HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text (FrameBound -> FrameExtent)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"between" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text FrameBound
frameBound HeadedParsec Void Text FrameBound
-> Parser () -> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 HeadedParsec Void Text FrameBound
-> Parser Text -> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"and" HeadedParsec Void Text FrameBound
-> Parser () -> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1) HeadedParsec Void Text (FrameBound -> FrameExtent)
-> HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text FrameExtent
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HeadedParsec Void Text FrameBound
frameBound
    HeadedParsec Void Text FrameExtent
-> HeadedParsec Void Text FrameExtent
-> HeadedParsec Void Text FrameExtent
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> FrameBound -> FrameExtent
SingularFrameExtent (FrameBound -> FrameExtent)
-> HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text FrameExtent
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text FrameBound
frameBound

-- |
-- ==== References
-- @
--   |  UNBOUNDED PRECEDING
--   |  UNBOUNDED FOLLOWING
--   |  CURRENT_P ROW
--   |  a_expr PRECEDING
--   |  a_expr FOLLOWING
-- @
frameBound :: HeadedParsec Void Text FrameBound
frameBound =
  FrameBound
UnboundedPrecedingFrameBound FrameBound -> Parser Text -> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"unbounded preceding"
    HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> FrameBound
UnboundedFollowingFrameBound FrameBound -> Parser Text -> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"unbounded following"
    HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> FrameBound
CurrentRowFrameBound FrameBound -> Parser Text -> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"current row"
    HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> do
      WhereClause
a <- HeadedParsec Void Text WhereClause
aExpr
      Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
      WhereClause -> FrameBound
PrecedingFrameBound WhereClause
a FrameBound -> Parser Text -> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"preceding" HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text FrameBound
-> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> WhereClause -> FrameBound
FollowingFrameBound WhereClause
a FrameBound -> Parser Text -> HeadedParsec Void Text FrameBound
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"following"

windowExclusionClause :: HeadedParsec e s WindowExclusionClause
windowExclusionClause =
  WindowExclusionClause
CurrentRowWindowExclusionClause WindowExclusionClause
-> HeadedParsec e s Text -> HeadedParsec e s WindowExclusionClause
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"exclude current row"
    HeadedParsec e s WindowExclusionClause
-> HeadedParsec e s WindowExclusionClause
-> HeadedParsec e s WindowExclusionClause
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> WindowExclusionClause
GroupWindowExclusionClause WindowExclusionClause
-> HeadedParsec e s Text -> HeadedParsec e s WindowExclusionClause
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"exclude group"
    HeadedParsec e s WindowExclusionClause
-> HeadedParsec e s WindowExclusionClause
-> HeadedParsec e s WindowExclusionClause
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> WindowExclusionClause
TiesWindowExclusionClause WindowExclusionClause
-> HeadedParsec e s Text -> HeadedParsec e s WindowExclusionClause
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"exclude ties"
    HeadedParsec e s WindowExclusionClause
-> HeadedParsec e s WindowExclusionClause
-> HeadedParsec e s WindowExclusionClause
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> WindowExclusionClause
NoOthersWindowExclusionClause WindowExclusionClause
-> HeadedParsec e s Text -> HeadedParsec e s WindowExclusionClause
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"exclude no others"

-- * Table refs

fromList :: HeadedParsec Void Text FromClause
fromList = Parser ()
-> HeadedParsec Void Text TableRef
-> HeadedParsec Void Text FromClause
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text TableRef
tableRef

fromClause :: HeadedParsec Void Text FromClause
fromClause = Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"from" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text FromClause
-> HeadedParsec Void Text FromClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text FromClause
fromList

-- |
-- >>> testParser tableRef "a left join b on (a.i = b.i)"
-- JoinTableRef (MethJoinedTable (QualJoinMeth...
tableRef :: HeadedParsec Void Text TableRef
tableRef =
  String
-> HeadedParsec Void Text TableRef
-> HeadedParsec Void Text TableRef
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"table reference" (HeadedParsec Void Text TableRef
 -> HeadedParsec Void Text TableRef)
-> HeadedParsec Void Text TableRef
-> HeadedParsec Void Text TableRef
forall a b. (a -> b) -> a -> b
$
    do
      TableRef
_tr <- HeadedParsec Void Text TableRef
nonTrailingTableRef
      TableRef -> HeadedParsec Void Text TableRef
recur TableRef
_tr
  where
    recur :: TableRef -> HeadedParsec Void Text TableRef
recur TableRef
_tr =
      [HeadedParsec Void Text TableRef]
-> HeadedParsec Void Text TableRef
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
        [ do
            TableRef
_tr2 <- HeadedParsec Void Text TableRef -> HeadedParsec Void Text TableRef
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text TableRef
-> HeadedParsec Void Text TableRef
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> TableRef -> HeadedParsec Void Text TableRef
trailingTableRef TableRef
_tr)
            Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
            TableRef -> HeadedParsec Void Text TableRef
recur TableRef
_tr2,
          TableRef -> HeadedParsec Void Text TableRef
forall (f :: * -> *) a. Applicative f => a -> f a
pure TableRef
_tr
        ]

nonTrailingTableRef :: HeadedParsec Void Text TableRef
nonTrailingTableRef =
  [HeadedParsec Void Text TableRef]
-> HeadedParsec Void Text TableRef
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ HeadedParsec Void Text TableRef
lateralTableRef
        HeadedParsec Void Text TableRef
-> HeadedParsec Void Text TableRef
-> HeadedParsec Void Text TableRef
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HeadedParsec Void Text TableRef -> HeadedParsec Void Text TableRef
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text TableRef
nonLateralTableRef
        HeadedParsec Void Text TableRef
-> HeadedParsec Void Text TableRef
-> HeadedParsec Void Text TableRef
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HeadedParsec Void Text TableRef
relationExprTableRef
        HeadedParsec Void Text TableRef
-> HeadedParsec Void Text TableRef
-> HeadedParsec Void Text TableRef
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HeadedParsec Void Text TableRef
joinedTableWithAliasTableRef
        HeadedParsec Void Text TableRef
-> HeadedParsec Void Text TableRef
-> HeadedParsec Void Text TableRef
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HeadedParsec Void Text TableRef
inParensJoinedTableTableRef
    ]
  where
    relationExprTableRef :: HeadedParsec Void Text TableRef
relationExprTableRef = do
      RelationExpr
_relationExpr <- HeadedParsec Void Text RelationExpr
relationExpr
      Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
      Maybe AliasClause
_optAliasClause <- HeadedParsec Void Text AliasClause
-> HeadedParsec Void Text (Maybe AliasClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text AliasClause
-> HeadedParsec Void Text AliasClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AliasClause
aliasClause)
      Maybe TablesampleClause
_optTablesampleClause <- HeadedParsec Void Text TablesampleClause
-> HeadedParsec Void Text (Maybe TablesampleClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text TablesampleClause
-> HeadedParsec Void Text TablesampleClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text TablesampleClause
tablesampleClause)
      return (RelationExpr
-> Maybe AliasClause -> Maybe TablesampleClause -> TableRef
RelationExprTableRef RelationExpr
_relationExpr Maybe AliasClause
_optAliasClause Maybe TablesampleClause
_optTablesampleClause)

    lateralTableRef :: HeadedParsec Void Text TableRef
lateralTableRef = do
      Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"lateral"
      Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
      Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
      Bool -> HeadedParsec Void Text TableRef
lateralableTableRef Bool
True

    nonLateralTableRef :: HeadedParsec Void Text TableRef
nonLateralTableRef = Bool -> HeadedParsec Void Text TableRef
lateralableTableRef Bool
False

    lateralableTableRef :: Bool -> HeadedParsec Void Text TableRef
lateralableTableRef Bool
_lateral =
      [HeadedParsec Void Text TableRef]
-> HeadedParsec Void Text TableRef
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
        [ do
            FuncTable
a <- HeadedParsec Void Text FuncTable
funcTable
            Maybe FuncAliasClause
b <- HeadedParsec Void Text FuncAliasClause
-> HeadedParsec Void Text (Maybe FuncAliasClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text FuncAliasClause
-> HeadedParsec Void Text FuncAliasClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text FuncAliasClause
funcAliasClause)
            return (Bool -> FuncTable -> Maybe FuncAliasClause -> TableRef
FuncTableRef Bool
_lateral FuncTable
a Maybe FuncAliasClause
b),
          do
            SelectWithParens
_select <- HeadedParsec Void Text SelectWithParens
selectWithParens
            Maybe AliasClause
_optAliasClause <- HeadedParsec Void Text AliasClause
-> HeadedParsec Void Text (Maybe AliasClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text AliasClause
 -> HeadedParsec Void Text (Maybe AliasClause))
-> HeadedParsec Void Text AliasClause
-> HeadedParsec Void Text (Maybe AliasClause)
forall a b. (a -> b) -> a -> b
$ Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text AliasClause
-> HeadedParsec Void Text AliasClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AliasClause
aliasClause
            return (Bool -> SelectWithParens -> Maybe AliasClause -> TableRef
SelectTableRef Bool
_lateral SelectWithParens
_select Maybe AliasClause
_optAliasClause)
        ]

    inParensJoinedTableTableRef :: HeadedParsec Void Text TableRef
inParensJoinedTableTableRef = JoinedTable -> Maybe AliasClause -> TableRef
JoinTableRef (JoinedTable -> Maybe AliasClause -> TableRef)
-> HeadedParsec Void Text JoinedTable
-> HeadedParsec Void Text (Maybe AliasClause -> TableRef)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text JoinedTable
inParensJoinedTable HeadedParsec Void Text (Maybe AliasClause -> TableRef)
-> HeadedParsec Void Text (Maybe AliasClause)
-> HeadedParsec Void Text TableRef
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe AliasClause -> HeadedParsec Void Text (Maybe AliasClause)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe AliasClause
forall a. Maybe a
Nothing

    joinedTableWithAliasTableRef :: HeadedParsec Void Text TableRef
joinedTableWithAliasTableRef = do
      JoinedTable
_joinedTable <- HeadedParsec Void Text JoinedTable
-> HeadedParsec Void Text JoinedTable
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead (HeadedParsec Void Text JoinedTable
-> HeadedParsec Void Text JoinedTable
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text JoinedTable
joinedTable)
      Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
      AliasClause
_alias <- HeadedParsec Void Text AliasClause
aliasClause
      return (JoinedTable -> Maybe AliasClause -> TableRef
JoinTableRef JoinedTable
_joinedTable (AliasClause -> Maybe AliasClause
forall a. a -> Maybe a
Just AliasClause
_alias))

trailingTableRef :: TableRef -> HeadedParsec Void Text TableRef
trailingTableRef TableRef
_tableRef =
  JoinedTable -> Maybe AliasClause -> TableRef
JoinTableRef (JoinedTable -> Maybe AliasClause -> TableRef)
-> HeadedParsec Void Text JoinedTable
-> HeadedParsec Void Text (Maybe AliasClause -> TableRef)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TableRef -> HeadedParsec Void Text JoinedTable
trailingJoinedTable TableRef
_tableRef HeadedParsec Void Text (Maybe AliasClause -> TableRef)
-> HeadedParsec Void Text (Maybe AliasClause)
-> HeadedParsec Void Text TableRef
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe AliasClause -> HeadedParsec Void Text (Maybe AliasClause)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe AliasClause
forall a. Maybe a
Nothing

relationExpr :: HeadedParsec Void Text RelationExpr
relationExpr =
  String
-> HeadedParsec Void Text RelationExpr
-> HeadedParsec Void Text RelationExpr
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"relation expression" (HeadedParsec Void Text RelationExpr
 -> HeadedParsec Void Text RelationExpr)
-> HeadedParsec Void Text RelationExpr
-> HeadedParsec Void Text RelationExpr
forall a b. (a -> b) -> a -> b
$
    [HeadedParsec Void Text RelationExpr]
-> HeadedParsec Void Text RelationExpr
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
      [ do
          Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"only"
          Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
          QualifiedName
_name <- HeadedParsec Void Text QualifiedName
qualifiedName
          return (QualifiedName -> Bool -> RelationExpr
OnlyRelationExpr QualifiedName
_name Bool
False),
        Parser Text
-> HeadedParsec Void Text QualifiedName
-> HeadedParsec Void Text QualifiedName
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"only") HeadedParsec Void Text QualifiedName
qualifiedName HeadedParsec Void Text QualifiedName
-> (QualifiedName -> RelationExpr)
-> HeadedParsec Void Text RelationExpr
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \QualifiedName
a -> QualifiedName -> Bool -> RelationExpr
OnlyRelationExpr QualifiedName
a Bool
True,
        do
          QualifiedName
_name <- HeadedParsec Void Text QualifiedName
qualifiedName
          Bool
_asterisk <-
            [Parser Bool] -> Parser Bool
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
              [ Bool
True Bool -> HeadedParsec Void Text Char -> Parser Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text Char -> HeadedParsec Void Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'*'),
                Bool -> Parser Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
              ]
          return (QualifiedName -> Bool -> RelationExpr
SimpleRelationExpr QualifiedName
_name Bool
_asterisk)
      ]

relationExprOptAlias :: [Text] -> HeadedParsec Void Text RelationExprOptAlias
relationExprOptAlias [Text]
reservedKeywords = do
  RelationExpr
a <- HeadedParsec Void Text RelationExpr
relationExpr
  Maybe (Bool, Ident)
b <- HeadedParsec Void Text (Bool, Ident)
-> HeadedParsec Void Text (Maybe (Bool, Ident))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text (Bool, Ident)
 -> HeadedParsec Void Text (Maybe (Bool, Ident)))
-> HeadedParsec Void Text (Bool, Ident)
-> HeadedParsec Void Text (Maybe (Bool, Ident))
forall a b. (a -> b) -> a -> b
$ do
    Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
    Bool
b <- Parser () -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"as" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
    Ident
c <- [Text] -> HeadedParsec Void Text Ident
forall (t :: * -> *).
Foldable t =>
t Text -> HeadedParsec Void Text Ident
filteredColId [Text]
reservedKeywords
    return (Bool
b, Ident
c)
  return (RelationExpr -> Maybe (Bool, Ident) -> RelationExprOptAlias
RelationExprOptAlias RelationExpr
a Maybe (Bool, Ident)
b)

tablesampleClause :: HeadedParsec Void Text TablesampleClause
tablesampleClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"tablesample"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  FuncName
a <- Parser FuncName
funcName
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
  NonEmpty WhereClause
b <- HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text (NonEmpty WhereClause)
exprList
  Maybe WhereClause
c <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
repeatableClause)
  return (FuncName
-> NonEmpty WhereClause -> Maybe WhereClause -> TablesampleClause
TablesampleClause FuncName
a NonEmpty WhereClause
b Maybe WhereClause
c)

repeatableClause :: HeadedParsec Void Text WhereClause
repeatableClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"repeatable"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
  HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall a. Parser a -> Parser a
inParens (Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr)

funcTable :: HeadedParsec Void Text FuncTable
funcTable =
  [HeadedParsec Void Text FuncTable]
-> HeadedParsec Void Text FuncTable
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"rows"
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"from"
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        NonEmpty RowsfromItem
a <- Parser (NonEmpty RowsfromItem) -> Parser (NonEmpty RowsfromItem)
forall a. Parser a -> Parser a
inParens (Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> Parser (NonEmpty RowsfromItem) -> Parser (NonEmpty RowsfromItem)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser (NonEmpty RowsfromItem)
rowsfromList)
        Bool
b <- Parser Text -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s Text
optOrdinality)
        return (NonEmpty RowsfromItem -> Bool -> FuncTable
RowsFromFuncTable NonEmpty RowsfromItem
a Bool
b),
      do
        FuncExprWindowless
a <- HeadedParsec Void Text FuncExprWindowless
funcExprWindowless
        Bool
b <- Parser Text -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s Text
optOrdinality)
        return (FuncExprWindowless -> Bool -> FuncTable
FuncExprFuncTable FuncExprWindowless
a Bool
b)
    ]

rowsfromItem :: HeadedParsec Void Text RowsfromItem
rowsfromItem = do
  FuncExprWindowless
a <- HeadedParsec Void Text FuncExprWindowless
funcExprWindowless
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe ColDefList
b <- HeadedParsec Void Text ColDefList
-> HeadedParsec Void Text (Maybe ColDefList)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text ColDefList
-> HeadedParsec Void Text ColDefList
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text ColDefList
colDefList)
  return (FuncExprWindowless -> Maybe ColDefList -> RowsfromItem
RowsfromItem FuncExprWindowless
a Maybe ColDefList
b)

rowsfromList :: Parser (NonEmpty RowsfromItem)
rowsfromList = Parser ()
-> HeadedParsec Void Text RowsfromItem
-> Parser (NonEmpty RowsfromItem)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text RowsfromItem
rowsfromItem

colDefList :: HeadedParsec Void Text ColDefList
colDefList = Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"as" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text ColDefList
-> HeadedParsec Void Text ColDefList
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text ColDefList
-> HeadedParsec Void Text ColDefList
forall a. Parser a -> Parser a
inParens (Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text ColDefList
-> HeadedParsec Void Text ColDefList
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text ColDefList
tableFuncElementList)

optOrdinality :: HeadedParsec e s Text
optOrdinality = Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"with" HeadedParsec e s Text -> HeadedParsec e s () -> HeadedParsec e s ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec e s ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 HeadedParsec e s ()
-> HeadedParsec e s Text -> HeadedParsec e s Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"ordinality"

tableFuncElementList :: HeadedParsec Void Text ColDefList
tableFuncElementList = Parser ()
-> HeadedParsec Void Text TableFuncElement
-> HeadedParsec Void Text ColDefList
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text TableFuncElement
tableFuncElement

tableFuncElement :: HeadedParsec Void Text TableFuncElement
tableFuncElement = do
  Ident
a <- HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text Ident
colId
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Typename
b <- HeadedParsec Void Text Typename
typename
  Maybe AnyName
c <- HeadedParsec Void Text AnyName
-> HeadedParsec Void Text (Maybe AnyName)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text AnyName -> HeadedParsec Void Text AnyName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AnyName
collateClause)
  return (Ident -> Typename -> Maybe AnyName -> TableFuncElement
TableFuncElement Ident
a Typename
b Maybe AnyName
c)

collateClause :: HeadedParsec Void Text AnyName
collateClause = Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"collate" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text AnyName -> HeadedParsec Void Text AnyName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AnyName
anyName

funcAliasClause :: HeadedParsec Void Text FuncAliasClause
funcAliasClause =
  [HeadedParsec Void Text FuncAliasClause]
-> HeadedParsec Void Text FuncAliasClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"as"
        [HeadedParsec Void Text FuncAliasClause]
-> HeadedParsec Void Text FuncAliasClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
          [ do
              Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
              HeadedParsec Void Text FuncAliasClause
-> HeadedParsec Void Text FuncAliasClause
forall a. Parser a -> Parser a
inParens (HeadedParsec Void Text FuncAliasClause
 -> HeadedParsec Void Text FuncAliasClause)
-> HeadedParsec Void Text FuncAliasClause
-> HeadedParsec Void Text FuncAliasClause
forall a b. (a -> b) -> a -> b
$ do
                Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
                ColDefList -> FuncAliasClause
AsFuncAliasClause (ColDefList -> FuncAliasClause)
-> HeadedParsec Void Text ColDefList
-> HeadedParsec Void Text FuncAliasClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ColDefList
tableFuncElementList,
            do
              Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
              Ident
a <- HeadedParsec Void Text Ident
colId
              [HeadedParsec Void Text FuncAliasClause]
-> HeadedParsec Void Text FuncAliasClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
                [ do
                    Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
                    HeadedParsec Void Text FuncAliasClause
-> HeadedParsec Void Text FuncAliasClause
forall a. Parser a -> Parser a
inParens (HeadedParsec Void Text FuncAliasClause
 -> HeadedParsec Void Text FuncAliasClause)
-> HeadedParsec Void Text FuncAliasClause
-> HeadedParsec Void Text FuncAliasClause
forall a b. (a -> b) -> a -> b
$ do
                      Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
                      [HeadedParsec Void Text FuncAliasClause]
-> HeadedParsec Void Text FuncAliasClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
                        [ Ident -> ColDefList -> FuncAliasClause
AsColIdFuncAliasClause Ident
a (ColDefList -> FuncAliasClause)
-> HeadedParsec Void Text ColDefList
-> HeadedParsec Void Text FuncAliasClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ColDefList
-> HeadedParsec Void Text ColDefList
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text ColDefList
tableFuncElementList,
                          AliasClause -> FuncAliasClause
AliasFuncAliasClause (AliasClause -> FuncAliasClause)
-> (Maybe (NonEmpty Ident) -> AliasClause)
-> Maybe (NonEmpty Ident)
-> FuncAliasClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Ident -> Maybe (NonEmpty Ident) -> AliasClause
AliasClause Bool
True Ident
a (Maybe (NonEmpty Ident) -> FuncAliasClause)
-> (NonEmpty Ident -> Maybe (NonEmpty Ident))
-> NonEmpty Ident
-> FuncAliasClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty Ident -> Maybe (NonEmpty Ident)
forall a. a -> Maybe a
Just (NonEmpty Ident -> FuncAliasClause)
-> HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text FuncAliasClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (NonEmpty Ident)
nameList
                        ],
                  FuncAliasClause -> HeadedParsec Void Text FuncAliasClause
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AliasClause -> FuncAliasClause
AliasFuncAliasClause (Bool -> Ident -> Maybe (NonEmpty Ident) -> AliasClause
AliasClause Bool
True Ident
a Maybe (NonEmpty Ident)
forall a. Maybe a
Nothing))
                ]
          ],
      do
        Ident
a <- HeadedParsec Void Text Ident
colId
        [HeadedParsec Void Text FuncAliasClause]
-> HeadedParsec Void Text FuncAliasClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
          [ do
              Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
              HeadedParsec Void Text FuncAliasClause
-> HeadedParsec Void Text FuncAliasClause
forall a. Parser a -> Parser a
inParens (HeadedParsec Void Text FuncAliasClause
 -> HeadedParsec Void Text FuncAliasClause)
-> HeadedParsec Void Text FuncAliasClause
-> HeadedParsec Void Text FuncAliasClause
forall a b. (a -> b) -> a -> b
$ do
                Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
                [HeadedParsec Void Text FuncAliasClause]
-> HeadedParsec Void Text FuncAliasClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
                  [ Ident -> ColDefList -> FuncAliasClause
ColIdFuncAliasClause Ident
a (ColDefList -> FuncAliasClause)
-> HeadedParsec Void Text ColDefList
-> HeadedParsec Void Text FuncAliasClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ColDefList
-> HeadedParsec Void Text ColDefList
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text ColDefList
tableFuncElementList,
                    AliasClause -> FuncAliasClause
AliasFuncAliasClause (AliasClause -> FuncAliasClause)
-> (Maybe (NonEmpty Ident) -> AliasClause)
-> Maybe (NonEmpty Ident)
-> FuncAliasClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Ident -> Maybe (NonEmpty Ident) -> AliasClause
AliasClause Bool
False Ident
a (Maybe (NonEmpty Ident) -> FuncAliasClause)
-> (NonEmpty Ident -> Maybe (NonEmpty Ident))
-> NonEmpty Ident
-> FuncAliasClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty Ident -> Maybe (NonEmpty Ident)
forall a. a -> Maybe a
Just (NonEmpty Ident -> FuncAliasClause)
-> HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text FuncAliasClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (NonEmpty Ident)
nameList
                  ],
            FuncAliasClause -> HeadedParsec Void Text FuncAliasClause
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AliasClause -> FuncAliasClause
AliasFuncAliasClause (Bool -> Ident -> Maybe (NonEmpty Ident) -> AliasClause
AliasClause Bool
False Ident
a Maybe (NonEmpty Ident)
forall a. Maybe a
Nothing))
          ]
    ]

joinedTable :: HeadedParsec Void Text JoinedTable
joinedTable =
  HeadedParsec Void Text JoinedTable
head HeadedParsec Void Text JoinedTable
-> (JoinedTable -> HeadedParsec Void Text JoinedTable)
-> HeadedParsec Void Text JoinedTable
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JoinedTable -> HeadedParsec Void Text JoinedTable
tail
  where
    head :: HeadedParsec Void Text JoinedTable
head =
      [HeadedParsec Void Text JoinedTable]
-> HeadedParsec Void Text JoinedTable
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
        [ do
            TableRef
_tr <- HeadedParsec Void Text TableRef -> HeadedParsec Void Text TableRef
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text TableRef
nonTrailingTableRef
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            TableRef -> HeadedParsec Void Text JoinedTable
trailingJoinedTable TableRef
_tr,
          HeadedParsec Void Text JoinedTable
inParensJoinedTable
        ]
    tail :: JoinedTable -> HeadedParsec Void Text JoinedTable
tail JoinedTable
_jt =
      [HeadedParsec Void Text JoinedTable]
-> HeadedParsec Void Text JoinedTable
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
        [ do
            JoinedTable
_jt2 <- HeadedParsec Void Text JoinedTable
-> HeadedParsec Void Text JoinedTable
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text JoinedTable
-> HeadedParsec Void Text JoinedTable
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> TableRef -> HeadedParsec Void Text JoinedTable
trailingJoinedTable (JoinedTable -> Maybe AliasClause -> TableRef
JoinTableRef JoinedTable
_jt Maybe AliasClause
forall a. Maybe a
Nothing))
            Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
            JoinedTable -> HeadedParsec Void Text JoinedTable
tail JoinedTable
_jt2,
          JoinedTable -> HeadedParsec Void Text JoinedTable
forall (f :: * -> *) a. Applicative f => a -> f a
pure JoinedTable
_jt
        ]

-- |
-- ==== References
-- @
--   | '(' joined_table ')'
-- @
inParensJoinedTable :: HeadedParsec Void Text JoinedTable
inParensJoinedTable = JoinedTable -> JoinedTable
InParensJoinedTable (JoinedTable -> JoinedTable)
-> HeadedParsec Void Text JoinedTable
-> HeadedParsec Void Text JoinedTable
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text JoinedTable
-> HeadedParsec Void Text JoinedTable
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text JoinedTable
joinedTable

-- |
-- ==== References
-- @
--   | table_ref CROSS JOIN table_ref
--   | table_ref join_type JOIN table_ref join_qual
--   | table_ref JOIN table_ref join_qual
--   | table_ref NATURAL join_type JOIN table_ref
--   | table_ref NATURAL JOIN table_ref
-- @
trailingJoinedTable :: TableRef -> HeadedParsec Void Text JoinedTable
trailingJoinedTable TableRef
_tr1 =
  [HeadedParsec Void Text JoinedTable]
-> HeadedParsec Void Text JoinedTable
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"cross join"
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        TableRef
_tr2 <- HeadedParsec Void Text TableRef
nonTrailingTableRef
        return (JoinMeth -> TableRef -> TableRef -> JoinedTable
MethJoinedTable JoinMeth
CrossJoinMeth TableRef
_tr1 TableRef
_tr2),
      do
        Maybe JoinType
_jt <- HeadedParsec Void Text (Maybe JoinType)
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s (Maybe JoinType)
joinTypedJoin
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        TableRef
_tr2 <- HeadedParsec Void Text TableRef
tableRef
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        JoinQual
_jq <- HeadedParsec Void Text JoinQual
joinQual
        return (JoinMeth -> TableRef -> TableRef -> JoinedTable
MethJoinedTable (Maybe JoinType -> JoinQual -> JoinMeth
QualJoinMeth Maybe JoinType
_jt JoinQual
_jq) TableRef
_tr1 TableRef
_tr2),
      do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"natural"
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Maybe JoinType
_jt <- HeadedParsec Void Text (Maybe JoinType)
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s (Maybe JoinType)
joinTypedJoin
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        TableRef
_tr2 <- HeadedParsec Void Text TableRef
nonTrailingTableRef
        return (JoinMeth -> TableRef -> TableRef -> JoinedTable
MethJoinedTable (Maybe JoinType -> JoinMeth
NaturalJoinMeth Maybe JoinType
_jt) TableRef
_tr1 TableRef
_tr2)
    ]
  where
    joinTypedJoin :: HeadedParsec e s (Maybe JoinType)
joinTypedJoin =
      JoinType -> Maybe JoinType
forall a. a -> Maybe a
Just (JoinType -> Maybe JoinType)
-> HeadedParsec e s JoinType -> HeadedParsec e s (Maybe JoinType)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (HeadedParsec e s JoinType
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s JoinType
joinType HeadedParsec e s JoinType
-> HeadedParsec e s () -> HeadedParsec e s JoinType
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* HeadedParsec e s ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead HeadedParsec e s JoinType
-> HeadedParsec e s () -> HeadedParsec e s JoinType
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* HeadedParsec e s ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 HeadedParsec e s JoinType
-> HeadedParsec e s Text -> HeadedParsec e s JoinType
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"join")
        HeadedParsec e s (Maybe JoinType)
-> HeadedParsec e s (Maybe JoinType)
-> HeadedParsec e s (Maybe JoinType)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe JoinType
forall a. Maybe a
Nothing Maybe JoinType
-> HeadedParsec e s Text -> HeadedParsec e s (Maybe JoinType)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"join"

joinType :: HeadedParsec e s JoinType
joinType =
  [HeadedParsec e s JoinType] -> HeadedParsec e s JoinType
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"full"
        HeadedParsec e s ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Bool
_outer <- HeadedParsec e s Bool
forall err strm.
(Ord err, Stream strm, Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm Bool
outerAfterSpace
        return (Bool -> JoinType
FullJoinType Bool
_outer),
      do
        Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"left"
        HeadedParsec e s ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Bool
_outer <- HeadedParsec e s Bool
forall err strm.
(Ord err, Stream strm, Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm Bool
outerAfterSpace
        return (Bool -> JoinType
LeftJoinType Bool
_outer),
      do
        Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"right"
        HeadedParsec e s ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Bool
_outer <- HeadedParsec e s Bool
forall err strm.
(Ord err, Stream strm, Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm Bool
outerAfterSpace
        return (Bool -> JoinType
RightJoinType Bool
_outer),
      Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"inner" HeadedParsec e s Text -> JoinType -> HeadedParsec e s JoinType
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> JoinType
InnerJoinType
    ]
  where
    outerAfterSpace :: HeadedParsec err strm Bool
outerAfterSpace = (HeadedParsec err strm ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 HeadedParsec err strm ()
-> HeadedParsec err strm Text -> HeadedParsec err strm Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> HeadedParsec err strm Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"outer") HeadedParsec err strm Text -> Bool -> HeadedParsec err strm Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
True HeadedParsec err strm Bool
-> HeadedParsec err strm Bool -> HeadedParsec err strm Bool
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool -> HeadedParsec err strm Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False

joinQual :: HeadedParsec Void Text JoinQual
joinQual =
  [HeadedParsec Void Text JoinQual]
-> HeadedParsec Void Text JoinQual
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"using" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text (NonEmpty Ident)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text (NonEmpty Ident)
forall a. Parser a -> Parser a
inParens (Parser ()
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text (NonEmpty Ident)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text Ident
colId) HeadedParsec Void Text (NonEmpty Ident)
-> (NonEmpty Ident -> JoinQual) -> HeadedParsec Void Text JoinQual
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> NonEmpty Ident -> JoinQual
UsingJoinQual,
      Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"on" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr HeadedParsec Void Text WhereClause
-> (WhereClause -> JoinQual) -> HeadedParsec Void Text JoinQual
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> WhereClause -> JoinQual
OnJoinQual
    ]

aliasClause :: HeadedParsec Void Text AliasClause
aliasClause = do
  (Bool
_as, Ident
_alias) <- (Bool
True,) (Ident -> (Bool, Ident))
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text (Bool, Ident)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"as" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Ident
colId) HeadedParsec Void Text (Bool, Ident)
-> HeadedParsec Void Text (Bool, Ident)
-> HeadedParsec Void Text (Bool, Ident)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Bool
False,) (Ident -> (Bool, Ident))
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text (Bool, Ident)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Ident
colId
  Maybe (NonEmpty Ident)
_columnAliases <- HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text (Maybe (NonEmpty Ident))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text (NonEmpty Ident)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text (NonEmpty Ident)
forall a. Parser a -> Parser a
inParens (Parser ()
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text (NonEmpty Ident)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text Ident
colId))
  return (Bool -> Ident -> Maybe (NonEmpty Ident) -> AliasClause
AliasClause Bool
_as Ident
_alias Maybe (NonEmpty Ident)
_columnAliases)

-- * Where

whereClause :: HeadedParsec Void Text WhereClause
whereClause = Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"where" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr

whereOrCurrentClause :: HeadedParsec Void Text WhereOrCurrentClause
whereOrCurrentClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"where"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  [HeadedParsec Void Text WhereOrCurrentClause]
-> HeadedParsec Void Text WhereOrCurrentClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"current"
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"of"
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Ident
a <- HeadedParsec Void Text Ident
cursorName
        return (Ident -> WhereOrCurrentClause
CursorWhereOrCurrentClause Ident
a),
      WhereClause -> WhereOrCurrentClause
ExprWhereOrCurrentClause (WhereClause -> WhereOrCurrentClause)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereOrCurrentClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
aExpr
    ]

-- * Sorting

sortClause :: HeadedParsec Void Text SortClause
sortClause = do
  Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"order by"
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  SortClause
a <- Parser ()
-> HeadedParsec Void Text SortBy
-> HeadedParsec Void Text SortClause
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text SortBy
sortBy
  return SortClause
a

sortBy :: HeadedParsec Void Text SortBy
sortBy = do
  WhereClause
a <- [Text] -> HeadedParsec Void Text WhereClause
filteredAExpr [Text
"using", Text
"asc", Text
"desc", Text
"nulls"]
  [HeadedParsec Void Text SortBy] -> HeadedParsec Void Text SortBy
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"using"
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        QualAllOp
b <- HeadedParsec Void Text QualAllOp
qualAllOp
        Maybe NullsOrder
c <- HeadedParsec Void Text NullsOrder
-> HeadedParsec Void Text (Maybe NullsOrder)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text NullsOrder
-> HeadedParsec Void Text NullsOrder
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text NullsOrder
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s NullsOrder
nullsOrder)
        return (WhereClause -> QualAllOp -> Maybe NullsOrder -> SortBy
UsingSortBy WhereClause
a QualAllOp
b Maybe NullsOrder
c),
      do
        Maybe AscDesc
b <- HeadedParsec Void Text AscDesc
-> HeadedParsec Void Text (Maybe AscDesc)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text AscDesc -> HeadedParsec Void Text AscDesc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AscDesc
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s AscDesc
ascDesc)
        Maybe NullsOrder
c <- HeadedParsec Void Text NullsOrder
-> HeadedParsec Void Text (Maybe NullsOrder)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text NullsOrder
-> HeadedParsec Void Text NullsOrder
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text NullsOrder
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s NullsOrder
nullsOrder)
        return (WhereClause -> Maybe AscDesc -> Maybe NullsOrder -> SortBy
AscDescSortBy WhereClause
a Maybe AscDesc
b Maybe NullsOrder
c)
    ]

-- * Expressions

exprList :: HeadedParsec Void Text (NonEmpty WhereClause)
exprList = Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text WhereClause
aExpr

exprListInParens :: HeadedParsec Void Text (NonEmpty WhereClause)
exprListInParens = HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text (NonEmpty WhereClause)
exprList

-- |
-- Notice that the tree constructed by this parser does not reflect
-- the precedence order of Postgres.
-- For the purposes of this library it simply doesn't matter,
-- so we're not bothering with that.
--
-- ==== Composite on the right:
--
-- >>> testParser aExpr "a = b :: int4"
-- SymbolicBinOpAExpr (CExprAExpr (ColumnrefCExpr (Columnref (UnquotedIdent "a") Nothing))) (MathSymbolicExprBinOp EqualsMathOp) (TypecastAExpr (CExprAExpr (ColumnrefCExpr (Columnref (UnquotedIdent "b") Nothing))) (Typename False (GenericTypeSimpleTypename (GenericType (UnquotedIdent "int4") Nothing Nothing)) False Nothing))
--
-- ==== Composite on the left:
--
-- >>> testParser aExpr "a = b :: int4 and c"
-- SymbolicBinOpAExpr (CExprAExpr (ColumnrefCExpr (Columnref (UnquotedIdent "a") Nothing))) (MathSymbolicExprBinOp EqualsMathOp) (AndAExpr (TypecastAExpr (CExprAExpr (ColumnrefCExpr (Columnref (UnquotedIdent "b") Nothing))) (Typename False (GenericTypeSimpleTypename (GenericType (UnquotedIdent "int4") Nothing Nothing)) False Nothing)) (CExprAExpr (ColumnrefCExpr (Columnref (UnquotedIdent "c") Nothing))))
aExpr :: HeadedParsec Void Text WhereClause
aExpr = HeadedParsec Void Text CExpr -> HeadedParsec Void Text WhereClause
customizedAExpr HeadedParsec Void Text CExpr
cExpr

filteredAExpr :: [Text] -> HeadedParsec Void Text WhereClause
filteredAExpr = HeadedParsec Void Text CExpr -> HeadedParsec Void Text WhereClause
customizedAExpr (HeadedParsec Void Text CExpr
 -> HeadedParsec Void Text WhereClause)
-> ([Text] -> HeadedParsec Void Text CExpr)
-> [Text]
-> HeadedParsec Void Text WhereClause
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. HeadedParsec Void Text Columnref -> HeadedParsec Void Text CExpr
customizedCExpr (HeadedParsec Void Text Columnref -> HeadedParsec Void Text CExpr)
-> ([Text] -> HeadedParsec Void Text Columnref)
-> [Text]
-> HeadedParsec Void Text CExpr
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Text] -> HeadedParsec Void Text Columnref
filteredColumnref

customizedAExpr :: HeadedParsec Void Text CExpr -> HeadedParsec Void Text WhereClause
customizedAExpr HeadedParsec Void Text CExpr
cExpr = HeadedParsec Void Text WhereClause
-> (WhereClause -> HeadedParsec Void Text WhereClause)
-> HeadedParsec Void Text WhereClause
forall (m :: * -> *) a.
(Monad m, Alternative m) =>
m a -> (a -> m a) -> m a
suffixRec HeadedParsec Void Text WhereClause
base WhereClause -> HeadedParsec Void Text WhereClause
suffix
  where
    aExpr :: HeadedParsec Void Text WhereClause
aExpr = HeadedParsec Void Text CExpr -> HeadedParsec Void Text WhereClause
customizedAExpr HeadedParsec Void Text CExpr
cExpr
    base :: HeadedParsec Void Text WhereClause
base =
      [HeadedParsec Void Text WhereClause]
-> HeadedParsec Void Text WhereClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
        [ WhereClause
DefaultAExpr WhereClause -> Parser Text -> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"default",
          SelectWithParens -> WhereClause
UniqueAExpr (SelectWithParens -> WhereClause)
-> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"unique" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text SelectWithParens
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SelectWithParens
selectWithParens),
          Row -> Row -> WhereClause
OverlapsAExpr (Row -> Row -> WhereClause)
-> HeadedParsec Void Text Row
-> HeadedParsec Void Text (Row -> WhereClause)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Row -> HeadedParsec Void Text Row
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text Row
row HeadedParsec Void Text (Row -> WhereClause)
-> HeadedParsec Void Text Row -> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"overlaps" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text Row -> HeadedParsec Void Text Row
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Row
row),
          HeadedParsec Void Text WhereClause
-> (QualOp -> WhereClause -> WhereClause)
-> HeadedParsec Void Text WhereClause
forall a b.
HeadedParsec Void Text a
-> (QualOp -> a -> b) -> HeadedParsec Void Text b
qualOpExpr HeadedParsec Void Text WhereClause
aExpr QualOp -> WhereClause -> WhereClause
PrefixQualOpAExpr,
          WhereClause -> WhereClause
PlusAExpr (WhereClause -> WhereClause)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall strm err b.
(Stream strm, Ord err, Token strm ~ Char) =>
HeadedParsec err strm b -> HeadedParsec err strm b
plusedExpr HeadedParsec Void Text WhereClause
aExpr,
          WhereClause -> WhereClause
MinusAExpr (WhereClause -> WhereClause)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall strm err b.
(Stream strm, Ord err, Token strm ~ Char) =>
HeadedParsec err strm b -> HeadedParsec err strm b
minusedExpr HeadedParsec Void Text WhereClause
aExpr,
          WhereClause -> WhereClause
NotAExpr (WhereClause -> WhereClause)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"not" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr),
          CExpr -> WhereClause
CExprAExpr (CExpr -> WhereClause)
-> HeadedParsec Void Text CExpr
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text CExpr
cExpr
        ]
    suffix :: WhereClause -> HeadedParsec Void Text WhereClause
suffix WhereClause
a =
      [HeadedParsec Void Text WhereClause]
-> HeadedParsec Void Text WhereClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
        [ do
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            SubqueryOp
b <- HeadedParsec Void Text SubqueryOp
-> HeadedParsec Void Text SubqueryOp
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text SubqueryOp
subqueryOp
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            SubType
c <- HeadedParsec Void Text SubType -> HeadedParsec Void Text SubType
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text SubType
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s SubType
subType
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
            Either SelectWithParens WhereClause
d <- SelectWithParens -> Either SelectWithParens WhereClause
forall a b. a -> Either a b
Left (SelectWithParens -> Either SelectWithParens WhereClause)
-> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text (Either SelectWithParens WhereClause)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text SelectWithParens
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text SelectWithParens
selectWithParens HeadedParsec Void Text (Either SelectWithParens WhereClause)
-> HeadedParsec Void Text (Either SelectWithParens WhereClause)
-> HeadedParsec Void Text (Either SelectWithParens WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> WhereClause -> Either SelectWithParens WhereClause
forall a b. b -> Either a b
Right (WhereClause -> Either SelectWithParens WhereClause)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Either SelectWithParens WhereClause)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text WhereClause
aExpr
            return (WhereClause
-> SubqueryOp
-> SubType
-> Either SelectWithParens WhereClause
-> WhereClause
SubqueryAExpr WhereClause
a SubqueryOp
b SubType
c Either SelectWithParens WhereClause
d),
          WhereClause
-> (WhereClause -> Typename -> WhereClause)
-> HeadedParsec Void Text WhereClause
forall a. a -> (a -> Typename -> a) -> HeadedParsec Void Text a
typecastExpr WhereClause
a WhereClause -> Typename -> WhereClause
TypecastAExpr,
          WhereClause -> AnyName -> WhereClause
CollateAExpr WhereClause
a (AnyName -> WhereClause)
-> HeadedParsec Void Text AnyName
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"collate" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text AnyName -> HeadedParsec Void Text AnyName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AnyName
anyName),
          WhereClause -> WhereClause -> WhereClause
AtTimeZoneAExpr WhereClause
a (WhereClause -> WhereClause)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"at time zone" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr),
          WhereClause
-> HeadedParsec Void Text WhereClause
-> (WhereClause -> SymbolicExprBinOp -> WhereClause -> WhereClause)
-> HeadedParsec Void Text WhereClause
forall t t b.
t
-> HeadedParsec Void Text t
-> (t -> SymbolicExprBinOp -> t -> b)
-> HeadedParsec Void Text b
symbolicBinOpExpr WhereClause
a HeadedParsec Void Text WhereClause
aExpr WhereClause -> SymbolicExprBinOp -> WhereClause -> WhereClause
SymbolicBinOpAExpr,
          WhereClause -> QualOp -> WhereClause
SuffixQualOpAExpr WhereClause
a (QualOp -> WhereClause)
-> HeadedParsec Void Text QualOp
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text QualOp -> HeadedParsec Void Text QualOp
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text QualOp
qualOp),
          WhereClause -> WhereClause -> WhereClause
AndAExpr WhereClause
a (WhereClause -> WhereClause)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"and" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr),
          WhereClause -> WhereClause -> WhereClause
OrAExpr WhereClause
a (WhereClause -> WhereClause)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"or" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr),
          do
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            Bool
b <- Parser () -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"not" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
            VerbalExprBinOp
c <-
              [HeadedParsec Void Text VerbalExprBinOp]
-> HeadedParsec Void Text VerbalExprBinOp
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
                [ VerbalExprBinOp
LikeVerbalExprBinOp VerbalExprBinOp
-> Parser Text -> HeadedParsec Void Text VerbalExprBinOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"like",
                  VerbalExprBinOp
IlikeVerbalExprBinOp VerbalExprBinOp
-> Parser Text -> HeadedParsec Void Text VerbalExprBinOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"ilike",
                  VerbalExprBinOp
SimilarToVerbalExprBinOp VerbalExprBinOp
-> Parser Text -> HeadedParsec Void Text VerbalExprBinOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"similar to"
                ]
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
            WhereClause
d <- HeadedParsec Void Text WhereClause
aExpr
            Maybe WhereClause
e <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"escape" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr)
            return (WhereClause
-> Bool
-> VerbalExprBinOp
-> WhereClause
-> Maybe WhereClause
-> WhereClause
VerbalExprBinOpAExpr WhereClause
a Bool
b VerbalExprBinOp
c WhereClause
d Maybe WhereClause
e),
          do
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"is"
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
            Bool
b <- Parser () -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"not" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
            AExprReversableOp
c <-
              [HeadedParsec Void Text AExprReversableOp]
-> HeadedParsec Void Text AExprReversableOp
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
                [ AExprReversableOp
NullAExprReversableOp AExprReversableOp
-> Parser Text -> HeadedParsec Void Text AExprReversableOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"null",
                  AExprReversableOp
TrueAExprReversableOp AExprReversableOp
-> Parser Text -> HeadedParsec Void Text AExprReversableOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"true",
                  AExprReversableOp
FalseAExprReversableOp AExprReversableOp
-> Parser Text -> HeadedParsec Void Text AExprReversableOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"false",
                  AExprReversableOp
UnknownAExprReversableOp AExprReversableOp
-> Parser Text -> HeadedParsec Void Text AExprReversableOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"unknown",
                  WhereClause -> AExprReversableOp
DistinctFromAExprReversableOp (WhereClause -> AExprReversableOp)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text AExprReversableOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"distinct" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"from" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr),
                  TypeList -> AExprReversableOp
OfAExprReversableOp (TypeList -> AExprReversableOp)
-> HeadedParsec Void Text TypeList
-> HeadedParsec Void Text AExprReversableOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"of" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text TypeList
-> HeadedParsec Void Text TypeList
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text TypeList -> HeadedParsec Void Text TypeList
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text TypeList
typeList),
                  AExprReversableOp
DocumentAExprReversableOp AExprReversableOp
-> Parser Text -> HeadedParsec Void Text AExprReversableOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"document"
                ]
            return (WhereClause -> Bool -> AExprReversableOp -> WhereClause
ReversableOpAExpr WhereClause
a Bool
b AExprReversableOp
c),
          do
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            Bool
b <- Parser () -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"not" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
            Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"between"
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
            BExpr -> WhereClause -> AExprReversableOp
c <-
              [HeadedParsec
   Void Text (BExpr -> WhereClause -> AExprReversableOp)]
-> HeadedParsec
     Void Text (BExpr -> WhereClause -> AExprReversableOp)
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
                [ BExpr -> WhereClause -> AExprReversableOp
BetweenSymmetricAExprReversableOp (BExpr -> WhereClause -> AExprReversableOp)
-> Parser ()
-> HeadedParsec
     Void Text (BExpr -> WhereClause -> AExprReversableOp)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"symmetric" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1),
                  Bool -> BExpr -> WhereClause -> AExprReversableOp
BetweenAExprReversableOp Bool
True (BExpr -> WhereClause -> AExprReversableOp)
-> Parser ()
-> HeadedParsec
     Void Text (BExpr -> WhereClause -> AExprReversableOp)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"asymmetric" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1),
                  (BExpr -> WhereClause -> AExprReversableOp)
-> HeadedParsec
     Void Text (BExpr -> WhereClause -> AExprReversableOp)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> BExpr -> WhereClause -> AExprReversableOp
BetweenAExprReversableOp Bool
False)
                ]
            BExpr
d <- HeadedParsec Void Text BExpr
bExpr
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"and"
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            WhereClause
e <- HeadedParsec Void Text WhereClause
aExpr
            return (WhereClause -> Bool -> AExprReversableOp -> WhereClause
ReversableOpAExpr WhereClause
a Bool
b (BExpr -> WhereClause -> AExprReversableOp
c BExpr
d WhereClause
e)),
          do
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            Bool
b <- Parser () -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"not" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
            Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"in"
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
            AExprReversableOp
c <- InExpr -> AExprReversableOp
InAExprReversableOp (InExpr -> AExprReversableOp)
-> HeadedParsec Void Text InExpr
-> HeadedParsec Void Text AExprReversableOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text InExpr
inExpr
            return (WhereClause -> Bool -> AExprReversableOp -> WhereClause
ReversableOpAExpr WhereClause
a Bool
b AExprReversableOp
c),
          WhereClause -> WhereClause
IsnullAExpr WhereClause
a WhereClause -> Parser Text -> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"isnull"),
          WhereClause -> WhereClause
NotnullAExpr WhereClause
a WhereClause -> Parser Text -> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"notnull")
        ]

bExpr :: HeadedParsec Void Text BExpr
bExpr = HeadedParsec Void Text CExpr -> HeadedParsec Void Text BExpr
customizedBExpr HeadedParsec Void Text CExpr
cExpr

customizedBExpr :: HeadedParsec Void Text CExpr -> HeadedParsec Void Text BExpr
customizedBExpr HeadedParsec Void Text CExpr
cExpr = HeadedParsec Void Text BExpr
-> (BExpr -> HeadedParsec Void Text BExpr)
-> HeadedParsec Void Text BExpr
forall (m :: * -> *) a.
(Monad m, Alternative m) =>
m a -> (a -> m a) -> m a
suffixRec HeadedParsec Void Text BExpr
base BExpr -> HeadedParsec Void Text BExpr
suffix
  where
    aExpr :: HeadedParsec Void Text WhereClause
aExpr = HeadedParsec Void Text CExpr -> HeadedParsec Void Text WhereClause
customizedAExpr HeadedParsec Void Text CExpr
cExpr
    bExpr :: HeadedParsec Void Text BExpr
bExpr = HeadedParsec Void Text CExpr -> HeadedParsec Void Text BExpr
customizedBExpr HeadedParsec Void Text CExpr
cExpr
    base :: HeadedParsec Void Text BExpr
base =
      [HeadedParsec Void Text BExpr] -> HeadedParsec Void Text BExpr
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
        [ HeadedParsec Void Text BExpr
-> (QualOp -> BExpr -> BExpr) -> HeadedParsec Void Text BExpr
forall a b.
HeadedParsec Void Text a
-> (QualOp -> a -> b) -> HeadedParsec Void Text b
qualOpExpr HeadedParsec Void Text BExpr
bExpr QualOp -> BExpr -> BExpr
QualOpBExpr,
          BExpr -> BExpr
PlusBExpr (BExpr -> BExpr)
-> HeadedParsec Void Text BExpr -> HeadedParsec Void Text BExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text BExpr -> HeadedParsec Void Text BExpr
forall strm err b.
(Stream strm, Ord err, Token strm ~ Char) =>
HeadedParsec err strm b -> HeadedParsec err strm b
plusedExpr HeadedParsec Void Text BExpr
bExpr,
          BExpr -> BExpr
MinusBExpr (BExpr -> BExpr)
-> HeadedParsec Void Text BExpr -> HeadedParsec Void Text BExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text BExpr -> HeadedParsec Void Text BExpr
forall strm err b.
(Stream strm, Ord err, Token strm ~ Char) =>
HeadedParsec err strm b -> HeadedParsec err strm b
minusedExpr HeadedParsec Void Text BExpr
bExpr,
          CExpr -> BExpr
CExprBExpr (CExpr -> BExpr)
-> HeadedParsec Void Text CExpr -> HeadedParsec Void Text BExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text CExpr
cExpr
        ]
    suffix :: BExpr -> HeadedParsec Void Text BExpr
suffix BExpr
a =
      [HeadedParsec Void Text BExpr] -> HeadedParsec Void Text BExpr
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
        [ BExpr
-> (BExpr -> Typename -> BExpr) -> HeadedParsec Void Text BExpr
forall a. a -> (a -> Typename -> a) -> HeadedParsec Void Text a
typecastExpr BExpr
a BExpr -> Typename -> BExpr
TypecastBExpr,
          BExpr
-> HeadedParsec Void Text BExpr
-> (BExpr -> SymbolicExprBinOp -> BExpr -> BExpr)
-> HeadedParsec Void Text BExpr
forall t t b.
t
-> HeadedParsec Void Text t
-> (t -> SymbolicExprBinOp -> t -> b)
-> HeadedParsec Void Text b
symbolicBinOpExpr BExpr
a HeadedParsec Void Text BExpr
bExpr BExpr -> SymbolicExprBinOp -> BExpr -> BExpr
SymbolicBinOpBExpr,
          do
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"is"
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
            Bool
b <- Parser () -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"not" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
            BExprIsOp
c <-
              [HeadedParsec Void Text BExprIsOp]
-> HeadedParsec Void Text BExprIsOp
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
                [ BExpr -> BExprIsOp
DistinctFromBExprIsOp (BExpr -> BExprIsOp)
-> HeadedParsec Void Text BExpr -> HeadedParsec Void Text BExprIsOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"distinct from" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text BExpr -> HeadedParsec Void Text BExpr
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text BExpr
bExpr),
                  TypeList -> BExprIsOp
OfBExprIsOp (TypeList -> BExprIsOp)
-> HeadedParsec Void Text TypeList
-> HeadedParsec Void Text BExprIsOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"of" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text TypeList
-> HeadedParsec Void Text TypeList
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text TypeList -> HeadedParsec Void Text TypeList
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text TypeList
typeList),
                  BExprIsOp
DocumentBExprIsOp BExprIsOp -> Parser Text -> HeadedParsec Void Text BExprIsOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"document"
                ]
            return (BExpr -> Bool -> BExprIsOp -> BExpr
IsOpBExpr BExpr
a Bool
b BExprIsOp
c)
        ]

cExpr :: HeadedParsec Void Text CExpr
cExpr = HeadedParsec Void Text Columnref -> HeadedParsec Void Text CExpr
customizedCExpr HeadedParsec Void Text Columnref
columnref

customizedCExpr :: HeadedParsec Void Text Columnref -> HeadedParsec Void Text CExpr
customizedCExpr HeadedParsec Void Text Columnref
columnref =
  [HeadedParsec Void Text CExpr] -> HeadedParsec Void Text CExpr
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Int -> Maybe Indirection -> CExpr
ParamCExpr (Int -> Maybe Indirection -> CExpr)
-> HeadedParsec Void Text Int
-> HeadedParsec Void Text (Maybe Indirection -> CExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'$' HeadedParsec Void Text Char
-> HeadedParsec Void Text Int -> HeadedParsec Void Text Int
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Int
forall err strm decimal.
(Ord err, Stream strm, Token strm ~ Char, Integral decimal) =>
HeadedParsec err strm decimal
decimal HeadedParsec Void Text Int
-> Parser () -> HeadedParsec Void Text Int
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead) HeadedParsec Void Text (Maybe Indirection -> CExpr)
-> HeadedParsec Void Text (Maybe Indirection)
-> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HeadedParsec Void Text Indirection
-> HeadedParsec Void Text (Maybe Indirection)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Indirection
-> HeadedParsec Void Text Indirection
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Indirection
indirection),
      CaseExpr -> CExpr
CaseCExpr (CaseExpr -> CExpr)
-> HeadedParsec Void Text CaseExpr -> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text CaseExpr
caseExpr,
      ImplicitRow -> CExpr
ImplicitRowCExpr (ImplicitRow -> CExpr)
-> HeadedParsec Void Text ImplicitRow
-> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ImplicitRow
implicitRow,
      Maybe (NonEmpty WhereClause) -> CExpr
ExplicitRowCExpr (Maybe (NonEmpty WhereClause) -> CExpr)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
-> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
explicitRow,
      Parser Text
-> HeadedParsec Void Text CExpr -> HeadedParsec Void Text CExpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"grouping") (NonEmpty WhereClause -> CExpr
GroupingCExpr (NonEmpty WhereClause -> CExpr)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text WhereClause
aExpr),
      Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"exists" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text CExpr -> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (SelectWithParens -> CExpr
ExistsCExpr (SelectWithParens -> CExpr)
-> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SelectWithParens
selectWithParens),
      do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"array"
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        HeadedParsec Void Text (HeadedParsec Void Text CExpr)
-> HeadedParsec Void Text CExpr
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (HeadedParsec Void Text (HeadedParsec Void Text CExpr)
 -> HeadedParsec Void Text CExpr)
-> HeadedParsec Void Text (HeadedParsec Void Text CExpr)
-> HeadedParsec Void Text CExpr
forall a b. (a -> b) -> a -> b
$
          [HeadedParsec Void Text (HeadedParsec Void Text CExpr)]
-> HeadedParsec Void Text (HeadedParsec Void Text CExpr)
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
            [ (HeadedParsec Void Text ArrayExpr -> HeadedParsec Void Text CExpr)
-> HeadedParsec Void Text (HeadedParsec Void Text ArrayExpr)
-> HeadedParsec Void Text (HeadedParsec Void Text CExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((ArrayExpr -> CExpr)
-> HeadedParsec Void Text ArrayExpr -> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Either SelectWithParens ArrayExpr -> CExpr
ArrayCExpr (Either SelectWithParens ArrayExpr -> CExpr)
-> (ArrayExpr -> Either SelectWithParens ArrayExpr)
-> ArrayExpr
-> CExpr
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ArrayExpr -> Either SelectWithParens ArrayExpr
forall a b. b -> Either a b
Right)) HeadedParsec Void Text (HeadedParsec Void Text ArrayExpr)
arrayExprCont,
              (SelectWithParens -> HeadedParsec Void Text CExpr)
-> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text (HeadedParsec Void Text CExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((SelectWithParens -> CExpr)
-> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Either SelectWithParens ArrayExpr -> CExpr
ArrayCExpr (Either SelectWithParens ArrayExpr -> CExpr)
-> (SelectWithParens -> Either SelectWithParens ArrayExpr)
-> SelectWithParens
-> CExpr
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. SelectWithParens -> Either SelectWithParens ArrayExpr
forall a b. a -> Either a b
Left) (HeadedParsec Void Text SelectWithParens
 -> HeadedParsec Void Text CExpr)
-> (SelectWithParens -> HeadedParsec Void Text SelectWithParens)
-> SelectWithParens
-> HeadedParsec Void Text CExpr
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. SelectWithParens -> HeadedParsec Void Text SelectWithParens
forall (f :: * -> *) a. Applicative f => a -> f a
pure) HeadedParsec Void Text SelectWithParens
selectWithParens
            ],
      do
        SelectWithParens
a <- HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text SelectWithParens
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text SelectWithParens
selectWithParens
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Maybe Indirection
b <- HeadedParsec Void Text Indirection
-> HeadedParsec Void Text (Maybe Indirection)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Indirection
-> HeadedParsec Void Text Indirection
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Indirection
indirection)
        return (SelectWithParens -> Maybe Indirection -> CExpr
SelectWithParensCExpr SelectWithParens
a Maybe Indirection
b),
      WhereClause -> Maybe Indirection -> CExpr
InParensCExpr (WhereClause -> Maybe Indirection -> CExpr)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe Indirection -> CExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text WhereClause
aExpr HeadedParsec Void Text WhereClause
-> Parser () -> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead) HeadedParsec Void Text (Maybe Indirection -> CExpr)
-> HeadedParsec Void Text (Maybe Indirection)
-> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HeadedParsec Void Text Indirection
-> HeadedParsec Void Text (Maybe Indirection)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Indirection
-> HeadedParsec Void Text Indirection
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Indirection
indirection),
      AexprConst -> CExpr
AexprConstCExpr (AexprConst -> CExpr)
-> HeadedParsec Void Text AexprConst
-> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text AexprConst
-> HeadedParsec Void Text AexprConst
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text AexprConst
aexprConst,
      FuncExpr -> CExpr
FuncCExpr (FuncExpr -> CExpr)
-> HeadedParsec Void Text FuncExpr -> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text FuncExpr
funcExpr,
      Columnref -> CExpr
ColumnrefCExpr (Columnref -> CExpr)
-> HeadedParsec Void Text Columnref -> HeadedParsec Void Text CExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Columnref
columnref
    ]

-- *

subqueryOp :: HeadedParsec Void Text SubqueryOp
subqueryOp =
  [HeadedParsec Void Text SubqueryOp]
-> HeadedParsec Void Text SubqueryOp
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ AnyOperator -> SubqueryOp
AnySubqueryOp (AnyOperator -> SubqueryOp)
-> HeadedParsec Void Text AnyOperator
-> HeadedParsec Void Text SubqueryOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"operator" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text AnyOperator
-> HeadedParsec Void Text AnyOperator
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AnyOperator
-> HeadedParsec Void Text AnyOperator
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text AnyOperator
anyOperator),
      do
        Bool
a <- Parser () -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"not" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
        Bool -> SubqueryOp
LikeSubqueryOp Bool
a SubqueryOp -> Parser Text -> HeadedParsec Void Text SubqueryOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"like" HeadedParsec Void Text SubqueryOp
-> HeadedParsec Void Text SubqueryOp
-> HeadedParsec Void Text SubqueryOp
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool -> SubqueryOp
IlikeSubqueryOp Bool
a SubqueryOp -> Parser Text -> HeadedParsec Void Text SubqueryOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"ilike",
      AllOp -> SubqueryOp
AllSubqueryOp (AllOp -> SubqueryOp)
-> HeadedParsec Void Text AllOp
-> HeadedParsec Void Text SubqueryOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text AllOp
forall err strm.
(Ord err, Stream strm, FoldCase (Tokens strm),
 IsString (Tokens strm), Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm AllOp
allOp
    ]

subType :: HeadedParsec e s SubType
subType =
  [HeadedParsec e s SubType] -> HeadedParsec e s SubType
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ SubType
AnySubType SubType -> HeadedParsec e s Text -> HeadedParsec e s SubType
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"any",
      SubType
SomeSubType SubType -> HeadedParsec e s Text -> HeadedParsec e s SubType
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"some",
      SubType
AllSubType SubType -> HeadedParsec e s Text -> HeadedParsec e s SubType
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"all"
    ]

inExpr :: HeadedParsec Void Text InExpr
inExpr = SelectWithParens -> InExpr
SelectInExpr (SelectWithParens -> InExpr)
-> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text InExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SelectWithParens
-> HeadedParsec Void Text SelectWithParens
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text SelectWithParens
selectWithParens HeadedParsec Void Text InExpr
-> HeadedParsec Void Text InExpr -> HeadedParsec Void Text InExpr
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> NonEmpty WhereClause -> InExpr
ExprListInExpr (NonEmpty WhereClause -> InExpr)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text InExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text (NonEmpty WhereClause)
exprList

symbolicBinOpExpr :: t
-> HeadedParsec Void Text t
-> (t -> SymbolicExprBinOp -> t -> b)
-> HeadedParsec Void Text b
symbolicBinOpExpr t
_a HeadedParsec Void Text t
_bParser t -> SymbolicExprBinOp -> t -> b
_constr = do
  SymbolicExprBinOp
_binOp <- String
-> HeadedParsec Void Text SymbolicExprBinOp
-> HeadedParsec Void Text SymbolicExprBinOp
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"binary operator" (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text SymbolicExprBinOp
-> HeadedParsec Void Text SymbolicExprBinOp
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SymbolicExprBinOp
-> HeadedParsec Void Text SymbolicExprBinOp
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text SymbolicExprBinOp
symbolicExprBinOp HeadedParsec Void Text SymbolicExprBinOp
-> Parser () -> HeadedParsec Void Text SymbolicExprBinOp
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space)
  t
_b <- HeadedParsec Void Text t
_bParser
  return (t -> SymbolicExprBinOp -> t -> b
_constr t
_a SymbolicExprBinOp
_binOp t
_b)

typecastExpr :: a -> (a -> Typename -> a) -> HeadedParsec Void Text a
typecastExpr :: a -> (a -> Typename -> a) -> HeadedParsec Void Text a
typecastExpr a
_prefix a -> Typename -> a
_constr = do
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
  Tokens Text -> HeadedParsec Void Text (Tokens Text)
forall err strm.
(Ord err, Stream strm) =>
Tokens strm -> HeadedParsec err strm (Tokens strm)
string Tokens Text
"::"
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
  Typename
_type <- HeadedParsec Void Text Typename
typename
  return (a -> Typename -> a
_constr a
_prefix Typename
_type)

plusedExpr :: HeadedParsec err strm b -> HeadedParsec err strm b
plusedExpr HeadedParsec err strm b
expr = Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'+' HeadedParsec err strm Char
-> HeadedParsec err strm () -> HeadedParsec err strm ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec err strm ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space HeadedParsec err strm ()
-> HeadedParsec err strm b -> HeadedParsec err strm b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec err strm b
expr

minusedExpr :: HeadedParsec err strm b -> HeadedParsec err strm b
minusedExpr HeadedParsec err strm b
expr = Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'-' HeadedParsec err strm Char
-> HeadedParsec err strm () -> HeadedParsec err strm ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec err strm ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space HeadedParsec err strm ()
-> HeadedParsec err strm b -> HeadedParsec err strm b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec err strm b
expr

qualOpExpr :: HeadedParsec Void Text a
-> (QualOp -> a -> b) -> HeadedParsec Void Text b
qualOpExpr HeadedParsec Void Text a
expr QualOp -> a -> b
constr = QualOp -> a -> b
constr (QualOp -> a -> b)
-> HeadedParsec Void Text QualOp -> HeadedParsec Void Text (a -> b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text QualOp -> HeadedParsec Void Text QualOp
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text QualOp
qualOp HeadedParsec Void Text (a -> b)
-> HeadedParsec Void Text a -> HeadedParsec Void Text b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> HeadedParsec Void Text a -> HeadedParsec Void Text a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text a
expr)

row :: HeadedParsec Void Text Row
row = Maybe (NonEmpty WhereClause) -> Row
ExplicitRowRow (Maybe (NonEmpty WhereClause) -> Row)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
-> HeadedParsec Void Text Row
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
explicitRow HeadedParsec Void Text Row
-> HeadedParsec Void Text Row -> HeadedParsec Void Text Row
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ImplicitRow -> Row
ImplicitRowRow (ImplicitRow -> Row)
-> HeadedParsec Void Text ImplicitRow -> HeadedParsec Void Text Row
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ImplicitRow
implicitRow

explicitRow :: HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
explicitRow = Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"row" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall a. Parser a -> Parser a
inParens (HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional HeadedParsec Void Text (NonEmpty WhereClause)
exprList)

implicitRow :: HeadedParsec Void Text ImplicitRow
implicitRow = HeadedParsec Void Text ImplicitRow
-> HeadedParsec Void Text ImplicitRow
forall a. Parser a -> Parser a
inParens (HeadedParsec Void Text ImplicitRow
 -> HeadedParsec Void Text ImplicitRow)
-> HeadedParsec Void Text ImplicitRow
-> HeadedParsec Void Text ImplicitRow
forall a b. (a -> b) -> a -> b
$ do
  WhereClause
a <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text WhereClause
aExpr
  Parser ()
commaSeparator
  NonEmpty WhereClause
b <- HeadedParsec Void Text (NonEmpty WhereClause)
exprList
  return $ case WhereClause
-> NonEmpty WhereClause -> (NonEmpty WhereClause, WhereClause)
forall a. a -> NonEmpty a -> (NonEmpty a, a)
NonEmpty.consAndUnsnoc WhereClause
a NonEmpty WhereClause
b of
    (NonEmpty WhereClause
c, WhereClause
d) -> NonEmpty WhereClause -> WhereClause -> ImplicitRow
ImplicitRow NonEmpty WhereClause
c WhereClause
d

arrayExprCont :: HeadedParsec Void Text (HeadedParsec Void Text ArrayExpr)
arrayExprCont =
  HeadedParsec Void Text ArrayExpr
-> HeadedParsec Void Text (HeadedParsec Void Text ArrayExpr)
forall a. Parser a -> Parser (Parser a)
inBracketsCont (HeadedParsec Void Text ArrayExpr
 -> HeadedParsec Void Text (HeadedParsec Void Text ArrayExpr))
-> HeadedParsec Void Text ArrayExpr
-> HeadedParsec Void Text (HeadedParsec Void Text ArrayExpr)
forall a b. (a -> b) -> a -> b
$
    [HeadedParsec Void Text ArrayExpr]
-> HeadedParsec Void Text ArrayExpr
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
      [ ArrayExprList -> ArrayExpr
ArrayExprListArrayExpr (ArrayExprList -> ArrayExpr)
-> HeadedParsec Void Text ArrayExprList
-> HeadedParsec Void Text ArrayExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ()
-> HeadedParsec Void Text ArrayExpr
-> HeadedParsec Void Text ArrayExprList
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator (HeadedParsec Void Text (HeadedParsec Void Text ArrayExpr)
-> HeadedParsec Void Text ArrayExpr
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join HeadedParsec Void Text (HeadedParsec Void Text ArrayExpr)
arrayExprCont),
        NonEmpty WhereClause -> ArrayExpr
ExprListArrayExpr (NonEmpty WhereClause -> ArrayExpr)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text ArrayExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (NonEmpty WhereClause)
exprList,
        ArrayExpr -> HeadedParsec Void Text ArrayExpr
forall (f :: * -> *) a. Applicative f => a -> f a
pure ArrayExpr
EmptyArrayExpr
      ]

caseExpr :: HeadedParsec Void Text CaseExpr
caseExpr = String
-> HeadedParsec Void Text CaseExpr
-> HeadedParsec Void Text CaseExpr
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"case expression" (HeadedParsec Void Text CaseExpr
 -> HeadedParsec Void Text CaseExpr)
-> HeadedParsec Void Text CaseExpr
-> HeadedParsec Void Text CaseExpr
forall a b. (a -> b) -> a -> b
$ do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"case"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe WhereClause
_arg <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text WhereClause
aExpr HeadedParsec Void Text WhereClause
-> Parser () -> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
  NonEmpty WhenClause
_whenClauses <- Parser ()
-> HeadedParsec Void Text WhenClause
-> HeadedParsec Void Text (NonEmpty WhenClause)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 HeadedParsec Void Text WhenClause
whenClause
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Maybe WhereClause
_default <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional HeadedParsec Void Text WhereClause
elseClause
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"end"
  pure $ Maybe WhereClause
-> NonEmpty WhenClause -> Maybe WhereClause -> CaseExpr
CaseExpr Maybe WhereClause
_arg NonEmpty WhenClause
_whenClauses Maybe WhereClause
_default

whenClause :: HeadedParsec Void Text WhenClause
whenClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"when"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  WhereClause
_a <- HeadedParsec Void Text WhereClause
aExpr
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"then"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  WhereClause
_b <- HeadedParsec Void Text WhereClause
aExpr
  return (WhereClause -> WhereClause -> WhenClause
WhenClause WhereClause
_a WhereClause
_b)

elseClause :: HeadedParsec Void Text WhereClause
elseClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"else"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  WhereClause
a <- HeadedParsec Void Text WhereClause
aExpr
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  return WhereClause
a

funcExpr :: HeadedParsec Void Text FuncExpr
funcExpr =
  [HeadedParsec Void Text FuncExpr]
-> HeadedParsec Void Text FuncExpr
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ FuncExprCommonSubexpr -> FuncExpr
SubexprFuncExpr (FuncExprCommonSubexpr -> FuncExpr)
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text FuncExprCommonSubexpr
funcExprCommonSubexpr,
      do
        FuncApplication
a <- HeadedParsec Void Text FuncApplication
funcApplication
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Maybe SortClause
b <- HeadedParsec Void Text SortClause
-> HeadedParsec Void Text (Maybe SortClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SortClause
-> HeadedParsec Void Text SortClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SortClause
withinGroupClause)
        Maybe WhereClause
c <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
filterClause)
        Maybe OverClause
d <- HeadedParsec Void Text OverClause
-> HeadedParsec Void Text (Maybe OverClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text OverClause
-> HeadedParsec Void Text OverClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text OverClause
overClause)
        return (FuncApplication
-> Maybe SortClause
-> Maybe WhereClause
-> Maybe OverClause
-> FuncExpr
ApplicationFuncExpr FuncApplication
a Maybe SortClause
b Maybe WhereClause
c Maybe OverClause
d)
    ]

funcExprWindowless :: HeadedParsec Void Text FuncExprWindowless
funcExprWindowless =
  [HeadedParsec Void Text FuncExprWindowless]
-> HeadedParsec Void Text FuncExprWindowless
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ FuncExprCommonSubexpr -> FuncExprWindowless
CommonSubexprFuncExprWindowless (FuncExprCommonSubexpr -> FuncExprWindowless)
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprWindowless
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text FuncExprCommonSubexpr
funcExprCommonSubexpr,
      FuncApplication -> FuncExprWindowless
ApplicationFuncExprWindowless (FuncApplication -> FuncExprWindowless)
-> HeadedParsec Void Text FuncApplication
-> HeadedParsec Void Text FuncExprWindowless
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text FuncApplication
funcApplication
    ]

withinGroupClause :: HeadedParsec Void Text SortClause
withinGroupClause = do
  Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"within group"
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
  HeadedParsec Void Text SortClause
-> HeadedParsec Void Text SortClause
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text SortClause
sortClause

filterClause :: HeadedParsec Void Text WhereClause
filterClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"filter"
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
  HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall a. Parser a -> Parser a
inParens (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"where" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr)

overClause :: HeadedParsec Void Text OverClause
overClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"over"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  [HeadedParsec Void Text OverClause]
-> HeadedParsec Void Text OverClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ WindowSpecification -> OverClause
WindowOverClause (WindowSpecification -> OverClause)
-> HeadedParsec Void Text WindowSpecification
-> HeadedParsec Void Text OverClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WindowSpecification
windowSpecification,
      Ident -> OverClause
ColIdOverClause (Ident -> OverClause)
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text OverClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Ident
colId
    ]

funcExprCommonSubexpr :: HeadedParsec Void Text FuncExprCommonSubexpr
funcExprCommonSubexpr =
  [HeadedParsec Void Text FuncExprCommonSubexpr]
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ WhereClause -> FuncExprCommonSubexpr
CollationForFuncExprCommonSubexpr (WhereClause -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser Text
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"collation for") HeadedParsec Void Text WhereClause
aExpr),
      FuncExprCommonSubexpr
CurrentDateFuncExprCommonSubexpr FuncExprCommonSubexpr
-> Parser Text -> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"current_date",
      Maybe Int64 -> FuncExprCommonSubexpr
CurrentTimestampFuncExprCommonSubexpr (Maybe Int64 -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> HeadedParsec Void Text (Maybe Int64)
forall a. Integral a => Text -> HeadedParsec Void Text (Maybe a)
labeledIconst Text
"current_timestamp",
      Maybe Int64 -> FuncExprCommonSubexpr
CurrentTimeFuncExprCommonSubexpr (Maybe Int64 -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> HeadedParsec Void Text (Maybe Int64)
forall a. Integral a => Text -> HeadedParsec Void Text (Maybe a)
labeledIconst Text
"current_time",
      Maybe Int64 -> FuncExprCommonSubexpr
LocalTimestampFuncExprCommonSubexpr (Maybe Int64 -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> HeadedParsec Void Text (Maybe Int64)
forall a. Integral a => Text -> HeadedParsec Void Text (Maybe a)
labeledIconst Text
"localtimestamp",
      Maybe Int64 -> FuncExprCommonSubexpr
LocalTimeFuncExprCommonSubexpr (Maybe Int64 -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> HeadedParsec Void Text (Maybe Int64)
forall a. Integral a => Text -> HeadedParsec Void Text (Maybe a)
labeledIconst Text
"localtime",
      FuncExprCommonSubexpr
CurrentRoleFuncExprCommonSubexpr FuncExprCommonSubexpr
-> Parser Text -> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"current_role",
      FuncExprCommonSubexpr
CurrentUserFuncExprCommonSubexpr FuncExprCommonSubexpr
-> Parser Text -> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"current_user",
      FuncExprCommonSubexpr
SessionUserFuncExprCommonSubexpr FuncExprCommonSubexpr
-> Parser Text -> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"session_user",
      FuncExprCommonSubexpr
UserFuncExprCommonSubexpr FuncExprCommonSubexpr
-> Parser Text -> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"user",
      FuncExprCommonSubexpr
CurrentCatalogFuncExprCommonSubexpr FuncExprCommonSubexpr
-> Parser Text -> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"current_catalog",
      FuncExprCommonSubexpr
CurrentSchemaFuncExprCommonSubexpr FuncExprCommonSubexpr
-> Parser Text -> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"current_schema",
      Parser Text
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"cast") (WhereClause -> Typename -> FuncExprCommonSubexpr
CastFuncExprCommonSubexpr (WhereClause -> Typename -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Typename -> FuncExprCommonSubexpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
aExpr HeadedParsec Void Text (Typename -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text Typename
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"as" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text Typename
-> HeadedParsec Void Text Typename
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Typename
typename)),
      Parser Text
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"extract") (Maybe ExtractList -> FuncExprCommonSubexpr
ExtractFuncExprCommonSubexpr (Maybe ExtractList -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text (Maybe ExtractList)
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ExtractList
-> HeadedParsec Void Text (Maybe ExtractList)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional HeadedParsec Void Text ExtractList
extractList),
      Parser Text
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"overlay") (OverlayList -> FuncExprCommonSubexpr
OverlayFuncExprCommonSubexpr (OverlayList -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text OverlayList
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text OverlayList
overlayList),
      Parser Text
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"position") (Maybe PositionList -> FuncExprCommonSubexpr
PositionFuncExprCommonSubexpr (Maybe PositionList -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text (Maybe PositionList)
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text PositionList
-> HeadedParsec Void Text (Maybe PositionList)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional HeadedParsec Void Text PositionList
positionList),
      Parser Text
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"substring") (Maybe SubstrList -> FuncExprCommonSubexpr
SubstringFuncExprCommonSubexpr (Maybe SubstrList -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text (Maybe SubstrList)
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SubstrList
-> HeadedParsec Void Text (Maybe SubstrList)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional HeadedParsec Void Text SubstrList
substrList),
      Parser Text
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"treat") (WhereClause -> Typename -> FuncExprCommonSubexpr
TreatFuncExprCommonSubexpr (WhereClause -> Typename -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Typename -> FuncExprCommonSubexpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
aExpr HeadedParsec Void Text (Typename -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text Typename
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"as" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text Typename
-> HeadedParsec Void Text Typename
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Typename
typename)),
      Parser Text
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"trim") (Maybe TrimModifier -> TrimList -> FuncExprCommonSubexpr
TrimFuncExprCommonSubexpr (Maybe TrimModifier -> TrimList -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text (Maybe TrimModifier)
-> HeadedParsec Void Text (TrimList -> FuncExprCommonSubexpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text TrimModifier
-> HeadedParsec Void Text (Maybe TrimModifier)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text TrimModifier
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s TrimModifier
trimModifier HeadedParsec Void Text TrimModifier
-> Parser () -> HeadedParsec Void Text TrimModifier
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1) HeadedParsec Void Text (TrimList -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text TrimList
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HeadedParsec Void Text TrimList
trimList),
      Parser Text
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"nullif") (WhereClause -> WhereClause -> FuncExprCommonSubexpr
NullIfFuncExprCommonSubexpr (WhereClause -> WhereClause -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (WhereClause -> FuncExprCommonSubexpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
aExpr HeadedParsec Void Text (WhereClause -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
commaSeparator Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr)),
      Parser Text
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"coalesce") (NonEmpty WhereClause -> FuncExprCommonSubexpr
CoalesceFuncExprCommonSubexpr (NonEmpty WhereClause -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (NonEmpty WhereClause)
exprList),
      Parser Text
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"greatest") (NonEmpty WhereClause -> FuncExprCommonSubexpr
GreatestFuncExprCommonSubexpr (NonEmpty WhereClause -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (NonEmpty WhereClause)
exprList),
      Parser Text
-> HeadedParsec Void Text FuncExprCommonSubexpr
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"least") (NonEmpty WhereClause -> FuncExprCommonSubexpr
LeastFuncExprCommonSubexpr (NonEmpty WhereClause -> FuncExprCommonSubexpr)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text FuncExprCommonSubexpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (NonEmpty WhereClause)
exprList)
    ]
  where
    labeledIconst :: Text -> HeadedParsec Void Text (Maybe a)
labeledIconst Text
_label = Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
_label Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (Maybe a)
-> HeadedParsec Void Text (Maybe a)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text a -> HeadedParsec Void Text (Maybe a)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> HeadedParsec Void Text a -> HeadedParsec Void Text a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text a -> HeadedParsec Void Text a
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text a
forall strm decimal err.
(Stream strm, Integral decimal, Ord err, Token strm ~ Char) =>
HeadedParsec err strm decimal
iconst)

extractList :: HeadedParsec Void Text ExtractList
extractList = ExtractArg -> WhereClause -> ExtractList
ExtractList (ExtractArg -> WhereClause -> ExtractList)
-> HeadedParsec Void Text ExtractArg
-> HeadedParsec Void Text (WhereClause -> ExtractList)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ExtractArg
extractArg HeadedParsec Void Text (WhereClause -> ExtractList)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text ExtractList
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"from" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr)

extractArg :: HeadedParsec Void Text ExtractArg
extractArg =
  [HeadedParsec Void Text ExtractArg]
-> HeadedParsec Void Text ExtractArg
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ ExtractArg
YearExtractArg ExtractArg -> Parser Text -> HeadedParsec Void Text ExtractArg
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"year",
      ExtractArg
MonthExtractArg ExtractArg -> Parser Text -> HeadedParsec Void Text ExtractArg
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"month",
      ExtractArg
DayExtractArg ExtractArg -> Parser Text -> HeadedParsec Void Text ExtractArg
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"day",
      ExtractArg
HourExtractArg ExtractArg -> Parser Text -> HeadedParsec Void Text ExtractArg
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"hour",
      ExtractArg
MinuteExtractArg ExtractArg -> Parser Text -> HeadedParsec Void Text ExtractArg
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"minute",
      ExtractArg
SecondExtractArg ExtractArg -> Parser Text -> HeadedParsec Void Text ExtractArg
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"second",
      Text -> ExtractArg
SconstExtractArg (Text -> ExtractArg)
-> Parser Text -> HeadedParsec Void Text ExtractArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text
sconst,
      Ident -> ExtractArg
IdentExtractArg (Ident -> ExtractArg)
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text ExtractArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Ident
ident
    ]

overlayList :: HeadedParsec Void Text OverlayList
overlayList = do
  WhereClause
a <- HeadedParsec Void Text WhereClause
aExpr
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  WhereClause
b <- HeadedParsec Void Text WhereClause
overlayPlacing
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  WhereClause
c <- HeadedParsec Void Text WhereClause
substrFrom
  Maybe WhereClause
d <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
substrFor)
  return (WhereClause
-> WhereClause -> WhereClause -> Maybe WhereClause -> OverlayList
OverlayList WhereClause
a WhereClause
b WhereClause
c Maybe WhereClause
d)

overlayPlacing :: HeadedParsec Void Text WhereClause
overlayPlacing = Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"placing" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr

positionList :: HeadedParsec Void Text PositionList
positionList = BExpr -> BExpr -> PositionList
PositionList (BExpr -> BExpr -> PositionList)
-> HeadedParsec Void Text BExpr
-> HeadedParsec Void Text (BExpr -> PositionList)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text BExpr
bExpr HeadedParsec Void Text (BExpr -> PositionList)
-> HeadedParsec Void Text BExpr
-> HeadedParsec Void Text PositionList
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"in" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text BExpr -> HeadedParsec Void Text BExpr
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text BExpr
bExpr)

substrList :: HeadedParsec Void Text SubstrList
substrList =
  [HeadedParsec Void Text SubstrList]
-> HeadedParsec Void Text SubstrList
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ WhereClause -> SubstrListFromFor -> SubstrList
ExprSubstrList (WhereClause -> SubstrListFromFor -> SubstrList)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (SubstrListFromFor -> SubstrList)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text WhereClause
aExpr HeadedParsec Void Text (SubstrListFromFor -> SubstrList)
-> HeadedParsec Void Text SubstrListFromFor
-> HeadedParsec Void Text SubstrList
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SubstrListFromFor
-> HeadedParsec Void Text SubstrListFromFor
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SubstrListFromFor
substrListFromFor),
      NonEmpty WhereClause -> SubstrList
ExprListSubstrList (NonEmpty WhereClause -> SubstrList)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text SubstrList
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (NonEmpty WhereClause)
exprList
    ]

substrListFromFor :: HeadedParsec Void Text SubstrListFromFor
substrListFromFor =
  [HeadedParsec Void Text SubstrListFromFor]
-> HeadedParsec Void Text SubstrListFromFor
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        WhereClause
a <- HeadedParsec Void Text WhereClause
substrFrom
        [HeadedParsec Void Text SubstrListFromFor]
-> HeadedParsec Void Text SubstrListFromFor
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
          [ do
              WhereClause
b <- Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
substrFor
              return (WhereClause -> WhereClause -> SubstrListFromFor
FromForSubstrListFromFor WhereClause
a WhereClause
b),
            SubstrListFromFor -> HeadedParsec Void Text SubstrListFromFor
forall (m :: * -> *) a. Monad m => a -> m a
return (WhereClause -> SubstrListFromFor
FromSubstrListFromFor WhereClause
a)
          ],
      do
        WhereClause
a <- HeadedParsec Void Text WhereClause
substrFor
        [HeadedParsec Void Text SubstrListFromFor]
-> HeadedParsec Void Text SubstrListFromFor
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
          [ do
              WhereClause
b <- Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
substrFrom
              return (WhereClause -> WhereClause -> SubstrListFromFor
ForFromSubstrListFromFor WhereClause
a WhereClause
b),
            SubstrListFromFor -> HeadedParsec Void Text SubstrListFromFor
forall (m :: * -> *) a. Monad m => a -> m a
return (WhereClause -> SubstrListFromFor
ForSubstrListFromFor WhereClause
a)
          ]
    ]

substrFrom :: HeadedParsec Void Text WhereClause
substrFrom = Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"from" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr

substrFor :: HeadedParsec Void Text WhereClause
substrFor = Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"for" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr

trimModifier :: HeadedParsec e s TrimModifier
trimModifier =
  TrimModifier
BothTrimModifier TrimModifier
-> HeadedParsec e s Text -> HeadedParsec e s TrimModifier
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"both"
    HeadedParsec e s TrimModifier
-> HeadedParsec e s TrimModifier -> HeadedParsec e s TrimModifier
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> TrimModifier
LeadingTrimModifier TrimModifier
-> HeadedParsec e s Text -> HeadedParsec e s TrimModifier
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"leading"
    HeadedParsec e s TrimModifier
-> HeadedParsec e s TrimModifier -> HeadedParsec e s TrimModifier
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> TrimModifier
TrailingTrimModifier TrimModifier
-> HeadedParsec e s Text -> HeadedParsec e s TrimModifier
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"trailing"

trimList :: HeadedParsec Void Text TrimList
trimList =
  [HeadedParsec Void Text TrimList]
-> HeadedParsec Void Text TrimList
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ WhereClause -> NonEmpty WhereClause -> TrimList
ExprFromExprListTrimList (WhereClause -> NonEmpty WhereClause -> TrimList)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (NonEmpty WhereClause -> TrimList)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text WhereClause
aExpr HeadedParsec Void Text (NonEmpty WhereClause -> TrimList)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text TrimList
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"from" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
exprList),
      NonEmpty WhereClause -> TrimList
FromExprListTrimList (NonEmpty WhereClause -> TrimList)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text TrimList
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"from" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
exprList),
      NonEmpty WhereClause -> TrimList
ExprListTrimList (NonEmpty WhereClause -> TrimList)
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text TrimList
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (NonEmpty WhereClause)
exprList
    ]

funcApplication :: HeadedParsec Void Text FuncApplication
funcApplication = (FuncName -> Maybe FuncApplicationParams -> FuncApplication)
-> Parser FuncName
-> Parser (Maybe FuncApplicationParams)
-> HeadedParsec Void Text FuncApplication
forall label content result.
(label -> content -> result)
-> Parser label -> Parser content -> Parser result
inParensWithLabel FuncName -> Maybe FuncApplicationParams -> FuncApplication
FuncApplication Parser FuncName
funcName (HeadedParsec Void Text FuncApplicationParams
-> Parser (Maybe FuncApplicationParams)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional HeadedParsec Void Text FuncApplicationParams
funcApplicationParams)

funcApplicationParams :: HeadedParsec Void Text FuncApplicationParams
funcApplicationParams =
  [HeadedParsec Void Text FuncApplicationParams]
-> HeadedParsec Void Text FuncApplicationParams
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ HeadedParsec Void Text FuncApplicationParams
forall strm err.
(Stream strm, Ord err, Token strm ~ Char) =>
HeadedParsec err strm FuncApplicationParams
starFuncApplicationParams,
      HeadedParsec Void Text FuncApplicationParams
listVariadicFuncApplicationParams,
      HeadedParsec Void Text FuncApplicationParams
singleVariadicFuncApplicationParams,
      HeadedParsec Void Text FuncApplicationParams
normalFuncApplicationParams
    ]

normalFuncApplicationParams :: HeadedParsec Void Text FuncApplicationParams
normalFuncApplicationParams = do
  Maybe Bool
_optAllOrDistinct <- Parser Bool -> HeadedParsec Void Text (Maybe Bool)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Bool
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s Bool
allOrDistinct Parser Bool -> Parser () -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1)
  NonEmpty FuncArgExpr
_argList <- Parser ()
-> HeadedParsec Void Text FuncArgExpr
-> HeadedParsec Void Text (NonEmpty FuncArgExpr)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text FuncArgExpr
funcArgExpr
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe SortClause
_optSortClause <- HeadedParsec Void Text SortClause
-> HeadedParsec Void Text (Maybe SortClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SortClause
-> HeadedParsec Void Text SortClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SortClause
sortClause)
  return (Maybe Bool
-> NonEmpty FuncArgExpr
-> Maybe SortClause
-> FuncApplicationParams
NormalFuncApplicationParams Maybe Bool
_optAllOrDistinct NonEmpty FuncArgExpr
_argList Maybe SortClause
_optSortClause)

singleVariadicFuncApplicationParams :: HeadedParsec Void Text FuncApplicationParams
singleVariadicFuncApplicationParams = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"variadic"
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  FuncArgExpr
_arg <- HeadedParsec Void Text FuncArgExpr
funcArgExpr
  Maybe SortClause
_optSortClause <- HeadedParsec Void Text SortClause
-> HeadedParsec Void Text (Maybe SortClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SortClause
-> HeadedParsec Void Text SortClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SortClause
sortClause)
  return (Maybe (NonEmpty FuncArgExpr)
-> FuncArgExpr -> Maybe SortClause -> FuncApplicationParams
VariadicFuncApplicationParams Maybe (NonEmpty FuncArgExpr)
forall a. Maybe a
Nothing FuncArgExpr
_arg Maybe SortClause
_optSortClause)

listVariadicFuncApplicationParams :: HeadedParsec Void Text FuncApplicationParams
listVariadicFuncApplicationParams = do
  (NonEmpty FuncArgExpr
_argList, Text
_) <- HeadedParsec Void Text (NonEmpty FuncArgExpr, Text)
-> HeadedParsec Void Text (NonEmpty FuncArgExpr, Text)
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead (HeadedParsec Void Text (NonEmpty FuncArgExpr, Text)
 -> HeadedParsec Void Text (NonEmpty FuncArgExpr, Text))
-> HeadedParsec Void Text (NonEmpty FuncArgExpr, Text)
-> HeadedParsec Void Text (NonEmpty FuncArgExpr, Text)
forall a b. (a -> b) -> a -> b
$ Parser ()
-> Parser Text
-> HeadedParsec Void Text FuncArgExpr
-> HeadedParsec Void Text (NonEmpty FuncArgExpr, Text)
forall err strm separator end el.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separator
-> HeadedParsec err strm end
-> HeadedParsec err strm el
-> HeadedParsec err strm (NonEmpty el, end)
sepEnd1 Parser ()
commaSeparator (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"variadic" Parser Text -> Parser () -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1) HeadedParsec Void Text FuncArgExpr
funcArgExpr
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  FuncArgExpr
_arg <- HeadedParsec Void Text FuncArgExpr
funcArgExpr
  Maybe SortClause
_optSortClause <- HeadedParsec Void Text SortClause
-> HeadedParsec Void Text (Maybe SortClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SortClause
-> HeadedParsec Void Text SortClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SortClause
sortClause)
  return (Maybe (NonEmpty FuncArgExpr)
-> FuncArgExpr -> Maybe SortClause -> FuncApplicationParams
VariadicFuncApplicationParams (NonEmpty FuncArgExpr -> Maybe (NonEmpty FuncArgExpr)
forall a. a -> Maybe a
Just NonEmpty FuncArgExpr
_argList) FuncArgExpr
_arg Maybe SortClause
_optSortClause)

starFuncApplicationParams :: HeadedParsec err strm FuncApplicationParams
starFuncApplicationParams = HeadedParsec err strm ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space HeadedParsec err strm ()
-> HeadedParsec err strm Char -> HeadedParsec err strm Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'*' HeadedParsec err strm Char
-> HeadedParsec err strm () -> HeadedParsec err strm ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec err strm ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead HeadedParsec err strm ()
-> HeadedParsec err strm () -> HeadedParsec err strm ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec err strm ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space HeadedParsec err strm ()
-> FuncApplicationParams
-> HeadedParsec err strm FuncApplicationParams
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> FuncApplicationParams
StarFuncApplicationParams

-- |
-- ==== References
-- @
-- func_arg_expr:
--   | a_expr
--   | param_name COLON_EQUALS a_expr
--   | param_name EQUALS_GREATER a_expr
-- param_name:
--   | type_function_name
-- @
funcArgExpr :: HeadedParsec Void Text FuncArgExpr
funcArgExpr =
  [HeadedParsec Void Text FuncArgExpr]
-> HeadedParsec Void Text FuncArgExpr
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Ident
a <- HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text Ident
typeFunctionName
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        [HeadedParsec Void Text FuncArgExpr]
-> HeadedParsec Void Text FuncArgExpr
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
          [ do
              Tokens Text -> HeadedParsec Void Text (Tokens Text)
forall err strm.
(Ord err, Stream strm) =>
Tokens strm -> HeadedParsec err strm (Tokens strm)
string Tokens Text
":="
              Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
              WhereClause
b <- Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr
              return (Ident -> WhereClause -> FuncArgExpr
ColonEqualsFuncArgExpr Ident
a WhereClause
b),
            do
              Tokens Text -> HeadedParsec Void Text (Tokens Text)
forall err strm.
(Ord err, Stream strm) =>
Tokens strm -> HeadedParsec err strm (Tokens strm)
string Tokens Text
"=>"
              Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
              WhereClause
b <- Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text WhereClause
aExpr
              return (Ident -> WhereClause -> FuncArgExpr
EqualsGreaterFuncArgExpr Ident
a WhereClause
b)
          ],
      WhereClause -> FuncArgExpr
ExprFuncArgExpr (WhereClause -> FuncArgExpr)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text FuncArgExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
aExpr
    ]

-- * Ops

symbolicExprBinOp :: HeadedParsec Void Text SymbolicExprBinOp
symbolicExprBinOp =
  QualOp -> SymbolicExprBinOp
QualSymbolicExprBinOp (QualOp -> SymbolicExprBinOp)
-> HeadedParsec Void Text QualOp
-> HeadedParsec Void Text SymbolicExprBinOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text QualOp
qualOp
    HeadedParsec Void Text SymbolicExprBinOp
-> HeadedParsec Void Text SymbolicExprBinOp
-> HeadedParsec Void Text SymbolicExprBinOp
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> MathOp -> SymbolicExprBinOp
MathSymbolicExprBinOp (MathOp -> SymbolicExprBinOp)
-> HeadedParsec Void Text MathOp
-> HeadedParsec Void Text SymbolicExprBinOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text MathOp
forall strm err.
(Stream strm, FoldCase (Tokens strm), IsString (Tokens strm),
 Ord err, Token strm ~ Char) =>
HeadedParsec err strm MathOp
mathOp

lexicalExprBinOp :: HeadedParsec e s Text
lexicalExprBinOp = [HeadedParsec e s Text] -> HeadedParsec e s Text
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum ([HeadedParsec e s Text] -> HeadedParsec e s Text)
-> [HeadedParsec e s Text] -> HeadedParsec e s Text
forall a b. (a -> b) -> a -> b
$ (Text -> HeadedParsec e s Text)
-> [Text] -> [HeadedParsec e s Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase ([Text] -> [HeadedParsec e s Text])
-> [Text] -> [HeadedParsec e s Text]
forall a b. (a -> b) -> a -> b
$ [Text
"and", Text
"or", Text
"is distinct from", Text
"is not distinct from"]

qualOp :: HeadedParsec Void Text QualOp
qualOp =
  [HeadedParsec Void Text QualOp] -> HeadedParsec Void Text QualOp
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Text -> QualOp
OpQualOp (Text -> QualOp) -> Parser Text -> HeadedParsec Void Text QualOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text
forall err strm.
(Ord err, Stream strm, Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm Text
op,
      AnyOperator -> QualOp
OperatorQualOp (AnyOperator -> QualOp)
-> HeadedParsec Void Text AnyOperator
-> HeadedParsec Void Text QualOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text
-> HeadedParsec Void Text AnyOperator
-> HeadedParsec Void Text AnyOperator
forall clause content.
Parser clause -> Parser content -> Parser content
inParensWithClause (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"operator") HeadedParsec Void Text AnyOperator
anyOperator
    ]

qualAllOp :: HeadedParsec Void Text QualAllOp
qualAllOp =
  [HeadedParsec Void Text QualAllOp]
-> HeadedParsec Void Text QualAllOp
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ AnyOperator -> QualAllOp
AnyQualAllOp (AnyOperator -> QualAllOp)
-> HeadedParsec Void Text AnyOperator
-> HeadedParsec Void Text QualAllOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"operator" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text AnyOperator
-> HeadedParsec Void Text AnyOperator
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AnyOperator
-> HeadedParsec Void Text AnyOperator
forall a. Parser a -> Parser a
inParens (Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text AnyOperator
-> HeadedParsec Void Text AnyOperator
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AnyOperator
anyOperator)),
      AllOp -> QualAllOp
AllQualAllOp (AllOp -> QualAllOp)
-> HeadedParsec Void Text AllOp -> HeadedParsec Void Text QualAllOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text AllOp
forall err strm.
(Ord err, Stream strm, FoldCase (Tokens strm),
 IsString (Tokens strm), Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm AllOp
allOp
    ]

op :: HeadedParsec err strm Text
op = do
  Text
a <- Maybe String
-> (Token strm -> Bool) -> HeadedParsec err strm (Tokens strm)
forall err strm.
(Ord err, Stream strm) =>
Maybe String
-> (Token strm -> Bool) -> HeadedParsec err strm (Tokens strm)
takeWhile1P Maybe String
forall a. Maybe a
Nothing Char -> Bool
Token strm -> Bool
Predicate.opChar
  case Text -> Maybe Text
Validation.op Text
a of
    Maybe Text
Nothing -> Text -> HeadedParsec err strm Text
forall (m :: * -> *) a. Monad m => a -> m a
return Text
a
    Just Text
err -> String -> HeadedParsec err strm Text
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (Text -> String
Text.unpack Text
err)

anyOperator :: HeadedParsec Void Text AnyOperator
anyOperator =
  [HeadedParsec Void Text AnyOperator]
-> HeadedParsec Void Text AnyOperator
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ AllOp -> AnyOperator
AllOpAnyOperator (AllOp -> AnyOperator)
-> HeadedParsec Void Text AllOp
-> HeadedParsec Void Text AnyOperator
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text AllOp
forall err strm.
(Ord err, Stream strm, FoldCase (Tokens strm),
 IsString (Tokens strm), Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm AllOp
allOp,
      Ident -> AnyOperator -> AnyOperator
QualifiedAnyOperator (Ident -> AnyOperator -> AnyOperator)
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text (AnyOperator -> AnyOperator)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Ident
colId HeadedParsec Void Text (AnyOperator -> AnyOperator)
-> HeadedParsec Void Text AnyOperator
-> HeadedParsec Void Text AnyOperator
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Char -> HeadedParsec Void Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'.' HeadedParsec Void Text Char -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text AnyOperator
-> HeadedParsec Void Text AnyOperator
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AnyOperator
anyOperator)
    ]

allOp :: HeadedParsec err strm AllOp
allOp =
  [HeadedParsec err strm AllOp] -> HeadedParsec err strm AllOp
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Text -> AllOp
OpAllOp (Text -> AllOp)
-> HeadedParsec err strm Text -> HeadedParsec err strm AllOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec err strm Text
forall err strm.
(Ord err, Stream strm, Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm Text
op,
      MathOp -> AllOp
MathAllOp (MathOp -> AllOp)
-> HeadedParsec err strm MathOp -> HeadedParsec err strm AllOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec err strm MathOp
forall strm err.
(Stream strm, FoldCase (Tokens strm), IsString (Tokens strm),
 Ord err, Token strm ~ Char) =>
HeadedParsec err strm MathOp
mathOp
    ]

mathOp :: HeadedParsec err strm MathOp
mathOp =
  [HeadedParsec err strm MathOp] -> HeadedParsec err strm MathOp
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ MathOp
ArrowLeftArrowRightMathOp MathOp
-> HeadedParsec err strm (Tokens strm)
-> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens strm -> HeadedParsec err strm (Tokens strm)
forall err strm.
(Ord err, Stream strm, FoldCase (Tokens strm)) =>
Tokens strm -> HeadedParsec err strm (Tokens strm)
string' Tokens strm
"<>",
      MathOp
GreaterEqualsMathOp MathOp
-> HeadedParsec err strm (Tokens strm)
-> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens strm -> HeadedParsec err strm (Tokens strm)
forall err strm.
(Ord err, Stream strm, FoldCase (Tokens strm)) =>
Tokens strm -> HeadedParsec err strm (Tokens strm)
string' Tokens strm
">=",
      MathOp
ExclamationEqualsMathOp MathOp
-> HeadedParsec err strm (Tokens strm)
-> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens strm -> HeadedParsec err strm (Tokens strm)
forall err strm.
(Ord err, Stream strm, FoldCase (Tokens strm)) =>
Tokens strm -> HeadedParsec err strm (Tokens strm)
string' Tokens strm
"!=",
      MathOp
LessEqualsMathOp MathOp
-> HeadedParsec err strm (Tokens strm)
-> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Tokens strm -> HeadedParsec err strm (Tokens strm)
forall err strm.
(Ord err, Stream strm, FoldCase (Tokens strm)) =>
Tokens strm -> HeadedParsec err strm (Tokens strm)
string' Tokens strm
"<=",
      MathOp
PlusMathOp MathOp
-> HeadedParsec err strm Char -> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'+',
      MathOp
MinusMathOp MathOp
-> HeadedParsec err strm Char -> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'-',
      MathOp
AsteriskMathOp MathOp
-> HeadedParsec err strm Char -> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'*',
      MathOp
SlashMathOp MathOp
-> HeadedParsec err strm Char -> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'/',
      MathOp
PercentMathOp MathOp
-> HeadedParsec err strm Char -> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'%',
      MathOp
ArrowUpMathOp MathOp
-> HeadedParsec err strm Char -> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'^',
      MathOp
ArrowLeftMathOp MathOp
-> HeadedParsec err strm Char -> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'<',
      MathOp
ArrowRightMathOp MathOp
-> HeadedParsec err strm Char -> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'>',
      MathOp
EqualsMathOp MathOp
-> HeadedParsec err strm Char -> HeadedParsec err strm MathOp
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'='
    ]

-- * Constants

-- |
-- >>> testParser aexprConst "32948023849023"
-- IAexprConst 32948023849023
--
-- >>> testParser aexprConst "'abc''de'"
-- SAexprConst "abc'de"
--
-- >>> testParser aexprConst "23.43234"
-- FAexprConst 23.43234
--
-- >>> testParser aexprConst "32423423.324324872"
-- FAexprConst 3.2423423324324872e7
--
-- >>> testParser aexprConst "NULL"
-- NullAexprConst
--
-- ==== References
-- @
-- AexprConst: Iconst
--       | FCONST
--       | Sconst
--       | BCONST
--       | XCONST
--       | func_name Sconst
--       | func_name '(' func_arg_list opt_sort_clause ')' Sconst
--       | ConstTypename Sconst
--       | ConstInterval Sconst opt_interval
--       | ConstInterval '(' Iconst ')' Sconst
--       | TRUE_P
--       | FALSE_P
--       | NULL_P
-- @
aexprConst :: HeadedParsec Void Text AexprConst
aexprConst =
  [HeadedParsec Void Text AexprConst]
-> HeadedParsec Void Text AexprConst
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"interval"
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        AexprConst
a <-
          [HeadedParsec Void Text AexprConst]
-> HeadedParsec Void Text AexprConst
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
            [ do
                Text
a <- Parser Text
sconst
                Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
                Maybe Interval
b <- HeadedParsec Void Text Interval
-> HeadedParsec Void Text (Maybe Interval)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text Interval
-> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Interval
interval)
                return (Text -> Maybe Interval -> AexprConst
StringIntervalAexprConst Text
a Maybe Interval
b),
              do
                Int64
a <- Parser Int64 -> Parser Int64
forall a. Parser a -> Parser a
inParens Parser Int64
forall strm decimal err.
(Stream strm, Integral decimal, Ord err, Token strm ~ Char) =>
HeadedParsec err strm decimal
iconst
                Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
                Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
                Text
b <- Parser Text
sconst
                return (Int64 -> Text -> AexprConst
IntIntervalAexprConst Int64
a Text
b)
            ]
        return AexprConst
a,
      do
        ConstTypename
a <- HeadedParsec Void Text ConstTypename
constTypename
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Text
b <- Parser Text
sconst
        return (ConstTypename -> Text -> AexprConst
ConstTypenameAexprConst ConstTypename
a Text
b),
      Bool -> AexprConst
BoolAexprConst Bool
True AexprConst -> Parser Text -> HeadedParsec Void Text AexprConst
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"true",
      Bool -> AexprConst
BoolAexprConst Bool
False AexprConst -> Parser Text -> HeadedParsec Void Text AexprConst
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"false",
      AexprConst
NullAexprConst AexprConst -> Parser Text -> HeadedParsec Void Text AexprConst
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"null" HeadedParsec Void Text AexprConst
-> Parser () -> HeadedParsec Void Text AexprConst
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parsec Void Text () -> Parser ()
forall err strm a.
(Ord err, Stream strm) =>
Parsec err strm a -> HeadedParsec err strm a
parse (ParsecT Void Text Identity Char -> Parsec Void Text ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
Megaparsec.notFollowedBy ParsecT Void Text Identity Char
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m (Token s)
MegaparsecChar.alphaNumChar),
      (Int64 -> AexprConst)
-> (Fconst -> AexprConst) -> Either Int64 Fconst -> AexprConst
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Int64 -> AexprConst
IAexprConst Fconst -> AexprConst
FAexprConst (Either Int64 Fconst -> AexprConst)
-> HeadedParsec Void Text (Either Int64 Fconst)
-> HeadedParsec Void Text AexprConst
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (Either Int64 Fconst)
forall strm b a err.
(Stream strm, RealFloat b, Integral a, Ord err,
 Token strm ~ Char) =>
HeadedParsec err strm (Either a b)
iconstOrFconst,
      Text -> AexprConst
SAexprConst (Text -> AexprConst)
-> Parser Text -> HeadedParsec Void Text AexprConst
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text
sconst,
      String
-> HeadedParsec Void Text AexprConst
-> HeadedParsec Void Text AexprConst
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"bit literal" (HeadedParsec Void Text AexprConst
 -> HeadedParsec Void Text AexprConst)
-> HeadedParsec Void Text AexprConst
-> HeadedParsec Void Text AexprConst
forall a b. (a -> b) -> a -> b
$ do
        Tokens Text -> HeadedParsec Void Text (Tokens Text)
forall err strm.
(Ord err, Stream strm, FoldCase (Tokens strm)) =>
Tokens strm -> HeadedParsec err strm (Tokens strm)
string' Tokens Text
"b'"
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Text
a <- Maybe String
-> (Token Text -> Bool) -> HeadedParsec Void Text (Tokens Text)
forall err strm.
(Ord err, Stream strm) =>
Maybe String
-> (Token strm -> Bool) -> HeadedParsec err strm (Tokens strm)
takeWhile1P (String -> Maybe String
forall a. a -> Maybe a
Just String
"0 or 1") (\Token Text
b -> Char
Token Text
b Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'0' Bool -> Bool -> Bool
|| Char
Token Text
b Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'1')
        Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'\''
        return (Text -> AexprConst
BAexprConst Text
a),
      String
-> HeadedParsec Void Text AexprConst
-> HeadedParsec Void Text AexprConst
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"hex literal" (HeadedParsec Void Text AexprConst
 -> HeadedParsec Void Text AexprConst)
-> HeadedParsec Void Text AexprConst
-> HeadedParsec Void Text AexprConst
forall a b. (a -> b) -> a -> b
$ do
        Tokens Text -> HeadedParsec Void Text (Tokens Text)
forall err strm.
(Ord err, Stream strm, FoldCase (Tokens strm)) =>
Tokens strm -> HeadedParsec err strm (Tokens strm)
string' Tokens Text
"x'"
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Text
a <- Maybe String
-> (Token Text -> Bool) -> HeadedParsec Void Text (Tokens Text)
forall err strm.
(Ord err, Stream strm) =>
Maybe String
-> (Token strm -> Bool) -> HeadedParsec err strm (Tokens strm)
takeWhile1P (String -> Maybe String
forall a. a -> Maybe a
Just String
"Hex digit") Char -> Bool
Token Text -> Bool
Predicate.hexDigit
        Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'\''
        return (Text -> AexprConst
XAexprConst Text
a),
      HeadedParsec Void Text AexprConst
-> HeadedParsec Void Text AexprConst
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead (HeadedParsec Void Text AexprConst
 -> HeadedParsec Void Text AexprConst)
-> HeadedParsec Void Text AexprConst
-> HeadedParsec Void Text AexprConst
forall a b. (a -> b) -> a -> b
$ do
        FuncName
a <- Parser FuncName
funcName
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'('
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        NonEmpty FuncArgExpr
b <- Parser ()
-> HeadedParsec Void Text FuncArgExpr
-> HeadedParsec Void Text (NonEmpty FuncArgExpr)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text FuncArgExpr
funcArgExpr
        Maybe SortClause
c <- HeadedParsec Void Text SortClause
-> HeadedParsec Void Text (Maybe SortClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text SortClause
-> HeadedParsec Void Text SortClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text SortClause
sortClause)
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
')'
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
        Text
d <- Parser Text
sconst
        return (FuncName -> Maybe FuncConstArgs -> Text -> AexprConst
FuncAexprConst FuncName
a (FuncConstArgs -> Maybe FuncConstArgs
forall a. a -> Maybe a
Just (NonEmpty FuncArgExpr -> Maybe SortClause -> FuncConstArgs
FuncConstArgs NonEmpty FuncArgExpr
b Maybe SortClause
c)) Text
d),
      FuncName -> Maybe FuncConstArgs -> Text -> AexprConst
FuncAexprConst (FuncName -> Maybe FuncConstArgs -> Text -> AexprConst)
-> Parser FuncName
-> HeadedParsec
     Void Text (Maybe FuncConstArgs -> Text -> AexprConst)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser FuncName -> Parser FuncName
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead Parser FuncName
funcName Parser FuncName -> Parser () -> Parser FuncName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1) HeadedParsec Void Text (Maybe FuncConstArgs -> Text -> AexprConst)
-> HeadedParsec Void Text (Maybe FuncConstArgs)
-> HeadedParsec Void Text (Text -> AexprConst)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe FuncConstArgs -> HeadedParsec Void Text (Maybe FuncConstArgs)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe FuncConstArgs
forall a. Maybe a
Nothing HeadedParsec Void Text (Text -> AexprConst)
-> Parser Text -> HeadedParsec Void Text AexprConst
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text
sconst
    ]

iconstOrFconst :: HeadedParsec err strm (Either a b)
iconstOrFconst = b -> Either a b
forall a b. b -> Either a b
Right (b -> Either a b)
-> HeadedParsec err strm b -> HeadedParsec err strm (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec err strm b
forall strm float err.
(Stream strm, RealFloat float, Ord err, Token strm ~ Char) =>
HeadedParsec err strm float
fconst HeadedParsec err strm (Either a b)
-> HeadedParsec err strm (Either a b)
-> HeadedParsec err strm (Either a b)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> a -> Either a b
forall a b. a -> Either a b
Left (a -> Either a b)
-> HeadedParsec err strm a -> HeadedParsec err strm (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec err strm a
forall strm decimal err.
(Stream strm, Integral decimal, Ord err, Token strm ~ Char) =>
HeadedParsec err strm decimal
iconst

iconst :: HeadedParsec err strm decimal
iconst = HeadedParsec err strm decimal
forall err strm decimal.
(Ord err, Stream strm, Token strm ~ Char, Integral decimal) =>
HeadedParsec err strm decimal
decimal

fconst :: HeadedParsec err strm float
fconst = HeadedParsec err strm float
forall err strm float.
(Ord err, Stream strm, Token strm ~ Char, RealFloat float) =>
HeadedParsec err strm float
float

sconst :: Parser Text
sconst = Char -> Parser Text
quotedString Char
'\''

constTypename :: HeadedParsec Void Text ConstTypename
constTypename =
  [HeadedParsec Void Text ConstTypename]
-> HeadedParsec Void Text ConstTypename
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Numeric -> ConstTypename
NumericConstTypename (Numeric -> ConstTypename)
-> HeadedParsec Void Text Numeric
-> HeadedParsec Void Text ConstTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Numeric
numeric,
      ConstBit -> ConstTypename
ConstBitConstTypename (ConstBit -> ConstTypename)
-> HeadedParsec Void Text ConstBit
-> HeadedParsec Void Text ConstTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ConstBit
constBit,
      ConstCharacter -> ConstTypename
ConstCharacterConstTypename (ConstCharacter -> ConstTypename)
-> HeadedParsec Void Text ConstCharacter
-> HeadedParsec Void Text ConstTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ConstCharacter
constCharacter,
      ConstDatetime -> ConstTypename
ConstDatetimeConstTypename (ConstDatetime -> ConstTypename)
-> HeadedParsec Void Text ConstDatetime
-> HeadedParsec Void Text ConstTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ConstDatetime
constDatetime
    ]

numeric :: HeadedParsec Void Text Numeric
numeric =
  [HeadedParsec Void Text Numeric] -> HeadedParsec Void Text Numeric
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Numeric
IntegerNumeric Numeric -> Parser Text -> HeadedParsec Void Text Numeric
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"integer",
      Numeric
IntNumeric Numeric -> Parser Text -> HeadedParsec Void Text Numeric
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"int",
      Numeric
SmallintNumeric Numeric -> Parser Text -> HeadedParsec Void Text Numeric
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"smallint",
      Numeric
BigintNumeric Numeric -> Parser Text -> HeadedParsec Void Text Numeric
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"bigint",
      Numeric
RealNumeric Numeric -> Parser Text -> HeadedParsec Void Text Numeric
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"real",
      Maybe Int64 -> Numeric
FloatNumeric (Maybe Int64 -> Numeric)
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text Numeric
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"float" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text (Maybe Int64)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int64 -> HeadedParsec Void Text (Maybe Int64)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> Parser Int64 -> Parser Int64
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int64 -> Parser Int64
forall a. Parser a -> Parser a
inParens Parser Int64
forall strm decimal err.
(Stream strm, Integral decimal, Ord err, Token strm ~ Char) =>
HeadedParsec err strm decimal
iconst)),
      Numeric
DoublePrecisionNumeric Numeric -> Parser Text -> HeadedParsec Void Text Numeric
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"double precision",
      Maybe (NonEmpty WhereClause) -> Numeric
DecimalNumeric (Maybe (NonEmpty WhereClause) -> Numeric)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
-> HeadedParsec Void Text Numeric
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"decimal" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
exprListInParens)),
      Maybe (NonEmpty WhereClause) -> Numeric
DecNumeric (Maybe (NonEmpty WhereClause) -> Numeric)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
-> HeadedParsec Void Text Numeric
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"dec" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
exprListInParens)),
      Maybe (NonEmpty WhereClause) -> Numeric
NumericNumeric (Maybe (NonEmpty WhereClause) -> Numeric)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
-> HeadedParsec Void Text Numeric
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"numeric" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
exprListInParens)),
      Numeric
BooleanNumeric Numeric -> Parser Text -> HeadedParsec Void Text Numeric
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"boolean"
    ]

bit :: HeadedParsec Void Text ConstBit
bit = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"bit"
  Bool
a <- Bool -> Parser Bool -> Parser Bool
forall (m :: * -> *) a. Alternative m => a -> m a -> m a
option Bool
False (Bool
True Bool -> Parser () -> Parser Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser Bool -> Parser Text -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"varying")
  Maybe (NonEmpty WhereClause)
b <- HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
exprListInParens)
  return (Bool -> Maybe (NonEmpty WhereClause) -> ConstBit
Bit Bool
a Maybe (NonEmpty WhereClause)
b)

constBit :: HeadedParsec Void Text ConstBit
constBit = HeadedParsec Void Text ConstBit
bit

constCharacter :: HeadedParsec Void Text ConstCharacter
constCharacter = Character -> Maybe Int64 -> ConstCharacter
ConstCharacter (Character -> Maybe Int64 -> ConstCharacter)
-> HeadedParsec Void Text Character
-> HeadedParsec Void Text (Maybe Int64 -> ConstCharacter)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (HeadedParsec Void Text Character
forall e s.
(Ord e, Stream s, FoldCase (Tokens s), Tokens s ~ Text,
 Token s ~ Char) =>
HeadedParsec e s Character
character HeadedParsec Void Text Character
-> Parser () -> HeadedParsec Void Text Character
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead) HeadedParsec Void Text (Maybe Int64 -> ConstCharacter)
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text ConstCharacter
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Int64 -> HeadedParsec Void Text (Maybe Int64)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> Parser Int64 -> Parser Int64
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int64 -> Parser Int64
forall a. Parser a -> Parser a
inParens Parser Int64
forall strm decimal err.
(Stream strm, Integral decimal, Ord err, Token strm ~ Char) =>
HeadedParsec err strm decimal
iconst)

character :: HeadedParsec e s Character
character =
  [HeadedParsec e s Character] -> HeadedParsec e s Character
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Bool -> Character
CharacterCharacter (Bool -> Character)
-> HeadedParsec e s Bool -> HeadedParsec e s Character
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"character" HeadedParsec e s Text
-> HeadedParsec e s Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec e s Bool
forall err strm.
(Ord err, Stream strm, Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm Bool
optVaryingAfterSpace),
      Bool -> Character
CharCharacter (Bool -> Character)
-> HeadedParsec e s Bool -> HeadedParsec e s Character
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"char" HeadedParsec e s Text
-> HeadedParsec e s Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec e s Bool
forall err strm.
(Ord err, Stream strm, Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm Bool
optVaryingAfterSpace),
      Character
VarcharCharacter Character -> HeadedParsec e s Text -> HeadedParsec e s Character
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"varchar",
      Bool -> Character
NationalCharacterCharacter (Bool -> Character)
-> HeadedParsec e s Bool -> HeadedParsec e s Character
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"national character" HeadedParsec e s Text
-> HeadedParsec e s Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec e s Bool
forall err strm.
(Ord err, Stream strm, Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm Bool
optVaryingAfterSpace),
      Bool -> Character
NationalCharCharacter (Bool -> Character)
-> HeadedParsec e s Bool -> HeadedParsec e s Character
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"national char" HeadedParsec e s Text
-> HeadedParsec e s Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec e s Bool
forall err strm.
(Ord err, Stream strm, Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm Bool
optVaryingAfterSpace),
      Bool -> Character
NcharCharacter (Bool -> Character)
-> HeadedParsec e s Bool -> HeadedParsec e s Character
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"nchar" HeadedParsec e s Text
-> HeadedParsec e s Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec e s Bool
forall err strm.
(Ord err, Stream strm, Token strm ~ Char, Tokens strm ~ Text) =>
HeadedParsec err strm Bool
optVaryingAfterSpace)
    ]
  where
    optVaryingAfterSpace :: HeadedParsec err strm Bool
optVaryingAfterSpace = Bool
True Bool -> HeadedParsec err strm () -> HeadedParsec err strm Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ HeadedParsec err strm ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 HeadedParsec err strm Bool
-> HeadedParsec err strm Text -> HeadedParsec err strm Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Text -> HeadedParsec err strm Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"varying" HeadedParsec err strm Bool
-> HeadedParsec err strm Bool -> HeadedParsec err strm Bool
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool -> HeadedParsec err strm Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False

-- |
-- ==== References
-- @
-- ConstDatetime:
--   | TIMESTAMP '(' Iconst ')' opt_timezone
--   | TIMESTAMP opt_timezone
--   | TIME '(' Iconst ')' opt_timezone
--   | TIME opt_timezone
-- @
constDatetime :: HeadedParsec Void Text ConstDatetime
constDatetime =
  [HeadedParsec Void Text ConstDatetime]
-> HeadedParsec Void Text ConstDatetime
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"timestamp"
        Maybe Int64
a <- Parser Int64 -> HeadedParsec Void Text (Maybe Int64)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Int64 -> Parser Int64
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int64 -> Parser Int64
forall a. Parser a -> Parser a
inParens Parser Int64
forall strm decimal err.
(Stream strm, Integral decimal, Ord err, Token strm ~ Char) =>
HeadedParsec err strm decimal
iconst)
        Maybe Bool
b <- Parser Bool -> HeadedParsec Void Text (Maybe Bool)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Bool -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Bool
forall e s.
(Ord e, Stream s, FoldCase (Tokens s), Tokens s ~ Text,
 Token s ~ Char) =>
HeadedParsec e s Bool
timezone)
        return (Maybe Int64 -> Maybe Bool -> ConstDatetime
TimestampConstDatetime Maybe Int64
a Maybe Bool
b),
      do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"time"
        Maybe Int64
a <- Parser Int64 -> HeadedParsec Void Text (Maybe Int64)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Int64 -> Parser Int64
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int64 -> Parser Int64
forall a. Parser a -> Parser a
inParens Parser Int64
forall strm decimal err.
(Stream strm, Integral decimal, Ord err, Token strm ~ Char) =>
HeadedParsec err strm decimal
iconst)
        Maybe Bool
b <- Parser Bool -> HeadedParsec Void Text (Maybe Bool)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Bool -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Bool
forall e s.
(Ord e, Stream s, FoldCase (Tokens s), Tokens s ~ Text,
 Token s ~ Char) =>
HeadedParsec e s Bool
timezone)
        return (Maybe Int64 -> Maybe Bool -> ConstDatetime
TimeConstDatetime Maybe Int64
a Maybe Bool
b)
    ]

timezone :: HeadedParsec e s Bool
timezone =
  [HeadedParsec e s Bool] -> HeadedParsec e s Bool
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Bool
False Bool -> HeadedParsec e s Text -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"with time zone",
      Bool
True Bool -> HeadedParsec e s Text -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"without time zone"
    ]

interval :: HeadedParsec Void Text Interval
interval =
  [HeadedParsec Void Text Interval]
-> HeadedParsec Void Text Interval
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Interval
YearToMonthInterval Interval -> Parser Text -> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"year to month",
      Interval
DayToHourInterval Interval -> Parser Text -> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"day to hour",
      Interval
DayToMinuteInterval Interval -> Parser Text -> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"day to minute",
      Maybe Int64 -> Interval
DayToSecondInterval (Maybe Int64 -> Interval)
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"day to" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text (Maybe Int64)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (Maybe Int64)
forall a. Integral a => HeadedParsec Void Text (Maybe a)
intervalSecond),
      Interval
HourToMinuteInterval Interval -> Parser Text -> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"hour to minute",
      Maybe Int64 -> Interval
HourToSecondInterval (Maybe Int64 -> Interval)
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"hour to" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text (Maybe Int64)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (Maybe Int64)
forall a. Integral a => HeadedParsec Void Text (Maybe a)
intervalSecond),
      Maybe Int64 -> Interval
MinuteToSecondInterval (Maybe Int64 -> Interval)
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"minute to" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text (Maybe Int64)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (Maybe Int64)
forall a. Integral a => HeadedParsec Void Text (Maybe a)
intervalSecond),
      Interval
YearInterval Interval -> Parser Text -> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"year",
      Interval
MonthInterval Interval -> Parser Text -> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"month",
      Interval
DayInterval Interval -> Parser Text -> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"day",
      Interval
HourInterval Interval -> Parser Text -> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"hour",
      Interval
MinuteInterval Interval -> Parser Text -> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"minute",
      Maybe Int64 -> Interval
SecondInterval (Maybe Int64 -> Interval)
-> HeadedParsec Void Text (Maybe Int64)
-> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text (Maybe Int64)
forall a. Integral a => HeadedParsec Void Text (Maybe a)
intervalSecond
    ]

intervalSecond :: HeadedParsec Void Text (Maybe a)
intervalSecond = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"second"
  Maybe a
a <- HeadedParsec Void Text a -> HeadedParsec Void Text (Maybe a)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> HeadedParsec Void Text a -> HeadedParsec Void Text a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text a -> HeadedParsec Void Text a
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text a
forall strm decimal err.
(Stream strm, Integral decimal, Ord err, Token strm ~ Char) =>
HeadedParsec err strm decimal
iconst)
  return Maybe a
a

-- * Clauses

-- |
-- ==== References
-- @
-- select_limit:
--   | limit_clause offset_clause
--   | offset_clause limit_clause
--   | limit_clause
--   | offset_clause
-- @
selectLimit :: HeadedParsec Void Text SelectLimit
selectLimit =
  [HeadedParsec Void Text SelectLimit]
-> HeadedParsec Void Text SelectLimit
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        LimitClause
_a <- HeadedParsec Void Text LimitClause
limitClause
        LimitClause -> OffsetClause -> SelectLimit
LimitOffsetSelectLimit LimitClause
_a (OffsetClause -> SelectLimit)
-> HeadedParsec Void Text OffsetClause
-> HeadedParsec Void Text SelectLimit
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text OffsetClause
-> HeadedParsec Void Text OffsetClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text OffsetClause
offsetClause) HeadedParsec Void Text SelectLimit
-> HeadedParsec Void Text SelectLimit
-> HeadedParsec Void Text SelectLimit
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> SelectLimit -> HeadedParsec Void Text SelectLimit
forall (f :: * -> *) a. Applicative f => a -> f a
pure (LimitClause -> SelectLimit
LimitSelectLimit LimitClause
_a),
      do
        OffsetClause
_a <- HeadedParsec Void Text OffsetClause
offsetClause
        OffsetClause -> LimitClause -> SelectLimit
OffsetLimitSelectLimit OffsetClause
_a (LimitClause -> SelectLimit)
-> HeadedParsec Void Text LimitClause
-> HeadedParsec Void Text SelectLimit
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text LimitClause
-> HeadedParsec Void Text LimitClause
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text LimitClause
limitClause) HeadedParsec Void Text SelectLimit
-> HeadedParsec Void Text SelectLimit
-> HeadedParsec Void Text SelectLimit
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> SelectLimit -> HeadedParsec Void Text SelectLimit
forall (f :: * -> *) a. Applicative f => a -> f a
pure (OffsetClause -> SelectLimit
OffsetSelectLimit OffsetClause
_a)
    ]

-- |
-- ==== References
-- @
-- limit_clause:
--   | LIMIT select_limit_value
--   | LIMIT select_limit_value ',' select_offset_value
--   | FETCH first_or_next select_fetch_first_value row_or_rows ONLY
--   | FETCH first_or_next row_or_rows ONLY
-- @
limitClause :: HeadedParsec Void Text LimitClause
limitClause =
  ( do
      Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"limit"
      Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
      Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
      SelectLimitValue
_a <- HeadedParsec Void Text SelectLimitValue
selectLimitValue
      Maybe WhereClause
_b <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text WhereClause
 -> HeadedParsec Void Text (Maybe WhereClause))
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall a b. (a -> b) -> a -> b
$ do
        Parser ()
commaSeparator
        HeadedParsec Void Text WhereClause
aExpr
      return (SelectLimitValue -> Maybe WhereClause -> LimitClause
LimitLimitClause SelectLimitValue
_a Maybe WhereClause
_b)
  )
    HeadedParsec Void Text LimitClause
-> HeadedParsec Void Text LimitClause
-> HeadedParsec Void Text LimitClause
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ( do
            Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"fetch"
            Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            Bool
_a <- Parser Bool
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s Bool
firstOrNext
            Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
            [HeadedParsec Void Text LimitClause]
-> HeadedParsec Void Text LimitClause
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
              [ do
                  Bool
_b <- Parser Bool
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s Bool
rowOrRows
                  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
                  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"only"
                  return (Bool -> Maybe SelectFetchFirstValue -> Bool -> LimitClause
FetchOnlyLimitClause Bool
_a Maybe SelectFetchFirstValue
forall a. Maybe a
Nothing Bool
_b),
                do
                  SelectFetchFirstValue
_b <- HeadedParsec Void Text SelectFetchFirstValue
selectFetchFirstValue
                  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
                  Bool
_c <- Parser Bool
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s Bool
rowOrRows
                  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
                  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"only"
                  return (Bool -> Maybe SelectFetchFirstValue -> Bool -> LimitClause
FetchOnlyLimitClause Bool
_a (SelectFetchFirstValue -> Maybe SelectFetchFirstValue
forall a. a -> Maybe a
Just SelectFetchFirstValue
_b) Bool
_c)
              ]
        )

offsetClause :: HeadedParsec Void Text OffsetClause
offsetClause = do
  Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"offset"
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
  HeadedParsec Void Text OffsetClause
offsetClauseParams

offsetClauseParams :: HeadedParsec Void Text OffsetClause
offsetClauseParams =
  SelectFetchFirstValue -> Bool -> OffsetClause
FetchFirstOffsetClause (SelectFetchFirstValue -> Bool -> OffsetClause)
-> HeadedParsec Void Text SelectFetchFirstValue
-> HeadedParsec Void Text (Bool -> OffsetClause)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text SelectFetchFirstValue
-> HeadedParsec Void Text SelectFetchFirstValue
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text SelectFetchFirstValue
selectFetchFirstValue HeadedParsec Void Text (Bool -> OffsetClause)
-> Parser Bool -> HeadedParsec Void Text OffsetClause
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Bool -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Bool
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s Bool
rowOrRows)
    HeadedParsec Void Text OffsetClause
-> HeadedParsec Void Text OffsetClause
-> HeadedParsec Void Text OffsetClause
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> WhereClause -> OffsetClause
ExprOffsetClause (WhereClause -> OffsetClause)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text OffsetClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
aExpr

-- |
-- ==== References
-- @
-- select_limit_value:
--   | a_expr
--   | ALL
-- @
selectLimitValue :: HeadedParsec Void Text SelectLimitValue
selectLimitValue =
  SelectLimitValue
AllSelectLimitValue SelectLimitValue
-> Parser Text -> HeadedParsec Void Text SelectLimitValue
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"all"
    HeadedParsec Void Text SelectLimitValue
-> HeadedParsec Void Text SelectLimitValue
-> HeadedParsec Void Text SelectLimitValue
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> WhereClause -> SelectLimitValue
ExprSelectLimitValue (WhereClause -> SelectLimitValue)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text SelectLimitValue
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
aExpr

rowOrRows :: HeadedParsec e s Bool
rowOrRows =
  Bool
True Bool -> HeadedParsec e s Text -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"rows"
    HeadedParsec e s Bool
-> HeadedParsec e s Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool
False Bool -> HeadedParsec e s Text -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"row"

firstOrNext :: HeadedParsec e s Bool
firstOrNext =
  Bool
False Bool -> HeadedParsec e s Text -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"first"
    HeadedParsec e s Bool
-> HeadedParsec e s Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool
True Bool -> HeadedParsec e s Text -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"next"

selectFetchFirstValue :: HeadedParsec Void Text SelectFetchFirstValue
selectFetchFirstValue =
  CExpr -> SelectFetchFirstValue
ExprSelectFetchFirstValue (CExpr -> SelectFetchFirstValue)
-> HeadedParsec Void Text CExpr
-> HeadedParsec Void Text SelectFetchFirstValue
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text CExpr
cExpr
    HeadedParsec Void Text SelectFetchFirstValue
-> HeadedParsec Void Text SelectFetchFirstValue
-> HeadedParsec Void Text SelectFetchFirstValue
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool -> Either Int64 Fconst -> SelectFetchFirstValue
NumSelectFetchFirstValue (Bool -> Either Int64 Fconst -> SelectFetchFirstValue)
-> Parser Bool
-> HeadedParsec
     Void Text (Either Int64 Fconst -> SelectFetchFirstValue)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser Bool
forall strm err.
(Stream strm, Ord err, Token strm ~ Char) =>
HeadedParsec err strm Bool
plusOrMinus Parser Bool -> Parser () -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser Bool -> Parser () -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space) HeadedParsec
  Void Text (Either Int64 Fconst -> SelectFetchFirstValue)
-> HeadedParsec Void Text (Either Int64 Fconst)
-> HeadedParsec Void Text SelectFetchFirstValue
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HeadedParsec Void Text (Either Int64 Fconst)
forall strm b a err.
(Stream strm, RealFloat b, Integral a, Ord err,
 Token strm ~ Char) =>
HeadedParsec err strm (Either a b)
iconstOrFconst

plusOrMinus :: HeadedParsec err strm Bool
plusOrMinus = Bool
False Bool -> HeadedParsec err strm Char -> HeadedParsec err strm Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'+' HeadedParsec err strm Bool
-> HeadedParsec err strm Bool -> HeadedParsec err strm Bool
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool
True Bool -> HeadedParsec err strm Char -> HeadedParsec err strm Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec err strm Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'-'

-- * For Locking

-- |
-- ==== References
-- @
-- for_locking_clause:
--   | for_locking_items
--   | FOR READ ONLY
-- for_locking_items:
--   | for_locking_item
--   | for_locking_items for_locking_item
-- @
forLockingClause :: HeadedParsec Void Text ForLockingClause
forLockingClause = HeadedParsec Void Text ForLockingClause
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
HeadedParsec e s ForLockingClause
readOnly HeadedParsec Void Text ForLockingClause
-> HeadedParsec Void Text ForLockingClause
-> HeadedParsec Void Text ForLockingClause
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HeadedParsec Void Text ForLockingClause
items
  where
    readOnly :: HeadedParsec e s ForLockingClause
readOnly = ForLockingClause
ReadOnlyForLockingClause ForLockingClause
-> HeadedParsec e s Text -> HeadedParsec e s ForLockingClause
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"for read only"
    items :: HeadedParsec Void Text ForLockingClause
items = NonEmpty ForLockingItem -> ForLockingClause
ItemsForLockingClause (NonEmpty ForLockingItem -> ForLockingClause)
-> HeadedParsec Void Text (NonEmpty ForLockingItem)
-> HeadedParsec Void Text ForLockingClause
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ()
-> HeadedParsec Void Text ForLockingItem
-> HeadedParsec Void Text (NonEmpty ForLockingItem)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 HeadedParsec Void Text ForLockingItem
forLockingItem

-- |
-- ==== References
-- @
-- for_locking_item:
--   | for_locking_strength locked_rels_list opt_nowait_or_skip
-- locked_rels_list:
--   | OF qualified_name_list
--   | EMPTY
-- opt_nowait_or_skip:
--   | NOWAIT
--   | SKIP LOCKED
--   | EMPTY
-- @
forLockingItem :: HeadedParsec Void Text ForLockingItem
forLockingItem = do
  ForLockingStrength
_strength <- HeadedParsec Void Text ForLockingStrength
forall e s.
(Ord e, Stream s, FoldCase (Tokens s), Tokens s ~ Text,
 Token s ~ Char) =>
HeadedParsec e s ForLockingStrength
forLockingStrength
  Maybe (NonEmpty QualifiedName)
_rels <- HeadedParsec Void Text (NonEmpty QualifiedName)
-> HeadedParsec Void Text (Maybe (NonEmpty QualifiedName))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (HeadedParsec Void Text (NonEmpty QualifiedName)
 -> HeadedParsec Void Text (Maybe (NonEmpty QualifiedName)))
-> HeadedParsec Void Text (NonEmpty QualifiedName)
-> HeadedParsec Void Text (Maybe (NonEmpty QualifiedName))
forall a b. (a -> b) -> a -> b
$ Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"of" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text (NonEmpty QualifiedName)
-> HeadedParsec Void Text (NonEmpty QualifiedName)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
-> HeadedParsec Void Text QualifiedName
-> HeadedParsec Void Text (NonEmpty QualifiedName)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text QualifiedName
qualifiedName
  Maybe Bool
_nowaitOrSkip <- Parser Bool -> HeadedParsec Void Text (Maybe Bool)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser Bool -> Parser Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Bool
forall e s.
(Ord e, Stream s, FoldCase (Tokens s), Tokens s ~ Text,
 Token s ~ Char) =>
HeadedParsec e s Bool
nowaitOrSkip)
  return (ForLockingStrength
-> Maybe (NonEmpty QualifiedName) -> Maybe Bool -> ForLockingItem
ForLockingItem ForLockingStrength
_strength Maybe (NonEmpty QualifiedName)
_rels Maybe Bool
_nowaitOrSkip)

-- |
-- ==== References
-- @
-- for_locking_strength:
--   | FOR UPDATE
--   | FOR NO KEY UPDATE
--   | FOR SHARE
--   | FOR KEY SHARE
-- @
forLockingStrength :: HeadedParsec e s ForLockingStrength
forLockingStrength =
  ForLockingStrength
UpdateForLockingStrength ForLockingStrength
-> HeadedParsec e s Text -> HeadedParsec e s ForLockingStrength
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"for update"
    HeadedParsec e s ForLockingStrength
-> HeadedParsec e s ForLockingStrength
-> HeadedParsec e s ForLockingStrength
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ForLockingStrength
NoKeyUpdateForLockingStrength ForLockingStrength
-> HeadedParsec e s Text -> HeadedParsec e s ForLockingStrength
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"for no key update"
    HeadedParsec e s ForLockingStrength
-> HeadedParsec e s ForLockingStrength
-> HeadedParsec e s ForLockingStrength
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ForLockingStrength
ShareForLockingStrength ForLockingStrength
-> HeadedParsec e s Text -> HeadedParsec e s ForLockingStrength
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"for share"
    HeadedParsec e s ForLockingStrength
-> HeadedParsec e s ForLockingStrength
-> HeadedParsec e s ForLockingStrength
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ForLockingStrength
KeyForLockingStrength ForLockingStrength
-> HeadedParsec e s Text -> HeadedParsec e s ForLockingStrength
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"for key share"

nowaitOrSkip :: HeadedParsec e s Bool
nowaitOrSkip = Bool
False Bool -> HeadedParsec e s Text -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"nowait" HeadedParsec e s Bool
-> HeadedParsec e s Bool -> HeadedParsec e s Bool
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool
True Bool -> HeadedParsec e s Text -> HeadedParsec e s Bool
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall s e.
(FoldCase (Tokens s), Ord e, Stream s, Tokens s ~ Text,
 Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyphrase Text
"skip locked"

-- * References & Names

quotedName :: HeadedParsec Void Text Ident
quotedName = (Text -> String) -> (Text -> Bool) -> Parser Text -> Parser Text
forall err strm a.
(Ord err, Stream strm) =>
(a -> String)
-> (a -> Bool)
-> HeadedParsec err strm a
-> HeadedParsec err strm a
filter (String -> Text -> String
forall a b. a -> b -> a
const String
"Empty name") (Bool -> Bool
not (Bool -> Bool) -> (Text -> Bool) -> Text -> Bool
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> Bool
Text.null) (Char -> Parser Text
quotedString Char
'"') Parser Text
-> (Parser Text -> HeadedParsec Void Text Ident)
-> HeadedParsec Void Text Ident
forall a b. a -> (a -> b) -> b
& (Text -> Ident) -> Parser Text -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> Ident
QuotedIdent

-- |
-- ==== References
-- @
-- ident_start   [A-Za-z\200-\377_]
-- ident_cont    [A-Za-z\200-\377_0-9\$]
-- identifier    {ident_start}{ident_cont}*
-- @
ident :: HeadedParsec Void Text Ident
ident = HeadedParsec Void Text Ident
quotedName HeadedParsec Void Text Ident
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Text -> Bool) -> HeadedParsec Void Text Ident
forall err strm.
(Ord err, Stream strm, Tokens strm ~ Text, Token strm ~ Char) =>
(Text -> Bool) -> HeadedParsec err strm Ident
keywordNameByPredicate (Bool -> Bool
not (Bool -> Bool) -> (Text -> Bool) -> Text -> Bool
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> Bool
Predicate.keyword)

-- |
-- ==== References
-- @
-- ColId:
--   |  IDENT
--   |  unreserved_keyword
--   |  col_name_keyword
-- @
{-# NOINLINE colId #-}
colId :: HeadedParsec Void Text Ident
colId =
  String
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"identifier" (HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident)
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall a b. (a -> b) -> a -> b
$
    HeadedParsec Void Text Ident
ident HeadedParsec Void Text Ident
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HashSet Text -> HeadedParsec Void Text Ident
forall err strm.
(Ord err, Stream strm, Tokens strm ~ Text, Token strm ~ Char) =>
HashSet Text -> HeadedParsec err strm Ident
keywordNameFromSet (HashSet Text
KeywordSet.unreservedKeyword HashSet Text -> HashSet Text -> HashSet Text
forall a. Semigroup a => a -> a -> a
<> HashSet Text
KeywordSet.colNameKeyword)

{-# NOINLINE filteredColId #-}
filteredColId :: t Text -> HeadedParsec Void Text Ident
filteredColId =
  let _originalSet :: HashSet Text
_originalSet = HashSet Text
KeywordSet.unreservedKeyword HashSet Text -> HashSet Text -> HashSet Text
forall a. Semigroup a => a -> a -> a
<> HashSet Text
KeywordSet.colNameKeyword
      _filteredSet :: t Text -> HashSet Text
_filteredSet = (Text -> HashSet Text -> HashSet Text)
-> HashSet Text -> t Text -> HashSet Text
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Text -> HashSet Text -> HashSet Text
forall a. (Eq a, Hashable a) => a -> HashSet a -> HashSet a
HashSet.delete HashSet Text
_originalSet
   in \t Text
_reservedKeywords -> String
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"identifier" (HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident)
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall a b. (a -> b) -> a -> b
$ HeadedParsec Void Text Ident
ident HeadedParsec Void Text Ident
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HashSet Text -> HeadedParsec Void Text Ident
forall err strm.
(Ord err, Stream strm, Tokens strm ~ Text, Token strm ~ Char) =>
HashSet Text -> HeadedParsec err strm Ident
keywordNameFromSet (t Text -> HashSet Text
forall (t :: * -> *). Foldable t => t Text -> HashSet Text
_filteredSet t Text
_reservedKeywords)

-- |
-- ==== References
-- @
-- ColLabel:
--   |  IDENT
--   |  unreserved_keyword
--   |  col_name_keyword
--   |  type_func_name_keyword
--   |  reserved_keyword
-- @
colLabel :: HeadedParsec Void Text Ident
colLabel =
  String
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall err strm a.
(Ord err, Stream strm) =>
String -> HeadedParsec err strm a -> HeadedParsec err strm a
label String
"column label" (HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident)
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall a b. (a -> b) -> a -> b
$
    HashSet Text -> HeadedParsec Void Text Ident
forall err strm.
(Ord err, Stream strm, Tokens strm ~ Text, Token strm ~ Char) =>
HashSet Text -> HeadedParsec err strm Ident
keywordNameFromSet HashSet Text
KeywordSet.keyword HeadedParsec Void Text Ident
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HeadedParsec Void Text Ident
ident

-- |
-- >>> testParser qualifiedName "a.b"
-- IndirectedQualifiedName (UnquotedIdent "a") (AttrNameIndirectionEl (UnquotedIdent "b") :| [])
--
-- >>> testParser qualifiedName "a.-"
-- ...
-- expecting '*', column label, or white space
--
-- ==== References
-- @
-- qualified_name:
--   | ColId
--   | ColId indirection
-- @
qualifiedName :: HeadedParsec Void Text QualifiedName
qualifiedName =
  Ident -> Indirection -> QualifiedName
IndirectedQualifiedName (Ident -> Indirection -> QualifiedName)
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text (Indirection -> QualifiedName)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text Ident
colId HeadedParsec Void Text (Indirection -> QualifiedName)
-> HeadedParsec Void Text Indirection
-> HeadedParsec Void Text QualifiedName
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Indirection
-> HeadedParsec Void Text Indirection
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Indirection
indirection)
    HeadedParsec Void Text QualifiedName
-> HeadedParsec Void Text QualifiedName
-> HeadedParsec Void Text QualifiedName
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Ident -> QualifiedName
SimpleQualifiedName (Ident -> QualifiedName)
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text QualifiedName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Ident
colId

columnref :: HeadedParsec Void Text Columnref
columnref = HeadedParsec Void Text Ident -> HeadedParsec Void Text Columnref
customizedColumnref HeadedParsec Void Text Ident
colId

filteredColumnref :: [Text] -> HeadedParsec Void Text Columnref
filteredColumnref [Text]
_keywords = HeadedParsec Void Text Ident -> HeadedParsec Void Text Columnref
customizedColumnref ([Text] -> HeadedParsec Void Text Ident
forall (t :: * -> *).
Foldable t =>
t Text -> HeadedParsec Void Text Ident
filteredColId [Text]
_keywords)

customizedColumnref :: HeadedParsec Void Text Ident -> HeadedParsec Void Text Columnref
customizedColumnref HeadedParsec Void Text Ident
colId = do
  Ident
a <- HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text Ident
colId
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe Indirection
b <- HeadedParsec Void Text Indirection
-> HeadedParsec Void Text (Maybe Indirection)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Indirection
-> HeadedParsec Void Text Indirection
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Indirection
indirection)
  return (Ident -> Maybe Indirection -> Columnref
Columnref Ident
a Maybe Indirection
b)

anyName :: HeadedParsec Void Text AnyName
anyName = HeadedParsec Void Text Ident -> HeadedParsec Void Text AnyName
customizedAnyName HeadedParsec Void Text Ident
colId

filteredAnyName :: t Text -> HeadedParsec Void Text AnyName
filteredAnyName t Text
_keywords = HeadedParsec Void Text Ident -> HeadedParsec Void Text AnyName
customizedAnyName (t Text -> HeadedParsec Void Text Ident
forall (t :: * -> *).
Foldable t =>
t Text -> HeadedParsec Void Text Ident
filteredColId t Text
_keywords)

customizedAnyName :: HeadedParsec Void Text Ident -> HeadedParsec Void Text AnyName
customizedAnyName HeadedParsec Void Text Ident
colId = do
  Ident
a <- HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text Ident
colId
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe (NonEmpty Ident)
b <- HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text (Maybe (NonEmpty Ident))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text (NonEmpty Ident)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty Ident)
attrs)
  return (Ident -> Maybe (NonEmpty Ident) -> AnyName
AnyName Ident
a Maybe (NonEmpty Ident)
b)

name :: HeadedParsec Void Text Ident
name = HeadedParsec Void Text Ident
colId

nameList :: HeadedParsec Void Text (NonEmpty Ident)
nameList = Parser ()
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text (NonEmpty Ident)
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text Ident
name

cursorName :: HeadedParsec Void Text Ident
cursorName = HeadedParsec Void Text Ident
name

-- |
-- ==== References
-- @
-- func_name:
--   | type_function_name
--   | ColId indirection
-- @
funcName :: Parser FuncName
funcName =
  Ident -> Indirection -> FuncName
IndirectedFuncName (Ident -> Indirection -> FuncName)
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text (Indirection -> FuncName)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall err strm a.
(Ord err, Stream strm) =>
HeadedParsec err strm a -> HeadedParsec err strm a
wrapToHead HeadedParsec Void Text Ident
colId HeadedParsec Void Text (Indirection -> FuncName)
-> HeadedParsec Void Text Indirection -> Parser FuncName
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Indirection
-> HeadedParsec Void Text Indirection
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Indirection
indirection)
    Parser FuncName -> Parser FuncName -> Parser FuncName
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Ident -> FuncName
TypeFuncName (Ident -> FuncName)
-> HeadedParsec Void Text Ident -> Parser FuncName
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Ident
typeFunctionName

-- |
-- ==== References
-- @
-- type_function_name:
--   | IDENT
--   | unreserved_keyword
--   | type_func_name_keyword
-- @
typeFunctionName :: HeadedParsec Void Text Ident
typeFunctionName =
  HashSet Text -> HeadedParsec Void Text Ident
forall err strm.
(Ord err, Stream strm, Tokens strm ~ Text, Token strm ~ Char) =>
HashSet Text -> HeadedParsec err strm Ident
keywordNameFromSet HashSet Text
KeywordSet.typeFunctionName
    HeadedParsec Void Text Ident
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> HeadedParsec Void Text Ident
ident

-- |
-- ==== References
-- @
-- indirection:
--   | indirection_el
--   | indirection indirection_el
-- @
indirection :: HeadedParsec Void Text Indirection
indirection = HeadedParsec Void Text IndirectionEl
-> HeadedParsec Void Text Indirection
forall (m :: * -> *) a. Alternative m => m a -> m (NonEmpty a)
some HeadedParsec Void Text IndirectionEl
indirectionEl

-- |
-- ==== References
-- @
-- indirection_el:
--   | '.' attr_name
--   | '.' '*'
--   | '[' a_expr ']'
--   | '[' opt_slice_bound ':' opt_slice_bound ']'
-- opt_slice_bound:
--   | a_expr
--   | EMPTY
-- @
indirectionEl :: HeadedParsec Void Text IndirectionEl
indirectionEl =
  [HeadedParsec Void Text IndirectionEl]
-> HeadedParsec Void Text IndirectionEl
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ do
        Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'.'
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        IndirectionEl
AllIndirectionEl IndirectionEl
-> HeadedParsec Void Text Char
-> HeadedParsec Void Text IndirectionEl
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'*' HeadedParsec Void Text IndirectionEl
-> HeadedParsec Void Text IndirectionEl
-> HeadedParsec Void Text IndirectionEl
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Ident -> IndirectionEl
AttrNameIndirectionEl (Ident -> IndirectionEl)
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text IndirectionEl
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Ident
attrName,
      do
        Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'['
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        IndirectionEl
_a <-
          [HeadedParsec Void Text IndirectionEl]
-> HeadedParsec Void Text IndirectionEl
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
            [ do
                Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
':'
                Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
                Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
                Maybe WhereClause
_b <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional HeadedParsec Void Text WhereClause
aExpr
                return (Maybe WhereClause -> Maybe WhereClause -> IndirectionEl
SliceIndirectionEl Maybe WhereClause
forall a. Maybe a
Nothing Maybe WhereClause
_b),
              do
                WhereClause
_a <- HeadedParsec Void Text WhereClause
aExpr
                [HeadedParsec Void Text IndirectionEl]
-> HeadedParsec Void Text IndirectionEl
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
                  [ do
                      Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
                      Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
':'
                      Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
                      Maybe WhereClause
_b <- HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text (Maybe WhereClause)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional HeadedParsec Void Text WhereClause
aExpr
                      return (Maybe WhereClause -> Maybe WhereClause -> IndirectionEl
SliceIndirectionEl (WhereClause -> Maybe WhereClause
forall a. a -> Maybe a
Just WhereClause
_a) Maybe WhereClause
_b),
                    IndirectionEl -> HeadedParsec Void Text IndirectionEl
forall (m :: * -> *) a. Monad m => a -> m a
return (WhereClause -> IndirectionEl
ExprIndirectionEl WhereClause
_a)
                  ]
            ]
        Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
        Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
']'
        return IndirectionEl
_a
    ]

-- |
-- ==== References
-- @
-- attr_name:
--   | ColLabel
-- @
attrName :: HeadedParsec Void Text Ident
attrName = HeadedParsec Void Text Ident
colLabel

keywordNameFromSet :: HashSet Text -> HeadedParsec err strm Ident
keywordNameFromSet HashSet Text
_set = (Text -> Bool) -> HeadedParsec err strm Ident
forall err strm.
(Ord err, Stream strm, Tokens strm ~ Text, Token strm ~ Char) =>
(Text -> Bool) -> HeadedParsec err strm Ident
keywordNameByPredicate (HashSet Text -> Text -> Bool
forall a. (Eq a, Hashable a) => HashSet a -> a -> Bool
Predicate.inSet HashSet Text
_set)

keywordNameByPredicate :: (Text -> Bool) -> HeadedParsec err strm Ident
keywordNameByPredicate Text -> Bool
_predicate =
  (Text -> Ident)
-> HeadedParsec err strm Text -> HeadedParsec err strm Ident
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> Ident
UnquotedIdent (HeadedParsec err strm Text -> HeadedParsec err strm Ident)
-> HeadedParsec err strm Text -> HeadedParsec err strm Ident
forall a b. (a -> b) -> a -> b
$
    (Text -> String)
-> (Text -> Bool)
-> HeadedParsec err strm Text
-> HeadedParsec err strm Text
forall err strm a.
(Ord err, Stream strm) =>
(a -> String)
-> (a -> Bool)
-> HeadedParsec err strm a
-> HeadedParsec err strm a
filter
      (\Text
a -> String
"Reserved keyword " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Text -> String
forall a. Show a => a -> String
show Text
a String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" used as an identifier. If that's what you intend, you have to wrap it in double quotes.")
      Text -> Bool
_predicate
      HeadedParsec err strm Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s Text
anyKeyword

anyKeyword :: HeadedParsec e s Text
anyKeyword = Parsec e s Text -> HeadedParsec e s Text
forall err strm a.
(Ord err, Stream strm) =>
Parsec err strm a -> HeadedParsec err strm a
parse (Parsec e s Text -> HeadedParsec e s Text)
-> Parsec e s Text -> HeadedParsec e s Text
forall a b. (a -> b) -> a -> b
$
  String -> Parsec e s Text -> Parsec e s Text
forall e s (m :: * -> *) a.
MonadParsec e s m =>
String -> m a -> m a
Megaparsec.label String
"keyword" (Parsec e s Text -> Parsec e s Text)
-> Parsec e s Text -> Parsec e s Text
forall a b. (a -> b) -> a -> b
$ do
    Char
_firstChar <- (Token s -> Bool) -> ParsecT e s Identity (Token s)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
Megaparsec.satisfy Char -> Bool
Token s -> Bool
Predicate.firstIdentifierChar
    Text
_remainder <- Maybe String
-> (Token s -> Bool) -> ParsecT e s Identity (Tokens s)
forall e s (m :: * -> *).
MonadParsec e s m =>
Maybe String -> (Token s -> Bool) -> m (Tokens s)
Megaparsec.takeWhileP Maybe String
forall a. Maybe a
Nothing Char -> Bool
Token s -> Bool
Predicate.notFirstIdentifierChar
    return (Text -> Text
Text.toLower (Char -> Text -> Text
Text.cons Char
_firstChar Text
_remainder))

-- | Expected keyword
keyword :: Text -> HeadedParsec e s Text
keyword Text
a = (Text -> Bool) -> HeadedParsec e s Text -> HeadedParsec e s Text
forall (m :: * -> *) a. MonadPlus m => (a -> Bool) -> m a -> m a
mfilter (Text
a Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
==) HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s Text
anyKeyword

-- |
-- Consume a keyphrase, ignoring case and types of spaces between words.
keyphrase :: Text -> HeadedParsec e s Text
keyphrase Text
a =
  Text -> [Text]
Text.words Text
a
    [Text]
-> ([Text] -> [ParsecT e s Identity ()])
-> [ParsecT e s Identity ()]
forall a b. a -> (a -> b) -> b
& (Text -> ParsecT e s Identity ())
-> [Text] -> [ParsecT e s Identity ()]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ParsecT e s Identity Text -> ParsecT e s Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT e s Identity Text -> ParsecT e s Identity ())
-> (Text -> ParsecT e s Identity Text)
-> Text
-> ParsecT e s Identity ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> ParsecT e s Identity Text
forall e s (m :: * -> *).
(MonadParsec e s m, FoldCase (Tokens s)) =>
Tokens s -> m (Tokens s)
MegaparsecChar.string')
    [ParsecT e s Identity ()]
-> ([ParsecT e s Identity ()] -> [ParsecT e s Identity ()])
-> [ParsecT e s Identity ()]
forall a b. a -> (a -> b) -> b
& ParsecT e s Identity ()
-> [ParsecT e s Identity ()] -> [ParsecT e s Identity ()]
forall a. a -> [a] -> [a]
intersperse ParsecT e s Identity ()
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
MegaparsecChar.space1
    [ParsecT e s Identity ()]
-> ([ParsecT e s Identity ()] -> ParsecT e s Identity ())
-> ParsecT e s Identity ()
forall a b. a -> (a -> b) -> b
& [ParsecT e s Identity ()] -> ParsecT e s Identity ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_
    ParsecT e s Identity ()
-> (ParsecT e s Identity () -> ParsecT e s Identity ())
-> ParsecT e s Identity ()
forall a b. a -> (a -> b) -> b
& (ParsecT e s Identity ()
-> ParsecT e s Identity () -> ParsecT e s Identity ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT e s Identity Char -> ParsecT e s Identity ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
Megaparsec.notFollowedBy ((Token s -> Bool) -> ParsecT e s Identity (Token s)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
Megaparsec.satisfy Char -> Bool
Token s -> Bool
Predicate.notFirstIdentifierChar))
    ParsecT e s Identity ()
-> (ParsecT e s Identity () -> ParsecT e s Identity Text)
-> ParsecT e s Identity Text
forall a b. a -> (a -> b) -> b
& (() -> Text)
-> ParsecT e s Identity () -> ParsecT e s Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> () -> Text
forall a b. a -> b -> a
const (Text -> Text
Text.toUpper Text
a))
    ParsecT e s Identity Text
-> (ParsecT e s Identity Text -> ParsecT e s Identity Text)
-> ParsecT e s Identity Text
forall a b. a -> (a -> b) -> b
& String -> ParsecT e s Identity Text -> ParsecT e s Identity Text
forall e s (m :: * -> *) a.
MonadParsec e s m =>
String -> m a -> m a
Megaparsec.label (Text -> String
forall a. Show a => a -> String
show Text
a)
    ParsecT e s Identity Text
-> (ParsecT e s Identity Text -> HeadedParsec e s Text)
-> HeadedParsec e s Text
forall a b. a -> (a -> b) -> b
& ParsecT e s Identity Text -> HeadedParsec e s Text
forall err strm a.
(Ord err, Stream strm) =>
Parsec err strm a -> HeadedParsec err strm a
parse
    HeadedParsec e s Text
-> (HeadedParsec e s Text -> HeadedParsec e s Text)
-> HeadedParsec e s Text
forall a b. a -> (a -> b) -> b
& (HeadedParsec e s Text
-> HeadedParsec e s () -> HeadedParsec e s Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* HeadedParsec e s ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead)

-- * Typename

typeList :: HeadedParsec Void Text TypeList
typeList = Parser ()
-> HeadedParsec Void Text Typename
-> HeadedParsec Void Text TypeList
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text Typename
typename

typename :: HeadedParsec Void Text Typename
typename =
  do
    Bool
a <- Bool -> Parser Bool -> Parser Bool
forall (m :: * -> *) a. Alternative m => a -> m a -> m a
option Bool
False (Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"setof" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Bool -> Parser Bool
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Bool
True)
    SimpleTypename
b <- HeadedParsec Void Text SimpleTypename
simpleTypename
    Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
    Bool
c <- HeadedParsec Void Text Char -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Char -> HeadedParsec Void Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'?')
    [HeadedParsec Void Text Typename]
-> HeadedParsec Void Text Typename
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
      [ do
          Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1
          Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"array"
          Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
          Maybe Int64
d <- Parser Int64 -> HeadedParsec Void Text (Maybe Int64)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> Parser Int64 -> Parser Int64
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int64 -> Parser Int64
forall a. Parser a -> Parser a
inBrackets Parser Int64
forall strm decimal err.
(Stream strm, Integral decimal, Ord err, Token strm ~ Char) =>
HeadedParsec err strm decimal
iconst)
          Bool
e <- HeadedParsec Void Text Char -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Char -> HeadedParsec Void Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'?')
          return (Bool
-> SimpleTypename
-> Bool
-> Maybe (TypenameArrayDimensions, Bool)
-> Typename
Typename Bool
a SimpleTypename
b Bool
c ((TypenameArrayDimensions, Bool)
-> Maybe (TypenameArrayDimensions, Bool)
forall a. a -> Maybe a
Just (Maybe Int64 -> TypenameArrayDimensions
ExplicitTypenameArrayDimensions Maybe Int64
d, Bool
e))),
        do
          Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space
          NonEmpty (Maybe Int64)
d <- HeadedParsec Void Text (NonEmpty (Maybe Int64))
forall a. Integral a => HeadedParsec Void Text (NonEmpty (Maybe a))
arrayBounds
          Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
          Bool
e <- HeadedParsec Void Text Char -> Parser Bool
forall a. Parser a -> Parser Bool
trueIfPresent (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Char -> HeadedParsec Void Text Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'?')
          return (Bool
-> SimpleTypename
-> Bool
-> Maybe (TypenameArrayDimensions, Bool)
-> Typename
Typename Bool
a SimpleTypename
b Bool
c ((TypenameArrayDimensions, Bool)
-> Maybe (TypenameArrayDimensions, Bool)
forall a. a -> Maybe a
Just (NonEmpty (Maybe Int64) -> TypenameArrayDimensions
BoundsTypenameArrayDimensions NonEmpty (Maybe Int64)
d, Bool
e))),
        Typename -> HeadedParsec Void Text Typename
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
-> SimpleTypename
-> Bool
-> Maybe (TypenameArrayDimensions, Bool)
-> Typename
Typename Bool
a SimpleTypename
b Bool
c Maybe (TypenameArrayDimensions, Bool)
forall a. Maybe a
Nothing)
      ]

arrayBounds :: HeadedParsec Void Text (NonEmpty (Maybe a))
arrayBounds = Parser ()
-> HeadedParsec Void Text (Maybe a)
-> HeadedParsec Void Text (NonEmpty (Maybe a))
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space (HeadedParsec Void Text (Maybe a)
-> HeadedParsec Void Text (Maybe a)
forall a. Parser a -> Parser a
inBrackets (HeadedParsec Void Text a -> HeadedParsec Void Text (Maybe a)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional HeadedParsec Void Text a
forall strm decimal err.
(Stream strm, Integral decimal, Ord err, Token strm ~ Char) =>
HeadedParsec err strm decimal
iconst))

simpleTypename :: HeadedParsec Void Text SimpleTypename
simpleTypename =
  [HeadedParsec Void Text SimpleTypename]
-> HeadedParsec Void Text SimpleTypename
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum ([HeadedParsec Void Text SimpleTypename]
 -> HeadedParsec Void Text SimpleTypename)
-> [HeadedParsec Void Text SimpleTypename]
-> HeadedParsec Void Text SimpleTypename
forall a b. (a -> b) -> a -> b
$
    [ do
        Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"interval"
        Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
        [HeadedParsec Void Text SimpleTypename]
-> HeadedParsec Void Text SimpleTypename
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
          [ Either (Maybe Interval) Int64 -> SimpleTypename
ConstIntervalSimpleTypename (Either (Maybe Interval) Int64 -> SimpleTypename)
-> (Int64 -> Either (Maybe Interval) Int64)
-> Int64
-> SimpleTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64 -> Either (Maybe Interval) Int64
forall a b. b -> Either a b
Right (Int64 -> SimpleTypename)
-> Parser Int64 -> HeadedParsec Void Text SimpleTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser () -> Parser Int64 -> Parser Int64
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int64 -> Parser Int64
forall a. Parser a -> Parser a
inParens Parser Int64
forall strm decimal err.
(Stream strm, Integral decimal, Ord err, Token strm ~ Char) =>
HeadedParsec err strm decimal
iconst),
            Either (Maybe Interval) Int64 -> SimpleTypename
ConstIntervalSimpleTypename (Either (Maybe Interval) Int64 -> SimpleTypename)
-> (Maybe Interval -> Either (Maybe Interval) Int64)
-> Maybe Interval
-> SimpleTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Interval -> Either (Maybe Interval) Int64
forall a b. a -> Either a b
Left (Maybe Interval -> SimpleTypename)
-> HeadedParsec Void Text (Maybe Interval)
-> HeadedParsec Void Text SimpleTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Interval
-> HeadedParsec Void Text (Maybe Interval)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Interval
-> HeadedParsec Void Text Interval
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Interval
interval)
          ],
      ConstDatetime -> SimpleTypename
ConstDatetimeSimpleTypename (ConstDatetime -> SimpleTypename)
-> HeadedParsec Void Text ConstDatetime
-> HeadedParsec Void Text SimpleTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ConstDatetime
constDatetime,
      Numeric -> SimpleTypename
NumericSimpleTypename (Numeric -> SimpleTypename)
-> HeadedParsec Void Text Numeric
-> HeadedParsec Void Text SimpleTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Numeric
numeric,
      ConstBit -> SimpleTypename
BitSimpleTypename (ConstBit -> SimpleTypename)
-> HeadedParsec Void Text ConstBit
-> HeadedParsec Void Text SimpleTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text ConstBit
bit,
      Character -> SimpleTypename
CharacterSimpleTypename (Character -> SimpleTypename)
-> HeadedParsec Void Text Character
-> HeadedParsec Void Text SimpleTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Character
forall e s.
(Ord e, Stream s, FoldCase (Tokens s), Tokens s ~ Text,
 Token s ~ Char) =>
HeadedParsec e s Character
character,
      GenericType -> SimpleTypename
GenericTypeSimpleTypename (GenericType -> SimpleTypename)
-> HeadedParsec Void Text GenericType
-> HeadedParsec Void Text SimpleTypename
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text GenericType
genericType
    ]

genericType :: HeadedParsec Void Text GenericType
genericType = do
  Ident
a <- HeadedParsec Void Text Ident
typeFunctionName
  Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead
  Maybe (NonEmpty Ident)
b <- HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text (Maybe (NonEmpty Ident))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text (NonEmpty Ident)
-> HeadedParsec Void Text (NonEmpty Ident)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty Ident)
attrs)
  Maybe (NonEmpty WhereClause)
c <- HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (Maybe (NonEmpty WhereClause))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text (NonEmpty WhereClause)
typeModifiers)
  return (Ident
-> Maybe (NonEmpty Ident)
-> Maybe (NonEmpty WhereClause)
-> GenericType
GenericType Ident
a Maybe (NonEmpty Ident)
b Maybe (NonEmpty WhereClause)
c)

attrs :: HeadedParsec Void Text (NonEmpty Ident)
attrs = HeadedParsec Void Text Ident
-> HeadedParsec Void Text (NonEmpty Ident)
forall (m :: * -> *) a. Alternative m => m a -> m (NonEmpty a)
some (Char -> HeadedParsec Void Text Char
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
Char -> HeadedParsec err strm Char
char Char
'.' HeadedParsec Void Text Char -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space Parser ()
-> HeadedParsec Void Text Ident -> HeadedParsec Void Text Ident
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text Ident
attrName)

typeModifiers :: HeadedParsec Void Text (NonEmpty WhereClause)
typeModifiers = HeadedParsec Void Text (NonEmpty WhereClause)
-> HeadedParsec Void Text (NonEmpty WhereClause)
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text (NonEmpty WhereClause)
exprList

-- * Indexes

indexParams :: HeadedParsec Void Text IndexParams
indexParams = Parser ()
-> HeadedParsec Void Text IndexElem
-> HeadedParsec Void Text IndexParams
forall err strm separtor a.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm separtor
-> HeadedParsec err strm a -> HeadedParsec err strm (NonEmpty a)
sep1 Parser ()
commaSeparator HeadedParsec Void Text IndexElem
indexElem

indexElem :: HeadedParsec Void Text IndexElem
indexElem =
  IndexElemDef
-> Maybe AnyName
-> Maybe AnyName
-> Maybe AscDesc
-> Maybe NullsOrder
-> IndexElem
IndexElem
    (IndexElemDef
 -> Maybe AnyName
 -> Maybe AnyName
 -> Maybe AscDesc
 -> Maybe NullsOrder
 -> IndexElem)
-> HeadedParsec Void Text IndexElemDef
-> HeadedParsec
     Void
     Text
     (Maybe AnyName
      -> Maybe AnyName -> Maybe AscDesc -> Maybe NullsOrder -> IndexElem)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (HeadedParsec Void Text IndexElemDef
indexElemDef HeadedParsec Void Text IndexElemDef
-> Parser () -> HeadedParsec Void Text IndexElemDef
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead)
    HeadedParsec
  Void
  Text
  (Maybe AnyName
   -> Maybe AnyName -> Maybe AscDesc -> Maybe NullsOrder -> IndexElem)
-> HeadedParsec Void Text (Maybe AnyName)
-> HeadedParsec
     Void
     Text
     (Maybe AnyName -> Maybe AscDesc -> Maybe NullsOrder -> IndexElem)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HeadedParsec Void Text AnyName
-> HeadedParsec Void Text (Maybe AnyName)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text AnyName -> HeadedParsec Void Text AnyName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AnyName
collate)
    HeadedParsec
  Void
  Text
  (Maybe AnyName -> Maybe AscDesc -> Maybe NullsOrder -> IndexElem)
-> HeadedParsec Void Text (Maybe AnyName)
-> HeadedParsec
     Void Text (Maybe AscDesc -> Maybe NullsOrder -> IndexElem)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HeadedParsec Void Text AnyName
-> HeadedParsec Void Text (Maybe AnyName)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text AnyName -> HeadedParsec Void Text AnyName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AnyName
class_)
    HeadedParsec
  Void Text (Maybe AscDesc -> Maybe NullsOrder -> IndexElem)
-> HeadedParsec Void Text (Maybe AscDesc)
-> HeadedParsec Void Text (Maybe NullsOrder -> IndexElem)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HeadedParsec Void Text AscDesc
-> HeadedParsec Void Text (Maybe AscDesc)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text AscDesc -> HeadedParsec Void Text AscDesc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AscDesc
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s AscDesc
ascDesc)
    HeadedParsec Void Text (Maybe NullsOrder -> IndexElem)
-> HeadedParsec Void Text (Maybe NullsOrder)
-> HeadedParsec Void Text IndexElem
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HeadedParsec Void Text NullsOrder
-> HeadedParsec Void Text (Maybe NullsOrder)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser ()
-> HeadedParsec Void Text NullsOrder
-> HeadedParsec Void Text NullsOrder
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text NullsOrder
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
HeadedParsec e s NullsOrder
nullsOrder)

indexElemDef :: HeadedParsec Void Text IndexElemDef
indexElemDef =
  WhereClause -> IndexElemDef
ExprIndexElemDef (WhereClause -> IndexElemDef)
-> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text IndexElemDef
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text WhereClause
-> HeadedParsec Void Text WhereClause
forall a. Parser a -> Parser a
inParens HeadedParsec Void Text WhereClause
aExpr
    HeadedParsec Void Text IndexElemDef
-> HeadedParsec Void Text IndexElemDef
-> HeadedParsec Void Text IndexElemDef
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> FuncExprWindowless -> IndexElemDef
FuncIndexElemDef (FuncExprWindowless -> IndexElemDef)
-> HeadedParsec Void Text FuncExprWindowless
-> HeadedParsec Void Text IndexElemDef
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text FuncExprWindowless
funcExprWindowless
    HeadedParsec Void Text IndexElemDef
-> HeadedParsec Void Text IndexElemDef
-> HeadedParsec Void Text IndexElemDef
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Ident -> IndexElemDef
IdIndexElemDef (Ident -> IndexElemDef)
-> HeadedParsec Void Text Ident
-> HeadedParsec Void Text IndexElemDef
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HeadedParsec Void Text Ident
colId

collate :: HeadedParsec Void Text AnyName
collate = Text -> Parser Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"collate" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead Parser ()
-> HeadedParsec Void Text AnyName -> HeadedParsec Void Text AnyName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec Void Text AnyName
anyName

class_ :: HeadedParsec Void Text AnyName
class_ = [Text] -> HeadedParsec Void Text AnyName
forall (t :: * -> *).
Foldable t =>
t Text -> HeadedParsec Void Text AnyName
filteredAnyName [Text
"asc", Text
"desc", Text
"nulls"]

ascDesc :: HeadedParsec e s AscDesc
ascDesc = Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"asc" HeadedParsec e s Text -> AscDesc -> HeadedParsec e s AscDesc
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> AscDesc
AscAscDesc HeadedParsec e s AscDesc
-> HeadedParsec e s AscDesc -> HeadedParsec e s AscDesc
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"desc" HeadedParsec e s Text -> AscDesc -> HeadedParsec e s AscDesc
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> AscDesc
DescAscDesc

nullsOrder :: HeadedParsec e s NullsOrder
nullsOrder = Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"nulls" HeadedParsec e s Text -> HeadedParsec e s () -> HeadedParsec e s ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec e s ()
forall err strm.
(Ord err, Stream strm, Token strm ~ Char) =>
HeadedParsec err strm ()
space1 HeadedParsec e s () -> HeadedParsec e s () -> HeadedParsec e s ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> HeadedParsec e s ()
forall strm err. Stream strm => HeadedParsec err strm ()
endHead HeadedParsec e s ()
-> HeadedParsec e s NullsOrder -> HeadedParsec e s NullsOrder
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (NullsOrder
FirstNullsOrder NullsOrder -> HeadedParsec e s Text -> HeadedParsec e s NullsOrder
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"first" HeadedParsec e s NullsOrder
-> HeadedParsec e s NullsOrder -> HeadedParsec e s NullsOrder
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> NullsOrder
LastNullsOrder NullsOrder -> HeadedParsec e s Text -> HeadedParsec e s NullsOrder
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> HeadedParsec e s Text
forall e s.
(Ord e, Stream s, Tokens s ~ Text, Token s ~ Char) =>
Text -> HeadedParsec e s Text
keyword Text
"last")