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

-- | Postgres Instances Metadata
--
-- Defines a 'Hasura.RQL.Types.Metadata.Backend.BackendMetadata' type class instance for Postgres.
module Hasura.Backends.Postgres.Instances.Metadata () where

import Data.HashMap.Strict qualified as Map
import Data.Text.Extended
import Hasura.Backends.Postgres.DDL qualified as PG
import Hasura.Backends.Postgres.SQL.Types (QualifiedTable)
import Hasura.Backends.Postgres.Types.CitusExtraTableMetadata
import Hasura.Base.Error
import Hasura.Prelude
import Hasura.RQL.Types.Backend (Backend)
import Hasura.RQL.Types.Metadata.Backend
import Hasura.RQL.Types.Relationships.Local
import Hasura.RQL.Types.Table
import Hasura.SQL.Backend

--------------------------------------------------------------------------------
-- PostgresMetadata

-- | We differentiate the handling of metadata between Citus and Vanilla
-- Postgres because Citus imposes limitations on the types of joins that it
-- permits, which then limits the types of relations that we can track.
class PostgresMetadata (pgKind :: PostgresKind) where
  -- TODO: find a better name
  validateRel ::
    MonadError QErr m =>
    TableCache ('Postgres pgKind) ->
    QualifiedTable ->
    Either (ObjRelDef ('Postgres pgKind)) (ArrRelDef ('Postgres pgKind)) ->
    m ()

instance PostgresMetadata 'Vanilla where
  validateRel :: TableCache ('Postgres 'Vanilla)
-> QualifiedTable
-> Either
     (ObjRelDef ('Postgres 'Vanilla)) (ArrRelDef ('Postgres 'Vanilla))
-> m ()
validateRel TableCache ('Postgres 'Vanilla)
_ QualifiedTable
_ Either
  (ObjRelDef ('Postgres 'Vanilla)) (ArrRelDef ('Postgres 'Vanilla))
_ = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

instance PostgresMetadata 'Citus where
  validateRel ::
    forall m.
    MonadError QErr m =>
    TableCache ('Postgres 'Citus) ->
    QualifiedTable ->
    Either (ObjRelDef ('Postgres 'Citus)) (ArrRelDef ('Postgres 'Citus)) ->
    m ()
  validateRel :: TableCache ('Postgres 'Citus)
-> QualifiedTable
-> Either
     (ObjRelDef ('Postgres 'Citus)) (ArrRelDef ('Postgres 'Citus))
-> m ()
validateRel TableCache ('Postgres 'Citus)
tableCache QualifiedTable
sourceTable Either
  (ObjRelDef ('Postgres 'Citus)) (ArrRelDef ('Postgres 'Citus))
relInfo = do
    TableInfo ('Postgres 'Citus)
sourceTableInfo <- QualifiedTable -> m (TableInfo ('Postgres 'Citus))
lookupTableInfo QualifiedTable
sourceTable
    case Either
  (ObjRelDef ('Postgres 'Citus)) (ArrRelDef ('Postgres 'Citus))
relInfo of
      Left (RelDef RelName
_ ObjRelUsing ('Postgres 'Citus)
obj Maybe Text
_) ->
        case ObjRelUsing ('Postgres 'Citus)
obj of
          RUFKeyOn (SameTable NonEmpty (Column ('Postgres 'Citus))
_) -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
          RUFKeyOn (RemoteTable TableName ('Postgres 'Citus)
targetTable NonEmpty (Column ('Postgres 'Citus))
_) -> TableInfo ('Postgres 'Citus) -> QualifiedTable -> m ()
checkObjectRelationship TableInfo ('Postgres 'Citus)
sourceTableInfo TableName ('Postgres 'Citus)
QualifiedTable
targetTable
          RUManual RelManualConfig {} -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
      Right (RelDef RelName
_ ArrRelUsing ('Postgres 'Citus)
obj Maybe Text
_) ->
        case ArrRelUsing ('Postgres 'Citus)
obj of
          RUFKeyOn (ArrRelUsingFKeyOn TableName ('Postgres 'Citus)
targetTable NonEmpty (Column ('Postgres 'Citus))
_col) -> TableInfo ('Postgres 'Citus) -> QualifiedTable -> m ()
checkArrayRelationship TableInfo ('Postgres 'Citus)
sourceTableInfo TableName ('Postgres 'Citus)
QualifiedTable
targetTable
          RUManual RelManualConfig {} -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    where
      lookupTableInfo :: QualifiedTable -> m (TableInfo ('Postgres 'Citus))
lookupTableInfo QualifiedTable
tableName =
        QualifiedTable
-> HashMap QualifiedTable (TableInfo ('Postgres 'Citus))
-> Maybe (TableInfo ('Postgres 'Citus))
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
Map.lookup QualifiedTable
tableName TableCache ('Postgres 'Citus)
HashMap QualifiedTable (TableInfo ('Postgres 'Citus))
tableCache
          Maybe (TableInfo ('Postgres 'Citus))
-> m (TableInfo ('Postgres 'Citus))
-> m (TableInfo ('Postgres 'Citus))
forall (m :: * -> *) a. Applicative m => Maybe a -> m a -> m a
`onNothing` Code -> Text -> m (TableInfo ('Postgres 'Citus))
forall (m :: * -> *) a. QErrM m => Code -> Text -> m a
throw400 Code
NotFound (Text
"no such table " Text -> QualifiedTable -> Text
forall t. ToTxt t => Text -> t -> Text
<>> QualifiedTable
tableName)

      checkObjectRelationship :: TableInfo ('Postgres 'Citus) -> QualifiedTable -> m ()
checkObjectRelationship TableInfo ('Postgres 'Citus)
sourceTableInfo QualifiedTable
targetTable = do
        TableInfo ('Postgres 'Citus)
targetTableInfo <- QualifiedTable -> m (TableInfo ('Postgres 'Citus))
lookupTableInfo QualifiedTable
targetTable
        let notSupported :: m ()
notSupported = TableInfo ('Postgres 'Citus)
-> TableInfo ('Postgres 'Citus) -> Text -> m ()
throwNotSupportedError TableInfo ('Postgres 'Citus)
sourceTableInfo TableInfo ('Postgres 'Citus)
targetTableInfo Text
"object"
        case ( TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
-> ExtraTableMetadata ('Postgres 'Citus)
forall (b :: BackendType) field primaryKeyColumn.
TableCoreInfoG b field primaryKeyColumn -> ExtraTableMetadata b
_tciExtraTableMetadata (TableCoreInfoG
   ('Postgres 'Citus)
   (FieldInfo ('Postgres 'Citus))
   (ColumnInfo ('Postgres 'Citus))
 -> ExtraTableMetadata ('Postgres 'Citus))
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
-> ExtraTableMetadata ('Postgres 'Citus)
forall a b. (a -> b) -> a -> b
$ TableInfo ('Postgres 'Citus)
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
forall (b :: BackendType). TableInfo b -> TableCoreInfo b
_tiCoreInfo TableInfo ('Postgres 'Citus)
sourceTableInfo,
               TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
-> ExtraTableMetadata ('Postgres 'Citus)
forall (b :: BackendType) field primaryKeyColumn.
TableCoreInfoG b field primaryKeyColumn -> ExtraTableMetadata b
_tciExtraTableMetadata (TableCoreInfoG
   ('Postgres 'Citus)
   (FieldInfo ('Postgres 'Citus))
   (ColumnInfo ('Postgres 'Citus))
 -> ExtraTableMetadata ('Postgres 'Citus))
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
-> ExtraTableMetadata ('Postgres 'Citus)
forall a b. (a -> b) -> a -> b
$ TableInfo ('Postgres 'Citus)
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
forall (b :: BackendType). TableInfo b -> TableCoreInfo b
_tiCoreInfo TableInfo ('Postgres 'Citus)
targetTableInfo
             ) of
          (Distributed {}, ExtraTableMetadata
Local) -> m ()
notSupported
          (Distributed {}, ExtraTableMetadata
Reference) -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
          (Distributed {}, Distributed {}) -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
          (ExtraTableMetadata
_, Distributed {}) -> m ()
notSupported
          (ExtraTableMetadata
_, ExtraTableMetadata
_) -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

      checkArrayRelationship :: TableInfo ('Postgres 'Citus) -> QualifiedTable -> m ()
checkArrayRelationship TableInfo ('Postgres 'Citus)
sourceTableInfo QualifiedTable
targetTable = do
        TableInfo ('Postgres 'Citus)
targetTableInfo <- QualifiedTable -> m (TableInfo ('Postgres 'Citus))
lookupTableInfo QualifiedTable
targetTable
        let notSupported :: m ()
notSupported = TableInfo ('Postgres 'Citus)
-> TableInfo ('Postgres 'Citus) -> Text -> m ()
throwNotSupportedError TableInfo ('Postgres 'Citus)
sourceTableInfo TableInfo ('Postgres 'Citus)
targetTableInfo Text
"array"
        case ( TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
-> ExtraTableMetadata ('Postgres 'Citus)
forall (b :: BackendType) field primaryKeyColumn.
TableCoreInfoG b field primaryKeyColumn -> ExtraTableMetadata b
_tciExtraTableMetadata (TableCoreInfoG
   ('Postgres 'Citus)
   (FieldInfo ('Postgres 'Citus))
   (ColumnInfo ('Postgres 'Citus))
 -> ExtraTableMetadata ('Postgres 'Citus))
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
-> ExtraTableMetadata ('Postgres 'Citus)
forall a b. (a -> b) -> a -> b
$ TableInfo ('Postgres 'Citus)
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
forall (b :: BackendType). TableInfo b -> TableCoreInfo b
_tiCoreInfo TableInfo ('Postgres 'Citus)
sourceTableInfo,
               TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
-> ExtraTableMetadata ('Postgres 'Citus)
forall (b :: BackendType) field primaryKeyColumn.
TableCoreInfoG b field primaryKeyColumn -> ExtraTableMetadata b
_tciExtraTableMetadata (TableCoreInfoG
   ('Postgres 'Citus)
   (FieldInfo ('Postgres 'Citus))
   (ColumnInfo ('Postgres 'Citus))
 -> ExtraTableMetadata ('Postgres 'Citus))
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
-> ExtraTableMetadata ('Postgres 'Citus)
forall a b. (a -> b) -> a -> b
$ TableInfo ('Postgres 'Citus)
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
forall (b :: BackendType). TableInfo b -> TableCoreInfo b
_tiCoreInfo TableInfo ('Postgres 'Citus)
targetTableInfo
             ) of
          (Distributed {}, Distributed {}) -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
          (Distributed {}, ExtraTableMetadata
_) -> m ()
notSupported
          (ExtraTableMetadata
_, Distributed {}) -> m ()
notSupported
          (ExtraTableMetadata
_, ExtraTableMetadata
_) -> () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

      showDistributionType :: ExtraTableMetadata -> Text
      showDistributionType :: ExtraTableMetadata -> Text
showDistributionType = \case
        ExtraTableMetadata
Local -> Text
"local"
        Distributed Text
_ -> Text
"distributed"
        ExtraTableMetadata
Reference -> Text
"reference"

      throwNotSupportedError :: TableInfo ('Postgres 'Citus) -> TableInfo ('Postgres 'Citus) -> Text -> m ()
      throwNotSupportedError :: TableInfo ('Postgres 'Citus)
-> TableInfo ('Postgres 'Citus) -> Text -> m ()
throwNotSupportedError TableInfo ('Postgres 'Citus)
sourceTableInfo TableInfo ('Postgres 'Citus)
targetTableInfo Text
t =
        let tciSrc :: TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
tciSrc = TableInfo ('Postgres 'Citus)
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
forall (b :: BackendType). TableInfo b -> TableCoreInfo b
_tiCoreInfo TableInfo ('Postgres 'Citus)
sourceTableInfo
            tciTgt :: TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
tciTgt = TableInfo ('Postgres 'Citus)
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
forall (b :: BackendType). TableInfo b -> TableCoreInfo b
_tiCoreInfo TableInfo ('Postgres 'Citus)
targetTableInfo
         in Code -> Text -> m ()
forall (m :: * -> *) a. QErrM m => Code -> Text -> m a
throw400
              Code
NotSupported
              ( ExtraTableMetadata -> Text
showDistributionType (TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
-> ExtraTableMetadata ('Postgres 'Citus)
forall (b :: BackendType) field primaryKeyColumn.
TableCoreInfoG b field primaryKeyColumn -> ExtraTableMetadata b
_tciExtraTableMetadata TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
tciSrc)
                  Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" tables ("
                  Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> QualifiedTable -> Text
forall a. ToTxt a => a -> Text
toTxt (TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
-> TableName ('Postgres 'Citus)
forall (b :: BackendType) field primaryKeyColumn.
TableCoreInfoG b field primaryKeyColumn -> TableName b
_tciName TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
tciSrc)
                  Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
") cannot have an "
                  Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
t
                  Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" relationship against a "
                  Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ExtraTableMetadata -> Text
showDistributionType (TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
-> ExtraTableMetadata ('Postgres 'Citus)
forall (b :: BackendType) field primaryKeyColumn.
TableCoreInfoG b field primaryKeyColumn -> ExtraTableMetadata b
_tciExtraTableMetadata (TableCoreInfoG
   ('Postgres 'Citus)
   (FieldInfo ('Postgres 'Citus))
   (ColumnInfo ('Postgres 'Citus))
 -> ExtraTableMetadata ('Postgres 'Citus))
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
-> ExtraTableMetadata ('Postgres 'Citus)
forall a b. (a -> b) -> a -> b
$ TableInfo ('Postgres 'Citus)
-> TableCoreInfoG
     ('Postgres 'Citus)
     (FieldInfo ('Postgres 'Citus))
     (ColumnInfo ('Postgres 'Citus))
forall (b :: BackendType). TableInfo b -> TableCoreInfo b
_tiCoreInfo TableInfo ('Postgres 'Citus)
targetTableInfo)
                  Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" table ("
                  Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> QualifiedTable -> Text
forall a. ToTxt a => a -> Text
toTxt (TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
-> TableName ('Postgres 'Citus)
forall (b :: BackendType) field primaryKeyColumn.
TableCoreInfoG b field primaryKeyColumn -> TableName b
_tciName TableCoreInfoG
  ('Postgres 'Citus)
  (FieldInfo ('Postgres 'Citus))
  (ColumnInfo ('Postgres 'Citus))
tciTgt)
                  Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
")"
              )

instance PostgresMetadata 'Cockroach where
  validateRel :: TableCache ('Postgres 'Cockroach)
-> QualifiedTable
-> Either
     (ObjRelDef ('Postgres 'Cockroach))
     (ArrRelDef ('Postgres 'Cockroach))
-> m ()
validateRel TableCache ('Postgres 'Cockroach)
_ QualifiedTable
_ Either
  (ObjRelDef ('Postgres 'Cockroach))
  (ArrRelDef ('Postgres 'Cockroach))
_ = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

----------------------------------------------------------------
-- BackendMetadata instance

instance
  ( Backend ('Postgres pgKind),
    PostgresMetadata pgKind,
    PG.FetchTableMetadata pgKind,
    PG.FetchFunctionMetadata pgKind,
    PG.ToMetadataFetchQuery pgKind
  ) =>
  BackendMetadata ('Postgres pgKind)
  where
  prepareCatalog :: SourceConfig ('Postgres pgKind)
-> ExceptT QErr m RecreateEventTriggers
prepareCatalog = SourceConfig ('Postgres pgKind)
-> ExceptT QErr m RecreateEventTriggers
forall (m :: * -> *) (pgKind :: PostgresKind).
(MonadIO m, MonadBaseControl IO m) =>
SourceConfig ('Postgres pgKind)
-> ExceptT QErr m RecreateEventTriggers
PG.prepareCatalog
  buildComputedFieldInfo :: HashSet (TableName ('Postgres pgKind))
-> TableName ('Postgres pgKind)
-> HashSet (Column ('Postgres pgKind))
-> ComputedFieldName
-> ComputedFieldDefinition ('Postgres pgKind)
-> RawFunctionInfo ('Postgres pgKind)
-> Comment
-> m (ComputedFieldInfo ('Postgres pgKind))
buildComputedFieldInfo = HashSet (TableName ('Postgres pgKind))
-> TableName ('Postgres pgKind)
-> HashSet (Column ('Postgres pgKind))
-> ComputedFieldName
-> ComputedFieldDefinition ('Postgres pgKind)
-> RawFunctionInfo ('Postgres pgKind)
-> Comment
-> m (ComputedFieldInfo ('Postgres pgKind))
forall (pgKind :: PostgresKind) (m :: * -> *).
QErrM m =>
HashSet QualifiedTable
-> QualifiedTable
-> HashSet PGCol
-> ComputedFieldName
-> ComputedFieldDefinition
-> PGRawFunctionInfo
-> Comment
-> m (ComputedFieldInfo ('Postgres pgKind))
PG.buildComputedFieldInfo
  fetchAndValidateEnumValues :: SourceConfig ('Postgres pgKind)
-> TableName ('Postgres pgKind)
-> Maybe
     (PrimaryKey ('Postgres pgKind) (RawColumnInfo ('Postgres pgKind)))
-> [RawColumnInfo ('Postgres pgKind)]
-> m (Either QErr EnumValues)
fetchAndValidateEnumValues = SourceConfig ('Postgres pgKind)
-> TableName ('Postgres pgKind)
-> Maybe
     (PrimaryKey ('Postgres pgKind) (RawColumnInfo ('Postgres pgKind)))
-> [RawColumnInfo ('Postgres pgKind)]
-> m (Either QErr EnumValues)
forall (pgKind :: PostgresKind) (m :: * -> *).
(Backend ('Postgres pgKind), MonadIO m, MonadBaseControl IO m) =>
PGSourceConfig
-> QualifiedTable
-> Maybe
     (PrimaryKey ('Postgres pgKind) (RawColumnInfo ('Postgres pgKind)))
-> [RawColumnInfo ('Postgres pgKind)]
-> m (Either QErr EnumValues)
PG.fetchAndValidateEnumValues
  resolveSourceConfig :: Logger Hasura
-> SourceName
-> SourceConnConfiguration ('Postgres pgKind)
-> BackendSourceKind ('Postgres pgKind)
-> BackendConfig ('Postgres pgKind)
-> Environment
-> Manager
-> m (Either QErr (SourceConfig ('Postgres pgKind)))
resolveSourceConfig = Logger Hasura
-> SourceName
-> SourceConnConfiguration ('Postgres pgKind)
-> BackendSourceKind ('Postgres pgKind)
-> BackendConfig ('Postgres pgKind)
-> Environment
-> Manager
-> m (Either QErr (SourceConfig ('Postgres pgKind)))
forall (m :: * -> *) (pgKind :: PostgresKind) manager.
(MonadIO m, MonadResolveSource m) =>
Logger Hasura
-> SourceName
-> PostgresConnConfiguration
-> BackendSourceKind ('Postgres pgKind)
-> BackendConfig ('Postgres pgKind)
-> Environment
-> manager
-> m (Either QErr (SourceConfig ('Postgres pgKind)))
PG.resolveSourceConfig
  resolveDatabaseMetadata :: SourceMetadata ('Postgres pgKind)
-> SourceConfig ('Postgres pgKind)
-> SourceTypeCustomization
-> m (Either QErr (ResolvedSource ('Postgres pgKind)))
resolveDatabaseMetadata = SourceMetadata ('Postgres pgKind)
-> SourceConfig ('Postgres pgKind)
-> SourceTypeCustomization
-> m (Either QErr (ResolvedSource ('Postgres pgKind)))
forall (pgKind :: PostgresKind) (m :: * -> *).
(Backend ('Postgres pgKind), ToMetadataFetchQuery pgKind,
 FetchFunctionMetadata pgKind, FetchTableMetadata pgKind, MonadIO m,
 MonadBaseControl IO m) =>
SourceMetadata ('Postgres pgKind)
-> SourceConfig ('Postgres pgKind)
-> SourceTypeCustomization
-> m (Either QErr (ResolvedSource ('Postgres pgKind)))
PG.resolveDatabaseMetadata
  parseBoolExpOperations :: ValueParser ('Postgres pgKind) m v
-> TableName ('Postgres pgKind)
-> FieldInfoMap (FieldInfo ('Postgres pgKind))
-> ColumnReference ('Postgres pgKind)
-> Value
-> m [OpExpG ('Postgres pgKind) v]
parseBoolExpOperations = ValueParser ('Postgres pgKind) m v
-> TableName ('Postgres pgKind)
-> FieldInfoMap (FieldInfo ('Postgres pgKind))
-> ColumnReference ('Postgres pgKind)
-> Value
-> m [OpExpG ('Postgres pgKind) v]
forall (pgKind :: PostgresKind) (m :: * -> *) v.
(Backend ('Postgres pgKind), MonadError QErr m,
 TableCoreInfoRM ('Postgres pgKind) m) =>
ValueParser ('Postgres pgKind) m v
-> QualifiedTable
-> FieldInfoMap (FieldInfo ('Postgres pgKind))
-> ColumnReference ('Postgres pgKind)
-> Value
-> m [OpExpG ('Postgres pgKind) v]
PG.parseBoolExpOperations
  buildFunctionInfo :: SourceName
-> FunctionName ('Postgres pgKind)
-> SystemDefined
-> FunctionConfig
-> FunctionPermissionsMap
-> RawFunctionInfo ('Postgres pgKind)
-> Maybe Text
-> NamingCase
-> m (FunctionInfo ('Postgres pgKind), SchemaDependency)
buildFunctionInfo = SourceName
-> FunctionName ('Postgres pgKind)
-> SystemDefined
-> FunctionConfig
-> FunctionPermissionsMap
-> RawFunctionInfo ('Postgres pgKind)
-> Maybe Text
-> NamingCase
-> m (FunctionInfo ('Postgres pgKind), SchemaDependency)
forall (pgKind :: PostgresKind) (m :: * -> *).
(Backend ('Postgres pgKind), QErrM m) =>
SourceName
-> QualifiedFunction
-> SystemDefined
-> FunctionConfig
-> FunctionPermissionsMap
-> RawFunctionInfo ('Postgres pgKind)
-> Maybe Text
-> NamingCase
-> m (FunctionInfo ('Postgres pgKind), SchemaDependency)
PG.buildFunctionInfo
  updateColumnInEventTrigger :: TableName ('Postgres pgKind)
-> Column ('Postgres pgKind)
-> Column ('Postgres pgKind)
-> TableName ('Postgres pgKind)
-> EventTriggerConf ('Postgres pgKind)
-> EventTriggerConf ('Postgres pgKind)
updateColumnInEventTrigger = TableName ('Postgres pgKind)
-> Column ('Postgres pgKind)
-> Column ('Postgres pgKind)
-> TableName ('Postgres pgKind)
-> EventTriggerConf ('Postgres pgKind)
-> EventTriggerConf ('Postgres pgKind)
forall (pgKind :: PostgresKind).
QualifiedTable
-> PGCol
-> PGCol
-> QualifiedTable
-> EventTriggerConf ('Postgres pgKind)
-> EventTriggerConf ('Postgres pgKind)
PG.updateColumnInEventTrigger
  parseCollectableType :: CollectableType (ColumnType ('Postgres pgKind))
-> Value -> m (PartialSQLExp ('Postgres pgKind))
parseCollectableType = CollectableType (ColumnType ('Postgres pgKind))
-> Value -> m (PartialSQLExp ('Postgres pgKind))
forall (pgKind :: PostgresKind) (m :: * -> *).
(Backend ('Postgres pgKind), MonadError QErr m) =>
CollectableType (ColumnType ('Postgres pgKind))
-> Value -> m (PartialSQLExp ('Postgres pgKind))
PG.parseCollectableType
  postDropSourceHook :: SourceConfig ('Postgres pgKind)
-> TableEventTriggers ('Postgres pgKind) -> m ()
postDropSourceHook = SourceConfig ('Postgres pgKind)
-> TableEventTriggers ('Postgres pgKind) -> m ()
forall (m :: * -> *) (pgKind :: PostgresKind).
(MonadIO m, MonadError QErr m, MonadBaseControl IO m) =>
SourceConfig ('Postgres pgKind)
-> TableEventTriggers ('Postgres pgKind) -> m ()
PG.postDropSourceHook
  validateRelationship :: TableCache ('Postgres pgKind)
-> TableName ('Postgres pgKind)
-> Either
     (ObjRelDef ('Postgres pgKind)) (ArrRelDef ('Postgres pgKind))
-> m ()
validateRelationship = forall (m :: * -> *).
(PostgresMetadata pgKind, MonadError QErr m) =>
TableCache ('Postgres pgKind)
-> QualifiedTable
-> Either
     (ObjRelDef ('Postgres pgKind)) (ArrRelDef ('Postgres pgKind))
-> m ()
forall (pgKind :: PostgresKind) (m :: * -> *).
(PostgresMetadata pgKind, MonadError QErr m) =>
TableCache ('Postgres pgKind)
-> QualifiedTable
-> Either
     (ObjRelDef ('Postgres pgKind)) (ArrRelDef ('Postgres pgKind))
-> m ()
validateRel @pgKind
  buildComputedFieldBooleanExp :: BoolExpResolver ('Postgres pgKind) m v
-> BoolExpRHSParser ('Postgres pgKind) m v
-> TableName ('Postgres pgKind)
-> FieldInfoMap (FieldInfo ('Postgres pgKind))
-> ComputedFieldInfo ('Postgres pgKind)
-> Value
-> m (AnnComputedFieldBoolExp ('Postgres pgKind) v)
buildComputedFieldBooleanExp = BoolExpResolver ('Postgres pgKind) m v
-> BoolExpRHSParser ('Postgres pgKind) m v
-> TableName ('Postgres pgKind)
-> FieldInfoMap (FieldInfo ('Postgres pgKind))
-> ComputedFieldInfo ('Postgres pgKind)
-> Value
-> m (AnnComputedFieldBoolExp ('Postgres pgKind) v)
forall (pgKind :: PostgresKind) (m :: * -> *) v.
(MonadError QErr m, Backend ('Postgres pgKind),
 TableCoreInfoRM ('Postgres pgKind) m) =>
BoolExpResolver ('Postgres pgKind) m v
-> BoolExpRHSParser ('Postgres pgKind) m v
-> TableName ('Postgres pgKind)
-> FieldInfoMap (FieldInfo ('Postgres pgKind))
-> ComputedFieldInfo ('Postgres pgKind)
-> Value
-> m (AnnComputedFieldBoolExp ('Postgres pgKind) v)
PG.buildComputedFieldBooleanExp