{-# LANGUAGE CPP #-}
{-# LANGUAGE UndecidableInstances #-}
-- | This module implements an AST type for SQL92. It allows us to realize
--   the call structure of the builders defined in "Database.Beam.Backend.SQL.SQL92"
module Database.Beam.Backend.SQL.AST where

import Prelude hiding (Ordering)

import Database.Beam.Backend.Internal.Compat
import Database.Beam.Backend.SQL.SQL92
import Database.Beam.Backend.SQL.SQL99
import Database.Beam.Backend.SQL.SQL2003
import Database.Beam.Backend.SQL.Types

import Data.Text (Text)
import Data.ByteString (ByteString)
import Data.Time
import Data.Word (Word16, Word32, Word64)
import Data.Typeable
import Data.Int
import GHC.TypeLits

data Command
  = SelectCommand Select
  | InsertCommand Insert
  | UpdateCommand Update
  | DeleteCommand Delete
  deriving (Int -> Command -> ShowS
[Command] -> ShowS
Command -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Command] -> ShowS
$cshowList :: [Command] -> ShowS
show :: Command -> String
$cshow :: Command -> String
showsPrec :: Int -> Command -> ShowS
$cshowsPrec :: Int -> Command -> ShowS
Show, Command -> Command -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Command -> Command -> Bool
$c/= :: Command -> Command -> Bool
== :: Command -> Command -> Bool
$c== :: Command -> Command -> Bool
Eq)

instance IsSql92Syntax Command where
  type Sql92SelectSyntax Command = Select
  type Sql92UpdateSyntax Command = Update
  type Sql92InsertSyntax Command = Insert
  type Sql92DeleteSyntax Command = Delete

  selectCmd :: Sql92SelectSyntax Command -> Command
selectCmd = Select -> Command
SelectCommand
  insertCmd :: Sql92InsertSyntax Command -> Command
insertCmd = Insert -> Command
InsertCommand
  updateCmd :: Sql92UpdateSyntax Command -> Command
updateCmd = Update -> Command
UpdateCommand
  deleteCmd :: Sql92DeleteSyntax Command -> Command
deleteCmd = Delete -> Command
DeleteCommand

data Select
    = Select
    { Select -> SelectTable
selectTable :: SelectTable
    , Select -> [Ordering]
selectOrdering   :: [ Ordering ]
    , Select -> Maybe Integer
selectLimit, Select -> Maybe Integer
selectOffset :: Maybe Integer }
    deriving (Int -> Select -> ShowS
[Select] -> ShowS
Select -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Select] -> ShowS
$cshowList :: [Select] -> ShowS
show :: Select -> String
$cshow :: Select -> String
showsPrec :: Int -> Select -> ShowS
$cshowsPrec :: Int -> Select -> ShowS
Show, Select -> Select -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Select -> Select -> Bool
$c/= :: Select -> Select -> Bool
== :: Select -> Select -> Bool
$c== :: Select -> Select -> Bool
Eq)

instance IsSql92SelectSyntax Select where
  type Sql92SelectSelectTableSyntax Select = SelectTable
  type Sql92SelectOrderingSyntax Select = Ordering

  selectStmt :: Sql92SelectSelectTableSyntax Select
-> [Sql92SelectOrderingSyntax Select]
-> Maybe Integer
-> Maybe Integer
-> Select
selectStmt = SelectTable
-> [Ordering] -> Maybe Integer -> Maybe Integer -> Select
Select

data SelectTable
  = SelectTable
  { SelectTable -> Maybe SetQuantifier
selectQuantifier :: Maybe SetQuantifier
  , SelectTable -> Projection
selectProjection :: Projection
  , SelectTable -> Maybe From
selectFrom       :: Maybe From
  , SelectTable -> Maybe Expression
selectWhere      :: Maybe Expression
  , SelectTable -> Maybe Grouping
selectGrouping   :: Maybe Grouping
  , SelectTable -> Maybe Expression
selectHaving     :: Maybe Expression }
  | UnionTables Bool SelectTable SelectTable
  | IntersectTables Bool SelectTable SelectTable
  | ExceptTable Bool SelectTable SelectTable
  deriving (Int -> SelectTable -> ShowS
[SelectTable] -> ShowS
SelectTable -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SelectTable] -> ShowS
$cshowList :: [SelectTable] -> ShowS
show :: SelectTable -> String
$cshow :: SelectTable -> String
showsPrec :: Int -> SelectTable -> ShowS
$cshowsPrec :: Int -> SelectTable -> ShowS
Show, SelectTable -> SelectTable -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SelectTable -> SelectTable -> Bool
$c/= :: SelectTable -> SelectTable -> Bool
== :: SelectTable -> SelectTable -> Bool
$c== :: SelectTable -> SelectTable -> Bool
Eq)

instance IsSql92SelectTableSyntax SelectTable where
  type Sql92SelectTableSelectSyntax SelectTable = Select
  type Sql92SelectTableExpressionSyntax SelectTable = Expression
  type Sql92SelectTableProjectionSyntax SelectTable = Projection
  type Sql92SelectTableFromSyntax SelectTable = From
  type Sql92SelectTableGroupingSyntax SelectTable = Grouping
  type Sql92SelectTableSetQuantifierSyntax SelectTable = SetQuantifier

  selectTableStmt :: Maybe (Sql92SelectTableSetQuantifierSyntax SelectTable)
-> Sql92SelectTableProjectionSyntax SelectTable
-> Maybe (Sql92SelectTableFromSyntax SelectTable)
-> Maybe (Sql92SelectTableExpressionSyntax SelectTable)
-> Maybe (Sql92SelectTableGroupingSyntax SelectTable)
-> Maybe (Sql92SelectTableExpressionSyntax SelectTable)
-> SelectTable
selectTableStmt = Maybe SetQuantifier
-> Projection
-> Maybe From
-> Maybe Expression
-> Maybe Grouping
-> Maybe Expression
-> SelectTable
SelectTable
  unionTables :: Bool -> SelectTable -> SelectTable -> SelectTable
unionTables = Bool -> SelectTable -> SelectTable -> SelectTable
UnionTables
  intersectTables :: Bool -> SelectTable -> SelectTable -> SelectTable
intersectTables = Bool -> SelectTable -> SelectTable -> SelectTable
IntersectTables
  exceptTable :: Bool -> SelectTable -> SelectTable -> SelectTable
exceptTable = Bool -> SelectTable -> SelectTable -> SelectTable
ExceptTable

data Insert
  = Insert
  { Insert -> TableName
insertTable :: TableName
  , Insert -> [Text]
insertFields :: [ Text ]
  , Insert -> InsertValues
insertValues :: InsertValues }
  deriving (Int -> Insert -> ShowS
[Insert] -> ShowS
Insert -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Insert] -> ShowS
$cshowList :: [Insert] -> ShowS
show :: Insert -> String
$cshow :: Insert -> String
showsPrec :: Int -> Insert -> ShowS
$cshowsPrec :: Int -> Insert -> ShowS
Show, Insert -> Insert -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Insert -> Insert -> Bool
$c/= :: Insert -> Insert -> Bool
== :: Insert -> Insert -> Bool
$c== :: Insert -> Insert -> Bool
Eq)

instance IsSql92InsertSyntax Insert where
  type Sql92InsertValuesSyntax Insert = InsertValues
  type Sql92InsertTableNameSyntax Insert = TableName

  insertStmt :: Sql92InsertTableNameSyntax Insert
-> [Text] -> Sql92InsertValuesSyntax Insert -> Insert
insertStmt = TableName -> [Text] -> InsertValues -> Insert
Insert

data InsertValues
  = InsertValues
  { InsertValues -> [[Expression]]
insertValuesExpressions :: [ [ Expression ] ] }
  | InsertSelect
  { InsertValues -> Select
insertSelectStmt :: Select }
  deriving (Int -> InsertValues -> ShowS
[InsertValues] -> ShowS
InsertValues -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InsertValues] -> ShowS
$cshowList :: [InsertValues] -> ShowS
show :: InsertValues -> String
$cshow :: InsertValues -> String
showsPrec :: Int -> InsertValues -> ShowS
$cshowsPrec :: Int -> InsertValues -> ShowS
Show, InsertValues -> InsertValues -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InsertValues -> InsertValues -> Bool
$c/= :: InsertValues -> InsertValues -> Bool
== :: InsertValues -> InsertValues -> Bool
$c== :: InsertValues -> InsertValues -> Bool
Eq)

instance IsSql92InsertValuesSyntax InsertValues where
  type Sql92InsertValuesExpressionSyntax InsertValues = Expression
  type Sql92InsertValuesSelectSyntax InsertValues = Select

  insertSqlExpressions :: [[Sql92InsertValuesExpressionSyntax InsertValues]] -> InsertValues
insertSqlExpressions = [[Expression]] -> InsertValues
InsertValues
  insertFromSql :: Sql92InsertValuesSelectSyntax InsertValues -> InsertValues
insertFromSql = Select -> InsertValues
InsertSelect

data Update
  = Update
  { Update -> TableName
updateTable :: TableName
  , Update -> [(FieldName, Expression)]
updateFields :: [ (FieldName, Expression) ]
  , Update -> Maybe Expression
updateWhere :: Maybe Expression }
  deriving (Int -> Update -> ShowS
[Update] -> ShowS
Update -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Update] -> ShowS
$cshowList :: [Update] -> ShowS
show :: Update -> String
$cshow :: Update -> String
showsPrec :: Int -> Update -> ShowS
$cshowsPrec :: Int -> Update -> ShowS
Show, Update -> Update -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Update -> Update -> Bool
$c/= :: Update -> Update -> Bool
== :: Update -> Update -> Bool
$c== :: Update -> Update -> Bool
Eq)

instance IsSql92UpdateSyntax Update where
  type Sql92UpdateTableNameSyntax Update = TableName
  type Sql92UpdateFieldNameSyntax Update = FieldName
  type Sql92UpdateExpressionSyntax Update = Expression

  updateStmt :: Sql92UpdateTableNameSyntax Update
-> [(Sql92UpdateFieldNameSyntax Update,
     Sql92UpdateExpressionSyntax Update)]
-> Maybe (Sql92UpdateExpressionSyntax Update)
-> Update
updateStmt = TableName
-> [(FieldName, Expression)] -> Maybe Expression -> Update
Update

data Delete
  = Delete
  { Delete -> TableName
deleteTable :: TableName
  , Delete -> Maybe Text
deleteAlias :: Maybe Text
  , Delete -> Maybe Expression
deleteWhere :: Maybe Expression }
  deriving (Int -> Delete -> ShowS
[Delete] -> ShowS
Delete -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Delete] -> ShowS
$cshowList :: [Delete] -> ShowS
show :: Delete -> String
$cshow :: Delete -> String
showsPrec :: Int -> Delete -> ShowS
$cshowsPrec :: Int -> Delete -> ShowS
Show, Delete -> Delete -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Delete -> Delete -> Bool
$c/= :: Delete -> Delete -> Bool
== :: Delete -> Delete -> Bool
$c== :: Delete -> Delete -> Bool
Eq)

instance IsSql92DeleteSyntax Delete where
  type Sql92DeleteTableNameSyntax Delete = TableName
  type Sql92DeleteExpressionSyntax Delete = Expression

  deleteStmt :: Sql92DeleteTableNameSyntax Delete
-> Maybe Text
-> Maybe (Sql92DeleteExpressionSyntax Delete)
-> Delete
deleteStmt = TableName -> Maybe Text -> Maybe Expression -> Delete
Delete
  deleteSupportsAlias :: Proxy Delete -> Bool
deleteSupportsAlias Proxy Delete
_ = Bool
True

data FieldName
  = QualifiedField Text Text
  | UnqualifiedField Text
  deriving (Int -> FieldName -> ShowS
[FieldName] -> ShowS
FieldName -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FieldName] -> ShowS
$cshowList :: [FieldName] -> ShowS
show :: FieldName -> String
$cshow :: FieldName -> String
showsPrec :: Int -> FieldName -> ShowS
$cshowsPrec :: Int -> FieldName -> ShowS
Show, FieldName -> FieldName -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FieldName -> FieldName -> Bool
$c/= :: FieldName -> FieldName -> Bool
== :: FieldName -> FieldName -> Bool
$c== :: FieldName -> FieldName -> Bool
Eq)

instance IsSql92FieldNameSyntax FieldName where
  qualifiedField :: Text -> Text -> FieldName
qualifiedField = Text -> Text -> FieldName
QualifiedField
  unqualifiedField :: Text -> FieldName
unqualifiedField = Text -> FieldName
UnqualifiedField

data ComparatorQuantifier
  = ComparatorQuantifierAny
  | ComparatorQuantifierAll
  deriving (Int -> ComparatorQuantifier -> ShowS
[ComparatorQuantifier] -> ShowS
ComparatorQuantifier -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ComparatorQuantifier] -> ShowS
$cshowList :: [ComparatorQuantifier] -> ShowS
show :: ComparatorQuantifier -> String
$cshow :: ComparatorQuantifier -> String
showsPrec :: Int -> ComparatorQuantifier -> ShowS
$cshowsPrec :: Int -> ComparatorQuantifier -> ShowS
Show, ComparatorQuantifier -> ComparatorQuantifier -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ComparatorQuantifier -> ComparatorQuantifier -> Bool
$c/= :: ComparatorQuantifier -> ComparatorQuantifier -> Bool
== :: ComparatorQuantifier -> ComparatorQuantifier -> Bool
$c== :: ComparatorQuantifier -> ComparatorQuantifier -> Bool
Eq)

instance IsSql92QuantifierSyntax ComparatorQuantifier where
  quantifyOverAll :: ComparatorQuantifier
quantifyOverAll = ComparatorQuantifier
ComparatorQuantifierAll
  quantifyOverAny :: ComparatorQuantifier
quantifyOverAny = ComparatorQuantifier
ComparatorQuantifierAny

data ExtractField
  = ExtractFieldTimeZoneHour
  | ExtractFieldTimeZoneMinute

  | ExtractFieldDateTimeYear
  | ExtractFieldDateTimeMonth
  | ExtractFieldDateTimeDay
  | ExtractFieldDateTimeHour
  | ExtractFieldDateTimeMinute
  | ExtractFieldDateTimeSecond
  deriving (Int -> ExtractField -> ShowS
[ExtractField] -> ShowS
ExtractField -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ExtractField] -> ShowS
$cshowList :: [ExtractField] -> ShowS
show :: ExtractField -> String
$cshow :: ExtractField -> String
showsPrec :: Int -> ExtractField -> ShowS
$cshowsPrec :: Int -> ExtractField -> ShowS
Show, ExtractField -> ExtractField -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ExtractField -> ExtractField -> Bool
$c/= :: ExtractField -> ExtractField -> Bool
== :: ExtractField -> ExtractField -> Bool
$c== :: ExtractField -> ExtractField -> Bool
Eq)

data DataType
  = DataTypeChar Bool {- Varying -} (Maybe Word) (Maybe Text)
  | DataTypeNationalChar Bool (Maybe Word)
  | DataTypeBit Bool (Maybe Word)
  | DataTypeNumeric (Maybe (Word, Maybe Word))
  | DataTypeDecimal (Maybe (Word, Maybe Word))
  | DataTypeInteger
  | DataTypeSmallInt
  | DataTypeBigInt
  | DataTypeFloat (Maybe Word)
  | DataTypeReal
  | DataTypeDoublePrecision
  | DataTypeDate
  | DataTypeTime (Maybe Word) {- time fractional seconds precision -} Bool {- With time zone -}
  | DataTypeTimeStamp (Maybe Word) Bool
  | DataTypeInterval ExtractField
  | DataTypeIntervalFromTo ExtractField ExtractField
  | DataTypeBoolean

  | DataTypeBinaryLargeObject
  | DataTypeCharacterLargeObject

  | DataTypeArray DataType Int
  | DataTypeRow [ (Text, DataType) ]

  | DataTypeDomain Text
  deriving (Int -> DataType -> ShowS
[DataType] -> ShowS
DataType -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DataType] -> ShowS
$cshowList :: [DataType] -> ShowS
show :: DataType -> String
$cshow :: DataType -> String
showsPrec :: Int -> DataType -> ShowS
$cshowsPrec :: Int -> DataType -> ShowS
Show, DataType -> DataType -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DataType -> DataType -> Bool
$c/= :: DataType -> DataType -> Bool
== :: DataType -> DataType -> Bool
$c== :: DataType -> DataType -> Bool
Eq)

instance IsSql92DataTypeSyntax DataType where
  domainType :: Text -> DataType
domainType = Text -> DataType
DataTypeDomain
  charType :: Maybe Word -> Maybe Text -> DataType
charType = Bool -> Maybe Word -> Maybe Text -> DataType
DataTypeChar Bool
False
  varCharType :: Maybe Word -> Maybe Text -> DataType
varCharType = Bool -> Maybe Word -> Maybe Text -> DataType
DataTypeChar Bool
True
  nationalCharType :: Maybe Word -> DataType
nationalCharType = Bool -> Maybe Word -> DataType
DataTypeNationalChar Bool
False
  nationalVarCharType :: Maybe Word -> DataType
nationalVarCharType = Bool -> Maybe Word -> DataType
DataTypeNationalChar Bool
True
  bitType :: Maybe Word -> DataType
bitType = Bool -> Maybe Word -> DataType
DataTypeBit Bool
False
  varBitType :: Maybe Word -> DataType
varBitType = Bool -> Maybe Word -> DataType
DataTypeBit Bool
True
  numericType :: Maybe (Word, Maybe Word) -> DataType
numericType = Maybe (Word, Maybe Word) -> DataType
DataTypeNumeric
  decimalType :: Maybe (Word, Maybe Word) -> DataType
decimalType = Maybe (Word, Maybe Word) -> DataType
DataTypeDecimal
  intType :: DataType
intType = DataType
DataTypeInteger
  smallIntType :: DataType
smallIntType = DataType
DataTypeSmallInt
  floatType :: Maybe Word -> DataType
floatType = Maybe Word -> DataType
DataTypeFloat
  doubleType :: DataType
doubleType = DataType
DataTypeDoublePrecision
  realType :: DataType
realType = DataType
DataTypeReal

  dateType :: DataType
dateType = DataType
DataTypeDate
  timeType :: Maybe Word -> Bool -> DataType
timeType = Maybe Word -> Bool -> DataType
DataTypeTime
  timestampType :: Maybe Word -> Bool -> DataType
timestampType = Maybe Word -> Bool -> DataType
DataTypeTimeStamp

instance IsSql99DataTypeSyntax DataType where
  characterLargeObjectType :: DataType
characterLargeObjectType = DataType
DataTypeCharacterLargeObject
  binaryLargeObjectType :: DataType
binaryLargeObjectType = DataType
DataTypeCharacterLargeObject
  booleanType :: DataType
booleanType = DataType
DataTypeBoolean
  arrayType :: DataType -> Int -> DataType
arrayType = DataType -> Int -> DataType
DataTypeArray
  rowType :: [(Text, DataType)] -> DataType
rowType = [(Text, DataType)] -> DataType
DataTypeRow

instance IsSql2008BigIntDataTypeSyntax DataType where
  bigIntType :: DataType
bigIntType = DataType
DataTypeBigInt

data SetQuantifier
  = SetQuantifierAll | SetQuantifierDistinct
  deriving (Int -> SetQuantifier -> ShowS
[SetQuantifier] -> ShowS
SetQuantifier -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SetQuantifier] -> ShowS
$cshowList :: [SetQuantifier] -> ShowS
show :: SetQuantifier -> String
$cshow :: SetQuantifier -> String
showsPrec :: Int -> SetQuantifier -> ShowS
$cshowsPrec :: Int -> SetQuantifier -> ShowS
Show, SetQuantifier -> SetQuantifier -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SetQuantifier -> SetQuantifier -> Bool
$c/= :: SetQuantifier -> SetQuantifier -> Bool
== :: SetQuantifier -> SetQuantifier -> Bool
$c== :: SetQuantifier -> SetQuantifier -> Bool
Eq)

instance IsSql92AggregationSetQuantifierSyntax SetQuantifier where
  setQuantifierDistinct :: SetQuantifier
setQuantifierDistinct = SetQuantifier
SetQuantifierDistinct
  setQuantifierAll :: SetQuantifier
setQuantifierAll = SetQuantifier
SetQuantifierAll

data Expression
  = ExpressionValue Value
  | ExpressionDefault
  | ExpressionRow [ Expression ]

  | ExpressionIn Expression [ Expression ]
  | ExpressionInSelect Expression Select

  | ExpressionIsNull Expression
  | ExpressionIsNotNull Expression
  | ExpressionIsTrue Expression
  | ExpressionIsNotTrue Expression
  | ExpressionIsFalse Expression
  | ExpressionIsNotFalse Expression
  | ExpressionIsUnknown Expression
  | ExpressionIsNotUnknown Expression

  | ExpressionCase [(Expression, Expression)] Expression
  | ExpressionCoalesce [Expression]
  | ExpressionNullIf Expression Expression

  | ExpressionFieldName FieldName

  | ExpressionBetween Expression Expression Expression
  | ExpressionBinOp Text Expression Expression
  | ExpressionCompOp Text (Maybe ComparatorQuantifier) Expression Expression
  | ExpressionUnOp Text Expression

  | ExpressionPosition Expression Expression
  | ExpressionCast Expression DataType
  | ExpressionExtract ExtractField Expression
  | ExpressionCharLength Expression
  | ExpressionOctetLength Expression
  | ExpressionBitLength Expression
  | ExpressionAbs Expression
  | ExpressionLower Expression
  | ExpressionUpper Expression
  | ExpressionTrim Expression

  | ExpressionNamedFunction Text
  | ExpressionFunctionCall Expression [ Expression ]
  | ExpressionInstanceField Expression Text
  | ExpressionRefField Expression Text

  | ExpressionCountAll
  | ExpressionAgg Text (Maybe SetQuantifier) [ Expression ]
  | ExpressionBuiltinFunction Text [ Expression ]

  | ExpressionSubquery Select
  | ExpressionUnique Select
  | ExpressionDistinct Select
  | ExpressionExists Select

  | ExpressionOver Expression WindowFrame

  | ExpressionCurrentTimestamp
  deriving (Int -> Expression -> ShowS
[Expression] -> ShowS
Expression -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Expression] -> ShowS
$cshowList :: [Expression] -> ShowS
show :: Expression -> String
$cshow :: Expression -> String
showsPrec :: Int -> Expression -> ShowS
$cshowsPrec :: Int -> Expression -> ShowS
Show, Expression -> Expression -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Expression -> Expression -> Bool
$c/= :: Expression -> Expression -> Bool
== :: Expression -> Expression -> Bool
$c== :: Expression -> Expression -> Bool
Eq)

instance IsSql92ExtractFieldSyntax ExtractField where
  secondsField :: ExtractField
secondsField = ExtractField
ExtractFieldDateTimeSecond
  minutesField :: ExtractField
minutesField = ExtractField
ExtractFieldDateTimeMinute
  hourField :: ExtractField
hourField = ExtractField
ExtractFieldDateTimeHour
  dayField :: ExtractField
dayField = ExtractField
ExtractFieldDateTimeDay
  monthField :: ExtractField
monthField = ExtractField
ExtractFieldDateTimeMonth
  yearField :: ExtractField
yearField = ExtractField
ExtractFieldDateTimeYear

instance IsSql92ExpressionSyntax Expression where
  type Sql92ExpressionQuantifierSyntax Expression = ComparatorQuantifier
  type Sql92ExpressionValueSyntax Expression = Value
  type Sql92ExpressionSelectSyntax Expression = Select
  type Sql92ExpressionFieldNameSyntax Expression = FieldName
  type Sql92ExpressionCastTargetSyntax Expression = DataType
  type Sql92ExpressionExtractFieldSyntax Expression = ExtractField

  valueE :: Sql92ExpressionValueSyntax Expression -> Expression
valueE = Value -> Expression
ExpressionValue
  rowE :: [Expression] -> Expression
rowE = [Expression] -> Expression
ExpressionRow

  isNullE :: Expression -> Expression
isNullE = Expression -> Expression
ExpressionIsNull
  isNotNullE :: Expression -> Expression
isNotNullE = Expression -> Expression
ExpressionIsNotNull
  isTrueE :: Expression -> Expression
isTrueE = Expression -> Expression
ExpressionIsTrue
  isNotTrueE :: Expression -> Expression
isNotTrueE = Expression -> Expression
ExpressionIsNotTrue
  isFalseE :: Expression -> Expression
isFalseE = Expression -> Expression
ExpressionIsFalse
  isNotFalseE :: Expression -> Expression
isNotFalseE = Expression -> Expression
ExpressionIsNotFalse
  isUnknownE :: Expression -> Expression
isUnknownE = Expression -> Expression
ExpressionIsUnknown
  isNotUnknownE :: Expression -> Expression
isNotUnknownE = Expression -> Expression
ExpressionIsNotUnknown

  caseE :: [(Expression, Expression)] -> Expression -> Expression
caseE = [(Expression, Expression)] -> Expression -> Expression
ExpressionCase
  coalesceE :: [Expression] -> Expression
coalesceE = [Expression] -> Expression
ExpressionCoalesce
  nullIfE :: Expression -> Expression -> Expression
nullIfE = Expression -> Expression -> Expression
ExpressionNullIf
  positionE :: Expression -> Expression -> Expression
positionE = Expression -> Expression -> Expression
ExpressionPosition
  extractE :: Sql92ExpressionExtractFieldSyntax Expression
-> Expression -> Expression
extractE = ExtractField -> Expression -> Expression
ExpressionExtract
  castE :: Expression
-> Sql92ExpressionCastTargetSyntax Expression -> Expression
castE = Expression -> DataType -> Expression
ExpressionCast

  fieldE :: Sql92ExpressionFieldNameSyntax Expression -> Expression
fieldE = FieldName -> Expression
ExpressionFieldName

  betweenE :: Expression -> Expression -> Expression -> Expression
betweenE = Expression -> Expression -> Expression -> Expression
ExpressionBetween
  andE :: Expression -> Expression -> Expression
andE = Text -> Expression -> Expression -> Expression
ExpressionBinOp Text
"AND"
  orE :: Expression -> Expression -> Expression
orE = Text -> Expression -> Expression -> Expression
ExpressionBinOp Text
"OR"

  eqE :: Maybe (Sql92ExpressionQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
eqE = Text
-> Maybe ComparatorQuantifier
-> Expression
-> Expression
-> Expression
ExpressionCompOp Text
"=="
  neqE :: Maybe (Sql92ExpressionQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
neqE = Text
-> Maybe ComparatorQuantifier
-> Expression
-> Expression
-> Expression
ExpressionCompOp Text
"<>"
  ltE :: Maybe (Sql92ExpressionQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
ltE = Text
-> Maybe ComparatorQuantifier
-> Expression
-> Expression
-> Expression
ExpressionCompOp Text
"<"
  gtE :: Maybe (Sql92ExpressionQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
gtE = Text
-> Maybe ComparatorQuantifier
-> Expression
-> Expression
-> Expression
ExpressionCompOp Text
">"
  leE :: Maybe (Sql92ExpressionQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
leE = Text
-> Maybe ComparatorQuantifier
-> Expression
-> Expression
-> Expression
ExpressionCompOp Text
"<="
  geE :: Maybe (Sql92ExpressionQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
geE = Text
-> Maybe ComparatorQuantifier
-> Expression
-> Expression
-> Expression
ExpressionCompOp Text
">="
  addE :: Expression -> Expression -> Expression
addE = Text -> Expression -> Expression -> Expression
ExpressionBinOp Text
"+"
  subE :: Expression -> Expression -> Expression
subE = Text -> Expression -> Expression -> Expression
ExpressionBinOp Text
"-"
  mulE :: Expression -> Expression -> Expression
mulE = Text -> Expression -> Expression -> Expression
ExpressionBinOp Text
"*"
  divE :: Expression -> Expression -> Expression
divE = Text -> Expression -> Expression -> Expression
ExpressionBinOp Text
"/"
  modE :: Expression -> Expression -> Expression
modE = Text -> Expression -> Expression -> Expression
ExpressionBinOp Text
"%"
  likeE :: Expression -> Expression -> Expression
likeE = Text -> Expression -> Expression -> Expression
ExpressionBinOp Text
"LIKE"
  overlapsE :: Expression -> Expression -> Expression
overlapsE = Text -> Expression -> Expression -> Expression
ExpressionBinOp Text
"OVERLAPS"

  notE :: Expression -> Expression
notE = Text -> Expression -> Expression
ExpressionUnOp Text
"NOT"
  negateE :: Expression -> Expression
negateE = Text -> Expression -> Expression
ExpressionUnOp Text
"-"

  charLengthE :: Expression -> Expression
charLengthE = Expression -> Expression
ExpressionCharLength
  octetLengthE :: Expression -> Expression
octetLengthE = Expression -> Expression
ExpressionOctetLength
  bitLengthE :: Expression -> Expression
bitLengthE = Expression -> Expression
ExpressionBitLength
  absE :: Expression -> Expression
absE = Expression -> Expression
ExpressionAbs
  lowerE :: Expression -> Expression
lowerE = Expression -> Expression
ExpressionLower
  upperE :: Expression -> Expression
upperE = Expression -> Expression
ExpressionUpper
  trimE :: Expression -> Expression
trimE = Expression -> Expression
ExpressionTrim

  subqueryE :: Sql92ExpressionSelectSyntax Expression -> Expression
subqueryE = Select -> Expression
ExpressionSubquery
  uniqueE :: Sql92ExpressionSelectSyntax Expression -> Expression
uniqueE = Select -> Expression
ExpressionUnique
  existsE :: Sql92ExpressionSelectSyntax Expression -> Expression
existsE = Select -> Expression
ExpressionExists

  currentTimestampE :: Expression
currentTimestampE = Expression
ExpressionCurrentTimestamp

  defaultE :: Expression
defaultE = Expression
ExpressionDefault
  inE :: Expression -> [Expression] -> Expression
inE = Expression -> [Expression] -> Expression
ExpressionIn
  inSelectE :: Expression -> Sql92ExpressionSelectSyntax Expression -> Expression
inSelectE = Expression -> Select -> Expression
ExpressionInSelect

instance IsSql99FunctionExpressionSyntax Expression where
  functionNameE :: Text -> Expression
functionNameE = Text -> Expression
ExpressionNamedFunction
  functionCallE :: Expression -> [Expression] -> Expression
functionCallE = Expression -> [Expression] -> Expression
ExpressionFunctionCall

instance IsSql99ExpressionSyntax Expression where
  distinctE :: Sql92ExpressionSelectSyntax Expression -> Expression
distinctE = Select -> Expression
ExpressionDistinct
  similarToE :: Expression -> Expression -> Expression
similarToE = Text -> Expression -> Expression -> Expression
ExpressionBinOp Text
"SIMILAR TO"
  instanceFieldE :: Expression -> Text -> Expression
instanceFieldE = Expression -> Text -> Expression
ExpressionInstanceField
  refFieldE :: Expression -> Text -> Expression
refFieldE = Expression -> Text -> Expression
ExpressionRefField

instance IsSql92AggregationExpressionSyntax Expression where
  type Sql92AggregationSetQuantifierSyntax Expression = SetQuantifier

  countAllE :: Expression
countAllE = Expression
ExpressionCountAll
  countE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
countE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"COUNT" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  sumE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
sumE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q   = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"SUM" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  minE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
minE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q   = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"MIN" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  maxE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
maxE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q   = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"MAX" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  avgE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
avgE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q   = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"AVG" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure

instance IsSql99AggregationExpressionSyntax Expression where
  everyE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
everyE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"EVERY" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  someE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
someE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q  = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"SOME" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  anyE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
anyE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q   = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"ANY" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure

instance IsSql2003EnhancedNumericFunctionsExpressionSyntax Expression where
  lnE :: Expression -> Expression
lnE    = Text -> [Expression] -> Expression
ExpressionBuiltinFunction Text
"LN" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  expE :: Expression -> Expression
expE   = Text -> [Expression] -> Expression
ExpressionBuiltinFunction Text
"EXP" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  sqrtE :: Expression -> Expression
sqrtE  = Text -> [Expression] -> Expression
ExpressionBuiltinFunction Text
"SQRT" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  ceilE :: Expression -> Expression
ceilE  = Text -> [Expression] -> Expression
ExpressionBuiltinFunction Text
"CEIL" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  floorE :: Expression -> Expression
floorE = Text -> [Expression] -> Expression
ExpressionBuiltinFunction Text
"FLOOR" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  powerE :: Expression -> Expression -> Expression
powerE Expression
a Expression
b = Text -> [Expression] -> Expression
ExpressionBuiltinFunction Text
"POWER" [Expression
a, Expression
b]

instance IsSql2003EnhancedNumericFunctionsAggregationExpressionSyntax Expression where
  stddevPopE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
stddevPopE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q  = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"STDDEV_POP" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  stddevSampE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
stddevSampE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"STDDEV_SAMP" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  varPopE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
varPopE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q     = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"VAR_POP" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
  varSampE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression
varSampE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q    = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"VAR_SAMP" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure

  covarPopE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
covarPopE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b      = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"COVAR_POP" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]
  covarSampE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
covarSampE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b     = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"COVAR_SAMP" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]
  corrE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
corrE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b          = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"CORR" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]
  regrSlopeE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
regrSlopeE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b     = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"REGR_SLOPE" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]
  regrInterceptE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
regrInterceptE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"REGR_INTERCEPT" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]
  regrCountE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
regrCountE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b     = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"REGR_COUNT" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]
  regrRSquaredE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
regrRSquaredE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b  = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"REGR_R2" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]
  regrAvgXE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
regrAvgXE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b      = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"REGR_AVGX" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]
  regrAvgYE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
regrAvgYE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b      = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"REGR_AVGY" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]
  regrSXXE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
regrSXXE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b       = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"REGR_SXX" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]
  regrSXYE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
regrSXYE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b       = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"REGR_SXY" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]
  regrSYYE :: Maybe (Sql92AggregationSetQuantifierSyntax Expression)
-> Expression -> Expression -> Expression
regrSYYE Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q Expression
a Expression
b       = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"REGR_SYY" Maybe (Sql92AggregationSetQuantifierSyntax Expression)
q [Expression
a, Expression
b]

instance IsSql2003NtileExpressionSyntax Expression where
  ntileE :: Expression -> Expression
ntileE = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"NTILE" forall a. Maybe a
Nothing forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure

instance IsSql2003LeadAndLagExpressionSyntax Expression where
  leadE :: Expression -> Maybe Expression -> Maybe Expression -> Expression
leadE Expression
x Maybe Expression
Nothing Maybe Expression
Nothing   = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"LEAD" forall a. Maybe a
Nothing [Expression
x]
  leadE Expression
x (Just Expression
y) Maybe Expression
Nothing  = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"LEAD" forall a. Maybe a
Nothing [Expression
x, Expression
y]
  leadE Expression
x (Just Expression
y) (Just Expression
z) = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"LEAD" forall a. Maybe a
Nothing [Expression
x, Expression
y, Expression
z]
  leadE Expression
x Maybe Expression
Nothing (Just Expression
z)  = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"LEAD" forall a. Maybe a
Nothing [Expression
x, Value -> Expression
ExpressionValue (forall a. (Show a, Eq a, Typeable a) => a -> Value
Value (Int
1 :: Int)), Expression
z]

  lagE :: Expression -> Maybe Expression -> Maybe Expression -> Expression
lagE Expression
x Maybe Expression
Nothing Maybe Expression
Nothing  = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"LAG" forall a. Maybe a
Nothing [Expression
x]
  lagE Expression
x (Just Expression
y) Maybe Expression
Nothing = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"LAG" forall a. Maybe a
Nothing [Expression
x, Expression
y]
  lagE Expression
x (Just Expression
y) (Just Expression
z) = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"LAG" forall a. Maybe a
Nothing [Expression
x, Expression
y, Expression
z]
  lagE Expression
x Maybe Expression
Nothing (Just Expression
z)  = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"LAG" forall a. Maybe a
Nothing [Expression
x, Value -> Expression
ExpressionValue (forall a. (Show a, Eq a, Typeable a) => a -> Value
Value (Int
1 :: Int)), Expression
z]

instance IsSql2003NthValueExpressionSyntax Expression where
  nthValueE :: Expression -> Expression -> Expression
nthValueE Expression
a Expression
b = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"NTH_VALUE" forall a. Maybe a
Nothing [Expression
a, Expression
b]

instance IsSql2003ExpressionSyntax Expression where
  type Sql2003ExpressionWindowFrameSyntax Expression = WindowFrame

  overE :: Expression
-> Sql2003ExpressionWindowFrameSyntax Expression -> Expression
overE = Expression -> WindowFrame -> Expression
ExpressionOver
  rowNumberE :: Expression
rowNumberE = Text -> Maybe SetQuantifier -> [Expression] -> Expression
ExpressionAgg Text
"ROW_NUMBER" forall a. Maybe a
Nothing []

newtype Projection
  = ProjExprs [ (Expression, Maybe Text ) ]
  deriving (Int -> Projection -> ShowS
[Projection] -> ShowS
Projection -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Projection] -> ShowS
$cshowList :: [Projection] -> ShowS
show :: Projection -> String
$cshow :: Projection -> String
showsPrec :: Int -> Projection -> ShowS
$cshowsPrec :: Int -> Projection -> ShowS
Show, Projection -> Projection -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Projection -> Projection -> Bool
$c/= :: Projection -> Projection -> Bool
== :: Projection -> Projection -> Bool
$c== :: Projection -> Projection -> Bool
Eq)

instance IsSql92ProjectionSyntax Projection where
  type Sql92ProjectionExpressionSyntax Projection = Expression

  projExprs :: [(Sql92ProjectionExpressionSyntax Projection, Maybe Text)]
-> Projection
projExprs = [(Expression, Maybe Text)] -> Projection
ProjExprs

data Ordering
  = OrderingAsc Expression
  | OrderingDesc Expression
  deriving (Int -> Ordering -> ShowS
[Ordering] -> ShowS
Ordering -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Ordering] -> ShowS
$cshowList :: [Ordering] -> ShowS
show :: Ordering -> String
$cshow :: Ordering -> String
showsPrec :: Int -> Ordering -> ShowS
$cshowsPrec :: Int -> Ordering -> ShowS
Show, Ordering -> Ordering -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Ordering -> Ordering -> Bool
$c/= :: Ordering -> Ordering -> Bool
== :: Ordering -> Ordering -> Bool
$c== :: Ordering -> Ordering -> Bool
Eq)

instance IsSql92OrderingSyntax Ordering where
  type Sql92OrderingExpressionSyntax Ordering = Expression

  ascOrdering :: Sql92OrderingExpressionSyntax Ordering -> Ordering
ascOrdering = Expression -> Ordering
OrderingAsc
  descOrdering :: Sql92OrderingExpressionSyntax Ordering -> Ordering
descOrdering = Expression -> Ordering
OrderingDesc

newtype Grouping = Grouping [ Expression ] deriving (Int -> Grouping -> ShowS
[Grouping] -> ShowS
Grouping -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Grouping] -> ShowS
$cshowList :: [Grouping] -> ShowS
show :: Grouping -> String
$cshow :: Grouping -> String
showsPrec :: Int -> Grouping -> ShowS
$cshowsPrec :: Int -> Grouping -> ShowS
Show, Grouping -> Grouping -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Grouping -> Grouping -> Bool
$c/= :: Grouping -> Grouping -> Bool
== :: Grouping -> Grouping -> Bool
$c== :: Grouping -> Grouping -> Bool
Eq)

instance IsSql92GroupingSyntax Grouping where
  type Sql92GroupingExpressionSyntax Grouping = Expression

  groupByExpressions :: [Sql92GroupingExpressionSyntax Grouping] -> Grouping
groupByExpressions = [Expression] -> Grouping
Grouping

data TableName = TableName (Maybe Text) Text
  deriving (Int -> TableName -> ShowS
[TableName] -> ShowS
TableName -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TableName] -> ShowS
$cshowList :: [TableName] -> ShowS
show :: TableName -> String
$cshow :: TableName -> String
showsPrec :: Int -> TableName -> ShowS
$cshowsPrec :: Int -> TableName -> ShowS
Show, TableName -> TableName -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TableName -> TableName -> Bool
$c/= :: TableName -> TableName -> Bool
== :: TableName -> TableName -> Bool
$c== :: TableName -> TableName -> Bool
Eq, Eq TableName
TableName -> TableName -> Bool
TableName -> TableName -> Ordering
TableName -> TableName -> TableName
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: TableName -> TableName -> TableName
$cmin :: TableName -> TableName -> TableName
max :: TableName -> TableName -> TableName
$cmax :: TableName -> TableName -> TableName
>= :: TableName -> TableName -> Bool
$c>= :: TableName -> TableName -> Bool
> :: TableName -> TableName -> Bool
$c> :: TableName -> TableName -> Bool
<= :: TableName -> TableName -> Bool
$c<= :: TableName -> TableName -> Bool
< :: TableName -> TableName -> Bool
$c< :: TableName -> TableName -> Bool
compare :: TableName -> TableName -> Ordering
$ccompare :: TableName -> TableName -> Ordering
Ord)

instance IsSql92TableNameSyntax TableName where
  tableName :: Maybe Text -> Text -> TableName
tableName = Maybe Text -> Text -> TableName
TableName

data TableSource
  = TableNamed TableName
  | TableFromSubSelect Select
  | TableFromValues [ [ Expression ] ]
  deriving (Int -> TableSource -> ShowS
[TableSource] -> ShowS
TableSource -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TableSource] -> ShowS
$cshowList :: [TableSource] -> ShowS
show :: TableSource -> String
$cshow :: TableSource -> String
showsPrec :: Int -> TableSource -> ShowS
$cshowsPrec :: Int -> TableSource -> ShowS
Show, TableSource -> TableSource -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TableSource -> TableSource -> Bool
$c/= :: TableSource -> TableSource -> Bool
== :: TableSource -> TableSource -> Bool
$c== :: TableSource -> TableSource -> Bool
Eq)

instance IsSql92TableSourceSyntax TableSource where
  type Sql92TableSourceSelectSyntax TableSource = Select
  type Sql92TableSourceExpressionSyntax TableSource = Expression
  type Sql92TableSourceTableNameSyntax TableSource = TableName

  tableNamed :: Sql92TableSourceTableNameSyntax TableSource -> TableSource
tableNamed = TableName -> TableSource
TableNamed
  tableFromSubSelect :: Sql92TableSourceSelectSyntax TableSource -> TableSource
tableFromSubSelect = Select -> TableSource
TableFromSubSelect
  tableFromValues :: [[Sql92TableSourceExpressionSyntax TableSource]] -> TableSource
tableFromValues = [[Expression]] -> TableSource
TableFromValues

data From
  = FromTable TableSource (Maybe (Text, Maybe [Text]))
  | InnerJoin From From (Maybe Expression)
  | LeftJoin From From (Maybe Expression)
  | RightJoin From From (Maybe Expression)
  | OuterJoin From From (Maybe Expression)
  deriving (Int -> From -> ShowS
[From] -> ShowS
From -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [From] -> ShowS
$cshowList :: [From] -> ShowS
show :: From -> String
$cshow :: From -> String
showsPrec :: Int -> From -> ShowS
$cshowsPrec :: Int -> From -> ShowS
Show, From -> From -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: From -> From -> Bool
$c/= :: From -> From -> Bool
== :: From -> From -> Bool
$c== :: From -> From -> Bool
Eq)

instance IsSql92FromSyntax From where
  type Sql92FromTableSourceSyntax From = TableSource
  type Sql92FromExpressionSyntax From = Expression

  fromTable :: Sql92FromTableSourceSyntax From
-> Maybe (Text, Maybe [Text]) -> From
fromTable = TableSource -> Maybe (Text, Maybe [Text]) -> From
FromTable
  innerJoin :: From -> From -> Maybe (Sql92FromExpressionSyntax From) -> From
innerJoin = From -> From -> Maybe Expression -> From
InnerJoin
  leftJoin :: From -> From -> Maybe (Sql92FromExpressionSyntax From) -> From
leftJoin = From -> From -> Maybe Expression -> From
LeftJoin
  rightJoin :: From -> From -> Maybe (Sql92FromExpressionSyntax From) -> From
rightJoin = From -> From -> Maybe Expression -> From
RightJoin

data Value where
  Value :: (Show a, Eq a, Typeable a) => a -> Value

#define VALUE_SYNTAX_INSTANCE(ty) instance HasSqlValueSyntax Value ty where { sqlValueSyntax = Value }
VALUE_SYNTAX_INSTANCE(Int16)
VALUE_SYNTAX_INSTANCE(Int32)
VALUE_SYNTAX_INSTANCE(Int64)
VALUE_SYNTAX_INSTANCE(Word16)
VALUE_SYNTAX_INSTANCE(Word32)
VALUE_SYNTAX_INSTANCE(Word64)
VALUE_SYNTAX_INSTANCE(Integer)
VALUE_SYNTAX_INSTANCE(String)
VALUE_SYNTAX_INSTANCE(Text)
VALUE_SYNTAX_INSTANCE(ByteString)
VALUE_SYNTAX_INSTANCE(LocalTime)
VALUE_SYNTAX_INSTANCE(UTCTime)
VALUE_SYNTAX_INSTANCE(Day)
VALUE_SYNTAX_INSTANCE(TimeOfDay)
VALUE_SYNTAX_INSTANCE(SqlNull)
VALUE_SYNTAX_INSTANCE(Double)
VALUE_SYNTAX_INSTANCE(Bool)

instance TypeError (PreferExplicitSize Int Int32) => HasSqlValueSyntax Value Int where
  sqlValueSyntax :: Int -> Value
sqlValueSyntax = forall a. (Show a, Eq a, Typeable a) => a -> Value
Value

instance TypeError (PreferExplicitSize Word Word32) => HasSqlValueSyntax Value Word where
  sqlValueSyntax :: Word -> Value
sqlValueSyntax = forall a. (Show a, Eq a, Typeable a) => a -> Value
Value

instance HasSqlValueSyntax Value x => HasSqlValueSyntax Value (Maybe x) where
  sqlValueSyntax :: Maybe x -> Value
sqlValueSyntax (Just x
x) = forall expr ty. HasSqlValueSyntax expr ty => ty -> expr
sqlValueSyntax x
x
  sqlValueSyntax Maybe x
Nothing = forall expr ty. HasSqlValueSyntax expr ty => ty -> expr
sqlValueSyntax SqlNull
SqlNull

instance Eq Value where
  Value a
a == :: Value -> Value -> Bool
== Value a
b =
    case forall a b. (Typeable a, Typeable b) => a -> Maybe b
cast a
a of
      Just a
a' -> a
a' forall a. Eq a => a -> a -> Bool
== a
b
      Maybe a
Nothing -> Bool
False
instance Show Value where
  showsPrec :: Int -> Value -> ShowS
showsPrec Int
prec (Value a
a) =
    Bool -> ShowS -> ShowS
showParen (Int
prec forall a. Ord a => a -> a -> Bool
> Int
app_prec) forall a b. (a -> b) -> a -> b
$
    (String
"Value " forall a. [a] -> [a] -> [a]
++ )forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    forall a. Show a => Int -> a -> ShowS
showsPrec (Int
app_prec forall a. Num a => a -> a -> a
+ Int
1) a
a
    where app_prec :: Int
app_prec = Int
10

-- Window functions

data WindowFrame
  = WindowFrame
  { WindowFrame -> Maybe [Expression]
windowFramePartitions :: Maybe [Expression]
  , WindowFrame -> Maybe [Ordering]
windowFrameOrdering   ::  Maybe [Ordering]
  , WindowFrame -> Maybe WindowFrameBounds
windowFrameBounds     :: Maybe WindowFrameBounds
  } deriving (Int -> WindowFrame -> ShowS
[WindowFrame] -> ShowS
WindowFrame -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [WindowFrame] -> ShowS
$cshowList :: [WindowFrame] -> ShowS
show :: WindowFrame -> String
$cshow :: WindowFrame -> String
showsPrec :: Int -> WindowFrame -> ShowS
$cshowsPrec :: Int -> WindowFrame -> ShowS
Show, WindowFrame -> WindowFrame -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: WindowFrame -> WindowFrame -> Bool
$c/= :: WindowFrame -> WindowFrame -> Bool
== :: WindowFrame -> WindowFrame -> Bool
$c== :: WindowFrame -> WindowFrame -> Bool
Eq)

instance IsSql2003WindowFrameSyntax WindowFrame where
  type Sql2003WindowFrameExpressionSyntax WindowFrame = Expression
  type Sql2003WindowFrameOrderingSyntax WindowFrame = Ordering
  type Sql2003WindowFrameBoundsSyntax WindowFrame = WindowFrameBounds

  frameSyntax :: Maybe [Sql2003WindowFrameExpressionSyntax WindowFrame]
-> Maybe [Sql2003WindowFrameOrderingSyntax WindowFrame]
-> Maybe (Sql2003WindowFrameBoundsSyntax WindowFrame)
-> WindowFrame
frameSyntax = Maybe [Expression]
-> Maybe [Ordering] -> Maybe WindowFrameBounds -> WindowFrame
WindowFrame

data WindowFrameBounds
  = WindowFrameBounds
  { WindowFrameBounds -> WindowFrameBound
boundsFrom :: WindowFrameBound
  , WindowFrameBounds -> Maybe WindowFrameBound
boundsTo   :: Maybe WindowFrameBound
  } deriving (Int -> WindowFrameBounds -> ShowS
[WindowFrameBounds] -> ShowS
WindowFrameBounds -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [WindowFrameBounds] -> ShowS
$cshowList :: [WindowFrameBounds] -> ShowS
show :: WindowFrameBounds -> String
$cshow :: WindowFrameBounds -> String
showsPrec :: Int -> WindowFrameBounds -> ShowS
$cshowsPrec :: Int -> WindowFrameBounds -> ShowS
Show, WindowFrameBounds -> WindowFrameBounds -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: WindowFrameBounds -> WindowFrameBounds -> Bool
$c/= :: WindowFrameBounds -> WindowFrameBounds -> Bool
== :: WindowFrameBounds -> WindowFrameBounds -> Bool
$c== :: WindowFrameBounds -> WindowFrameBounds -> Bool
Eq)

instance IsSql2003WindowFrameBoundsSyntax WindowFrameBounds where
  type Sql2003WindowFrameBoundsBoundSyntax WindowFrameBounds = WindowFrameBound

  fromToBoundSyntax :: Sql2003WindowFrameBoundsBoundSyntax WindowFrameBounds
-> Maybe (Sql2003WindowFrameBoundsBoundSyntax WindowFrameBounds)
-> WindowFrameBounds
fromToBoundSyntax = WindowFrameBound -> Maybe WindowFrameBound -> WindowFrameBounds
WindowFrameBounds

data WindowFrameBound
  = WindowFrameUnbounded
  | WindowFrameBoundNRows Int
  deriving (Int -> WindowFrameBound -> ShowS
[WindowFrameBound] -> ShowS
WindowFrameBound -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [WindowFrameBound] -> ShowS
$cshowList :: [WindowFrameBound] -> ShowS
show :: WindowFrameBound -> String
$cshow :: WindowFrameBound -> String
showsPrec :: Int -> WindowFrameBound -> ShowS
$cshowsPrec :: Int -> WindowFrameBound -> ShowS
Show, WindowFrameBound -> WindowFrameBound -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: WindowFrameBound -> WindowFrameBound -> Bool
$c/= :: WindowFrameBound -> WindowFrameBound -> Bool
== :: WindowFrameBound -> WindowFrameBound -> Bool
$c== :: WindowFrameBound -> WindowFrameBound -> Bool
Eq)

instance IsSql2003WindowFrameBoundSyntax WindowFrameBound where
  unboundedSyntax :: WindowFrameBound
unboundedSyntax = WindowFrameBound
WindowFrameUnbounded
  nrowsBoundSyntax :: Int -> WindowFrameBound
nrowsBoundSyntax = Int -> WindowFrameBound
WindowFrameBoundNRows