{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE CPP #-}

-- | DDL syntax instances for 'SqlSyntaxBuilder'
module Database.Beam.Migrate.SQL.Builder where

import           Database.Beam.Backend.SQL
import           Database.Beam.Backend.SQL.Builder
import           Database.Beam.Migrate.SQL
import           Database.Beam.Migrate.Serialization

import           Control.Applicative

import           Data.ByteString.Builder (Builder, byteString, toLazyByteString)
import qualified Data.ByteString.Lazy.Char8 as BCL
#if !MIN_VERSION_base(4, 11, 0)
import           Data.Semigroup
#endif


-- | Options for @CREATE TABLE@. Given as a separate ADT because the options may
-- go in different places syntactically.
--
-- You never really need to use this type directly.
data SqlSyntaxBuilderCreateTableOptions
    = SqlSyntaxBuilderCreateTableOptions
        SqlSyntaxBuilder
        SqlSyntaxBuilder
    deriving SqlSyntaxBuilderCreateTableOptions
-> SqlSyntaxBuilderCreateTableOptions -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SqlSyntaxBuilderCreateTableOptions
-> SqlSyntaxBuilderCreateTableOptions -> Bool
$c/= :: SqlSyntaxBuilderCreateTableOptions
-> SqlSyntaxBuilderCreateTableOptions -> Bool
== :: SqlSyntaxBuilderCreateTableOptions
-> SqlSyntaxBuilderCreateTableOptions -> Bool
$c== :: SqlSyntaxBuilderCreateTableOptions
-> SqlSyntaxBuilderCreateTableOptions -> Bool
Eq

instance IsSql92DdlCommandSyntax SqlSyntaxBuilder where
  type Sql92DdlCommandCreateTableSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92DdlCommandDropTableSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92DdlCommandAlterTableSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  createTableCmd :: Sql92DdlCommandCreateTableSyntax SqlSyntaxBuilder
-> SqlSyntaxBuilder
createTableCmd = forall a. a -> a
id
  alterTableCmd :: Sql92DdlCommandAlterTableSyntax SqlSyntaxBuilder
-> SqlSyntaxBuilder
alterTableCmd = forall a. a -> a
id
  dropTableCmd :: Sql92DdlCommandDropTableSyntax SqlSyntaxBuilder -> SqlSyntaxBuilder
dropTableCmd = forall a. a -> a
id

instance IsSql92DropTableSyntax SqlSyntaxBuilder where
  type Sql92DropTableTableNameSyntax SqlSyntaxBuilder = SqlSyntaxBuilder

  dropTableSyntax :: Sql92DropTableTableNameSyntax SqlSyntaxBuilder -> SqlSyntaxBuilder
dropTableSyntax Sql92DropTableTableNameSyntax SqlSyntaxBuilder
tblNm =
    Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
    ByteString -> Builder
byteString ByteString
"DROP TABLE " forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql Sql92DropTableTableNameSyntax SqlSyntaxBuilder
tblNm

instance IsSql92AlterTableSyntax SqlSyntaxBuilder where
  type Sql92AlterTableTableNameSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92AlterTableAlterTableActionSyntax SqlSyntaxBuilder = SqlSyntaxBuilder

  alterTableSyntax :: Sql92AlterTableTableNameSyntax SqlSyntaxBuilder
-> Sql92AlterTableAlterTableActionSyntax SqlSyntaxBuilder
-> SqlSyntaxBuilder
alterTableSyntax Sql92AlterTableTableNameSyntax SqlSyntaxBuilder
tblNm Sql92AlterTableAlterTableActionSyntax SqlSyntaxBuilder
action =
    Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
    ByteString -> Builder
byteString ByteString
"ALTER TABLE " forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql Sql92AlterTableTableNameSyntax SqlSyntaxBuilder
tblNm forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
byteString ByteString
" " forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql Sql92AlterTableAlterTableActionSyntax SqlSyntaxBuilder
action

instance IsSql92AlterTableActionSyntax SqlSyntaxBuilder where
  type Sql92AlterTableAlterColumnActionSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92AlterTableColumnSchemaSyntax SqlSyntaxBuilder = SqlSyntaxBuilder

  alterColumnSyntax :: Text
-> Sql92AlterTableAlterColumnActionSyntax SqlSyntaxBuilder
-> SqlSyntaxBuilder
alterColumnSyntax Text
colNm Sql92AlterTableAlterColumnActionSyntax SqlSyntaxBuilder
action =
    Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
    ByteString -> Builder
byteString ByteString
"ALTER COLUMN " forall a. Semigroup a => a -> a -> a
<> Text -> Builder
quoteSql Text
colNm forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
byteString ByteString
" " forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql Sql92AlterTableAlterColumnActionSyntax SqlSyntaxBuilder
action

  addColumnSyntax :: Text
-> Sql92AlterTableColumnSchemaSyntax SqlSyntaxBuilder
-> SqlSyntaxBuilder
addColumnSyntax Text
colNm Sql92AlterTableColumnSchemaSyntax SqlSyntaxBuilder
colSchema =
    Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
    ByteString -> Builder
byteString ByteString
"ADD COLUMN " forall a. Semigroup a => a -> a -> a
<> Text -> Builder
quoteSql Text
colNm forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
byteString ByteString
" " forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql Sql92AlterTableColumnSchemaSyntax SqlSyntaxBuilder
colSchema
  dropColumnSyntax :: Text -> SqlSyntaxBuilder
dropColumnSyntax Text
colNm =
    Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
    ByteString -> Builder
byteString ByteString
"DROP COLUMN " forall a. Semigroup a => a -> a -> a
<> Text -> Builder
quoteSql Text
colNm

  renameColumnToSyntax :: Text -> Text -> SqlSyntaxBuilder
renameColumnToSyntax Text
oldNm Text
newNm =
    Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
    ByteString -> Builder
byteString ByteString
"RENAME COLUMN " forall a. Semigroup a => a -> a -> a
<> Text -> Builder
quoteSql Text
oldNm forall a. Semigroup a => a -> a -> a
<> Builder
" TO " forall a. Semigroup a => a -> a -> a
<> Text -> Builder
quoteSql Text
newNm
  renameTableToSyntax :: Text -> SqlSyntaxBuilder
renameTableToSyntax Text
newNm =
    Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
    ByteString -> Builder
byteString ByteString
"RENAME TO " forall a. Semigroup a => a -> a -> a
<> Text -> Builder
quoteSql Text
newNm

instance IsSql92AlterColumnActionSyntax SqlSyntaxBuilder where
  setNotNullSyntax :: SqlSyntaxBuilder
setNotNullSyntax = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder (ByteString -> Builder
byteString ByteString
"SET NOT NULL")
  setNullSyntax :: SqlSyntaxBuilder
setNullSyntax = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder (ByteString -> Builder
byteString ByteString
"DROP NOT NULL")

instance IsSql92CreateTableSyntax SqlSyntaxBuilder where
  type Sql92CreateTableTableNameSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92CreateTableColumnSchemaSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92CreateTableTableConstraintSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92CreateTableOptionsSyntax SqlSyntaxBuilder = SqlSyntaxBuilderCreateTableOptions

  createTableSyntax :: Maybe (Sql92CreateTableOptionsSyntax SqlSyntaxBuilder)
-> Sql92CreateTableTableNameSyntax SqlSyntaxBuilder
-> [(Text, Sql92CreateTableColumnSchemaSyntax SqlSyntaxBuilder)]
-> [Sql92CreateTableTableConstraintSyntax SqlSyntaxBuilder]
-> SqlSyntaxBuilder
createTableSyntax Maybe (Sql92CreateTableOptionsSyntax SqlSyntaxBuilder)
tableOptions Sql92CreateTableTableNameSyntax SqlSyntaxBuilder
tblName [(Text, Sql92CreateTableColumnSchemaSyntax SqlSyntaxBuilder)]
fieldSchemas [Sql92CreateTableTableConstraintSyntax SqlSyntaxBuilder]
constraints =
      Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
      ByteString -> Builder
byteString ByteString
"CREATE " forall a. Semigroup a => a -> a -> a
<>
      forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (\SqlSyntaxBuilder
b -> SqlSyntaxBuilder -> Builder
buildSql SqlSyntaxBuilder
b forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
byteString ByteString
" ") Maybe SqlSyntaxBuilder
beforeOptions forall a. Semigroup a => a -> a -> a
<>
      ByteString -> Builder
byteString ByteString
" TABLE " forall a. Semigroup a => a -> a -> a
<>

      SqlSyntaxBuilder -> Builder
buildSql Sql92CreateTableTableNameSyntax SqlSyntaxBuilder
tblName forall a. Semigroup a => a -> a -> a
<>

      ByteString -> Builder
byteString ByteString
"(" forall a. Semigroup a => a -> a -> a
<>
      Builder -> [Builder] -> Builder
buildSepBy (ByteString -> Builder
byteString ByteString
", ")
                 (forall a b. (a -> b) -> [a] -> [b]
map (\(Text
nm, SqlSyntaxBuilder
schema) -> Text -> Builder
quoteSql Text
nm forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
byteString ByteString
" " forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql SqlSyntaxBuilder
schema) [(Text, Sql92CreateTableColumnSchemaSyntax SqlSyntaxBuilder)]
fieldSchemas forall a. Semigroup a => a -> a -> a
<>
                  forall a b. (a -> b) -> [a] -> [b]
map SqlSyntaxBuilder -> Builder
buildSql [Sql92CreateTableTableConstraintSyntax SqlSyntaxBuilder]
constraints) forall a. Semigroup a => a -> a -> a
<>
      ByteString -> Builder
byteString ByteString
")" forall a. Semigroup a => a -> a -> a
<>

      forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (\SqlSyntaxBuilder
a -> SqlSyntaxBuilder -> Builder
buildSql SqlSyntaxBuilder
a forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
byteString ByteString
" ") Maybe SqlSyntaxBuilder
afterOptions

    where
      (Maybe SqlSyntaxBuilder
beforeOptions, Maybe SqlSyntaxBuilder
afterOptions) =
          case Maybe (Sql92CreateTableOptionsSyntax SqlSyntaxBuilder)
tableOptions of
            Just (SqlSyntaxBuilderCreateTableOptions SqlSyntaxBuilder
b SqlSyntaxBuilder
a) -> (forall a. a -> Maybe a
Just SqlSyntaxBuilder
b, forall a. a -> Maybe a
Just SqlSyntaxBuilder
a)
            Maybe (Sql92CreateTableOptionsSyntax SqlSyntaxBuilder)
Nothing -> (forall a. Maybe a
Nothing, forall a. Maybe a
Nothing)

instance IsSql92TableConstraintSyntax SqlSyntaxBuilder where
  primaryKeyConstraintSyntax :: [Text] -> SqlSyntaxBuilder
primaryKeyConstraintSyntax [Text]
fs =
    Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
    ByteString -> Builder
byteString ByteString
"PRIMARY KEY(" forall a. Semigroup a => a -> a -> a
<> Builder -> [Builder] -> Builder
buildSepBy (ByteString -> Builder
byteString ByteString
", ") (forall a b. (a -> b) -> [a] -> [b]
map Text -> Builder
quoteSql [Text]
fs) forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
byteString ByteString
")"

-- | Some backends use this to represent their constraint attributes. Does not
-- need to be used in practice.
data ConstraintAttributeTiming = InitiallyDeferred | InitiallyImmediate
  deriving (Int -> ConstraintAttributeTiming -> ShowS
[ConstraintAttributeTiming] -> ShowS
ConstraintAttributeTiming -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ConstraintAttributeTiming] -> ShowS
$cshowList :: [ConstraintAttributeTiming] -> ShowS
show :: ConstraintAttributeTiming -> String
$cshow :: ConstraintAttributeTiming -> String
showsPrec :: Int -> ConstraintAttributeTiming -> ShowS
$cshowsPrec :: Int -> ConstraintAttributeTiming -> ShowS
Show, ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
$c/= :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
== :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
$c== :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
Eq, Eq ConstraintAttributeTiming
ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
ConstraintAttributeTiming -> ConstraintAttributeTiming -> Ordering
ConstraintAttributeTiming
-> ConstraintAttributeTiming -> ConstraintAttributeTiming
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 :: ConstraintAttributeTiming
-> ConstraintAttributeTiming -> ConstraintAttributeTiming
$cmin :: ConstraintAttributeTiming
-> ConstraintAttributeTiming -> ConstraintAttributeTiming
max :: ConstraintAttributeTiming
-> ConstraintAttributeTiming -> ConstraintAttributeTiming
$cmax :: ConstraintAttributeTiming
-> ConstraintAttributeTiming -> ConstraintAttributeTiming
>= :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
$c>= :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
> :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
$c> :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
<= :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
$c<= :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
< :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
$c< :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Bool
compare :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Ordering
$ccompare :: ConstraintAttributeTiming -> ConstraintAttributeTiming -> Ordering
Ord, Int -> ConstraintAttributeTiming
ConstraintAttributeTiming -> Int
ConstraintAttributeTiming -> [ConstraintAttributeTiming]
ConstraintAttributeTiming -> ConstraintAttributeTiming
ConstraintAttributeTiming
-> ConstraintAttributeTiming -> [ConstraintAttributeTiming]
ConstraintAttributeTiming
-> ConstraintAttributeTiming
-> ConstraintAttributeTiming
-> [ConstraintAttributeTiming]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: ConstraintAttributeTiming
-> ConstraintAttributeTiming
-> ConstraintAttributeTiming
-> [ConstraintAttributeTiming]
$cenumFromThenTo :: ConstraintAttributeTiming
-> ConstraintAttributeTiming
-> ConstraintAttributeTiming
-> [ConstraintAttributeTiming]
enumFromTo :: ConstraintAttributeTiming
-> ConstraintAttributeTiming -> [ConstraintAttributeTiming]
$cenumFromTo :: ConstraintAttributeTiming
-> ConstraintAttributeTiming -> [ConstraintAttributeTiming]
enumFromThen :: ConstraintAttributeTiming
-> ConstraintAttributeTiming -> [ConstraintAttributeTiming]
$cenumFromThen :: ConstraintAttributeTiming
-> ConstraintAttributeTiming -> [ConstraintAttributeTiming]
enumFrom :: ConstraintAttributeTiming -> [ConstraintAttributeTiming]
$cenumFrom :: ConstraintAttributeTiming -> [ConstraintAttributeTiming]
fromEnum :: ConstraintAttributeTiming -> Int
$cfromEnum :: ConstraintAttributeTiming -> Int
toEnum :: Int -> ConstraintAttributeTiming
$ctoEnum :: Int -> ConstraintAttributeTiming
pred :: ConstraintAttributeTiming -> ConstraintAttributeTiming
$cpred :: ConstraintAttributeTiming -> ConstraintAttributeTiming
succ :: ConstraintAttributeTiming -> ConstraintAttributeTiming
$csucc :: ConstraintAttributeTiming -> ConstraintAttributeTiming
Enum, ConstraintAttributeTiming
forall a. a -> a -> Bounded a
maxBound :: ConstraintAttributeTiming
$cmaxBound :: ConstraintAttributeTiming
minBound :: ConstraintAttributeTiming
$cminBound :: ConstraintAttributeTiming
Bounded)

-- | Valid 'IsSql92ConstraintAttributesSyntax' shared among some backends.
data SqlConstraintAttributesBuilder
  = SqlConstraintAttributesBuilder
  { SqlConstraintAttributesBuilder -> Maybe ConstraintAttributeTiming
_sqlConstraintAttributeTiming :: Maybe ConstraintAttributeTiming
  , SqlConstraintAttributesBuilder -> Maybe Bool
_sqlConstraintAttributeDeferrable :: Maybe Bool }
  deriving (Int -> SqlConstraintAttributesBuilder -> ShowS
[SqlConstraintAttributesBuilder] -> ShowS
SqlConstraintAttributesBuilder -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlConstraintAttributesBuilder] -> ShowS
$cshowList :: [SqlConstraintAttributesBuilder] -> ShowS
show :: SqlConstraintAttributesBuilder -> String
$cshow :: SqlConstraintAttributesBuilder -> String
showsPrec :: Int -> SqlConstraintAttributesBuilder -> ShowS
$cshowsPrec :: Int -> SqlConstraintAttributesBuilder -> ShowS
Show, SqlConstraintAttributesBuilder
-> SqlConstraintAttributesBuilder -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SqlConstraintAttributesBuilder
-> SqlConstraintAttributesBuilder -> Bool
$c/= :: SqlConstraintAttributesBuilder
-> SqlConstraintAttributesBuilder -> Bool
== :: SqlConstraintAttributesBuilder
-> SqlConstraintAttributesBuilder -> Bool
$c== :: SqlConstraintAttributesBuilder
-> SqlConstraintAttributesBuilder -> Bool
Eq)

instance Semigroup SqlConstraintAttributesBuilder where
  <> :: SqlConstraintAttributesBuilder
-> SqlConstraintAttributesBuilder -> SqlConstraintAttributesBuilder
(<>) = forall a. Monoid a => a -> a -> a
mappend

instance Monoid SqlConstraintAttributesBuilder where
  mempty :: SqlConstraintAttributesBuilder
mempty = Maybe ConstraintAttributeTiming
-> Maybe Bool -> SqlConstraintAttributesBuilder
SqlConstraintAttributesBuilder forall a. Maybe a
Nothing forall a. Maybe a
Nothing
  mappend :: SqlConstraintAttributesBuilder
-> SqlConstraintAttributesBuilder -> SqlConstraintAttributesBuilder
mappend SqlConstraintAttributesBuilder
a SqlConstraintAttributesBuilder
b =
    Maybe ConstraintAttributeTiming
-> Maybe Bool -> SqlConstraintAttributesBuilder
SqlConstraintAttributesBuilder
      (SqlConstraintAttributesBuilder -> Maybe ConstraintAttributeTiming
_sqlConstraintAttributeTiming SqlConstraintAttributesBuilder
b forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> SqlConstraintAttributesBuilder -> Maybe ConstraintAttributeTiming
_sqlConstraintAttributeTiming SqlConstraintAttributesBuilder
a)
      (SqlConstraintAttributesBuilder -> Maybe Bool
_sqlConstraintAttributeDeferrable SqlConstraintAttributesBuilder
b forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> SqlConstraintAttributesBuilder -> Maybe Bool
_sqlConstraintAttributeDeferrable SqlConstraintAttributesBuilder
a)

-- | Convert a 'SqlConstraintAttributesBuilder' to its @SQL92@ representation in
-- the returned 'ByteString' 'Builder'.
fromSqlConstraintAttributes :: SqlConstraintAttributesBuilder -> Builder
fromSqlConstraintAttributes :: SqlConstraintAttributesBuilder -> Builder
fromSqlConstraintAttributes (SqlConstraintAttributesBuilder Maybe ConstraintAttributeTiming
timing Maybe Bool
deferrable) =
  forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty ConstraintAttributeTiming -> Builder
timingBuilder Maybe ConstraintAttributeTiming
timing forall a. Semigroup a => a -> a -> a
<> forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty Bool -> Builder
deferrableBuilder Maybe Bool
deferrable
  where timingBuilder :: ConstraintAttributeTiming -> Builder
timingBuilder ConstraintAttributeTiming
InitiallyDeferred = ByteString -> Builder
byteString ByteString
"INITIALLY DEFERRED"
        timingBuilder ConstraintAttributeTiming
InitiallyImmediate = ByteString -> Builder
byteString ByteString
"INITIALLY IMMEDIATE"
        deferrableBuilder :: Bool -> Builder
deferrableBuilder Bool
False = ByteString -> Builder
byteString ByteString
"NOT DEFERRABLE"
        deferrableBuilder Bool
True = ByteString -> Builder
byteString ByteString
"DEFERRABLE"

-- | Serialize a 'SqlConstraintAttributesBuilder'
sqlConstraintAttributesSerialized :: SqlConstraintAttributesBuilder -> BeamSerializedConstraintAttributes
sqlConstraintAttributesSerialized :: SqlConstraintAttributesBuilder
-> BeamSerializedConstraintAttributes
sqlConstraintAttributesSerialized (SqlConstraintAttributesBuilder Maybe ConstraintAttributeTiming
timing Maybe Bool
deferrable) =
  forall a. Monoid a => [a] -> a
mconcat [ forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty forall {attrs}.
IsSql92ConstraintAttributesSyntax attrs =>
ConstraintAttributeTiming -> attrs
serializeTiming Maybe ConstraintAttributeTiming
timing
          , forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty forall {attrs}.
IsSql92ConstraintAttributesSyntax attrs =>
Bool -> attrs
serializeDeferrable Maybe Bool
deferrable ]

  where
    serializeTiming :: ConstraintAttributeTiming -> attrs
serializeTiming ConstraintAttributeTiming
InitiallyDeferred = forall attrs. IsSql92ConstraintAttributesSyntax attrs => attrs
initiallyDeferredAttributeSyntax
    serializeTiming ConstraintAttributeTiming
InitiallyImmediate = forall attrs. IsSql92ConstraintAttributesSyntax attrs => attrs
initiallyImmediateAttributeSyntax

    serializeDeferrable :: Bool -> attrs
serializeDeferrable Bool
True = forall attrs. IsSql92ConstraintAttributesSyntax attrs => attrs
deferrableAttributeSyntax
    serializeDeferrable Bool
False = forall attrs. IsSql92ConstraintAttributesSyntax attrs => attrs
notDeferrableAttributeSyntax

instance IsSql92ConstraintAttributesSyntax SqlConstraintAttributesBuilder where
  initiallyDeferredAttributeSyntax :: SqlConstraintAttributesBuilder
initiallyDeferredAttributeSyntax = Maybe ConstraintAttributeTiming
-> Maybe Bool -> SqlConstraintAttributesBuilder
SqlConstraintAttributesBuilder (forall a. a -> Maybe a
Just ConstraintAttributeTiming
InitiallyDeferred) forall a. Maybe a
Nothing
  initiallyImmediateAttributeSyntax :: SqlConstraintAttributesBuilder
initiallyImmediateAttributeSyntax = Maybe ConstraintAttributeTiming
-> Maybe Bool -> SqlConstraintAttributesBuilder
SqlConstraintAttributesBuilder (forall a. a -> Maybe a
Just ConstraintAttributeTiming
InitiallyImmediate) forall a. Maybe a
Nothing
  deferrableAttributeSyntax :: SqlConstraintAttributesBuilder
deferrableAttributeSyntax = Maybe ConstraintAttributeTiming
-> Maybe Bool -> SqlConstraintAttributesBuilder
SqlConstraintAttributesBuilder forall a. Maybe a
Nothing (forall a. a -> Maybe a
Just Bool
True)
  notDeferrableAttributeSyntax :: SqlConstraintAttributesBuilder
notDeferrableAttributeSyntax = Maybe ConstraintAttributeTiming
-> Maybe Bool -> SqlConstraintAttributesBuilder
SqlConstraintAttributesBuilder forall a. Maybe a
Nothing (forall a. a -> Maybe a
Just Bool
False)

instance IsSql92ColumnSchemaSyntax SqlSyntaxBuilder where
  type Sql92ColumnSchemaColumnConstraintDefinitionSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92ColumnSchemaColumnTypeSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92ColumnSchemaExpressionSyntax SqlSyntaxBuilder = SqlSyntaxBuilder

  columnSchemaSyntax :: Sql92ColumnSchemaColumnTypeSyntax SqlSyntaxBuilder
-> Maybe (Sql92ColumnSchemaExpressionSyntax SqlSyntaxBuilder)
-> [Sql92ColumnSchemaColumnConstraintDefinitionSyntax
      SqlSyntaxBuilder]
-> Maybe Text
-> SqlSyntaxBuilder
columnSchemaSyntax Sql92ColumnSchemaColumnTypeSyntax SqlSyntaxBuilder
type_ Maybe (Sql92ColumnSchemaExpressionSyntax SqlSyntaxBuilder)
default_ [Sql92ColumnSchemaColumnConstraintDefinitionSyntax
   SqlSyntaxBuilder]
constraints Maybe Text
collation =
    Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
    SqlSyntaxBuilder -> Builder
buildSql Sql92ColumnSchemaColumnTypeSyntax SqlSyntaxBuilder
type_ forall a. Semigroup a => a -> a -> a
<>
    forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (\SqlSyntaxBuilder
d -> ByteString -> Builder
byteString ByteString
" DEFAULT " forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql SqlSyntaxBuilder
d) Maybe (Sql92ColumnSchemaExpressionSyntax SqlSyntaxBuilder)
default_ forall a. Semigroup a => a -> a -> a
<>
    (case [Sql92ColumnSchemaColumnConstraintDefinitionSyntax
   SqlSyntaxBuilder]
constraints of
       [] -> forall a. Monoid a => a
mempty
       [Sql92ColumnSchemaColumnConstraintDefinitionSyntax
   SqlSyntaxBuilder]
_ -> forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (\SqlSyntaxBuilder
c -> ByteString -> Builder
byteString ByteString
" " forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql SqlSyntaxBuilder
c) [Sql92ColumnSchemaColumnConstraintDefinitionSyntax
   SqlSyntaxBuilder]
constraints) forall a. Semigroup a => a -> a -> a
<>
    forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (\Text
nm -> ByteString -> Builder
byteString ByteString
" COLLATE " forall a. Semigroup a => a -> a -> a
<> Text -> Builder
quoteSql Text
nm) Maybe Text
collation

instance IsSql92ColumnConstraintDefinitionSyntax SqlSyntaxBuilder where
  type Sql92ColumnConstraintDefinitionConstraintSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92ColumnConstraintDefinitionAttributesSyntax SqlSyntaxBuilder = SqlConstraintAttributesBuilder

  constraintDefinitionSyntax :: Maybe Text
-> Sql92ColumnConstraintDefinitionConstraintSyntax SqlSyntaxBuilder
-> Maybe
     (Sql92ColumnConstraintDefinitionAttributesSyntax SqlSyntaxBuilder)
-> SqlSyntaxBuilder
constraintDefinitionSyntax Maybe Text
nm Sql92ColumnConstraintDefinitionConstraintSyntax SqlSyntaxBuilder
c Maybe
  (Sql92ColumnConstraintDefinitionAttributesSyntax SqlSyntaxBuilder)
attrs =
    Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
    forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (\Text
nm' -> ByteString -> Builder
byteString ByteString
"CONSTRAINT " forall a. Semigroup a => a -> a -> a
<> Text -> Builder
quoteSql Text
nm' forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
byteString ByteString
" ") Maybe Text
nm forall a. Semigroup a => a -> a -> a
<>
    SqlSyntaxBuilder -> Builder
buildSql Sql92ColumnConstraintDefinitionConstraintSyntax SqlSyntaxBuilder
c forall a. Semigroup a => a -> a -> a
<>
    forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty SqlConstraintAttributesBuilder -> Builder
fromSqlConstraintAttributes Maybe
  (Sql92ColumnConstraintDefinitionAttributesSyntax SqlSyntaxBuilder)
attrs

instance IsSql92ColumnConstraintSyntax SqlSyntaxBuilder where
  type Sql92ColumnConstraintMatchTypeSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92ColumnConstraintReferentialActionSyntax SqlSyntaxBuilder = SqlSyntaxBuilder
  type Sql92ColumnConstraintExpressionSyntax SqlSyntaxBuilder = SqlSyntaxBuilder

  notNullConstraintSyntax :: SqlSyntaxBuilder
notNullConstraintSyntax = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder (ByteString -> Builder
byteString ByteString
"NOT NULL")
  uniqueColumnConstraintSyntax :: SqlSyntaxBuilder
uniqueColumnConstraintSyntax = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder (ByteString -> Builder
byteString ByteString
"UNIQUE")
  primaryKeyColumnConstraintSyntax :: SqlSyntaxBuilder
primaryKeyColumnConstraintSyntax = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder (ByteString -> Builder
byteString ByteString
"PRIMARY KEY")
  checkColumnConstraintSyntax :: Sql92ColumnConstraintExpressionSyntax SqlSyntaxBuilder
-> SqlSyntaxBuilder
checkColumnConstraintSyntax Sql92ColumnConstraintExpressionSyntax SqlSyntaxBuilder
e = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder (Builder
"CHECK (" forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql Sql92ColumnConstraintExpressionSyntax SqlSyntaxBuilder
e forall a. Semigroup a => a -> a -> a
<> Builder
")")
  referencesConstraintSyntax :: Text
-> [Text]
-> Maybe (Sql92ColumnConstraintMatchTypeSyntax SqlSyntaxBuilder)
-> Maybe
     (Sql92ColumnConstraintReferentialActionSyntax SqlSyntaxBuilder)
-> Maybe
     (Sql92ColumnConstraintReferentialActionSyntax SqlSyntaxBuilder)
-> SqlSyntaxBuilder
referencesConstraintSyntax Text
tbl [Text]
fields Maybe (Sql92ColumnConstraintMatchTypeSyntax SqlSyntaxBuilder)
match Maybe
  (Sql92ColumnConstraintReferentialActionSyntax SqlSyntaxBuilder)
onUpdate Maybe
  (Sql92ColumnConstraintReferentialActionSyntax SqlSyntaxBuilder)
onDelete =
    Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder forall a b. (a -> b) -> a -> b
$
    Builder
"REFERENCES " forall a. Semigroup a => a -> a -> a
<> Text -> Builder
quoteSql Text
tbl forall a. Semigroup a => a -> a -> a
<> Builder
"(" forall a. Semigroup a => a -> a -> a
<>
    Builder -> [Builder] -> Builder
buildSepBy Builder
", " (forall a b. (a -> b) -> [a] -> [b]
map Text -> Builder
quoteSql [Text]
fields) forall a. Semigroup a => a -> a -> a
<> Builder
")" forall a. Semigroup a => a -> a -> a
<>
    forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (\SqlSyntaxBuilder
m -> Builder
" " forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql SqlSyntaxBuilder
m) Maybe (Sql92ColumnConstraintMatchTypeSyntax SqlSyntaxBuilder)
match forall a. Semigroup a => a -> a -> a
<>
    forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (\SqlSyntaxBuilder
a -> Builder
" ON UPDATE " forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql SqlSyntaxBuilder
a) Maybe
  (Sql92ColumnConstraintReferentialActionSyntax SqlSyntaxBuilder)
onUpdate forall a. Semigroup a => a -> a -> a
<>
    forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty (\SqlSyntaxBuilder
a -> Builder
" ON DELETE " forall a. Semigroup a => a -> a -> a
<> SqlSyntaxBuilder -> Builder
buildSql SqlSyntaxBuilder
a) Maybe
  (Sql92ColumnConstraintReferentialActionSyntax SqlSyntaxBuilder)
onDelete

instance IsSql92MatchTypeSyntax SqlSyntaxBuilder where
  fullMatchSyntax :: SqlSyntaxBuilder
fullMatchSyntax = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder Builder
"FULL"
  partialMatchSyntax :: SqlSyntaxBuilder
partialMatchSyntax = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder Builder
"PARTIAL"

instance IsSql92ReferentialActionSyntax SqlSyntaxBuilder where
  referentialActionCascadeSyntax :: SqlSyntaxBuilder
referentialActionCascadeSyntax = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder Builder
"CASCADE"
  referentialActionNoActionSyntax :: SqlSyntaxBuilder
referentialActionNoActionSyntax = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder Builder
"NO ACTION"
  referentialActionSetDefaultSyntax :: SqlSyntaxBuilder
referentialActionSetDefaultSyntax = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder Builder
"SET DEFAULT"
  referentialActionSetNullSyntax :: SqlSyntaxBuilder
referentialActionSetNullSyntax = Builder -> SqlSyntaxBuilder
SqlSyntaxBuilder Builder
"SET NULL"

instance Sql92DisplaySyntax SqlSyntaxBuilder where
  displaySyntax :: SqlSyntaxBuilder -> String
displaySyntax = ByteString -> String
BCL.unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> ByteString
toLazyByteString forall b c a. (b -> c) -> (a -> b) -> a -> c
. SqlSyntaxBuilder -> Builder
buildSql