packages feed

squeal-postgresql 0.3.2.0 → 0.4.0.0

raw patch · 14 files changed

+2107/−1438 lines, 14 filesdep +hspecdep +records-sopdep −profunctorsdep ~basedep ~generics-sopdep ~textPVP ok

version bump matches the API change (PVP)

Dependencies added: hspec, records-sop

Dependencies removed: profunctors

Dependency ranges changed: base, generics-sop, text

API changes (from Hackage documentation)

- Squeal.PostgreSQL.Binary: class FromColumnValue (colty :: (Symbol, NullityType)) (y :: Type)
- Squeal.PostgreSQL.Binary: class ToColumnParam (x :: Type) (ty :: NullityType)
- Squeal.PostgreSQL.Binary: fromColumnValue :: FromColumnValue colty y => K (Maybe ByteString) colty -> y
- Squeal.PostgreSQL.Binary: instance (Generics.SOP.Sing.SListI fields, Squeal.PostgreSQL.Schema.MapMaybes xs, Generics.SOP.Universe.IsProductType x (Squeal.PostgreSQL.Schema.Maybes xs), Generics.SOP.Constraint.AllZip Squeal.PostgreSQL.Binary.ToAliasedParam xs fields, Squeal.PostgreSQL.Schema.FieldNamesFrom x ~ Squeal.PostgreSQL.Schema.AliasesOf fields, Generics.SOP.Constraint.All Squeal.PostgreSQL.Binary.HasAliasedOid fields) => Squeal.PostgreSQL.Binary.ToParam x ('Squeal.PostgreSQL.Schema.PGcomposite fields)
- Squeal.PostgreSQL.Binary: instance (Generics.SOP.Sing.SListI fields, Squeal.PostgreSQL.Schema.MapMaybes ys, Generics.SOP.Universe.IsProductType y (Squeal.PostgreSQL.Schema.Maybes ys), Generics.SOP.Constraint.AllZip Squeal.PostgreSQL.Binary.FromAliasedValue fields ys, Squeal.PostgreSQL.Schema.FieldNamesFrom y ~ Squeal.PostgreSQL.Schema.AliasesOf fields) => Squeal.PostgreSQL.Binary.FromValue ('Squeal.PostgreSQL.Schema.PGcomposite fields) y
- Squeal.PostgreSQL.Binary: instance (Generics.SOP.Sing.SListI results, Generics.SOP.Universe.IsProductType y ys, Generics.SOP.Constraint.AllZip Squeal.PostgreSQL.Binary.FromColumnValue results ys, Squeal.PostgreSQL.Schema.FieldNamesFrom y ~ Squeal.PostgreSQL.Schema.AliasesOf results) => Squeal.PostgreSQL.Binary.FromRow results y
- Squeal.PostgreSQL.Binary: instance (Generics.SOP.Sing.SListI tys, Generics.SOP.Universe.IsProductType x xs, Generics.SOP.Constraint.AllZip Squeal.PostgreSQL.Binary.ToColumnParam xs tys) => Squeal.PostgreSQL.Binary.ToParams x tys
- Squeal.PostgreSQL.Binary: instance (Generics.SOP.Universe.IsEnumType x, Generics.SOP.Universe.HasDatatypeInfo x, Squeal.PostgreSQL.Schema.LabelsFrom x ~ labels) => Squeal.PostgreSQL.Binary.ToParam x ('Squeal.PostgreSQL.Schema.PGenum labels)
- Squeal.PostgreSQL.Binary: instance (Generics.SOP.Universe.IsEnumType y, Generics.SOP.Universe.HasDatatypeInfo y, Squeal.PostgreSQL.Schema.LabelsFrom y ~ labels) => Squeal.PostgreSQL.Binary.FromValue ('Squeal.PostgreSQL.Schema.PGenum labels) y
- Squeal.PostgreSQL.Binary: instance (Squeal.PostgreSQL.Schema.HasOid pg, Squeal.PostgreSQL.Binary.ToParam x pg) => Squeal.PostgreSQL.Binary.ToParam (Data.Vector.Vector (GHC.Base.Maybe x)) ('Squeal.PostgreSQL.Schema.PGvararray pg)
- Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromValue pg y => Squeal.PostgreSQL.Binary.FromAliasedValue (alias Squeal.PostgreSQL.Schema.::: pg) y
- Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromValue pg y => Squeal.PostgreSQL.Binary.FromColumnValue (column Squeal.PostgreSQL.Schema.::: 'Squeal.PostgreSQL.Schema.NotNull pg) y
- Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromValue pg y => Squeal.PostgreSQL.Binary.FromColumnValue (column Squeal.PostgreSQL.Schema.::: 'Squeal.PostgreSQL.Schema.Null pg) (GHC.Base.Maybe y)
- Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromValue pg y => Squeal.PostgreSQL.Binary.FromValue ('Squeal.PostgreSQL.Schema.PGfixarray n pg) (Data.Vector.Vector (GHC.Base.Maybe y))
- Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromValue pg y => Squeal.PostgreSQL.Binary.FromValue ('Squeal.PostgreSQL.Schema.PGvararray pg) (Data.Vector.Vector (GHC.Base.Maybe y))
- Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.ToParam x pg => Squeal.PostgreSQL.Binary.ToColumnParam (GHC.Base.Maybe x) ('Squeal.PostgreSQL.Schema.Null pg)
- Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.ToParam x pg => Squeal.PostgreSQL.Binary.ToColumnParam x ('Squeal.PostgreSQL.Schema.NotNull pg)
- Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.ToParam x ty => Squeal.PostgreSQL.Binary.ToAliasedParam x (alias Squeal.PostgreSQL.Schema.::: ty)
- Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Schema.HasOid ty => Squeal.PostgreSQL.Binary.HasAliasedOid (alias Squeal.PostgreSQL.Schema.::: ty)
- Squeal.PostgreSQL.Binary: toColumnParam :: ToColumnParam x ty => x -> K (Maybe ByteString) ty
- Squeal.PostgreSQL.Expression: instance (GHC.TypeLits.KnownSymbol label, Squeal.PostgreSQL.Schema.In label labels) => Squeal.PostgreSQL.Schema.IsPGlabel label (Squeal.PostgreSQL.Expression.Expression schema relations grouping params (nullity ('Squeal.PostgreSQL.Schema.PGenum labels)))
- Squeal.PostgreSQL.Expression: instance (GHC.TypeNats.KnownNat n, 1 GHC.TypeNats.<= n) => Squeal.PostgreSQL.Expression.PGTyped schema ('Squeal.PostgreSQL.Schema.PGchar n)
- Squeal.PostgreSQL.Expression: instance (GHC.TypeNats.KnownNat n, 1 GHC.TypeNats.<= n) => Squeal.PostgreSQL.Expression.PGTyped schema ('Squeal.PostgreSQL.Schema.PGvarchar n)
- Squeal.PostgreSQL.Expression: instance (GHC.TypeNats.KnownNat n, Squeal.PostgreSQL.Expression.PGTyped schema ty) => Squeal.PostgreSQL.Expression.PGTyped schema ('Squeal.PostgreSQL.Schema.PGfixarray n ty)
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty) => Squeal.PostgreSQL.Schema.IsQualified relation column (Generics.SOP.NP.NP (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema relations 'Squeal.PostgreSQL.Schema.Ungrouped params)) '[column Squeal.PostgreSQL.Schema.::: ty])
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty) => Squeal.PostgreSQL.Schema.IsQualified relation column (Squeal.PostgreSQL.Expression.Expression schema relations 'Squeal.PostgreSQL.Schema.Ungrouped params ty)
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty) => Squeal.PostgreSQL.Schema.IsQualified relation column (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema relations 'Squeal.PostgreSQL.Schema.Ungrouped params) (column Squeal.PostgreSQL.Schema.::: ty))
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy relation column bys) => Squeal.PostgreSQL.Schema.IsQualified relation column (Generics.SOP.NP.NP (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema relations ('Squeal.PostgreSQL.Schema.Grouped bys) params)) '[column Squeal.PostgreSQL.Schema.::: ty])
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy relation column bys) => Squeal.PostgreSQL.Schema.IsQualified relation column (Squeal.PostgreSQL.Expression.Expression schema relations ('Squeal.PostgreSQL.Schema.Grouped bys) params ty)
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy relation column bys) => Squeal.PostgreSQL.Schema.IsQualified relation column (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema relations ('Squeal.PostgreSQL.Schema.Grouped bys) params) (column Squeal.PostgreSQL.Schema.::: ty))
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty) => GHC.OverloadedLabels.IsLabel column (Generics.SOP.NP.NP (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema relations 'Squeal.PostgreSQL.Schema.Ungrouped params)) '[column Squeal.PostgreSQL.Schema.::: ty])
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty) => GHC.OverloadedLabels.IsLabel column (Squeal.PostgreSQL.Expression.Expression schema relations 'Squeal.PostgreSQL.Schema.Ungrouped params ty)
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty) => GHC.OverloadedLabels.IsLabel column (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema relations 'Squeal.PostgreSQL.Schema.Ungrouped params) (column Squeal.PostgreSQL.Schema.::: ty))
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy relation column bys) => GHC.OverloadedLabels.IsLabel column (Generics.SOP.NP.NP (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema relations ('Squeal.PostgreSQL.Schema.Grouped bys) params)) '[column Squeal.PostgreSQL.Schema.::: ty])
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy relation column bys) => GHC.OverloadedLabels.IsLabel column (Squeal.PostgreSQL.Expression.Expression schema relations ('Squeal.PostgreSQL.Schema.Grouped bys) params ty)
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique relation relations columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy relation column bys) => GHC.OverloadedLabels.IsLabel column (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema relations ('Squeal.PostgreSQL.Schema.Grouped bys) params) (column Squeal.PostgreSQL.Schema.::: ty))
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.PGNum ty, Squeal.PostgreSQL.Schema.PGFloating ty) => GHC.Float.Floating (Squeal.PostgreSQL.Expression.Expression schema relations grouping params (nullity ty))
- Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.PGNum ty, Squeal.PostgreSQL.Schema.PGFloating ty) => GHC.Real.Fractional (Squeal.PostgreSQL.Expression.Expression schema relations grouping params (nullity ty))
- Squeal.PostgreSQL.Expression: instance Control.DeepSeq.NFData (Squeal.PostgreSQL.Expression.Expression schema relations grouping params ty)
- Squeal.PostgreSQL.Expression: instance Data.String.IsString (Squeal.PostgreSQL.Expression.Expression schema relations grouping params (nullity 'Squeal.PostgreSQL.Schema.PGtext))
- Squeal.PostgreSQL.Expression: instance GHC.Base.Monoid (Squeal.PostgreSQL.Expression.Expression schema relations grouping params (nullity 'Squeal.PostgreSQL.Schema.PGtext))
- Squeal.PostgreSQL.Expression: instance GHC.Base.Monoid (Squeal.PostgreSQL.Expression.Expression schema relations grouping params (nullity ('Squeal.PostgreSQL.Schema.PGvararray ty)))
- Squeal.PostgreSQL.Expression: instance GHC.Base.Semigroup (Squeal.PostgreSQL.Expression.Expression schema relations grouping param (nullity 'Squeal.PostgreSQL.Schema.PGjsonb))
- Squeal.PostgreSQL.Expression: instance GHC.Base.Semigroup (Squeal.PostgreSQL.Expression.Expression schema relations grouping params (nullity 'Squeal.PostgreSQL.Schema.PGtext))
- Squeal.PostgreSQL.Expression: instance GHC.Base.Semigroup (Squeal.PostgreSQL.Expression.Expression schema relations grouping params (nullity ('Squeal.PostgreSQL.Schema.PGvararray ty)))
- Squeal.PostgreSQL.Expression: instance GHC.Classes.Eq (Squeal.PostgreSQL.Expression.Expression schema relations grouping params ty)
- Squeal.PostgreSQL.Expression: instance GHC.Classes.Ord (Squeal.PostgreSQL.Expression.Expression schema relations grouping params ty)
- Squeal.PostgreSQL.Expression: instance GHC.Generics.Generic (Squeal.PostgreSQL.Expression.Expression schema relations grouping params ty)
- Squeal.PostgreSQL.Expression: instance GHC.Show.Show (Squeal.PostgreSQL.Expression.Expression schema relations grouping params ty)
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGbool
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGbytea
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGdate
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGfloat4
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGfloat8
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGint2
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGint4
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGint8
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGinterval
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGjson
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGjsonb
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGnumeric
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGtext
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGtime
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGtimestamp
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGtimestamptz
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGtimetz
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema 'Squeal.PostgreSQL.Schema.PGuuid
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema ty => Squeal.PostgreSQL.Expression.PGTyped schema ('Squeal.PostgreSQL.Schema.PGvararray ty)
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Render.RenderSQL (Squeal.PostgreSQL.Expression.Expression schema relations grouping params ty)
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Schema.Has alias schema ('Squeal.PostgreSQL.Schema.Typedef ty) => GHC.OverloadedLabels.IsLabel alias (Squeal.PostgreSQL.Expression.TypeExpression schema ty)
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Schema.Has field fields ty => GHC.OverloadedLabels.IsLabel field (Squeal.PostgreSQL.Expression.Expression schema relation grouping params (nullity ('Squeal.PostgreSQL.Schema.PGcomposite fields)) -> Squeal.PostgreSQL.Expression.Expression schema relation grouping params ('Squeal.PostgreSQL.Schema.Null ty))
- Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Schema.PGNum ty => GHC.Num.Num (Squeal.PostgreSQL.Expression.Expression schema relations grouping params (nullity ty))
- Squeal.PostgreSQL.Expression: jsonObjectKeys :: Expression schema relations grouping params (nullity 'PGjson) -> Expression schema relations grouping params (nullity 'PGtext)
- Squeal.PostgreSQL.Expression: jsonbObjectKeys :: Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity 'PGtext)
- Squeal.PostgreSQL.Expression: type PGjsonKey key = key `In` '[ 'PGint2, 'PGint4, 'PGtext]
- Squeal.PostgreSQL.Expression: type PGjson_ json = json `In` '[ 'PGjson, 'PGjsonb]
- Squeal.PostgreSQL.Manipulation: with :: SListI commons => NP (Aliased (Manipulation schema params)) (common : commons) -> Manipulation (With (common : commons) schema) params results -> Manipulation schema params results
- Squeal.PostgreSQL.Migration: [:>>] :: p x0 x1 -> AlignedList p x1 x2 -> AlignedList p x0 x2
- Squeal.PostgreSQL.Migration: [Done] :: AlignedList p x x
- Squeal.PostgreSQL.Migration: data AlignedList p x0 x1
- Squeal.PostgreSQL.Migration: instance forall k (p :: k -> k -> *). Control.Category.Category (Squeal.PostgreSQL.Migration.AlignedList p)
- Squeal.PostgreSQL.Migration: single :: p x0 x1 -> AlignedList p x0 x1
- Squeal.PostgreSQL.PQ: instance Squeal.PostgreSQL.PQ.MonadPQ schema m => Squeal.PostgreSQL.PQ.MonadPQ schema (Control.Monad.Trans.List.ListT m)
- Squeal.PostgreSQL.Query: instance GHC.Classes.Eq (Squeal.PostgreSQL.Query.By relations by)
- Squeal.PostgreSQL.Query: instance GHC.Classes.Eq (Squeal.PostgreSQL.Query.HavingClause schema relations grouping params)
- Squeal.PostgreSQL.Query: instance GHC.Classes.Ord (Squeal.PostgreSQL.Query.By relations by)
- Squeal.PostgreSQL.Query: instance GHC.Classes.Ord (Squeal.PostgreSQL.Query.HavingClause schema relations grouping params)
- Squeal.PostgreSQL.Query: instance GHC.Show.Show (Squeal.PostgreSQL.Query.By relations by)
- Squeal.PostgreSQL.Query: instance GHC.Show.Show (Squeal.PostgreSQL.Query.HavingClause schema relations grouping params)
- Squeal.PostgreSQL.Query: instance GHC.Show.Show (Squeal.PostgreSQL.Query.SortExpression schema relations grouping params)
- Squeal.PostgreSQL.Query: instance forall k1 (schema :: k1) k2 (params :: k2) k3 (relations :: k3). Control.DeepSeq.NFData (Squeal.PostgreSQL.Query.FromClause schema params relations)
- Squeal.PostgreSQL.Query: instance forall k1 (schema :: k1) k2 (params :: k2) k3 (relations :: k3). GHC.Classes.Eq (Squeal.PostgreSQL.Query.FromClause schema params relations)
- Squeal.PostgreSQL.Query: instance forall k1 (schema :: k1) k2 (params :: k2) k3 (relations :: k3). GHC.Classes.Ord (Squeal.PostgreSQL.Query.FromClause schema params relations)
- Squeal.PostgreSQL.Query: instance forall k1 (schema :: k1) k2 (params :: k2) k3 (relations :: k3). GHC.Generics.Generic (Squeal.PostgreSQL.Query.FromClause schema params relations)
- Squeal.PostgreSQL.Query: instance forall k1 (schema :: k1) k2 (params :: k2) k3 (relations :: k3). GHC.Show.Show (Squeal.PostgreSQL.Query.FromClause schema params relations)
- Squeal.PostgreSQL.Query: jsonPopulateRecordAs :: (KnownSymbol alias, Has tab schema ( 'Table table)) => Alias tab -> Expression schema '[] 'Ungrouped params (nullity 'PGjson) -> Alias alias -> FromClause schema params '[alias ::: TableToRelation table]
- Squeal.PostgreSQL.Query: jsonPopulateRecordSetAs :: (KnownSymbol alias, Has tab schema ( 'Table table)) => Alias tab -> Expression schema '[] 'Ungrouped params (nullity 'PGjson) -> Alias alias -> FromClause schema params '[alias ::: TableToRelation table]
- Squeal.PostgreSQL.Query: jsonToRecordAs :: All Top types => Expression schema '[] 'Ungrouped params (nullity 'PGjson) -> Aliased (NP (Aliased (TypeExpression schema))) (tab ::: types) -> FromClause schema params '[tab ::: types]
- Squeal.PostgreSQL.Query: jsonToRecordSetAs :: All Top types => Expression schema '[] 'Ungrouped params (nullity 'PGjson) -> Aliased (NP (Aliased (TypeExpression schema))) (tab ::: types) -> FromClause schema params '[tab ::: types]
- Squeal.PostgreSQL.Query: jsonbPopulateRecordAs :: (KnownSymbol alias, Has tab schema ( 'Table table)) => Alias tab -> Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -> Alias alias -> FromClause schema params '[alias ::: TableToRelation table]
- Squeal.PostgreSQL.Query: jsonbPopulateRecordSetAs :: (KnownSymbol alias, Has tab schema ( 'Table table)) => Alias tab -> Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -> Alias alias -> FromClause schema params '[alias ::: TableToRelation table]
- Squeal.PostgreSQL.Query: jsonbToRecordAs :: All Top types => Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -> Aliased (NP (Aliased (TypeExpression schema))) (tab ::: types) -> FromClause schema params '[tab ::: types]
- Squeal.PostgreSQL.Query: jsonbToRecordSetAs :: All Top types => Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -> Aliased (NP (Aliased (TypeExpression schema))) (tab ::: types) -> FromClause schema params '[tab ::: types]
- Squeal.PostgreSQL.Query: type PGjson_each tab = PGjson_each_variant 'PGjson tab
- Squeal.PostgreSQL.Query: type PGjsonb_each tab = PGjson_each_variant 'PGjsonb tab
- Squeal.PostgreSQL.Schema: class MapMaybes xs where {
- Squeal.PostgreSQL.Schema: class (SListI (ZipAs ns xs), All KnownSymbol ns) => ZipAliased ns xs where {
- Squeal.PostgreSQL.Schema: instance Squeal.PostgreSQL.Schema.MapMaybes '[]
- Squeal.PostgreSQL.Schema: instance Squeal.PostgreSQL.Schema.MapMaybes xs => Squeal.PostgreSQL.Schema.MapMaybes (x : xs)
- Squeal.PostgreSQL.Schema: instance Squeal.PostgreSQL.Schema.ZipAliased '[] '[]
- Squeal.PostgreSQL.Schema: instance forall a (relation :: GHC.Types.Symbol) (column :: GHC.Types.Symbol) (bys :: [a]) (tabcol :: a). (GHC.TypeLits.KnownSymbol relation, GHC.TypeLits.KnownSymbol column, Squeal.PostgreSQL.Schema.GroupedBy relation column bys) => Squeal.PostgreSQL.Schema.GroupedBy relation column (tabcol : bys)
- Squeal.PostgreSQL.Schema: instance forall k (alias :: GHC.Types.Symbol) (alias1 :: GHC.Types.Symbol) (expression :: k -> *) (ty :: k). (alias ~ alias1, GHC.TypeLits.KnownSymbol alias) => Squeal.PostgreSQL.Schema.Aliasable alias (expression ty) (Squeal.PostgreSQL.Schema.Aliased expression (alias1 Squeal.PostgreSQL.Schema.::: ty))
- Squeal.PostgreSQL.Schema: instance forall k (n :: GHC.Types.Symbol) (ns :: [GHC.Types.Symbol]) (xs :: [k]) (x :: k). (GHC.TypeLits.KnownSymbol n, Squeal.PostgreSQL.Schema.ZipAliased ns xs) => Squeal.PostgreSQL.Schema.ZipAliased (n : ns) (x : xs)
- Squeal.PostgreSQL.Schema: instance forall k (relation :: GHC.Types.Symbol) (column :: GHC.Types.Symbol) (table :: k) (bys :: [(k, GHC.Types.Symbol)]). (GHC.TypeLits.KnownSymbol relation, GHC.TypeLits.KnownSymbol column) => Squeal.PostgreSQL.Schema.GroupedBy relation column ('(table, column) : bys)
- Squeal.PostgreSQL.Schema: k)]) | zs -> ns xs;
- Squeal.PostgreSQL.Schema: maybes :: MapMaybes xs => NP Maybe xs -> NP I (Maybes xs)
- Squeal.PostgreSQL.Schema: type PGjsonKey key = key `In` '[ 'PGint2, 'PGint4, 'PGtext]
- Squeal.PostgreSQL.Schema: type PGjson_ json = json `In` '[ 'PGjson, 'PGjsonb]
- Squeal.PostgreSQL.Schema: type PGtextArray name arr = PGarrayOf name arr 'PGtext
- Squeal.PostgreSQL.Schema: type RelationType = [(Symbol, NullityType)]
- Squeal.PostgreSQL.Schema: type RelationsType = [(Symbol, RelationType)]
- Squeal.PostgreSQL.Schema: type family Maybes (xs :: [Type]) = (mxs :: [Type]) | mxs -> xs;
- Squeal.PostgreSQL.Schema: unMaybes :: MapMaybes xs => NP I (Maybes xs) -> NP Maybe xs
- Squeal.PostgreSQL.Schema: zipAs :: ZipAliased ns xs => NP Alias ns -> NP expr xs -> NP (Aliased expr) (ZipAs ns xs)
- Squeal.PostgreSQL.Schema: }
+ Squeal.PostgreSQL.Binary: instance (Generics.SOP.Sing.SListI fields, Generics.SOP.Record.IsRecord x xs, Generics.SOP.Constraint.AllZip Squeal.PostgreSQL.Binary.ToField xs fields, Generics.SOP.Constraint.All Squeal.PostgreSQL.Binary.HasAliasedOid fields) => Squeal.PostgreSQL.Binary.ToParam (Squeal.PostgreSQL.Schema.Composite x) ('Squeal.PostgreSQL.Schema.PGcomposite fields)
+ Squeal.PostgreSQL.Binary: instance (Generics.SOP.Sing.SListI result, Generics.SOP.Record.IsRecord y ys, Generics.SOP.Constraint.AllZip Squeal.PostgreSQL.Binary.FromField result ys) => Squeal.PostgreSQL.Binary.FromRow result y
+ Squeal.PostgreSQL.Binary: instance (Generics.SOP.Sing.SListI tys, Generics.SOP.Universe.IsProductType x xs, Generics.SOP.Constraint.AllZip Squeal.PostgreSQL.Binary.ToNullityParam xs tys) => Squeal.PostgreSQL.Binary.ToParams x tys
+ Squeal.PostgreSQL.Binary: instance (Generics.SOP.Universe.IsEnumType x, Generics.SOP.Universe.HasDatatypeInfo x, Squeal.PostgreSQL.Schema.LabelsPG x ~ labels) => Squeal.PostgreSQL.Binary.ToParam (Squeal.PostgreSQL.Schema.Enumerated x) ('Squeal.PostgreSQL.Schema.PGenum labels)
+ Squeal.PostgreSQL.Binary: instance (Generics.SOP.Universe.IsEnumType y, Generics.SOP.Universe.HasDatatypeInfo y, Squeal.PostgreSQL.Schema.LabelsPG y ~ labels) => Squeal.PostgreSQL.Binary.FromValue ('Squeal.PostgreSQL.Schema.PGenum labels) (Squeal.PostgreSQL.Schema.Enumerated y)
+ Squeal.PostgreSQL.Binary: instance (Generics.SOP.Universe.IsProductType product xs, Squeal.PostgreSQL.Schema.Length xs ~ n, Generics.SOP.Constraint.All ((Data.Type.Equality.~) x) xs, Squeal.PostgreSQL.Binary.ToArray x array) => Squeal.PostgreSQL.Binary.ToArray (GHC.Base.Maybe product) ('Squeal.PostgreSQL.Schema.Null ('Squeal.PostgreSQL.Schema.PGfixarray n array))
+ Squeal.PostgreSQL.Binary: instance (Generics.SOP.Universe.IsProductType product xs, Squeal.PostgreSQL.Schema.Length xs ~ n, Generics.SOP.Constraint.All ((Data.Type.Equality.~) x) xs, Squeal.PostgreSQL.Binary.ToArray x array) => Squeal.PostgreSQL.Binary.ToArray product ('Squeal.PostgreSQL.Schema.NotNull ('Squeal.PostgreSQL.Schema.PGfixarray n array))
+ Squeal.PostgreSQL.Binary: instance (Squeal.PostgreSQL.Binary.FromArray array y, Generics.SOP.Constraint.All ((Data.Type.Equality.~) y) ys, Generics.SOP.Sing.SListI ys, Generics.SOP.Universe.IsProductType product ys) => Squeal.PostgreSQL.Binary.FromArray ('Squeal.PostgreSQL.Schema.NotNull ('Squeal.PostgreSQL.Schema.PGfixarray n array)) product
+ Squeal.PostgreSQL.Binary: instance (Squeal.PostgreSQL.Binary.FromArray array y, Generics.SOP.Constraint.All ((Data.Type.Equality.~) y) ys, Generics.SOP.Sing.SListI ys, Generics.SOP.Universe.IsProductType product ys) => Squeal.PostgreSQL.Binary.FromArray ('Squeal.PostgreSQL.Schema.Null ('Squeal.PostgreSQL.Schema.PGfixarray n array)) (GHC.Base.Maybe product)
+ Squeal.PostgreSQL.Binary: instance (Squeal.PostgreSQL.Schema.HasOid pg, Squeal.PostgreSQL.Binary.ToParam x pg) => Squeal.PostgreSQL.Binary.ToArray (GHC.Base.Maybe x) ('Squeal.PostgreSQL.Schema.Null pg)
+ Squeal.PostgreSQL.Binary: instance (Squeal.PostgreSQL.Schema.HasOid pg, Squeal.PostgreSQL.Binary.ToParam x pg) => Squeal.PostgreSQL.Binary.ToArray x ('Squeal.PostgreSQL.Schema.NotNull pg)
+ Squeal.PostgreSQL.Binary: instance Data.Aeson.Types.FromJSON.FromJSON x => Squeal.PostgreSQL.Binary.FromValue 'Squeal.PostgreSQL.Schema.PGjson (Squeal.PostgreSQL.Schema.Json x)
+ Squeal.PostgreSQL.Binary: instance Data.Aeson.Types.FromJSON.FromJSON x => Squeal.PostgreSQL.Binary.FromValue 'Squeal.PostgreSQL.Schema.PGjsonb (Squeal.PostgreSQL.Schema.Jsonb x)
+ Squeal.PostgreSQL.Binary: instance Data.Aeson.Types.ToJSON.ToJSON x => Squeal.PostgreSQL.Binary.ToParam (Squeal.PostgreSQL.Schema.Json x) 'Squeal.PostgreSQL.Schema.PGjson
+ Squeal.PostgreSQL.Binary: instance Data.Aeson.Types.ToJSON.ToJSON x => Squeal.PostgreSQL.Binary.ToParam (Squeal.PostgreSQL.Schema.Jsonb x) 'Squeal.PostgreSQL.Schema.PGjsonb
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromArray ('Squeal.PostgreSQL.Schema.NotNull ('Squeal.PostgreSQL.Schema.PGfixarray n ty)) y => Squeal.PostgreSQL.Binary.FromValue ('Squeal.PostgreSQL.Schema.PGfixarray n ty) y
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromArray ('Squeal.PostgreSQL.Schema.NotNull ('Squeal.PostgreSQL.Schema.PGvararray ty)) y => Squeal.PostgreSQL.Binary.FromValue ('Squeal.PostgreSQL.Schema.PGvararray ty) y
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromArray array y => Squeal.PostgreSQL.Binary.FromArray ('Squeal.PostgreSQL.Schema.NotNull ('Squeal.PostgreSQL.Schema.PGvararray array)) (Data.Vector.Vector y)
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromArray array y => Squeal.PostgreSQL.Binary.FromArray ('Squeal.PostgreSQL.Schema.Null ('Squeal.PostgreSQL.Schema.PGvararray array)) (GHC.Base.Maybe (Data.Vector.Vector y))
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromRow fields y => Squeal.PostgreSQL.Binary.FromValue ('Squeal.PostgreSQL.Schema.PGcomposite fields) (Squeal.PostgreSQL.Schema.Composite y)
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromValue 'Squeal.PostgreSQL.Schema.PGtext GHC.Base.String
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromValue pg y => Squeal.PostgreSQL.Binary.FromArray ('Squeal.PostgreSQL.Schema.NotNull pg) y
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromValue pg y => Squeal.PostgreSQL.Binary.FromArray ('Squeal.PostgreSQL.Schema.Null pg) (GHC.Base.Maybe y)
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromValue pg y => Squeal.PostgreSQL.Binary.FromField (column Squeal.PostgreSQL.Schema.::: 'Squeal.PostgreSQL.Schema.NotNull pg) (column Squeal.PostgreSQL.Schema.::: y)
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.FromValue pg y => Squeal.PostgreSQL.Binary.FromField (column Squeal.PostgreSQL.Schema.::: 'Squeal.PostgreSQL.Schema.Null pg) (column Squeal.PostgreSQL.Schema.::: GHC.Base.Maybe y)
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.ToArray x ('Squeal.PostgreSQL.Schema.NotNull ('Squeal.PostgreSQL.Schema.PGfixarray n ty)) => Squeal.PostgreSQL.Binary.ToParam x ('Squeal.PostgreSQL.Schema.PGfixarray n ty)
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.ToArray x ('Squeal.PostgreSQL.Schema.NotNull ('Squeal.PostgreSQL.Schema.PGvararray ty)) => Squeal.PostgreSQL.Binary.ToParam x ('Squeal.PostgreSQL.Schema.PGvararray ty)
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.ToArray x array => Squeal.PostgreSQL.Binary.ToArray (Data.Vector.Vector x) ('Squeal.PostgreSQL.Schema.NotNull ('Squeal.PostgreSQL.Schema.PGvararray array))
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.ToArray x array => Squeal.PostgreSQL.Binary.ToArray (GHC.Base.Maybe (Data.Vector.Vector x)) ('Squeal.PostgreSQL.Schema.Null ('Squeal.PostgreSQL.Schema.PGvararray array))
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.ToNullityParam x ty => Squeal.PostgreSQL.Binary.ToField (alias Squeal.PostgreSQL.Schema.::: x) (alias Squeal.PostgreSQL.Schema.::: ty)
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.ToParam GHC.Base.String 'Squeal.PostgreSQL.Schema.PGtext
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.ToParam x pg => Squeal.PostgreSQL.Binary.ToNullityParam (GHC.Base.Maybe x) ('Squeal.PostgreSQL.Schema.Null pg)
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Binary.ToParam x pg => Squeal.PostgreSQL.Binary.ToNullityParam x ('Squeal.PostgreSQL.Schema.NotNull pg)
+ Squeal.PostgreSQL.Binary: instance Squeal.PostgreSQL.Schema.HasOid ty => Squeal.PostgreSQL.Binary.HasAliasedOid (alias Squeal.PostgreSQL.Schema.::: nullity ty)
+ Squeal.PostgreSQL.Definition: instance (GHC.TypeLits.KnownSymbol alias, Squeal.PostgreSQL.Expression.PGTyped schema ty) => Squeal.PostgreSQL.Definition.FieldTyped schema (alias Squeal.PostgreSQL.Schema.::: ty)
+ Squeal.PostgreSQL.Expression: field :: (Has tydef schema ( 'Typedef ( 'PGcomposite row)), Has field row ty) => Alias tydef -> Alias field -> Expression schema from grouping params ( 'NotNull ( 'PGcomposite row)) -> Expression schema from grouping params ty
+ Squeal.PostgreSQL.Expression: index :: Word64 -> Expression schema from grouping params (nullity ( 'PGvararray ty)) -> Expression schema from grouping params (NullifyType ty)
+ Squeal.PostgreSQL.Expression: infixl 6 #-.
+ Squeal.PostgreSQL.Expression: infixl 8 .#>>
+ Squeal.PostgreSQL.Expression: infixl 9 .?&
+ Squeal.PostgreSQL.Expression: infixr 2 .||
+ Squeal.PostgreSQL.Expression: infixr 3 .&&
+ Squeal.PostgreSQL.Expression: instance (GHC.TypeLits.KnownSymbol label, Squeal.PostgreSQL.Schema.In label labels) => Squeal.PostgreSQL.Schema.IsPGlabel label (Squeal.PostgreSQL.Expression.Expression schema from grouping params (nullity ('Squeal.PostgreSQL.Schema.PGenum labels)))
+ Squeal.PostgreSQL.Expression: instance (GHC.TypeNats.KnownNat n, 1 GHC.TypeNats.<= n) => Squeal.PostgreSQL.Expression.PGTyped schema (nullity ('Squeal.PostgreSQL.Schema.PGchar n))
+ Squeal.PostgreSQL.Expression: instance (GHC.TypeNats.KnownNat n, 1 GHC.TypeNats.<= n) => Squeal.PostgreSQL.Expression.PGTyped schema (nullity ('Squeal.PostgreSQL.Schema.PGvarchar n))
+ Squeal.PostgreSQL.Expression: instance (GHC.TypeNats.KnownNat n, Squeal.PostgreSQL.Expression.PGTyped schema ty) => Squeal.PostgreSQL.Expression.PGTyped schema (nullity ('Squeal.PostgreSQL.Schema.PGfixarray n ty))
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has table from columns, Squeal.PostgreSQL.Schema.Has column columns ty) => Squeal.PostgreSQL.Schema.IsQualified table column (Generics.SOP.NP.NP (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema from 'Squeal.PostgreSQL.Schema.Ungrouped params)) '[column Squeal.PostgreSQL.Schema.::: ty])
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has table from columns, Squeal.PostgreSQL.Schema.Has column columns ty) => Squeal.PostgreSQL.Schema.IsQualified table column (Squeal.PostgreSQL.Expression.Expression schema from 'Squeal.PostgreSQL.Schema.Ungrouped params ty)
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has table from columns, Squeal.PostgreSQL.Schema.Has column columns ty) => Squeal.PostgreSQL.Schema.IsQualified table column (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema from 'Squeal.PostgreSQL.Schema.Ungrouped params) (column Squeal.PostgreSQL.Schema.::: ty))
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has table from columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy table column bys) => Squeal.PostgreSQL.Schema.IsQualified table column (Generics.SOP.NP.NP (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema from ('Squeal.PostgreSQL.Schema.Grouped bys) params)) '[column Squeal.PostgreSQL.Schema.::: ty])
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has table from columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy table column bys) => Squeal.PostgreSQL.Schema.IsQualified table column (Squeal.PostgreSQL.Expression.Expression schema from ('Squeal.PostgreSQL.Schema.Grouped bys) params ty)
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.Has table from columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy table column bys) => Squeal.PostgreSQL.Schema.IsQualified table column (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema from ('Squeal.PostgreSQL.Schema.Grouped bys) params) (column Squeal.PostgreSQL.Schema.::: ty))
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique table from columns, Squeal.PostgreSQL.Schema.Has column columns ty) => GHC.OverloadedLabels.IsLabel column (Generics.SOP.NP.NP (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema from 'Squeal.PostgreSQL.Schema.Ungrouped params)) '[column Squeal.PostgreSQL.Schema.::: ty])
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique table from columns, Squeal.PostgreSQL.Schema.Has column columns ty) => GHC.OverloadedLabels.IsLabel column (Squeal.PostgreSQL.Expression.Expression schema from 'Squeal.PostgreSQL.Schema.Ungrouped params ty)
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique table from columns, Squeal.PostgreSQL.Schema.Has column columns ty) => GHC.OverloadedLabels.IsLabel column (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema from 'Squeal.PostgreSQL.Schema.Ungrouped params) (column Squeal.PostgreSQL.Schema.::: ty))
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique table from columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy table column bys) => GHC.OverloadedLabels.IsLabel column (Generics.SOP.NP.NP (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema from ('Squeal.PostgreSQL.Schema.Grouped bys) params)) '[column Squeal.PostgreSQL.Schema.::: ty])
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique table from columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy table column bys) => GHC.OverloadedLabels.IsLabel column (Squeal.PostgreSQL.Expression.Expression schema from ('Squeal.PostgreSQL.Schema.Grouped bys) params ty)
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.HasUnique table from columns, Squeal.PostgreSQL.Schema.Has column columns ty, Squeal.PostgreSQL.Schema.GroupedBy table column bys) => GHC.OverloadedLabels.IsLabel column (Squeal.PostgreSQL.Schema.Aliased (Squeal.PostgreSQL.Expression.Expression schema from ('Squeal.PostgreSQL.Schema.Grouped bys) params) (column Squeal.PostgreSQL.Schema.::: ty))
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.In ty Squeal.PostgreSQL.Schema.PGNum, Squeal.PostgreSQL.Schema.In ty Squeal.PostgreSQL.Schema.PGFloating) => GHC.Float.Floating (Squeal.PostgreSQL.Expression.Expression schema from grouping params (nullity ty))
+ Squeal.PostgreSQL.Expression: instance (Squeal.PostgreSQL.Schema.In ty Squeal.PostgreSQL.Schema.PGNum, Squeal.PostgreSQL.Schema.In ty Squeal.PostgreSQL.Schema.PGFloating) => GHC.Real.Fractional (Squeal.PostgreSQL.Expression.Expression schema from grouping params (nullity ty))
+ Squeal.PostgreSQL.Expression: instance Control.DeepSeq.NFData (Squeal.PostgreSQL.Expression.Expression schema from grouping params ty)
+ Squeal.PostgreSQL.Expression: instance Data.String.IsString (Squeal.PostgreSQL.Expression.Expression schema from grouping params (nullity 'Squeal.PostgreSQL.Schema.PGtext))
+ Squeal.PostgreSQL.Expression: instance GHC.Base.Monoid (Squeal.PostgreSQL.Expression.Expression schema from grouping params (nullity 'Squeal.PostgreSQL.Schema.PGtext))
+ Squeal.PostgreSQL.Expression: instance GHC.Base.Monoid (Squeal.PostgreSQL.Expression.Expression schema from grouping params (nullity ('Squeal.PostgreSQL.Schema.PGvararray ty)))
+ Squeal.PostgreSQL.Expression: instance GHC.Base.Semigroup (Squeal.PostgreSQL.Expression.Expression schema from grouping param (nullity 'Squeal.PostgreSQL.Schema.PGjsonb))
+ Squeal.PostgreSQL.Expression: instance GHC.Base.Semigroup (Squeal.PostgreSQL.Expression.Expression schema from grouping params (nullity 'Squeal.PostgreSQL.Schema.PGtext))
+ Squeal.PostgreSQL.Expression: instance GHC.Base.Semigroup (Squeal.PostgreSQL.Expression.Expression schema from grouping params (nullity ('Squeal.PostgreSQL.Schema.PGvararray ty)))
+ Squeal.PostgreSQL.Expression: instance GHC.Classes.Eq (Squeal.PostgreSQL.Expression.Expression schema from grouping params ty)
+ Squeal.PostgreSQL.Expression: instance GHC.Classes.Ord (Squeal.PostgreSQL.Expression.Expression schema from grouping params ty)
+ Squeal.PostgreSQL.Expression: instance GHC.Generics.Generic (Squeal.PostgreSQL.Expression.Expression schema from grouping params ty)
+ Squeal.PostgreSQL.Expression: instance GHC.Show.Show (Squeal.PostgreSQL.Expression.Expression schema from grouping params ty)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGbool)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGbytea)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGdate)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGfloat4)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGfloat8)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGint2)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGint4)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGint8)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGinterval)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGjson)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGjsonb)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGnumeric)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGtext)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGtime)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGtimestamp)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGtimestamptz)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGtimetz)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema (nullity 'Squeal.PostgreSQL.Schema.PGuuid)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Expression.PGTyped schema ty => Squeal.PostgreSQL.Expression.PGTyped schema (nullity ('Squeal.PostgreSQL.Schema.PGvararray ty))
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Render.RenderSQL (Squeal.PostgreSQL.Expression.Expression schema from grouping params ty)
+ Squeal.PostgreSQL.Expression: instance Squeal.PostgreSQL.Schema.In ty Squeal.PostgreSQL.Schema.PGNum => GHC.Num.Num (Squeal.PostgreSQL.Expression.Expression schema from grouping params (nullity ty))
+ Squeal.PostgreSQL.Expression: typedef :: Has alias schema ( 'Typedef ty) => Alias alias -> TypeExpression schema (nullity ty)
+ Squeal.PostgreSQL.Expression: typetable :: Has alias schema ( 'Table tab) => Alias alias -> TypeExpression schema (nullity ( 'PGcomposite (TableToRow tab)))
+ Squeal.PostgreSQL.Expression: typeview :: Has alias schema ( 'View view) => Alias alias -> TypeExpression schema (nullity ( 'PGcomposite view))
+ Squeal.PostgreSQL.Manipulation: instance Squeal.PostgreSQL.Query.With Squeal.PostgreSQL.Manipulation.Manipulation
+ Squeal.PostgreSQL.PQ: PQException :: ExecStatus -> Maybe ByteString -> Maybe ByteString -> SquealException
+ Squeal.PostgreSQL.PQ: ParseException :: Text -> SquealException
+ Squeal.PostgreSQL.PQ: ResultException :: Text -> SquealException
+ Squeal.PostgreSQL.PQ: [sqlErrorMessage] :: SquealException -> Maybe ByteString
+ Squeal.PostgreSQL.PQ: [sqlExecStatus] :: SquealException -> ExecStatus
+ Squeal.PostgreSQL.PQ: [sqlStateCode] :: SquealException -> Maybe ByteString
+ Squeal.PostgreSQL.PQ: catchSqueal :: MonadBaseControl IO io => io a -> (SquealException -> io a) -> io a
+ Squeal.PostgreSQL.PQ: data SquealException
+ Squeal.PostgreSQL.PQ: handleSqueal :: MonadBaseControl IO io => (SquealException -> io a) -> io a -> io a
+ Squeal.PostgreSQL.PQ: instance GHC.Classes.Eq Squeal.PostgreSQL.PQ.SquealException
+ Squeal.PostgreSQL.PQ: instance GHC.Exception.Exception Squeal.PostgreSQL.PQ.SquealException
+ Squeal.PostgreSQL.PQ: instance GHC.Show.Show Squeal.PostgreSQL.PQ.SquealException
+ Squeal.PostgreSQL.PQ: resultErrorCode :: MonadBase IO io => K Result results -> io (Maybe ByteString)
+ Squeal.PostgreSQL.Query: [CommonTableExpression] :: Aliased (statement schema params) (alias ::: cte) -> CommonTableExpression statement params schema (alias ::: 'View cte : schema)
+ Squeal.PostgreSQL.Query: allLt :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: class With statement
+ Squeal.PostgreSQL.Query: data CommonTableExpression statement (params :: [NullityType]) (schema0 :: SchemaType) (schema1 :: SchemaType)
+ Squeal.PostgreSQL.Query: eqAll :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: eqAny :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: gtAll :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: gtAny :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: gteAll :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: gteAny :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: in_ :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: instance (GHC.TypeLits.KnownSymbol alias, schema1 ~ ((alias Squeal.PostgreSQL.Schema.::: 'Squeal.PostgreSQL.Schema.View cte) : schema)) => Squeal.PostgreSQL.Schema.Aliasable alias (statement schema params cte) (Squeal.PostgreSQL.Query.CommonTableExpression statement params schema schema1)
+ Squeal.PostgreSQL.Query: instance (GHC.TypeLits.KnownSymbol alias, schema1 ~ ((alias Squeal.PostgreSQL.Schema.::: 'Squeal.PostgreSQL.Schema.View cte) : schema)) => Squeal.PostgreSQL.Schema.Aliasable alias (statement schema params cte) (Squeal.PostgreSQL.Schema.AlignedList (Squeal.PostgreSQL.Query.CommonTableExpression statement params) schema schema1)
+ Squeal.PostgreSQL.Query: instance GHC.Classes.Eq (Squeal.PostgreSQL.Query.By from by)
+ Squeal.PostgreSQL.Query: instance GHC.Classes.Eq (Squeal.PostgreSQL.Query.HavingClause schema from grouping params)
+ Squeal.PostgreSQL.Query: instance GHC.Classes.Ord (Squeal.PostgreSQL.Query.By from by)
+ Squeal.PostgreSQL.Query: instance GHC.Classes.Ord (Squeal.PostgreSQL.Query.HavingClause schema from grouping params)
+ Squeal.PostgreSQL.Query: instance GHC.Show.Show (Squeal.PostgreSQL.Query.By from by)
+ Squeal.PostgreSQL.Query: instance GHC.Show.Show (Squeal.PostgreSQL.Query.HavingClause schema from grouping params)
+ Squeal.PostgreSQL.Query: instance GHC.Show.Show (Squeal.PostgreSQL.Query.SortExpression schema from grouping params)
+ Squeal.PostgreSQL.Query: instance Squeal.PostgreSQL.Query.With Squeal.PostgreSQL.Query.Query
+ Squeal.PostgreSQL.Query: instance forall k1 (schema :: k1) k2 (params :: k2) k3 (from :: k3). Control.DeepSeq.NFData (Squeal.PostgreSQL.Query.FromClause schema params from)
+ Squeal.PostgreSQL.Query: instance forall k1 (schema :: k1) k2 (params :: k2) k3 (from :: k3). GHC.Classes.Eq (Squeal.PostgreSQL.Query.FromClause schema params from)
+ Squeal.PostgreSQL.Query: instance forall k1 (schema :: k1) k2 (params :: k2) k3 (from :: k3). GHC.Classes.Ord (Squeal.PostgreSQL.Query.FromClause schema params from)
+ Squeal.PostgreSQL.Query: instance forall k1 (schema :: k1) k2 (params :: k2) k3 (from :: k3). GHC.Generics.Generic (Squeal.PostgreSQL.Query.FromClause schema params from)
+ Squeal.PostgreSQL.Query: instance forall k1 (schema :: k1) k2 (params :: k2) k3 (from :: k3). GHC.Show.Show (Squeal.PostgreSQL.Query.FromClause schema params from)
+ Squeal.PostgreSQL.Query: jsonObjectKeys :: Expression schema '[] 'Ungrouped params (nullity 'PGjson) -> Query schema params '["json_object_keys" ::: 'NotNull 'PGtext]
+ Squeal.PostgreSQL.Query: jsonPopulateRecord :: TypeExpression schema (nullity ( 'PGcomposite row)) -> Expression schema '[] 'Ungrouped params (nullity 'PGjson) -> Query schema params row
+ Squeal.PostgreSQL.Query: jsonPopulateRecordSet :: TypeExpression schema (nullity ( 'PGcomposite row)) -> Expression schema '[] 'Ungrouped params (nullity 'PGjson) -> Query schema params row
+ Squeal.PostgreSQL.Query: jsonToRecord :: SListI record => Expression schema '[] 'Ungrouped params (nullity 'PGjson) -> NP (Aliased (TypeExpression schema)) record -> Query schema params record
+ Squeal.PostgreSQL.Query: jsonToRecordSet :: SListI record => Expression schema '[] 'Ungrouped params (nullity 'PGjson) -> NP (Aliased (TypeExpression schema)) record -> Query schema params record
+ Squeal.PostgreSQL.Query: jsonbObjectKeys :: Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -> Query schema params '["jsonb_object_keys" ::: 'NotNull 'PGtext]
+ Squeal.PostgreSQL.Query: jsonbPopulateRecord :: TypeExpression schema (nullity ( 'PGcomposite row)) -> Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -> Query schema params row
+ Squeal.PostgreSQL.Query: jsonbPopulateRecordSet :: TypeExpression schema (nullity ( 'PGcomposite row)) -> Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -> Query schema params row
+ Squeal.PostgreSQL.Query: jsonbToRecord :: SListI record => Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -> NP (Aliased (TypeExpression schema)) record -> Query schema params record
+ Squeal.PostgreSQL.Query: jsonbToRecordSet :: SListI record => Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -> NP (Aliased (TypeExpression schema)) record -> Query schema params record
+ Squeal.PostgreSQL.Query: ltAny :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: lteAll :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: lteAny :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: neqAll :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: neqAny :: Expression schema from grp params ty -> Query schema params '[alias ::: ty] -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: renderCommonTableExpression :: (forall sch ps row. statement ps sch row -> ByteString) -> CommonTableExpression statement params schema0 schema1 -> ByteString
+ Squeal.PostgreSQL.Query: renderCommonTableExpressions :: (forall sch ps row. statement ps sch row -> ByteString) -> CommonTableExpression statement params schema0 schema1 -> AlignedList (CommonTableExpression statement params) schema1 schema2 -> ByteString
+ Squeal.PostgreSQL.Query: rowEqAll :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowEqAny :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowGtAll :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowGtAny :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowGteAll :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowGteAny :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowIn :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowLtAll :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowLtAny :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowLteAll :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowLteAny :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowNeqAll :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: rowNeqAny :: SListI row => NP (Aliased (Expression schema from grp params)) row -> Query schema params row -> Expression schema from grp params (nullity 'PGbool)
+ Squeal.PostgreSQL.Query: with :: With statement => AlignedList (CommonTableExpression statement params) schema0 schema1 -> statement schema1 params row -> statement schema0 params row
+ Squeal.PostgreSQL.Render: infixr 7 <+>
+ Squeal.PostgreSQL.Render: renderSymbol :: forall s. KnownSymbol s => ByteString
+ Squeal.PostgreSQL.Schema: Composite :: record -> Composite record
+ Squeal.PostgreSQL.Schema: Enumerated :: enum -> Enumerated enum
+ Squeal.PostgreSQL.Schema: Json :: hask -> Json hask
+ Squeal.PostgreSQL.Schema: Jsonb :: hask -> Jsonb hask
+ Squeal.PostgreSQL.Schema: [:>>] :: p x0 x1 -> AlignedList p x1 x2 -> AlignedList p x0 x2
+ Squeal.PostgreSQL.Schema: [Done] :: AlignedList p x x
+ Squeal.PostgreSQL.Schema: [getComposite] :: Composite record -> record
+ Squeal.PostgreSQL.Schema: [getEnumerated] :: Enumerated enum -> enum
+ Squeal.PostgreSQL.Schema: [getJson] :: Json hask -> hask
+ Squeal.PostgreSQL.Schema: [getJsonb] :: Jsonb hask -> hask
+ Squeal.PostgreSQL.Schema: data AlignedList p x0 x1
+ Squeal.PostgreSQL.Schema: instance (GHC.TypeLits.KnownSymbol table, GHC.TypeLits.KnownSymbol column) => Squeal.PostgreSQL.Schema.GroupedBy table column ('(table, column) : bys)
+ Squeal.PostgreSQL.Schema: instance GHC.Classes.Eq enum => GHC.Classes.Eq (Squeal.PostgreSQL.Schema.Enumerated enum)
+ Squeal.PostgreSQL.Schema: instance GHC.Classes.Eq hask => GHC.Classes.Eq (Squeal.PostgreSQL.Schema.Json hask)
+ Squeal.PostgreSQL.Schema: instance GHC.Classes.Eq hask => GHC.Classes.Eq (Squeal.PostgreSQL.Schema.Jsonb hask)
+ Squeal.PostgreSQL.Schema: instance GHC.Classes.Eq record => GHC.Classes.Eq (Squeal.PostgreSQL.Schema.Composite record)
+ Squeal.PostgreSQL.Schema: instance GHC.Classes.Ord enum => GHC.Classes.Ord (Squeal.PostgreSQL.Schema.Enumerated enum)
+ Squeal.PostgreSQL.Schema: instance GHC.Classes.Ord hask => GHC.Classes.Ord (Squeal.PostgreSQL.Schema.Json hask)
+ Squeal.PostgreSQL.Schema: instance GHC.Classes.Ord hask => GHC.Classes.Ord (Squeal.PostgreSQL.Schema.Jsonb hask)
+ Squeal.PostgreSQL.Schema: instance GHC.Classes.Ord record => GHC.Classes.Ord (Squeal.PostgreSQL.Schema.Composite record)
+ Squeal.PostgreSQL.Schema: instance GHC.Generics.Generic (Squeal.PostgreSQL.Schema.Composite record)
+ Squeal.PostgreSQL.Schema: instance GHC.Generics.Generic (Squeal.PostgreSQL.Schema.Enumerated enum)
+ Squeal.PostgreSQL.Schema: instance GHC.Generics.Generic (Squeal.PostgreSQL.Schema.Json hask)
+ Squeal.PostgreSQL.Schema: instance GHC.Generics.Generic (Squeal.PostgreSQL.Schema.Jsonb hask)
+ Squeal.PostgreSQL.Schema: instance GHC.Read.Read enum => GHC.Read.Read (Squeal.PostgreSQL.Schema.Enumerated enum)
+ Squeal.PostgreSQL.Schema: instance GHC.Read.Read hask => GHC.Read.Read (Squeal.PostgreSQL.Schema.Json hask)
+ Squeal.PostgreSQL.Schema: instance GHC.Read.Read hask => GHC.Read.Read (Squeal.PostgreSQL.Schema.Jsonb hask)
+ Squeal.PostgreSQL.Schema: instance GHC.Read.Read record => GHC.Read.Read (Squeal.PostgreSQL.Schema.Composite record)
+ Squeal.PostgreSQL.Schema: instance GHC.Show.Show enum => GHC.Show.Show (Squeal.PostgreSQL.Schema.Enumerated enum)
+ Squeal.PostgreSQL.Schema: instance GHC.Show.Show hask => GHC.Show.Show (Squeal.PostgreSQL.Schema.Json hask)
+ Squeal.PostgreSQL.Schema: instance GHC.Show.Show hask => GHC.Show.Show (Squeal.PostgreSQL.Schema.Jsonb hask)
+ Squeal.PostgreSQL.Schema: instance GHC.Show.Show record => GHC.Show.Show (Squeal.PostgreSQL.Schema.Composite record)
+ Squeal.PostgreSQL.Schema: instance forall a (table :: GHC.Types.Symbol) (column :: GHC.Types.Symbol) (bys :: [a]) (tabcol :: a). (GHC.TypeLits.KnownSymbol table, GHC.TypeLits.KnownSymbol column, Squeal.PostgreSQL.Schema.GroupedBy table column bys) => Squeal.PostgreSQL.Schema.GroupedBy table column (tabcol : bys)
+ Squeal.PostgreSQL.Schema: instance forall k (alias :: GHC.Types.Symbol) (alias1 :: GHC.Types.Symbol) (expression :: k -> *) (ty :: k). (GHC.TypeLits.KnownSymbol alias, alias ~ alias1) => Squeal.PostgreSQL.Schema.Aliasable alias (expression ty) (Squeal.PostgreSQL.Schema.Aliased expression (alias1 Squeal.PostgreSQL.Schema.::: ty))
+ Squeal.PostgreSQL.Schema: instance forall k (p :: k -> k -> *). Control.Category.Category (Squeal.PostgreSQL.Schema.AlignedList p)
+ Squeal.PostgreSQL.Schema: newtype Composite record
+ Squeal.PostgreSQL.Schema: newtype Enumerated enum
+ Squeal.PostgreSQL.Schema: newtype Json hask
+ Squeal.PostgreSQL.Schema: newtype Jsonb hask
+ Squeal.PostgreSQL.Schema: single :: p x0 x1 -> AlignedList p x0 x1
+ Squeal.PostgreSQL.Schema: type FromType = [(Symbol, RowType)]
+ Squeal.PostgreSQL.Schema: type PGJsonKey = '[ 'PGint2, 'PGint4, 'PGtext]
+ Squeal.PostgreSQL.Schema: type PGJsonType = '[ 'PGjson, 'PGjsonb]
+ Squeal.PostgreSQL.Schema: type PGTextArray name arr = PGArrayOf name arr ( 'NotNull 'PGtext)
+ Squeal.PostgreSQL.Schema: type RowType = [(Symbol, NullityType)]
- Squeal.PostgreSQL.Binary: class SListI results => FromRow (results :: RelationType) y
+ Squeal.PostgreSQL.Binary: class SListI result => FromRow (result :: RowType) y
- Squeal.PostgreSQL.Binary: fromRow :: FromRow results y => NP (K (Maybe ByteString)) results -> y
+ Squeal.PostgreSQL.Binary: fromRow :: FromRow result y => NP (K (Maybe ByteString)) result -> Either Text y
- Squeal.PostgreSQL.Binary: fromValue :: FromValue pg y => proxy pg -> Value y
+ Squeal.PostgreSQL.Binary: fromValue :: FromValue pg y => Value y
- Squeal.PostgreSQL.Binary: toParams :: ToParams x tys => x -> NP (K (Maybe ByteString)) tys
+ Squeal.PostgreSQL.Binary: toParams :: ToParams x tys => x -> NP (K (Maybe Encoding)) tys
- Squeal.PostgreSQL.Definition: check :: (Has alias schema ( 'Table table), HasAll aliases (TableToRelation table) subcolumns) => NP Alias aliases -> (forall tab. Condition schema '[tab ::: subcolumns] 'Ungrouped '[]) -> TableConstraintExpression schema alias ( 'Check aliases)
+ Squeal.PostgreSQL.Definition: check :: (Has alias schema ( 'Table table), HasAll aliases (TableToRow table) subcolumns) => NP Alias aliases -> (forall tab. Condition schema '[tab ::: subcolumns] 'Ungrouped '[]) -> TableConstraintExpression schema alias ( 'Check aliases)
- Squeal.PostgreSQL.Definition: createTypeCompositeFrom :: forall hask ty schema. (ZipAliased (FieldNamesFrom hask) (FieldTypesFrom hask), All (PGTyped schema) (FieldTypesFrom hask), KnownSymbol ty) => Alias ty -> Definition schema (Create ty ( 'Typedef (CompositeFrom hask)) schema)
+ Squeal.PostgreSQL.Definition: createTypeCompositeFrom :: forall hask ty schema. (All (FieldTyped schema) (RowPG hask), KnownSymbol ty) => Alias ty -> Definition schema (Create ty ( 'Typedef (PG (Composite hask))) schema)
- Squeal.PostgreSQL.Definition: createTypeEnumFrom :: forall hask enum schema. (Generic hask, All KnownSymbol (LabelsFrom hask), KnownSymbol enum) => Alias enum -> Definition schema (Create enum ( 'Typedef (EnumFrom hask)) schema)
+ Squeal.PostgreSQL.Definition: createTypeEnumFrom :: forall hask enum schema. (Generic hask, All KnownSymbol (LabelsPG hask), KnownSymbol enum) => Alias enum -> Definition schema (Create enum ( 'Typedef (PG (Enumerated hask))) schema)
- Squeal.PostgreSQL.Definition: createView :: KnownSymbol view => Alias view -> Query schema '[] relation -> Definition schema (Create view ( 'View relation) schema)
+ Squeal.PostgreSQL.Definition: createView :: KnownSymbol view => Alias view -> Query schema '[] row -> Definition schema (Create view ( 'View row) schema)
- Squeal.PostgreSQL.Definition: notNullable :: TypeExpression schema ty -> ColumnTypeExpression schema (def :=> 'NotNull ty)
+ Squeal.PostgreSQL.Definition: notNullable :: TypeExpression schema (nullity ty) -> ColumnTypeExpression schema ( 'NoDef :=> 'NotNull ty)
- Squeal.PostgreSQL.Definition: nullable :: TypeExpression schema ty -> ColumnTypeExpression schema ( 'NoDef :=> 'Null ty)
+ Squeal.PostgreSQL.Definition: nullable :: TypeExpression schema (nullity ty) -> ColumnTypeExpression schema ( 'NoDef :=> 'Null ty)
- Squeal.PostgreSQL.Definition: unique :: (Has alias schema ( 'Table table), HasAll aliases (TableToRelation table) subcolumns) => NP Alias aliases -> TableConstraintExpression schema alias ( 'Unique aliases)
+ Squeal.PostgreSQL.Definition: unique :: (Has alias schema ( 'Table table), HasAll aliases (TableToRow table) subcolumns) => NP Alias aliases -> TableConstraintExpression schema alias ( 'Unique aliases)
- Squeal.PostgreSQL.Expression: (#-.) :: PGtextArray "(#-.)" arrayty => Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity arrayty) -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: (#-.) :: PGTextArray "(#-.)" arrayty => Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity arrayty) -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: (.#>) :: (PGjson_ json, PGtextArray "(.#>)" path) => Expression schema relations grouping params (nullity json) -> Expression schema relations grouping params (nullity path) -> Expression schema relations grouping params ( 'Null json)
+ Squeal.PostgreSQL.Expression: (.#>) :: (json `In` PGJsonType, PGTextArray "(.#>)" path) => Expression schema from grouping params (nullity json) -> Expression schema from grouping params (nullity path) -> Expression schema from grouping params ( 'Null json)
- Squeal.PostgreSQL.Expression: (.#>>) :: (PGjson_ json, PGtextArray "(.#>>)" path) => Expression schema relations grouping params (nullity json) -> Expression schema relations grouping params (nullity path) -> Expression schema relations grouping params ( 'Null 'PGtext)
+ Squeal.PostgreSQL.Expression: (.#>>) :: (json `In` PGJsonType, PGTextArray "(.#>>)" path) => Expression schema from grouping params (nullity json) -> Expression schema from grouping params (nullity path) -> Expression schema from grouping params ( 'Null 'PGtext)
- Squeal.PostgreSQL.Expression: (.&&) :: Condition schema relations grouping params -> Condition schema relations grouping params -> Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: (.&&) :: Expression schema from grouping params (nullity 'PGbool) -> Expression schema from grouping params (nullity 'PGbool) -> Expression schema from grouping params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: (.-.) :: (key `In` '[ 'PGtext, 'PGvararray 'PGtext, 'PGint4, 'PGint2]) => Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity key) -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: (.-.) :: (key `In` '[ 'PGtext, 'PGvararray ( 'NotNull 'PGtext), 'PGint4, 'PGint2]) => Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity key) -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: (.->) :: (PGjson_ json, PGjsonKey key) => Expression schema relations grouping params (nullity json) -> Expression schema relations grouping params (nullity key) -> Expression schema relations grouping params ( 'Null json)
+ Squeal.PostgreSQL.Expression: (.->) :: (json `In` PGJsonType, key `In` PGJsonKey) => Expression schema from grouping params (nullity json) -> Expression schema from grouping params (nullity key) -> Expression schema from grouping params ( 'Null json)
- Squeal.PostgreSQL.Expression: (.->>) :: (PGjson_ json, PGjsonKey key) => Expression schema relations grouping params (nullity json) -> Expression schema relations grouping params (nullity key) -> Expression schema relations grouping params ( 'Null 'PGtext)
+ Squeal.PostgreSQL.Expression: (.->>) :: (json `In` PGJsonType, key `In` PGJsonKey) => Expression schema from grouping params (nullity json) -> Expression schema from grouping params (nullity key) -> Expression schema from grouping params ( 'Null 'PGtext)
- Squeal.PostgreSQL.Expression: (./=) :: Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: (./=) :: Expression schema from grouping params (nullity0 ty) -> Expression schema from grouping params (nullity1 ty) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: (.<) :: Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: (.<) :: Expression schema from grouping params (nullity0 ty) -> Expression schema from grouping params (nullity1 ty) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: (.<=) :: Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: (.<=) :: Expression schema from grouping params (nullity0 ty) -> Expression schema from grouping params (nullity1 ty) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: (.<@) :: Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity 'PGjsonb) -> Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: (.<@) :: Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity 'PGjsonb) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: (.==) :: Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: (.==) :: Expression schema from grouping params (nullity0 ty) -> Expression schema from grouping params (nullity1 ty) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: (.>) :: Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: (.>) :: Expression schema from grouping params (nullity0 ty) -> Expression schema from grouping params (nullity1 ty) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: (.>=) :: Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: (.>=) :: Expression schema from grouping params (nullity0 ty) -> Expression schema from grouping params (nullity1 ty) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: (.?&) :: Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity ( 'PGvararray 'PGtext)) -> Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: (.?&) :: Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity ( 'PGvararray ( 'NotNull 'PGtext))) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: (.?) :: Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity 'PGtext) -> Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: (.?) :: Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity 'PGtext) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: (.?|) :: Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity ( 'PGvararray 'PGtext)) -> Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: (.?|) :: Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity ( 'PGvararray ( 'NotNull 'PGtext))) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: (.@>) :: Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity 'PGjsonb) -> Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: (.@>) :: Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity 'PGjsonb) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: (.||) :: Condition schema relations grouping params -> Condition schema relations grouping params -> Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: (.||) :: Expression schema from grouping params (nullity 'PGbool) -> Expression schema from grouping params (nullity 'PGbool) -> Expression schema from grouping params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: array :: [Expression schema relations grouping params ( 'Null ty)] -> Expression schema relations grouping params (nullity ( 'PGvararray ty))
+ Squeal.PostgreSQL.Expression: array :: [Expression schema from grouping params ty] -> Expression schema from grouping params (nullity ( 'PGvararray ty))
- Squeal.PostgreSQL.Expression: arrayToJson :: PGarray "arrayToJson" arr => Expression schema relations grouping params (nullity arr) -> Expression schema relations grouping params (nullity 'PGjson)
+ Squeal.PostgreSQL.Expression: arrayToJson :: PGArray "arrayToJson" arr => Expression schema from grouping params (nullity arr) -> Expression schema from grouping params (nullity 'PGjson)
- Squeal.PostgreSQL.Expression: atan2_ :: PGFloating float => Expression schema relations grouping params (nullity float) -> Expression schema relations grouping params (nullity float) -> Expression schema relations grouping params (nullity float)
+ Squeal.PostgreSQL.Expression: atan2_ :: float `In` PGFloating => Expression schema from grouping params (nullity float) -> Expression schema from grouping params (nullity float) -> Expression schema from grouping params (nullity float)
- Squeal.PostgreSQL.Expression: avg :: PGAvg ty avg => Expression schema relations 'Ungrouped params (nullity ty) -> Expression schema relations ( 'Grouped bys) params (nullity avg)
+ Squeal.PostgreSQL.Expression: avg :: PGAvg ty avg => Expression schema from 'Ungrouped params (nullity ty) -> Expression schema from ( 'Grouped bys) params (nullity avg)
- Squeal.PostgreSQL.Expression: avgDistinct :: PGAvg ty avg => Expression schema relations 'Ungrouped params (nullity ty) -> Expression schema relations ( 'Grouped bys) params (nullity avg)
+ Squeal.PostgreSQL.Expression: avgDistinct :: PGAvg ty avg => Expression schema from 'Ungrouped params (nullity ty) -> Expression schema from ( 'Grouped bys) params (nullity avg)
- Squeal.PostgreSQL.Expression: bigint :: TypeExpression schema 'PGint8
+ Squeal.PostgreSQL.Expression: bigint :: TypeExpression schema (nullity 'PGint8)
- Squeal.PostgreSQL.Expression: bitAnd :: PGIntegral int => Expression schema relations 'Ungrouped params (nullity int) -> Expression schema relations ( 'Grouped bys) params (nullity int)
+ Squeal.PostgreSQL.Expression: bitAnd :: int `In` PGIntegral => Expression schema from 'Ungrouped params (nullity int) -> Expression schema from ( 'Grouped bys) params (nullity int)
- Squeal.PostgreSQL.Expression: bitAndDistinct :: PGIntegral int => Expression schema relations 'Ungrouped params (nullity int) -> Expression schema relations ( 'Grouped bys) params (nullity int)
+ Squeal.PostgreSQL.Expression: bitAndDistinct :: int `In` PGIntegral => Expression schema from 'Ungrouped params (nullity int) -> Expression schema from ( 'Grouped bys) params (nullity int)
- Squeal.PostgreSQL.Expression: bitOr :: PGIntegral int => Expression schema relations 'Ungrouped params (nullity int) -> Expression schema relations ( 'Grouped bys) params (nullity int)
+ Squeal.PostgreSQL.Expression: bitOr :: int `In` PGIntegral => Expression schema from 'Ungrouped params (nullity int) -> Expression schema from ( 'Grouped bys) params (nullity int)
- Squeal.PostgreSQL.Expression: bitOrDistinct :: PGIntegral int => Expression schema relations 'Ungrouped params (nullity int) -> Expression schema relations ( 'Grouped bys) params (nullity int)
+ Squeal.PostgreSQL.Expression: bitOrDistinct :: int `In` PGIntegral => Expression schema from 'Ungrouped params (nullity int) -> Expression schema from ( 'Grouped bys) params (nullity int)
- Squeal.PostgreSQL.Expression: bool :: TypeExpression schema 'PGbool
+ Squeal.PostgreSQL.Expression: bool :: TypeExpression schema (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: boolAnd :: Expression schema relations 'Ungrouped params (nullity 'PGbool) -> Expression schema relations ( 'Grouped bys) params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: boolAnd :: Expression schema from 'Ungrouped params (nullity 'PGbool) -> Expression schema from ( 'Grouped bys) params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: boolAndDistinct :: Expression schema relations 'Ungrouped params (nullity 'PGbool) -> Expression schema relations ( 'Grouped bys) params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: boolAndDistinct :: Expression schema from 'Ungrouped params (nullity 'PGbool) -> Expression schema from ( 'Grouped bys) params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: boolOr :: Expression schema relations 'Ungrouped params (nullity 'PGbool) -> Expression schema relations ( 'Grouped bys) params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: boolOr :: Expression schema from 'Ungrouped params (nullity 'PGbool) -> Expression schema from ( 'Grouped bys) params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: boolOrDistinct :: Expression schema relations 'Ungrouped params (nullity 'PGbool) -> Expression schema relations ( 'Grouped bys) params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: boolOrDistinct :: Expression schema from 'Ungrouped params (nullity 'PGbool) -> Expression schema from ( 'Grouped bys) params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: bytea :: TypeExpression schema 'PGbytea
+ Squeal.PostgreSQL.Expression: bytea :: TypeExpression schema (nullity 'PGbytea)
- Squeal.PostgreSQL.Expression: caseWhenThenElse :: [(Condition schema relations grouping params, Expression schema relations grouping params (ty))] -> Expression schema relations grouping params (ty) -> Expression schema relations grouping params (ty)
+ Squeal.PostgreSQL.Expression: caseWhenThenElse :: [(Condition schema from grouping params, Expression schema from grouping params ty)] -> Expression schema from grouping params ty -> Expression schema from grouping params ty
- Squeal.PostgreSQL.Expression: cast :: TypeExpression schema ty1 -> Expression schema relations grouping params (nullity ty0) -> Expression schema relations grouping params (nullity ty1)
+ Squeal.PostgreSQL.Expression: cast :: TypeExpression schema ty1 -> Expression schema from grouping params ty0 -> Expression schema from grouping params ty1
- Squeal.PostgreSQL.Expression: ceiling_ :: PGFloating frac => Expression schema relations grouping params (nullity frac) -> Expression schema relations grouping params (nullity frac)
+ Squeal.PostgreSQL.Expression: ceiling_ :: frac `In` PGFloating => Expression schema from grouping params (nullity frac) -> Expression schema from grouping params (nullity frac)
- Squeal.PostgreSQL.Expression: char :: (KnownNat n, 1 <= n) => proxy n -> TypeExpression schema ( 'PGchar n)
+ Squeal.PostgreSQL.Expression: char :: forall n schema nullity. (KnownNat n, 1 <= n) => TypeExpression schema (nullity ( 'PGchar n))
- Squeal.PostgreSQL.Expression: charLength :: Expression schema relations grouping params (nullity 'PGtext) -> Expression schema relations grouping params (nullity 'PGint4)
+ Squeal.PostgreSQL.Expression: charLength :: Expression schema from grouping params (nullity 'PGtext) -> Expression schema from grouping params (nullity 'PGint4)
- Squeal.PostgreSQL.Expression: character :: (KnownNat n, 1 <= n) => proxy n -> TypeExpression schema ( 'PGchar n)
+ Squeal.PostgreSQL.Expression: character :: forall n schema nullity. (KnownNat n, 1 <= n) => TypeExpression schema (nullity ( 'PGchar n))
- Squeal.PostgreSQL.Expression: characterVarying :: (KnownNat n, 1 <= n) => proxy n -> TypeExpression schema ( 'PGvarchar n)
+ Squeal.PostgreSQL.Expression: characterVarying :: forall n schema nullity. (KnownNat n, 1 <= n) => TypeExpression schema (nullity ( 'PGvarchar n))
- Squeal.PostgreSQL.Expression: class PGTyped schema (ty :: PGType)
+ Squeal.PostgreSQL.Expression: class PGTyped schema (ty :: NullityType)
- Squeal.PostgreSQL.Expression: coalesce :: [Expression schema relations grouping params ( 'Null ty)] -> Expression schema relations grouping params ( 'NotNull ty) -> Expression schema relations grouping params ( 'NotNull ty)
+ Squeal.PostgreSQL.Expression: coalesce :: [Expression schema from grouping params ( 'Null ty)] -> Expression schema from grouping params ( 'NotNull ty) -> Expression schema from grouping params ( 'NotNull ty)
- Squeal.PostgreSQL.Expression: count :: Expression schema relations 'Ungrouped params ty -> Expression schema relations ( 'Grouped bys) params ( 'NotNull 'PGint8)
+ Squeal.PostgreSQL.Expression: count :: Expression schema from 'Ungrouped params ty -> Expression schema from ( 'Grouped bys) params ( 'NotNull 'PGint8)
- Squeal.PostgreSQL.Expression: countDistinct :: Expression schema relations 'Ungrouped params ty -> Expression schema relations ( 'Grouped bys) params ( 'NotNull 'PGint8)
+ Squeal.PostgreSQL.Expression: countDistinct :: Expression schema from 'Ungrouped params ty -> Expression schema from ( 'Grouped bys) params ( 'NotNull 'PGint8)
- Squeal.PostgreSQL.Expression: countStar :: Expression schema relations ( 'Grouped bys) params ( 'NotNull 'PGint8)
+ Squeal.PostgreSQL.Expression: countStar :: Expression schema from ( 'Grouped bys) params ( 'NotNull 'PGint8)
- Squeal.PostgreSQL.Expression: currentDate :: Expression schema relations grouping params (nullity 'PGdate)
+ Squeal.PostgreSQL.Expression: currentDate :: Expression schema from grouping params (nullity 'PGdate)
- Squeal.PostgreSQL.Expression: currentTime :: Expression schema relations grouping params (nullity 'PGtimetz)
+ Squeal.PostgreSQL.Expression: currentTime :: Expression schema from grouping params (nullity 'PGtimetz)
- Squeal.PostgreSQL.Expression: currentTimestamp :: Expression schema relations grouping params (nullity 'PGtimestamptz)
+ Squeal.PostgreSQL.Expression: currentTimestamp :: Expression schema from grouping params (nullity 'PGtimestamptz)
- Squeal.PostgreSQL.Expression: date :: TypeExpression schema 'PGdate
+ Squeal.PostgreSQL.Expression: date :: TypeExpression schema (nullity 'PGdate)
- Squeal.PostgreSQL.Expression: doublePrecision :: TypeExpression schema 'PGfloat8
+ Squeal.PostgreSQL.Expression: doublePrecision :: TypeExpression schema (nullity 'PGfloat8)
- Squeal.PostgreSQL.Expression: every :: Expression schema relations 'Ungrouped params (nullity 'PGbool) -> Expression schema relations ( 'Grouped bys) params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: every :: Expression schema from 'Ungrouped params (nullity 'PGbool) -> Expression schema from ( 'Grouped bys) params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: everyDistinct :: Expression schema relations 'Ungrouped params (nullity 'PGbool) -> Expression schema relations ( 'Grouped bys) params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: everyDistinct :: Expression schema from 'Ungrouped params (nullity 'PGbool) -> Expression schema from ( 'Grouped bys) params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: false :: Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: false :: Expression schema from grouping params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: fixarray :: KnownNat n => proxy n -> TypeExpression schema pg -> TypeExpression schema ( 'PGfixarray n pg)
+ Squeal.PostgreSQL.Expression: fixarray :: forall n schema nullity pg. KnownNat n => TypeExpression schema pg -> TypeExpression schema (nullity ( 'PGfixarray n pg))
- Squeal.PostgreSQL.Expression: float4 :: TypeExpression schema 'PGfloat4
+ Squeal.PostgreSQL.Expression: float4 :: TypeExpression schema (nullity 'PGfloat4)
- Squeal.PostgreSQL.Expression: float8 :: TypeExpression schema 'PGfloat8
+ Squeal.PostgreSQL.Expression: float8 :: TypeExpression schema (nullity 'PGfloat8)
- Squeal.PostgreSQL.Expression: fromNull :: Expression schema relations grouping params ( 'NotNull ty) -> Expression schema relations grouping params ( 'Null ty) -> Expression schema relations grouping params ( 'NotNull ty)
+ Squeal.PostgreSQL.Expression: fromNull :: Expression schema from grouping params ( 'NotNull ty) -> Expression schema from grouping params ( 'Null ty) -> Expression schema from grouping params ( 'NotNull ty)
- Squeal.PostgreSQL.Expression: greatest :: Expression schema relations grouping params (nullty) -> [Expression schema relations grouping params (nullty)] -> Expression schema relations grouping params (nullty)
+ Squeal.PostgreSQL.Expression: greatest :: Expression schema from grouping params (nullty) -> [Expression schema from grouping params (nullty)] -> Expression schema from grouping params (nullty)
- Squeal.PostgreSQL.Expression: ifThenElse :: Condition schema relations grouping params -> Expression schema relations grouping params (ty) -> Expression schema relations grouping params (ty) -> Expression schema relations grouping params (ty)
+ Squeal.PostgreSQL.Expression: ifThenElse :: Condition schema from grouping params -> Expression schema from grouping params ty -> Expression schema from grouping params ty -> Expression schema from grouping params ty
- Squeal.PostgreSQL.Expression: inet :: TypeExpression schema 'PGinet
+ Squeal.PostgreSQL.Expression: inet :: TypeExpression schema (nullity 'PGinet)
- Squeal.PostgreSQL.Expression: int :: TypeExpression schema 'PGint4
+ Squeal.PostgreSQL.Expression: int :: TypeExpression schema (nullity 'PGint4)
- Squeal.PostgreSQL.Expression: int2 :: TypeExpression schema 'PGint2
+ Squeal.PostgreSQL.Expression: int2 :: TypeExpression schema (nullity 'PGint2)
- Squeal.PostgreSQL.Expression: int4 :: TypeExpression schema 'PGint4
+ Squeal.PostgreSQL.Expression: int4 :: TypeExpression schema (nullity 'PGint4)
- Squeal.PostgreSQL.Expression: int8 :: TypeExpression schema 'PGint8
+ Squeal.PostgreSQL.Expression: int8 :: TypeExpression schema (nullity 'PGint8)
- Squeal.PostgreSQL.Expression: integer :: TypeExpression schema 'PGint4
+ Squeal.PostgreSQL.Expression: integer :: TypeExpression schema (nullity 'PGint4)
- Squeal.PostgreSQL.Expression: interval :: TypeExpression schema 'PGinterval
+ Squeal.PostgreSQL.Expression: interval :: TypeExpression schema (nullity 'PGinterval)
- Squeal.PostgreSQL.Expression: isNotNull :: Expression schema relations grouping params ( 'Null ty) -> Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: isNotNull :: Expression schema from grouping params ( 'Null ty) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: isNull :: Expression schema relations grouping params ( 'Null ty) -> Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: isNull :: Expression schema from grouping params ( 'Null ty) -> Condition schema from grouping params
- Squeal.PostgreSQL.Expression: json :: TypeExpression schema 'PGjson
+ Squeal.PostgreSQL.Expression: json :: TypeExpression schema (nullity 'PGjson)
- Squeal.PostgreSQL.Expression: jsonArrayLength :: Expression schema relations grouping params (nullity 'PGjson) -> Expression schema relations grouping params (nullity 'PGint4)
+ Squeal.PostgreSQL.Expression: jsonArrayLength :: Expression schema from grouping params (nullity 'PGjson) -> Expression schema from grouping params (nullity 'PGint4)
- Squeal.PostgreSQL.Expression: jsonBuildArray :: SListI elems => NP (Expression schema relations grouping params) elems -> Expression schema relations grouping params (nullity 'PGjson)
+ Squeal.PostgreSQL.Expression: jsonBuildArray :: SListI elems => NP (Expression schema from grouping params) elems -> Expression schema from grouping params (nullity 'PGjson)
- Squeal.PostgreSQL.Expression: jsonBuildObject :: All Top elems => NP (Aliased (Expression schema relations grouping params)) elems -> Expression schema relations grouping params (nullity 'PGjson)
+ Squeal.PostgreSQL.Expression: jsonBuildObject :: All Top elems => NP (Aliased (Expression schema from grouping params)) elems -> Expression schema from grouping params (nullity 'PGjson)
- Squeal.PostgreSQL.Expression: jsonExtractPath :: SListI elems => Expression schema relations grouping params (nullity 'PGjson) -> NP (Expression schema relations grouping params) elems -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: jsonExtractPath :: SListI elems => Expression schema from grouping params (nullity 'PGjson) -> NP (Expression schema from grouping params) elems -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: jsonExtractPathAsText :: SListI elems => Expression schema relations grouping params (nullity 'PGjson) -> NP (Expression schema relations grouping params) elems -> Expression schema relations grouping params (nullity 'PGjson)
+ Squeal.PostgreSQL.Expression: jsonExtractPathAsText :: SListI elems => Expression schema from grouping params (nullity 'PGjson) -> NP (Expression schema from grouping params) elems -> Expression schema from grouping params (nullity 'PGjson)
- Squeal.PostgreSQL.Expression: jsonLit :: Value -> Expression schema relations grouping params (nullity 'PGjson)
+ Squeal.PostgreSQL.Expression: jsonLit :: ToJSON x => x -> Expression schema from grouping params (nullity 'PGjson)
- Squeal.PostgreSQL.Expression: jsonObject :: PGarrayOf "jsonObject" arr 'PGtext => Expression schema relations grouping params (nullity arr) -> Expression schema relations grouping params (nullity 'PGjson)
+ Squeal.PostgreSQL.Expression: jsonObject :: PGArrayOf "jsonObject" arr ( 'NotNull 'PGtext) => Expression schema from grouping params (nullity arr) -> Expression schema from grouping params (nullity 'PGjson)
- Squeal.PostgreSQL.Expression: jsonStripNulls :: Expression schema relations grouping params (nullity 'PGjson) -> Expression schema relations grouping params (nullity 'PGjson)
+ Squeal.PostgreSQL.Expression: jsonStripNulls :: Expression schema from grouping params (nullity 'PGjson) -> Expression schema from grouping params (nullity 'PGjson)
- Squeal.PostgreSQL.Expression: jsonTypeof :: Expression schema relations grouping params (nullity 'PGjson) -> Expression schema relations grouping params (nullity 'PGtext)
+ Squeal.PostgreSQL.Expression: jsonTypeof :: Expression schema from grouping params (nullity 'PGjson) -> Expression schema from grouping params (nullity 'PGtext)
- Squeal.PostgreSQL.Expression: jsonZipObject :: (PGarrayOf "jsonZipObject" keysArray 'PGtext, PGarrayOf "jsonZipObject" valuesArray 'PGtext) => Expression schema relations grouping params (nullity keysArray) -> Expression schema relations grouping params (nullity valuesArray) -> Expression schema relations grouping params (nullity 'PGjson)
+ Squeal.PostgreSQL.Expression: jsonZipObject :: (PGArrayOf "jsonZipObject" keysArray ( 'NotNull 'PGtext), PGArrayOf "jsonZipObject" valuesArray ( 'NotNull 'PGtext)) => Expression schema from grouping params (nullity keysArray) -> Expression schema from grouping params (nullity valuesArray) -> Expression schema from grouping params (nullity 'PGjson)
- Squeal.PostgreSQL.Expression: jsonb :: TypeExpression schema 'PGjsonb
+ Squeal.PostgreSQL.Expression: jsonb :: TypeExpression schema (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: jsonbArrayLength :: Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity 'PGint4)
+ Squeal.PostgreSQL.Expression: jsonbArrayLength :: Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity 'PGint4)
- Squeal.PostgreSQL.Expression: jsonbBuildArray :: SListI elems => NP (Expression schema relations grouping params) elems -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: jsonbBuildArray :: SListI elems => NP (Expression schema from grouping params) elems -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: jsonbBuildObject :: All Top elems => NP (Aliased (Expression schema relations grouping params)) elems -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: jsonbBuildObject :: All Top elems => NP (Aliased (Expression schema from grouping params)) elems -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: jsonbExtractPath :: SListI elems => Expression schema relations grouping params (nullity 'PGjsonb) -> NP (Expression schema relations grouping params) elems -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: jsonbExtractPath :: SListI elems => Expression schema from grouping params (nullity 'PGjsonb) -> NP (Expression schema from grouping params) elems -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: jsonbExtractPathAsText :: SListI elems => Expression schema relations grouping params (nullity 'PGjsonb) -> NP (Expression schema relations grouping params) elems -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: jsonbExtractPathAsText :: SListI elems => Expression schema from grouping params (nullity 'PGjsonb) -> NP (Expression schema from grouping params) elems -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: jsonbInsert :: PGtextArray "jsonbInsert" arr => Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity arr) -> Expression schema relations grouping params (nullity 'PGjsonb) -> Maybe (Expression schema relations grouping params (nullity 'PGbool)) -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: jsonbInsert :: PGTextArray "jsonbInsert" arr => Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity arr) -> Expression schema from grouping params (nullity 'PGjsonb) -> Maybe (Expression schema from grouping params (nullity 'PGbool)) -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: jsonbLit :: Value -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: jsonbLit :: ToJSON x => x -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: jsonbObject :: PGarrayOf "jsonbObject" arr 'PGtext => Expression schema relations grouping params (nullity arr) -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: jsonbObject :: PGArrayOf "jsonbObject" arr ( 'NotNull 'PGtext) => Expression schema from grouping params (nullity arr) -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: jsonbPretty :: Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity 'PGtext)
+ Squeal.PostgreSQL.Expression: jsonbPretty :: Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity 'PGtext)
- Squeal.PostgreSQL.Expression: jsonbSet :: PGtextArray "jsonbSet" arr => Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity arr) -> Expression schema relations grouping params (nullity 'PGjsonb) -> Maybe (Expression schema relations grouping params (nullity 'PGbool)) -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: jsonbSet :: PGTextArray "jsonbSet" arr => Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity arr) -> Expression schema from grouping params (nullity 'PGjsonb) -> Maybe (Expression schema from grouping params (nullity 'PGbool)) -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: jsonbStripNulls :: Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: jsonbStripNulls :: Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: jsonbTypeof :: Expression schema relations grouping params (nullity 'PGjsonb) -> Expression schema relations grouping params (nullity 'PGtext)
+ Squeal.PostgreSQL.Expression: jsonbTypeof :: Expression schema from grouping params (nullity 'PGjsonb) -> Expression schema from grouping params (nullity 'PGtext)
- Squeal.PostgreSQL.Expression: jsonbZipObject :: (PGarrayOf "jsonbZipObject" keysArray 'PGtext, PGarrayOf "jsonbZipObject" valuesArray 'PGtext) => Expression schema relations grouping params (nullity keysArray) -> Expression schema relations grouping params (nullity valuesArray) -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: jsonbZipObject :: (PGArrayOf "jsonbZipObject" keysArray ( 'NotNull 'PGtext), PGArrayOf "jsonbZipObject" valuesArray ( 'NotNull 'PGtext)) => Expression schema from grouping params (nullity keysArray) -> Expression schema from grouping params (nullity valuesArray) -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: least :: Expression schema relations grouping params (nullty) -> [Expression schema relations grouping params (nullty)] -> Expression schema relations grouping params (nullty)
+ Squeal.PostgreSQL.Expression: least :: Expression schema from grouping params (nullty) -> [Expression schema from grouping params (nullty)] -> Expression schema from grouping params (nullty)
- Squeal.PostgreSQL.Expression: like :: Expression schema relations grouping params (nullity 'PGtext) -> Expression schema relations grouping params (nullity 'PGtext) -> Expression schema relations grouping params (nullity 'PGbool)
+ Squeal.PostgreSQL.Expression: like :: Expression schema from grouping params (nullity 'PGtext) -> Expression schema from grouping params (nullity 'PGtext) -> Expression schema from grouping params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: localTime :: Expression schema relations grouping params (nullity 'PGtime)
+ Squeal.PostgreSQL.Expression: localTime :: Expression schema from grouping params (nullity 'PGtime)
- Squeal.PostgreSQL.Expression: localTimestamp :: Expression schema relations grouping params (nullity 'PGtimestamp)
+ Squeal.PostgreSQL.Expression: localTimestamp :: Expression schema from grouping params (nullity 'PGtimestamp)
- Squeal.PostgreSQL.Expression: lower :: Expression schema relations grouping params (nullity 'PGtext) -> Expression schema relations grouping params (nullity 'PGtext)
+ Squeal.PostgreSQL.Expression: lower :: Expression schema from grouping params (nullity 'PGtext) -> Expression schema from grouping params (nullity 'PGtext)
- Squeal.PostgreSQL.Expression: matchNull :: Expression schema relations grouping params (nullty) -> (Expression schema relations grouping params ( 'NotNull ty) -> Expression schema relations grouping params (nullty)) -> Expression schema relations grouping params ( 'Null ty) -> Expression schema relations grouping params (nullty)
+ Squeal.PostgreSQL.Expression: matchNull :: Expression schema from grouping params (nullty) -> (Expression schema from grouping params ( 'NotNull ty) -> Expression schema from grouping params (nullty)) -> Expression schema from grouping params ( 'Null ty) -> Expression schema from grouping params (nullty)
- Squeal.PostgreSQL.Expression: maxDistinct :: Expression schema relations 'Ungrouped params (nullity ty) -> Expression schema relations ( 'Grouped bys) params (nullity ty)
+ Squeal.PostgreSQL.Expression: maxDistinct :: Expression schema from 'Ungrouped params (nullity ty) -> Expression schema from ( 'Grouped bys) params (nullity ty)
- Squeal.PostgreSQL.Expression: max_ :: Expression schema relations 'Ungrouped params (nullity ty) -> Expression schema relations ( 'Grouped bys) params (nullity ty)
+ Squeal.PostgreSQL.Expression: max_ :: Expression schema from 'Ungrouped params (nullity ty) -> Expression schema from ( 'Grouped bys) params (nullity ty)
- Squeal.PostgreSQL.Expression: minDistinct :: Expression schema relations 'Ungrouped params (nullity ty) -> Expression schema relations ( 'Grouped bys) params (nullity ty)
+ Squeal.PostgreSQL.Expression: minDistinct :: Expression schema from 'Ungrouped params (nullity ty) -> Expression schema from ( 'Grouped bys) params (nullity ty)
- Squeal.PostgreSQL.Expression: min_ :: Expression schema relations 'Ungrouped params (nullity ty) -> Expression schema relations ( 'Grouped bys) params (nullity ty)
+ Squeal.PostgreSQL.Expression: min_ :: Expression schema from 'Ungrouped params (nullity ty) -> Expression schema from ( 'Grouped bys) params (nullity ty)
- Squeal.PostgreSQL.Expression: newtype Expression (schema :: SchemaType) (relations :: RelationsType) (grouping :: Grouping) (params :: [NullityType]) (ty :: NullityType)
+ Squeal.PostgreSQL.Expression: newtype Expression (schema :: SchemaType) (from :: FromType) (grouping :: Grouping) (params :: [NullityType]) (ty :: NullityType)
- Squeal.PostgreSQL.Expression: newtype TypeExpression (schema :: SchemaType) (ty :: PGType)
+ Squeal.PostgreSQL.Expression: newtype TypeExpression (schema :: SchemaType) (ty :: NullityType)
- Squeal.PostgreSQL.Expression: not_ :: Condition schema relations grouping params -> Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: not_ :: Expression schema from grouping params (nullity 'PGbool) -> Expression schema from grouping params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: nullIf :: Expression schema relations grouping params ( 'NotNull ty) -> Expression schema relations grouping params ( 'NotNull ty) -> Expression schema relations grouping params ( 'Null ty)
+ Squeal.PostgreSQL.Expression: nullIf :: Expression schema from grouping params ( 'NotNull ty) -> Expression schema from grouping params ( 'NotNull ty) -> Expression schema from grouping params ( 'Null ty)
- Squeal.PostgreSQL.Expression: numeric :: TypeExpression schema 'PGnumeric
+ Squeal.PostgreSQL.Expression: numeric :: TypeExpression schema (nullity 'PGnumeric)
- Squeal.PostgreSQL.Expression: param :: forall n schema params relations grouping ty. (PGTyped schema (PGTypeOf ty), HasParameter n schema params ty) => Expression schema relations grouping params ty
+ Squeal.PostgreSQL.Expression: param :: forall n schema params from grouping ty. (PGTyped schema ty, HasParameter n schema params ty) => Expression schema from grouping params ty
- Squeal.PostgreSQL.Expression: parameter :: HasParameter n schema params ty => TypeExpression schema (PGTypeOf ty) -> Expression schema relations grouping params ty
+ Squeal.PostgreSQL.Expression: parameter :: HasParameter n schema params ty => TypeExpression schema ty -> Expression schema from grouping params ty
- Squeal.PostgreSQL.Expression: quot_ :: PGIntegral int => Expression schema relations grouping params (nullity int) -> Expression schema relations grouping params (nullity int) -> Expression schema relations grouping params (nullity int)
+ Squeal.PostgreSQL.Expression: quot_ :: int `In` PGIntegral => Expression schema from grouping params (nullity int) -> Expression schema from grouping params (nullity int) -> Expression schema from grouping params (nullity int)
- Squeal.PostgreSQL.Expression: real :: TypeExpression schema 'PGfloat4
+ Squeal.PostgreSQL.Expression: real :: TypeExpression schema (nullity 'PGfloat4)
- Squeal.PostgreSQL.Expression: rem_ :: PGIntegral int => Expression schema relations grouping params (nullity int) -> Expression schema relations grouping params (nullity int) -> Expression schema relations grouping params (nullity int)
+ Squeal.PostgreSQL.Expression: rem_ :: int `In` PGIntegral => Expression schema from grouping params (nullity int) -> Expression schema from grouping params (nullity int) -> Expression schema from grouping params (nullity int)
- Squeal.PostgreSQL.Expression: round_ :: PGFloating frac => Expression schema relations grouping params (nullity frac) -> Expression schema relations grouping params (nullity frac)
+ Squeal.PostgreSQL.Expression: round_ :: frac `In` PGFloating => Expression schema from grouping params (nullity frac) -> Expression schema from grouping params (nullity frac)
- Squeal.PostgreSQL.Expression: row :: SListI (Nulls fields) => NP (Aliased (Expression schema relations grouping params)) (Nulls fields) -> Expression schema relations grouping params (nullity ( 'PGcomposite fields))
+ Squeal.PostgreSQL.Expression: row :: SListI row => NP (Aliased (Expression schema from grouping params)) row -> Expression schema from grouping params (nullity ( 'PGcomposite row))
- Squeal.PostgreSQL.Expression: rowToJson :: Expression schema relations grouping params (nullity ( 'PGcomposite ty)) -> Expression schema relations grouping params (nullity 'PGjson)
+ Squeal.PostgreSQL.Expression: rowToJson :: Expression schema from grouping params (nullity ( 'PGcomposite ty)) -> Expression schema from grouping params (nullity 'PGjson)
- Squeal.PostgreSQL.Expression: smallint :: TypeExpression schema 'PGint2
+ Squeal.PostgreSQL.Expression: smallint :: TypeExpression schema (nullity 'PGint2)
- Squeal.PostgreSQL.Expression: sumDistinct :: PGNum ty => Expression schema relations 'Ungrouped params (nullity ty) -> Expression schema relations ( 'Grouped bys) params (nullity ty)
+ Squeal.PostgreSQL.Expression: sumDistinct :: ty `In` PGNum => Expression schema from 'Ungrouped params (nullity ty) -> Expression schema from ( 'Grouped bys) params (nullity ty)
- Squeal.PostgreSQL.Expression: sum_ :: PGNum ty => Expression schema relations 'Ungrouped params (nullity ty) -> Expression schema relations ( 'Grouped bys) params (nullity ty)
+ Squeal.PostgreSQL.Expression: sum_ :: ty `In` PGNum => Expression schema from 'Ungrouped params (nullity ty) -> Expression schema from ( 'Grouped bys) params (nullity ty)
- Squeal.PostgreSQL.Expression: text :: TypeExpression schema 'PGtext
+ Squeal.PostgreSQL.Expression: text :: TypeExpression schema (nullity 'PGtext)
- Squeal.PostgreSQL.Expression: time :: TypeExpression schema 'PGtime
+ Squeal.PostgreSQL.Expression: time :: TypeExpression schema (nullity 'PGtime)
- Squeal.PostgreSQL.Expression: timeWithTimeZone :: TypeExpression schema 'PGtimetz
+ Squeal.PostgreSQL.Expression: timeWithTimeZone :: TypeExpression schema (nullity 'PGtimetz)
- Squeal.PostgreSQL.Expression: timestamp :: TypeExpression schema 'PGtimestamp
+ Squeal.PostgreSQL.Expression: timestamp :: TypeExpression schema (nullity 'PGtimestamp)
- Squeal.PostgreSQL.Expression: timestampWithTimeZone :: TypeExpression schema 'PGtimestamptz
+ Squeal.PostgreSQL.Expression: timestampWithTimeZone :: TypeExpression schema (nullity 'PGtimestamptz)
- Squeal.PostgreSQL.Expression: toJson :: Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity 'PGjson)
+ Squeal.PostgreSQL.Expression: toJson :: Expression schema from grouping params (nullity ty) -> Expression schema from grouping params (nullity 'PGjson)
- Squeal.PostgreSQL.Expression: toJsonb :: Expression schema relations grouping params (nullity ty) -> Expression schema relations grouping params (nullity 'PGjsonb)
+ Squeal.PostgreSQL.Expression: toJsonb :: Expression schema from grouping params (nullity ty) -> Expression schema from grouping params (nullity 'PGjsonb)
- Squeal.PostgreSQL.Expression: true :: Condition schema relations grouping params
+ Squeal.PostgreSQL.Expression: true :: Expression schema from grouping params (nullity 'PGbool)
- Squeal.PostgreSQL.Expression: trunc :: PGFloating frac => Expression schema relations grouping params (nullity frac) -> Expression schema relations grouping params (nullity frac)
+ Squeal.PostgreSQL.Expression: trunc :: frac `In` PGFloating => Expression schema from grouping params (nullity frac) -> Expression schema from grouping params (nullity frac)
- Squeal.PostgreSQL.Expression: type Condition schema relations grouping params = Expression schema relations grouping params ( 'NotNull 'PGbool)
+ Squeal.PostgreSQL.Expression: type Condition schema from grouping params = Expression schema from grouping params ( 'Null 'PGbool)
- Squeal.PostgreSQL.Expression: unsafeAggregate :: ByteString -> Expression schema relations 'Ungrouped params (xty) -> Expression schema relations ( 'Grouped bys) params (yty)
+ Squeal.PostgreSQL.Expression: unsafeAggregate :: ByteString -> Expression schema from 'Ungrouped params (xty) -> Expression schema from ( 'Grouped bys) params (yty)
- Squeal.PostgreSQL.Expression: unsafeAggregateDistinct :: ByteString -> Expression schema relations 'Ungrouped params (xty) -> Expression schema relations ( 'Grouped bys) params (yty)
+ Squeal.PostgreSQL.Expression: unsafeAggregateDistinct :: ByteString -> Expression schema from 'Ungrouped params (xty) -> Expression schema from ( 'Grouped bys) params (yty)
- Squeal.PostgreSQL.Expression: unsafeBinaryOp :: ByteString -> Expression schema relations grouping params (ty0) -> Expression schema relations grouping params (ty1) -> Expression schema relations grouping params (ty2)
+ Squeal.PostgreSQL.Expression: unsafeBinaryOp :: ByteString -> Expression schema from grouping params (ty0) -> Expression schema from grouping params (ty1) -> Expression schema from grouping params (ty2)
- Squeal.PostgreSQL.Expression: unsafeFunction :: ByteString -> Expression schema relations grouping params (xty) -> Expression schema relations grouping params (yty)
+ Squeal.PostgreSQL.Expression: unsafeFunction :: ByteString -> Expression schema from grouping params (xty) -> Expression schema from grouping params (yty)
- Squeal.PostgreSQL.Expression: unsafeUnaryOp :: ByteString -> Expression schema relations grouping params (ty0) -> Expression schema relations grouping params (ty1)
+ Squeal.PostgreSQL.Expression: unsafeUnaryOp :: ByteString -> Expression schema from grouping params (ty0) -> Expression schema from grouping params (ty1)
- Squeal.PostgreSQL.Expression: unsafeVariadicFunction :: SListI elems => ByteString -> NP (Expression schema relations grouping params) elems -> Expression schema relations grouping params ret
+ Squeal.PostgreSQL.Expression: unsafeVariadicFunction :: SListI elems => ByteString -> NP (Expression schema from grouping params) elems -> Expression schema from grouping params ret
- Squeal.PostgreSQL.Expression: upper :: Expression schema relations grouping params (nullity 'PGtext) -> Expression schema relations grouping params (nullity 'PGtext)
+ Squeal.PostgreSQL.Expression: upper :: Expression schema from grouping params (nullity 'PGtext) -> Expression schema from grouping params (nullity 'PGtext)
- Squeal.PostgreSQL.Expression: uuid :: TypeExpression schema 'PGuuid
+ Squeal.PostgreSQL.Expression: uuid :: TypeExpression schema (nullity 'PGuuid)
- Squeal.PostgreSQL.Expression: vararray :: TypeExpression schema pg -> TypeExpression schema ( 'PGvararray pg)
+ Squeal.PostgreSQL.Expression: vararray :: TypeExpression schema pg -> TypeExpression schema (nullity ( 'PGvararray pg))
- Squeal.PostgreSQL.Expression: varchar :: (KnownNat n, 1 <= n) => proxy n -> TypeExpression schema ( 'PGvarchar n)
+ Squeal.PostgreSQL.Expression: varchar :: forall n schema nullity. (KnownNat n, 1 <= n) => TypeExpression schema (nullity ( 'PGvarchar n))
- Squeal.PostgreSQL.Manipulation: [OnConflictDoNothing] :: ConflictClause schema columns params
+ Squeal.PostgreSQL.Manipulation: [OnConflictDoNothing] :: ConflictClause schema table params
- Squeal.PostgreSQL.Manipulation: [OnConflictDoRaise] :: ConflictClause schema columns params
+ Squeal.PostgreSQL.Manipulation: [OnConflictDoRaise] :: ConflictClause schema table params
- Squeal.PostgreSQL.Manipulation: [OnConflictDoUpdate] :: NP (Aliased (ColumnValue schema (ColumnsToRelation columns) params)) columns -> [Condition schema '[table ::: ColumnsToRelation columns] 'Ungrouped params] -> ConflictClause schema columns params
+ Squeal.PostgreSQL.Manipulation: [OnConflictDoUpdate] :: (row ~ TableToRow table, columns ~ TableToColumns table) => NP (Aliased (ColumnValue schema row params)) columns -> [Condition schema '[t ::: row] 'Ungrouped params] -> ConflictClause schema table params
- Squeal.PostgreSQL.Manipulation: [ReturningStar] :: results ~ ColumnsToRelation columns => ReturningClause schema columns params results
+ Squeal.PostgreSQL.Manipulation: [ReturningStar] :: ReturningClause schema params row row
- Squeal.PostgreSQL.Manipulation: [Returning] :: rel ~ ColumnsToRelation columns => NP (Aliased (Expression schema '[table ::: rel] 'Ungrouped params)) results -> ReturningClause schema columns params results
+ Squeal.PostgreSQL.Manipulation: [Returning] :: NP (Aliased (Expression schema '[table ::: row0] 'Ungrouped params)) row1 -> ReturningClause schema params row0 row1
- Squeal.PostgreSQL.Manipulation: data ColumnValue (schema :: SchemaType) (columns :: RelationType) (params :: [NullityType]) (ty :: ColumnType)
+ Squeal.PostgreSQL.Manipulation: data ColumnValue (schema :: SchemaType) (columns :: RowType) (params :: [NullityType]) (ty :: ColumnType)
- Squeal.PostgreSQL.Manipulation: data ConflictClause (schema :: SchemaType) (columns :: ColumnsType) params
+ Squeal.PostgreSQL.Manipulation: data ConflictClause (schema :: SchemaType) (table :: TableType) (params :: [NullityType])
- Squeal.PostgreSQL.Manipulation: data ReturningClause (schema :: SchemaType) (columns :: ColumnsType) (params :: [NullityType]) (results :: RelationType)
+ Squeal.PostgreSQL.Manipulation: data ReturningClause (schema :: SchemaType) (params :: [NullityType]) (row0 :: RowType) (row1 :: RowType)
- Squeal.PostgreSQL.Manipulation: deleteFrom :: (SListI results, Has tab schema ( 'Table table), columns ~ TableToColumns table) => Alias tab -> Condition schema '[tab ::: ColumnsToRelation columns] 'Ungrouped params -> ReturningClause schema columns params results -> Manipulation schema params results
+ Squeal.PostgreSQL.Manipulation: deleteFrom :: (SListI results, Has tab schema ( 'Table table), row ~ TableToRow table, columns ~ TableToColumns table) => Alias tab -> Condition schema '[tab ::: row] 'Ungrouped params -> ReturningClause schema params row results -> Manipulation schema params results
- Squeal.PostgreSQL.Manipulation: deleteFrom_ :: (Has tab schema ( 'Table table), columns ~ TableToColumns table) => Alias tab -> Condition schema '[tab ::: ColumnsToRelation columns] 'Ungrouped params -> Manipulation schema params '[]
+ Squeal.PostgreSQL.Manipulation: deleteFrom_ :: (Has tab schema ( 'Table table), row ~ TableToRow table, columns ~ TableToColumns table) => Alias tab -> (forall t. Condition schema '[t ::: row] 'Ungrouped params) -> Manipulation schema params '[]
- Squeal.PostgreSQL.Manipulation: insertQuery :: (SListI columns, SListI results, Has tab schema ( 'Table table), columns ~ TableToColumns table) => Alias tab -> Query schema params (ColumnsToRelation columns) -> ConflictClause schema columns params -> ReturningClause schema columns params results -> Manipulation schema params results
+ Squeal.PostgreSQL.Manipulation: insertQuery :: (SListI columns, SListI results, Has tab schema ( 'Table table), row ~ TableToRow table, columns ~ TableToColumns table) => Alias tab -> Query schema params (TableToRow table) -> ConflictClause schema table params -> ReturningClause schema params row results -> Manipulation schema params results
- Squeal.PostgreSQL.Manipulation: insertQuery_ :: (SListI columns, Has tab schema ( 'Table table), columns ~ TableToColumns table) => Alias tab -> Query schema params (ColumnsToRelation columns) -> Manipulation schema params '[]
+ Squeal.PostgreSQL.Manipulation: insertQuery_ :: (SListI columns, Has tab schema ( 'Table table), columns ~ TableToColumns table) => Alias tab -> Query schema params (TableToRow table) -> Manipulation schema params '[]
- Squeal.PostgreSQL.Manipulation: insertRow :: (SListI columns, SListI results, Has tab schema ( 'Table table), columns ~ TableToColumns table) => Alias tab -> NP (Aliased (ColumnValue schema '[] params)) columns -> ConflictClause schema columns params -> ReturningClause schema columns params results -> Manipulation schema params results
+ Squeal.PostgreSQL.Manipulation: insertRow :: (SListI columns, SListI results, Has tab schema ( 'Table table), row ~ TableToRow table, columns ~ TableToColumns table) => Alias tab -> NP (Aliased (ColumnValue schema '[] params)) columns -> ConflictClause schema table params -> ReturningClause schema params row results -> Manipulation schema params results
- Squeal.PostgreSQL.Manipulation: insertRows :: (SListI columns, SListI results, Has tab schema ( 'Table table), columns ~ TableToColumns table) => Alias tab -> NP (Aliased (ColumnValue schema '[] params)) columns -> [NP (Aliased (ColumnValue schema '[] params)) columns] -> ConflictClause schema columns params -> ReturningClause schema columns params results -> Manipulation schema params results
+ Squeal.PostgreSQL.Manipulation: insertRows :: (SListI columns, SListI results, Has tab schema ( 'Table table), row ~ TableToRow table, columns ~ TableToColumns table) => Alias tab -> NP (Aliased (ColumnValue schema '[] params)) columns -> [NP (Aliased (ColumnValue schema '[] params)) columns] -> ConflictClause schema table params -> ReturningClause schema params row results -> Manipulation schema params results
- Squeal.PostgreSQL.Manipulation: newtype Manipulation (schema :: SchemaType) (params :: [NullityType]) (columns :: RelationType)
+ Squeal.PostgreSQL.Manipulation: newtype Manipulation (schema :: SchemaType) (params :: [NullityType]) (columns :: RowType)
- Squeal.PostgreSQL.Manipulation: renderConflictClause :: SListI columns => ConflictClause schema columns params -> ByteString
+ Squeal.PostgreSQL.Manipulation: renderConflictClause :: SListI (TableToColumns table) => ConflictClause schema table params -> ByteString
- Squeal.PostgreSQL.Manipulation: update :: (SListI columns, SListI results, Has tab schema ( 'Table table), columns ~ TableToColumns table) => Alias tab -> NP (Aliased (ColumnValue schema (ColumnsToRelation columns) params)) columns -> Condition schema '[tab ::: ColumnsToRelation columns] 'Ungrouped params -> ReturningClause schema columns params results -> Manipulation schema params results
+ Squeal.PostgreSQL.Manipulation: update :: (SListI columns, SListI results, Has tab schema ( 'Table table), row ~ TableToRow table, columns ~ TableToColumns table) => Alias tab -> NP (Aliased (ColumnValue schema row params)) columns -> (forall t. Condition schema '[t ::: row] 'Ungrouped params) -> ReturningClause schema params row results -> Manipulation schema params results
- Squeal.PostgreSQL.Manipulation: update_ :: (SListI columns, Has tab schema ( 'Table table), columns ~ TableToColumns table) => Alias tab -> NP (Aliased (ColumnValue schema (ColumnsToRelation columns) params)) columns -> Condition schema '[tab ::: ColumnsToRelation columns] 'Ungrouped params -> Manipulation schema params '[]
+ Squeal.PostgreSQL.Manipulation: update_ :: (SListI columns, Has tab schema ( 'Table table), row ~ TableToRow table, columns ~ TableToColumns table) => Alias tab -> NP (Aliased (ColumnValue schema row params)) columns -> (forall t. Condition schema '[t ::: row] 'Ungrouped params) -> Manipulation schema params '[]
- Squeal.PostgreSQL.Query: TableExpression :: FromClause schema params relations -> [Condition schema relations 'Ungrouped params] -> GroupByClause relations grouping -> HavingClause schema relations grouping params -> [SortExpression schema relations grouping params] -> [Word64] -> [Word64] -> TableExpression
+ Squeal.PostgreSQL.Query: TableExpression :: FromClause schema params from -> [Condition schema from 'Ungrouped params] -> GroupByClause from grouping -> HavingClause schema from grouping params -> [SortExpression schema from grouping params] -> [Word64] -> [Word64] -> TableExpression
- Squeal.PostgreSQL.Query: UnsafeFromClause :: ByteString -> FromClause schema params relations
+ Squeal.PostgreSQL.Query: UnsafeFromClause :: ByteString -> FromClause schema params from
- Squeal.PostgreSQL.Query: [AscNullsFirst] :: Expression schema relations grouping params ( 'Null ty) -> SortExpression schema relations grouping params
+ Squeal.PostgreSQL.Query: [AscNullsFirst] :: Expression schema from grouping params ( 'Null ty) -> SortExpression schema from grouping params
- Squeal.PostgreSQL.Query: [AscNullsLast] :: Expression schema relations grouping params ( 'Null ty) -> SortExpression schema relations grouping params
+ Squeal.PostgreSQL.Query: [AscNullsLast] :: Expression schema from grouping params ( 'Null ty) -> SortExpression schema from grouping params
- Squeal.PostgreSQL.Query: [Asc] :: Expression schema relations grouping params ( 'NotNull ty) -> SortExpression schema relations grouping params
+ Squeal.PostgreSQL.Query: [Asc] :: Expression schema from grouping params ( 'NotNull ty) -> SortExpression schema from grouping params
- Squeal.PostgreSQL.Query: [By1] :: (HasUnique relation relations columns, Has column columns ty) => Alias column -> By relations '(relation, column)
+ Squeal.PostgreSQL.Query: [By1] :: (HasUnique table from columns, Has column columns ty) => Alias column -> By from '(table, column)
- Squeal.PostgreSQL.Query: [By2] :: (Has relation relations columns, Has column columns ty) => Alias relation -> Alias column -> By relations '(relation, column)
+ Squeal.PostgreSQL.Query: [By2] :: (Has table from columns, Has column columns ty) => Alias table -> Alias column -> By from '(table, column)
- Squeal.PostgreSQL.Query: [DescNullsFirst] :: Expression schema relations grouping params ( 'Null ty) -> SortExpression schema relations grouping params
+ Squeal.PostgreSQL.Query: [DescNullsFirst] :: Expression schema from grouping params ( 'Null ty) -> SortExpression schema from grouping params
- Squeal.PostgreSQL.Query: [DescNullsLast] :: Expression schema relations grouping params ( 'Null ty) -> SortExpression schema relations grouping params
+ Squeal.PostgreSQL.Query: [DescNullsLast] :: Expression schema from grouping params ( 'Null ty) -> SortExpression schema from grouping params
- Squeal.PostgreSQL.Query: [Desc] :: Expression schema relations grouping params ( 'NotNull ty) -> SortExpression schema relations grouping params
+ Squeal.PostgreSQL.Query: [Desc] :: Expression schema from grouping params ( 'NotNull ty) -> SortExpression schema from grouping params
- Squeal.PostgreSQL.Query: [Group] :: SListI bys => NP (By relations) bys -> GroupByClause relations ( 'Grouped bys)
+ Squeal.PostgreSQL.Query: [Group] :: SListI bys => NP (By from) bys -> GroupByClause from ( 'Grouped bys)
- Squeal.PostgreSQL.Query: [Having] :: [Condition schema relations ( 'Grouped bys) params] -> HavingClause schema relations ( 'Grouped bys) params
+ Squeal.PostgreSQL.Query: [Having] :: [Condition schema from ( 'Grouped bys) params] -> HavingClause schema from ( 'Grouped bys) params
- Squeal.PostgreSQL.Query: [NoGroups] :: GroupByClause relations 'Ungrouped
+ Squeal.PostgreSQL.Query: [NoGroups] :: GroupByClause from 'Ungrouped
- Squeal.PostgreSQL.Query: [NoHaving] :: HavingClause schema relations 'Ungrouped params
+ Squeal.PostgreSQL.Query: [NoHaving] :: HavingClause schema from 'Ungrouped params
- Squeal.PostgreSQL.Query: [fromClause] :: TableExpression -> FromClause schema params relations
+ Squeal.PostgreSQL.Query: [fromClause] :: TableExpression -> FromClause schema params from
- Squeal.PostgreSQL.Query: [groupByClause] :: TableExpression -> GroupByClause relations grouping
+ Squeal.PostgreSQL.Query: [groupByClause] :: TableExpression -> GroupByClause from grouping
- Squeal.PostgreSQL.Query: [havingClause] :: TableExpression -> HavingClause schema relations grouping params
+ Squeal.PostgreSQL.Query: [havingClause] :: TableExpression -> HavingClause schema from grouping params
- Squeal.PostgreSQL.Query: [orderByClause] :: TableExpression -> [SortExpression schema relations grouping params]
+ Squeal.PostgreSQL.Query: [orderByClause] :: TableExpression -> [SortExpression schema from grouping params]
- Squeal.PostgreSQL.Query: [renderFromClause] :: FromClause schema params relations -> ByteString
+ Squeal.PostgreSQL.Query: [renderFromClause] :: FromClause schema params from -> ByteString
- Squeal.PostgreSQL.Query: [whereClause] :: TableExpression -> [Condition schema relations 'Ungrouped params]
+ Squeal.PostgreSQL.Query: [whereClause] :: TableExpression -> [Condition schema from 'Ungrouped params]
- Squeal.PostgreSQL.Query: data By (relations :: RelationsType) (by :: (Symbol, Symbol))
+ Squeal.PostgreSQL.Query: data By (from :: FromType) (by :: (Symbol, Symbol))
- Squeal.PostgreSQL.Query: data GroupByClause relations grouping
+ Squeal.PostgreSQL.Query: data GroupByClause from grouping
- Squeal.PostgreSQL.Query: data HavingClause schema relations grouping params
+ Squeal.PostgreSQL.Query: data HavingClause schema from grouping params
- Squeal.PostgreSQL.Query: data SortExpression schema relations grouping params
+ Squeal.PostgreSQL.Query: data SortExpression schema from grouping params
- Squeal.PostgreSQL.Query: data TableExpression (schema :: SchemaType) (params :: [NullityType]) (relations :: RelationsType) (grouping :: Grouping)
+ Squeal.PostgreSQL.Query: data TableExpression (schema :: SchemaType) (params :: [NullityType]) (from :: FromType) (grouping :: Grouping)
- Squeal.PostgreSQL.Query: from :: FromClause schema params relations -> TableExpression schema params relations 'Ungrouped
+ Squeal.PostgreSQL.Query: from :: FromClause schema params from -> TableExpression schema params from 'Ungrouped
- Squeal.PostgreSQL.Query: fullOuterJoin :: FromClause schema params right -> Condition schema (Join left right) 'Ungrouped params -> FromClause schema params left -> FromClause schema params (Join (NullifyRelations left) (NullifyRelations right))
+ Squeal.PostgreSQL.Query: fullOuterJoin :: FromClause schema params right -> Condition schema (Join left right) 'Ungrouped params -> FromClause schema params left -> FromClause schema params (Join (NullifyFrom left) (NullifyFrom right))
- Squeal.PostgreSQL.Query: groupBy :: SListI bys => NP (By relations) bys -> TableExpression schema params relations 'Ungrouped -> TableExpression schema params relations ( 'Grouped bys)
+ Squeal.PostgreSQL.Query: groupBy :: SListI bys => NP (By from) bys -> TableExpression schema params from 'Ungrouped -> TableExpression schema params from ( 'Grouped bys)
- Squeal.PostgreSQL.Query: having :: Condition schema relations ( 'Grouped bys) params -> TableExpression schema params relations ( 'Grouped bys) -> TableExpression schema params relations ( 'Grouped bys)
+ Squeal.PostgreSQL.Query: having :: Condition schema from ( 'Grouped bys) params -> TableExpression schema params from ( 'Grouped bys) -> TableExpression schema params from ( 'Grouped bys)
- Squeal.PostgreSQL.Query: jsonEach :: Aliased (Expression schema '[] 'Ungrouped params) '(tab, nullity 'PGjson) -> FromClause schema params (PGjson_each tab)
+ Squeal.PostgreSQL.Query: jsonEach :: Expression schema '[] 'Ungrouped params (nullity 'PGjson) -> Query schema params '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGjson]
- Squeal.PostgreSQL.Query: jsonEachAsText :: Aliased (Expression schema '[] 'Ungrouped params) '(tab, nullity 'PGjson) -> FromClause schema params (PGjson_each_text tab)
+ Squeal.PostgreSQL.Query: jsonEachAsText :: Expression schema '[] 'Ungrouped params (nullity 'PGjson) -> Query schema params '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGtext]
- Squeal.PostgreSQL.Query: jsonbEach :: Aliased (Expression schema '[] 'Ungrouped params) '(tab, nullity 'PGjsonb) -> FromClause schema params (PGjsonb_each tab)
+ Squeal.PostgreSQL.Query: jsonbEach :: Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -> Query schema params '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGjsonb]
- Squeal.PostgreSQL.Query: jsonbEachAsText :: Aliased (Expression schema '[] 'Ungrouped params) '(tab, nullity 'PGjsonb) -> FromClause schema params (PGjsonb_each_text tab)
+ Squeal.PostgreSQL.Query: jsonbEachAsText :: Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -> Query schema params '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGtext]
- Squeal.PostgreSQL.Query: leftOuterJoin :: FromClause schema params right -> Condition schema (Join left right) 'Ungrouped params -> FromClause schema params left -> FromClause schema params (Join left (NullifyRelations right))
+ Squeal.PostgreSQL.Query: leftOuterJoin :: FromClause schema params right -> Condition schema (Join left right) 'Ungrouped params -> FromClause schema params left -> FromClause schema params (Join left (NullifyFrom right))
- Squeal.PostgreSQL.Query: limit :: Word64 -> TableExpression schema params relations grouping -> TableExpression schema params relations grouping
+ Squeal.PostgreSQL.Query: limit :: Word64 -> TableExpression schema params from grouping -> TableExpression schema params from grouping
- Squeal.PostgreSQL.Query: newtype FromClause schema params relations
+ Squeal.PostgreSQL.Query: newtype FromClause schema params from
- Squeal.PostgreSQL.Query: newtype Query (schema :: SchemaType) (params :: [NullityType]) (columns :: RelationType)
+ Squeal.PostgreSQL.Query: newtype Query (schema :: SchemaType) (params :: [NullityType]) (columns :: RowType)
- Squeal.PostgreSQL.Query: offset :: Word64 -> TableExpression schema params relations grouping -> TableExpression schema params relations grouping
+ Squeal.PostgreSQL.Query: offset :: Word64 -> TableExpression schema params from grouping -> TableExpression schema params from grouping
- Squeal.PostgreSQL.Query: orderBy :: [SortExpression schema relations grouping params] -> TableExpression schema params relations grouping -> TableExpression schema params relations grouping
+ Squeal.PostgreSQL.Query: orderBy :: [SortExpression schema from grouping params] -> TableExpression schema params from grouping -> TableExpression schema params from grouping
- Squeal.PostgreSQL.Query: renderBy :: By relations by -> ByteString
+ Squeal.PostgreSQL.Query: renderBy :: By from by -> ByteString
- Squeal.PostgreSQL.Query: renderGroupByClause :: GroupByClause relations grouping -> ByteString
+ Squeal.PostgreSQL.Query: renderGroupByClause :: GroupByClause from grouping -> ByteString
- Squeal.PostgreSQL.Query: renderHavingClause :: HavingClause schema relations grouping params -> ByteString
+ Squeal.PostgreSQL.Query: renderHavingClause :: HavingClause schema from grouping params -> ByteString
- Squeal.PostgreSQL.Query: renderSortExpression :: SortExpression schema relations grouping params -> ByteString
+ Squeal.PostgreSQL.Query: renderSortExpression :: SortExpression schema from grouping params -> ByteString
- Squeal.PostgreSQL.Query: renderTableExpression :: TableExpression schema params relations grouping -> ByteString
+ Squeal.PostgreSQL.Query: renderTableExpression :: TableExpression schema params from grouping -> ByteString
- Squeal.PostgreSQL.Query: rightOuterJoin :: FromClause schema params right -> Condition schema (Join left right) 'Ungrouped params -> FromClause schema params left -> FromClause schema params (Join (NullifyRelations left) right)
+ Squeal.PostgreSQL.Query: rightOuterJoin :: FromClause schema params right -> Condition schema (Join left right) 'Ungrouped params -> FromClause schema params left -> FromClause schema params (Join (NullifyFrom left) right)
- Squeal.PostgreSQL.Query: select :: SListI columns => NP (Aliased (Expression schema relations grouping params)) (column : columns) -> TableExpression schema params relations grouping -> Query schema params (column : columns)
+ Squeal.PostgreSQL.Query: select :: SListI columns => NP (Aliased (Expression schema from grouping params)) (column : columns) -> TableExpression schema params from grouping -> Query schema params (column : columns)
- Squeal.PostgreSQL.Query: selectDistinct :: SListI columns => NP (Aliased (Expression schema relations 'Ungrouped params)) (column : columns) -> TableExpression schema params relations 'Ungrouped -> Query schema params (column : columns)
+ Squeal.PostgreSQL.Query: selectDistinct :: SListI columns => NP (Aliased (Expression schema from 'Ungrouped params)) (column : columns) -> TableExpression schema params from 'Ungrouped -> Query schema params (column : columns)
- Squeal.PostgreSQL.Query: selectDistinctDotStar :: Has relation relations columns => Alias relation -> TableExpression schema params relations 'Ungrouped -> Query schema params columns
+ Squeal.PostgreSQL.Query: selectDistinctDotStar :: Has table from columns => Alias table -> TableExpression schema params from 'Ungrouped -> Query schema params columns
- Squeal.PostgreSQL.Query: selectDistinctStar :: HasUnique relation relations columns => TableExpression schema params relations 'Ungrouped -> Query schema params columns
+ Squeal.PostgreSQL.Query: selectDistinctStar :: HasUnique table from columns => TableExpression schema params from 'Ungrouped -> Query schema params columns
- Squeal.PostgreSQL.Query: selectDotStar :: Has relation relations columns => Alias relation -> TableExpression schema params relations 'Ungrouped -> Query schema params columns
+ Squeal.PostgreSQL.Query: selectDotStar :: Has table from columns => Alias table -> TableExpression schema params from 'Ungrouped -> Query schema params columns
- Squeal.PostgreSQL.Query: selectStar :: HasUnique relation relations columns => TableExpression schema params relations 'Ungrouped -> Query schema params columns
+ Squeal.PostgreSQL.Query: selectStar :: HasUnique table from columns => TableExpression schema params from 'Ungrouped -> Query schema params columns
- Squeal.PostgreSQL.Query: table :: Has tab schema ( 'Table table) => Aliased Alias (alias ::: tab) -> FromClause schema params '[alias ::: TableToRelation table]
+ Squeal.PostgreSQL.Query: table :: Has tab schema ( 'Table table) => Aliased Alias (alias ::: tab) -> FromClause schema params '[alias ::: TableToRow table]
- Squeal.PostgreSQL.Query: view :: Has view schema ( 'View rel) => Aliased Alias (alias ::: view) -> FromClause schema params '[alias ::: rel]
+ Squeal.PostgreSQL.Query: view :: Has view schema ( 'View row) => Aliased Alias (alias ::: view) -> FromClause schema params '[alias ::: row]
- Squeal.PostgreSQL.Query: where_ :: Condition schema relations 'Ungrouped params -> TableExpression schema params relations grouping -> TableExpression schema params relations grouping
+ Squeal.PostgreSQL.Query: where_ :: Condition schema from 'Ungrouped params -> TableExpression schema params from grouping -> TableExpression schema params from grouping
- Squeal.PostgreSQL.Render: renderNat :: KnownNat n => proxy n -> ByteString
+ Squeal.PostgreSQL.Render: renderNat :: forall n. KnownNat n => ByteString
- Squeal.PostgreSQL.Schema: PGcomposite :: [(Symbol, PGType)] -> PGType
+ Squeal.PostgreSQL.Schema: PGcomposite :: RowType -> PGType
- Squeal.PostgreSQL.Schema: PGfixarray :: Nat -> PGType -> PGType
+ Squeal.PostgreSQL.Schema: PGfixarray :: Nat -> NullityType -> PGType
- Squeal.PostgreSQL.Schema: PGvararray :: PGType -> PGType
+ Squeal.PostgreSQL.Schema: PGvararray :: NullityType -> PGType
- Squeal.PostgreSQL.Schema: View :: RelationType -> SchemumType
+ Squeal.PostgreSQL.Schema: View :: RowType -> SchemumType
- Squeal.PostgreSQL.Schema: class (KnownSymbol relation, KnownSymbol column) => GroupedBy relation column bys
+ Squeal.PostgreSQL.Schema: class (KnownSymbol table, KnownSymbol column) => GroupedBy table column bys
- Squeal.PostgreSQL.Schema: type PGFloating ty = In ty '[ 'PGfloat4, 'PGfloat8, 'PGnumeric]
+ Squeal.PostgreSQL.Schema: type PGFloating = '[ 'PGfloat4, 'PGfloat8, 'PGnumeric]
- Squeal.PostgreSQL.Schema: type PGIntegral ty = In ty '[ 'PGint2, 'PGint4, 'PGint8]
+ Squeal.PostgreSQL.Schema: type PGIntegral = '[ 'PGint2, 'PGint4, 'PGint8]
- Squeal.PostgreSQL.Schema: type PGNum ty = In ty '[ 'PGint2, 'PGint4, 'PGint8, 'PGnumeric, 'PGfloat4, 'PGfloat8]
+ Squeal.PostgreSQL.Schema: type PGNum = '[ 'PGint2, 'PGint4, 'PGint8, 'PGnumeric, 'PGfloat4, 'PGfloat8]
- Squeal.PostgreSQL.Transaction: begin :: MonadPQ schema tx => TransactionMode -> tx (K Result NilRelation)
+ Squeal.PostgreSQL.Transaction: begin :: MonadPQ schema tx => TransactionMode -> tx (K Result ('[] :: RowType))
- Squeal.PostgreSQL.Transaction: commit :: MonadPQ schema tx => tx (K Result NilRelation)
+ Squeal.PostgreSQL.Transaction: commit :: MonadPQ schema tx => tx (K Result ('[] :: RowType))
- Squeal.PostgreSQL.Transaction: rollback :: MonadPQ schema tx => tx (K Result NilRelation)
+ Squeal.PostgreSQL.Transaction: rollback :: MonadPQ schema tx => tx (K Result ('[] :: RowType))

Files

exe/Example.hs view
@@ -29,7 +29,7 @@        '[ "pk_users" ::: 'PrimaryKey '["id"] ] :=>        '[ "id" ::: 'Def :=> 'NotNull 'PGint4         , "name" ::: 'NoDef :=> 'NotNull 'PGtext-        , "vec" ::: 'NoDef :=> 'NotNull ('PGvararray 'PGint2)+        , "vec" ::: 'NoDef :=> 'NotNull ('PGvararray ('Null 'PGint2))         ])    , "emails" ::: 'Table (        '[  "pk_emails" ::: 'PrimaryKey '["id"]@@ -60,7 +60,7 @@ teardown :: Definition Schema '[] teardown = dropTable #emails >>> dropTable #users -insertUser :: Manipulation Schema '[ 'NotNull 'PGtext, 'NotNull ('PGvararray 'PGint2)]+insertUser :: Manipulation Schema '[ 'NotNull 'PGtext, 'NotNull ('PGvararray ('Null 'PGint2))]   '[ "fromOnly" ::: 'NotNull 'PGint4 ] insertUser = insertRows #users   (Default `as` #id :* Set (param @1) `as` #name :* Set (param @2) `as` #vec) []@@ -76,7 +76,7 @@ getUsers :: Query Schema '[]   '[ "userName" ::: 'NotNull 'PGtext    , "userEmail" ::: 'Null 'PGtext-   , "userVec" ::: 'NotNull ('PGvararray 'PGint2)]+   , "userVec" ::: 'NotNull ('PGvararray ('Null 'PGint2))] getUsers = select   (#u ! #name `as` #userName :* #e ! #email `as` #userEmail :* #u ! #vec `as` #userVec)   ( from (table (#users `as` #u)
squeal-postgresql.cabal view
@@ -1,5 +1,5 @@ name: squeal-postgresql-version: 0.3.2.0+version: 0.4.0.0 synopsis: Squeal PostgreSQL Library description: Squeal is a type-safe embedding of PostgreSQL in Haskell homepage: https://github.com/morphismtech/squeal@@ -37,7 +37,7 @@   ghc-options: -Wall   build-depends:       aeson >= 1.2.4.0-    , base >= 4.10.1.0 && < 5.0+    , base >= 4.11.1.0 && < 5.0     , binary-parser >= 0.5.5     , bytestring >= 0.10.8.2     , bytestring-strict-builder >= 0.4.5@@ -50,7 +50,7 @@     , network-ip >= 0.3.0.2     , postgresql-binary >= 0.12.1     , postgresql-libpq >= 0.9.4.1-    , profunctors >= 5.2.2+    , records-sop >= 0.1.0.0     , resource-pool >= 0.2.3.2     , scientific >= 0.3.5.3     , text >= 1.2.3.0@@ -69,6 +69,24 @@   build-depends:       base >= 4.10.0.0     , doctest >= 0.11.4++test-suite squeal-postgresql-specs+  default-language: Haskell2010+  type: exitcode-stdio-1.0+  hs-source-dirs: test/Specs+  ghc-options: -Wall  -main-is Specs+  main-is: Specs.hs+  other-modules: ExceptionHandling+  build-depends:+      base >= 4.10.0.0+    , bytestring >= 0.10.8.2+    , generics-sop >= 0.3.1.0+    , hspec >= 2.4.8+    , squeal-postgresql+    , text >= 1.2.2.2+    , transformers >= 0.5.2.0+    , transformers-base >= 0.4.4+    , vector >= 0.12.0.1  executable squeal-postgresql-example   default-language: Haskell2010
src/Squeal/PostgreSQL/Binary.hs view
@@ -11,65 +11,104 @@ do not need to define your own instances to decode retrieved rows into Haskell values or to encode Haskell values into statement parameters. +Let's see some examples. We'll need some imports+ >>> import Data.Int (Int16) >>> import Data.Text (Text)-->>> data Row = Row { col1 :: Int16, col2 :: Text } deriving (Eq, GHC.Generic)->>> instance Generic Row->>> instance HasDatatypeInfo Row- >>> import Control.Monad (void) >>> import Control.Monad.Base (liftBase) >>> import Squeal.PostgreSQL +Define a Haskell datatype `Row` that will serve as both the input and output of a simple+round trip query.++>>> data Row = Row { col1 :: Int16, col2 :: Text, col3 :: Maybe Bool } deriving (Eq, GHC.Generic)+>>> instance Generic Row+>>> instance HasDatatypeInfo Row >>> :{ let-  query :: Query '[]-    '[ 'NotNull 'PGint2, 'NotNull 'PGtext]-    '["col1" ::: 'NotNull 'PGint2, "col2" ::: 'NotNull 'PGtext]-  query = values_ (param @1 `as` #col1 :* param @2 `as` #col2)+  roundTrip :: Query '[] (TuplePG Row) (RowPG Row)+  roundTrip = values_ $+    parameter @1 int2 `as` #col1 :*+    parameter @2 text `as` #col2 :*+    parameter @3 bool `as` #col3 :} +So long as we can encode the parameters and then decode the result of the query,+the input and output should be equal.++>>> let input = Row 2 "hi" (Just True) >>> :{+void . withConnection "host=localhost port=5432 dbname=exampledb" $ do+  result <- runQueryParams roundTrip input+  Just output <- firstRow result+  liftBase . print $ input == output+:}+True++In addition to being able to encode and decode basic Haskell types+like `Int16` and `Text`, Squeal permits you to encode and decode Haskell types to+Postgres array, enumerated and composite types and json. Let's see another example,+this time using the `Vector` type which corresponds to variable length arrays+and homogeneous tuples which correspond to fixed length arrays. We can even+create multi-dimensional fixed length arrays.++>>> :{+data Row = Row+  { col1 :: Vector Int16+  , col2 :: (Maybe Int16,Maybe Int16)+  , col3 :: ((Int16,Int16),(Int16,Int16),(Int16,Int16))+  } deriving (Eq, GHC.Generic)+:}++>>> instance Generic Row+>>> instance HasDatatypeInfo Row++Once again, we define a simple round trip query.++>>> :{ let-  roundtrip :: IO ()-  roundtrip = void . withConnection "host=localhost port=5432 dbname=exampledb" $ do-    result <- runQueryParams query (2 :: Int16, "hi" :: Text)-    Just row <- firstRow result-    liftBase . print $ row == Row 2 "hi"+  roundTrip :: Query '[] (TuplePG Row) (RowPG Row)+  roundTrip = values_ $+    parameter @1 (int2 & vararray)                  `as` #col1 :*+    parameter @2 (int2 & fixarray @2)               `as` #col2 :*+    parameter @3 (int2 & fixarray @2 & fixarray @3) `as` #col3 :} ->>> roundtrip+>>> :set -XOverloadedLists+>>> let input = Row [1,2] (Just 1,Nothing) ((1,2),(3,4),(5,6))+>>> :{+void . withConnection "host=localhost port=5432 dbname=exampledb" $ do+  result <- runQueryParams roundTrip input+  Just output <- firstRow result+  liftBase . print $ input == output+:} True -In addition to being able to encode and decode basic Haskell types like `Int16` and `Text`,-Squeal permits you to encode and decode Haskell types which are equivalent to-Postgres enumerated and composite types.- Enumerated (enum) types are data types that comprise a static, ordered set of values. They are equivalent to Haskell algebraic data types whose constructors are nullary. An example of an enum type might be the days of the week, or a set of status values for a piece of data. ->>> data Schwarma = Beef | Lamb | Chicken deriving (Show, GHC.Generic)+>>> data Schwarma = Beef | Lamb | Chicken deriving (Eq, Show, GHC.Generic) >>> instance Generic Schwarma >>> instance HasDatatypeInfo Schwarma  A composite type represents the structure of a row or record;-it is essentially just a list of field names and their data types. They are almost-equivalent to Haskell record types. However, because of the potential presence of @NULL@-all the record fields must be `Maybe`s of basic types.+it is essentially just a list of field names and their data types. ->>> data Person = Person {name :: Maybe Text, age :: Maybe Int32} deriving (Show, GHC.Generic)+>>> data Person = Person {name :: Text, age :: Int32} deriving (Eq, Show, GHC.Generic) >>> instance Generic Person >>> instance HasDatatypeInfo Person+>>> instance Aeson.FromJSON Person+>>> instance Aeson.ToJSON Person  We can create the equivalent Postgres types directly from their Haskell types.  >>> :{ type Schema =-  '[ "schwarma" ::: 'Typedef (EnumFrom Schwarma)-   , "person" ::: 'Typedef (CompositeFrom Person)+  '[ "schwarma" ::: 'Typedef (PG (Enumerated Schwarma))+   , "person" ::: 'Typedef (PG (Composite Person))    ] :} @@ -81,25 +120,40 @@     createTypeCompositeFrom @Person #person :} -Then we can perform roundtrip queries;+Let's demonstrate how to associate our Haskell types `Schwarma` and `Person`+with enumerated, composite or json types in Postgres. First create a Haskell+`Row` type using the `Enumerated`, `Composite` and `Json` newtypes as fields.  >>> :{+data Row = Row+  { schwarma :: Enumerated Schwarma+  , person1 :: Composite Person+  , person2 :: Json Person+  } deriving (Eq, GHC.Generic)+:}++>>> instance Generic Row+>>> instance HasDatatypeInfo Row+>>> :{ let-  querySchwarma :: Query Schema-    '[ 'NotNull (EnumFrom Schwarma)]-    '["fromOnly" ::: 'NotNull (EnumFrom Schwarma)]-  querySchwarma = values_ (parameter @1 #schwarma `as` #fromOnly)+  input = Row+    (Enumerated Chicken)+    (Composite (Person "Faisal" 24))+    (Json (Person "Ahmad" 48)) :} +Once again, define a round trip query.+ >>> :{ let-  queryPerson :: Query Schema-    '[ 'NotNull (CompositeFrom Person)]-    '["fromOnly" ::: 'NotNull (CompositeFrom Person)]-  queryPerson = values_ (parameter @1 #person `as` #fromOnly)+  roundTrip :: Query Schema (TuplePG Row) (RowPG Row)+  roundTrip = values_ $+    parameter @1 (typedef #schwarma) `as` #schwarma :*+    parameter @2 (typedef #person)   `as` #person1  :*+    parameter @3 json                `as` #person2 :} -And finally drop the types.+Finally, we can drop our type definitions.  >>> :{ let@@ -112,20 +166,16 @@ >>> :{ let   session = do-    result1 <- runQueryParams querySchwarma (Only Chicken)-    Just (Only schwarma) <- firstRow result1-    liftBase $ print (schwarma :: Schwarma)-    result2 <- runQueryParams queryPerson (Only (Person (Just "Faisal") (Just 24)))-    Just (Only person) <- firstRow result2-    liftBase $ print (person :: Person)+    result <- runQueryParams roundTrip input+    Just output <- firstRow result+    liftBase . print $ input == output in   void . withConnection "host=localhost port=5432 dbname=exampledb" $     define setup     & pqThen session     & pqThen (define teardown) :}-Chicken-Person {name = Just "Faisal", age = Just 24}+True -}  {-# LANGUAGE@@ -134,10 +184,13 @@   , DeriveFunctor   , DeriveGeneric   , DeriveTraversable+  , DefaultSignatures   , FlexibleContexts   , FlexibleInstances+  , FunctionalDependencies   , GADTs   , LambdaCase+  , OverloadedStrings   , MultiParamTypeClasses   , ScopedTypeVariables   , TypeApplications@@ -149,35 +202,37 @@ module Squeal.PostgreSQL.Binary   ( -- * Encoding     ToParam (..)-  , ToColumnParam (..)   , ToParams (..)     -- * Decoding   , FromValue (..)-  , FromColumnValue (..)   , FromRow (..)     -- * Only   , Only (..)   ) where  import BinaryParser-import ByteString.StrictBuilder-import Data.Aeson hiding (Null)+import ByteString.StrictBuilder (builderLength, int32BE, int64BE, word32BE)+import Control.Arrow (left)+import Control.Monad import Data.Int import Data.Kind-import Data.Monoid hiding (All) import Data.Scientific import Data.Time import Data.UUID.Types import Data.Vector (Vector) import Data.Word import Generics.SOP+import Generics.SOP.Record import GHC.TypeLits import Network.IP.Addr -import qualified Data.ByteString.Lazy as Lazy-import qualified Data.ByteString as Strict hiding (pack, unpack)-import qualified Data.Text.Lazy as Lazy-import qualified Data.Text as Strict+import qualified Data.Aeson as Aeson+import qualified Data.ByteString.Lazy as Lazy (ByteString)+import qualified Data.ByteString.Lazy as Lazy.ByteString+import qualified Data.ByteString as Strict (ByteString)+import qualified Data.Text.Lazy as Lazy (Text)+import qualified Data.Text as Strict (Text)+import qualified Data.Text as Strict.Text import qualified Data.Vector as Vector import qualified GHC.Generics as GHC import qualified PostgreSQL.Binary.Decoding as Decoding@@ -219,6 +274,8 @@ instance ToParam Char ('PGchar 1) where toParam = K . Encoding.char_utf8 instance ToParam Strict.Text 'PGtext where toParam = K . Encoding.text_strict instance ToParam Lazy.Text 'PGtext where toParam = K . Encoding.text_lazy+instance ToParam String 'PGtext where+  toParam = K . Encoding.text_strict . Strict.Text.pack instance ToParam Strict.ByteString 'PGbytea where   toParam = K . Encoding.bytea_strict instance ToParam Lazy.ByteString 'PGbytea where@@ -232,17 +289,29 @@ instance ToParam UTCTime 'PGtimestamptz where   toParam = K . Encoding.timestamptz_int instance ToParam DiffTime 'PGinterval where toParam = K . Encoding.interval_int-instance ToParam Value 'PGjson where toParam = K . Encoding.json_ast-instance ToParam Value 'PGjsonb where toParam = K . Encoding.jsonb_ast-instance (HasOid pg, ToParam x pg)-  => ToParam (Vector (Maybe x)) ('PGvararray pg) where-    toParam = K . Encoding.nullableArray_vector-      (oid @pg) (unK . toParam @x @pg)+instance ToParam Aeson.Value 'PGjson where toParam = K . Encoding.json_ast+instance ToParam Aeson.Value 'PGjsonb where toParam = K . Encoding.jsonb_ast+instance Aeson.ToJSON x => ToParam (Json x) 'PGjson where+  toParam = K . Encoding.json_bytes+    . Lazy.ByteString.toStrict . Aeson.encode . getJson+instance Aeson.ToJSON x => ToParam (Jsonb x) 'PGjsonb where+  toParam = K . Encoding.jsonb_bytes+    . Lazy.ByteString.toStrict . Aeson.encode . getJsonb+instance ToArray x ('NotNull ('PGvararray ty))+  => ToParam x ('PGvararray ty) where+    toParam+      = K . Encoding.array (baseOid @x @('NotNull ('PGvararray ty)))+      . unK . toArray @x @('NotNull ('PGvararray ty))+instance ToArray x ('NotNull ('PGfixarray n ty))+  => ToParam x ('PGfixarray n ty) where+    toParam+      = K . Encoding.array (baseOid @x @('NotNull ('PGfixarray n ty)))+      . unK . toArray @x @('NotNull ('PGfixarray n ty)) instance   ( IsEnumType x   , HasDatatypeInfo x-  , LabelsFrom x ~ labels-  ) => ToParam x ('PGenum labels) where+  , LabelsPG x ~ labels+  ) => ToParam (Enumerated x) ('PGenum labels) where     toParam =       let         gshowConstructor :: NP ConstructorInfo xss -> SOP I xss -> String@@ -253,21 +322,20 @@           gshowConstructor constructors (SOP xs)       in         K . Encoding.text_strict-        . Strict.pack+        . Strict.Text.pack         . gshowConstructor (constructorInfo (datatypeInfo (Proxy @x)))         . from+        . getEnumerated instance   ( SListI fields-  , MapMaybes xs-  , IsProductType x (Maybes xs)-  , AllZip ToAliasedParam xs fields-  , FieldNamesFrom x ~ AliasesOf fields+  , IsRecord x xs+  , AllZip ToField xs fields   , All HasAliasedOid fields-  ) => ToParam x ('PGcomposite fields) where+  ) => ToParam (Composite x) ('PGcomposite fields) where     toParam =       let -        encoders = htrans (Proxy @ToAliasedParam) toAliasedParam+        encoders = htrans (Proxy @ToField) toField          composite           :: All HasAliasedOid row@@ -301,36 +369,66 @@               hcfoldMap (Proxy @HasAliasedOid) each fields        in-        composite . encoders . unMaybes . unZ . unSOP . from+        composite . encoders . toRecord . getComposite -class HasAliasedOid (field :: (Symbol, PGType)) where aliasedOid :: Word32-instance HasOid ty => HasAliasedOid (alias ::: ty) where aliasedOid = oid @ty+class HasAliasedOid (field :: (Symbol, NullityType)) where+  aliasedOid :: Word32+instance HasOid ty => HasAliasedOid (alias ::: nullity ty) where+  aliasedOid = oid @ty -class ToAliasedParam (x :: Type) (field :: (Symbol, PGType)) where-  toAliasedParam :: Maybe x -> K (Maybe Encoding.Encoding) field-instance ToParam x ty => ToAliasedParam x (alias ::: ty) where-  toAliasedParam = \case-    Nothing -> K Nothing-    Just x -> K . Just . unK $ toParam @x @ty x+class ToNullityParam (x :: Type) (ty :: NullityType) where+  toNullityParam :: x -> K (Maybe Encoding.Encoding) ty+instance ToParam x pg => ToNullityParam x ('NotNull pg) where+  toNullityParam = K . Just . unK . toParam @x @pg+instance ToParam x pg => ToNullityParam (Maybe x) ('Null pg) where+  toNullityParam = K . fmap (unK . toParam @x @pg) --- | A `ToColumnParam` constraint lifts the `ToParam` encoding--- of a `Type` to a `NullityType`, encoding `Maybe`s to `Null`s. You should--- not define instances of `ToColumnParam`, just use the provided instances.-class ToColumnParam (x :: Type) (ty :: NullityType) where-  -- | >>> toColumnParam @Int16 @('NotNull 'PGint2) 0-  -- K (Just "\NUL\NUL")-  ---  -- >>> toColumnParam @(Maybe Int16) @('Null 'PGint2) (Just 0)-  -- K (Just "\NUL\NUL")-  ---  -- >>> toColumnParam @(Maybe Int16) @('Null 'PGint2) Nothing-  -- K Nothing-  toColumnParam :: x -> K (Maybe Strict.ByteString) ty-instance ToParam x pg => ToColumnParam x ('NotNull pg) where-  toColumnParam = K . Just . Encoding.encodingBytes . unK . toParam @x @pg-instance ToParam x pg => ToColumnParam (Maybe x) ('Null pg) where-  toColumnParam = K . fmap (Encoding.encodingBytes . unK . toParam @x @pg)+class ToField (x :: (Symbol, Type)) (field :: (Symbol, NullityType)) where+  toField :: P x -> K (Maybe Encoding.Encoding) field+instance ToNullityParam x ty => ToField (alias ::: x) (alias ::: ty) where+  toField (P x) = K . unK $ toNullityParam @x @ty x +class ToArray (x :: Type) (array :: NullityType) where+  toArray :: x -> K Encoding.Array array+  baseOid :: Word32+  default baseOid :: HasOid (PGTypeOf array) => Word32+  baseOid = oid @(PGTypeOf array)+instance {-# OVERLAPPABLE #-} (HasOid pg, ToParam x pg)+  => ToArray x ('NotNull pg) where+    toArray = K . Encoding.encodingArray . unK . toParam @x @pg+instance {-# OVERLAPPABLE #-} (HasOid pg, ToParam x pg)+  => ToArray (Maybe x) ('Null pg) where+    toArray = K . maybe Encoding.nullArray+      (Encoding.encodingArray . unK . toParam @x @pg)+instance {-# OVERLAPPING #-} ToArray x array+  => ToArray (Vector x) ('NotNull ('PGvararray array)) where+    toArray = K . Encoding.dimensionArray Vector.foldl'+      (unK . toArray @x @array)+    baseOid = baseOid @x @array+instance {-# OVERLAPPING #-} ToArray x array+  => ToArray (Maybe (Vector x)) ('Null ('PGvararray array)) where+    toArray = K . maybe Encoding.nullArray+      (Encoding.dimensionArray Vector.foldl' (unK . toArray @x @array))+    baseOid = baseOid @x @array+instance {-# OVERLAPPING #-}+  ( IsProductType product xs+  , Length xs ~ n+  , All ((~) x) xs+  , ToArray x array )+  => ToArray product ('NotNull ('PGfixarray n array)) where+    toArray = K . Encoding.dimensionArray foldlN+      (unK . toArray @x @array) . unZ . unSOP . from+    baseOid = baseOid @x @array+instance {-# OVERLAPPING #-}+  ( IsProductType product xs+  , Length xs ~ n+  , All ((~) x) xs+  , ToArray x array )+  => ToArray (Maybe product) ('Null ('PGfixarray n array)) where+    toArray = K . maybe Encoding.nullArray+      (Encoding.dimensionArray foldlN (unK . toArray @x @array) . unZ . unSOP . from)+    baseOid = baseOid @x @array+ -- | A `ToParams` constraint generically sequences the encodings of `Type`s -- of the fields of a tuple or record to a row of `ColumnType`s. You should -- not define instances of `ToParams`. Instead define `Generic` instances@@ -345,61 +443,67 @@   -- >>> instance Generic Tuple   -- >>> toParams @Tuple @Params (Tuple False (Just 0))   -- K (Just "\NUL") :* K (Just "\NUL\NUL") :* Nil-  toParams :: x -> NP (K (Maybe Strict.ByteString)) tys-instance (SListI tys, IsProductType x xs, AllZip ToColumnParam xs tys)+  toParams :: x -> NP (K (Maybe Encoding.Encoding)) tys+instance (SListI tys, IsProductType x xs, AllZip ToNullityParam xs tys)   => ToParams x tys where       toParams-        = htrans (Proxy @ToColumnParam) (toColumnParam . unI)+        = htrans (Proxy @ToNullityParam) (toNullityParam . unI)         . unZ . unSOP . from  -- | A `FromValue` constraint gives a parser from the binary format of -- a PostgreSQL `PGType` into a Haskell `Type`. class FromValue (pg :: PGType) (y :: Type) where   -- | >>> newtype Id = Id { getId :: Int16 } deriving Show-  -- >>> instance FromValue 'PGint2 Id where fromValue = fmap Id . fromValue-  fromValue :: proxy pg -> Decoding.Value y-instance FromValue 'PGbool Bool where fromValue _ = Decoding.bool-instance FromValue 'PGint2 Int16 where fromValue _ = Decoding.int-instance FromValue 'PGint4 Int32 where fromValue _ = Decoding.int-instance FromValue 'PGint8 Int64 where fromValue _ = Decoding.int-instance FromValue 'PGfloat4 Float where fromValue _ = Decoding.float4-instance FromValue 'PGfloat8 Double where fromValue _ = Decoding.float8-instance FromValue 'PGnumeric Scientific where fromValue _ = Decoding.numeric-instance FromValue 'PGuuid UUID where fromValue _ = Decoding.uuid-instance FromValue 'PGinet (NetAddr IP) where fromValue _ = Decoding.inet-instance FromValue ('PGchar 1) Char where fromValue _ = Decoding.char-instance FromValue 'PGtext Strict.Text where fromValue _ = Decoding.text_strict-instance FromValue 'PGtext Lazy.Text where fromValue _ = Decoding.text_lazy+  -- >>> instance FromValue 'PGint2 Id where fromValue = Id <$> fromValue @'PGint2+  fromValue :: Decoding.Value y+instance FromValue 'PGbool Bool where fromValue = Decoding.bool+instance FromValue 'PGint2 Int16 where fromValue = Decoding.int+instance FromValue 'PGint4 Int32 where fromValue = Decoding.int+instance FromValue 'PGint8 Int64 where fromValue = Decoding.int+instance FromValue 'PGfloat4 Float where fromValue = Decoding.float4+instance FromValue 'PGfloat8 Double where fromValue = Decoding.float8+instance FromValue 'PGnumeric Scientific where fromValue = Decoding.numeric+instance FromValue 'PGuuid UUID where fromValue = Decoding.uuid+instance FromValue 'PGinet (NetAddr IP) where fromValue = Decoding.inet+instance FromValue ('PGchar 1) Char where fromValue = Decoding.char+instance FromValue 'PGtext Strict.Text where fromValue = Decoding.text_strict+instance FromValue 'PGtext Lazy.Text where fromValue = Decoding.text_lazy+instance FromValue 'PGtext String where+  fromValue = Strict.Text.unpack <$> Decoding.text_strict instance FromValue 'PGbytea Strict.ByteString where-  fromValue _ = Decoding.bytea_strict+  fromValue = Decoding.bytea_strict instance FromValue 'PGbytea Lazy.ByteString where-  fromValue _ = Decoding.bytea_lazy-instance FromValue 'PGdate Day where fromValue _ = Decoding.date-instance FromValue 'PGtime TimeOfDay where fromValue _ = Decoding.time_int+  fromValue = Decoding.bytea_lazy+instance FromValue 'PGdate Day where fromValue = Decoding.date+instance FromValue 'PGtime TimeOfDay where fromValue = Decoding.time_int instance FromValue 'PGtimetz (TimeOfDay, TimeZone) where-  fromValue _ = Decoding.timetz_int+  fromValue = Decoding.timetz_int instance FromValue 'PGtimestamp LocalTime where-  fromValue _ = Decoding.timestamp_int+  fromValue = Decoding.timestamp_int instance FromValue 'PGtimestamptz UTCTime where-  fromValue _ = Decoding.timestamptz_int+  fromValue = Decoding.timestamptz_int instance FromValue 'PGinterval DiffTime where-  fromValue _ = Decoding.interval_int-instance FromValue 'PGjson Value where fromValue _ = Decoding.json_ast-instance FromValue 'PGjsonb Value where fromValue _ = Decoding.jsonb_ast-instance FromValue pg y => FromValue ('PGvararray pg) (Vector (Maybe y)) where-  fromValue _ = Decoding.array-    (Decoding.dimensionArray Vector.replicateM-      (Decoding.nullableValueArray (fromValue (Proxy @pg))))-instance FromValue pg y => FromValue ('PGfixarray n pg) (Vector (Maybe y)) where-  fromValue _ = Decoding.array-    (Decoding.dimensionArray Vector.replicateM-      (Decoding.nullableValueArray (fromValue (Proxy @pg))))+  fromValue = Decoding.interval_int+instance FromValue 'PGjson Aeson.Value where fromValue = Decoding.json_ast+instance FromValue 'PGjsonb Aeson.Value where fromValue = Decoding.jsonb_ast+instance Aeson.FromJSON x => FromValue 'PGjson (Json x) where+  fromValue = Json <$>+    Decoding.json_bytes (left Strict.Text.pack . Aeson.eitherDecodeStrict)+instance Aeson.FromJSON x => FromValue 'PGjsonb (Jsonb x) where+  fromValue = Jsonb <$>+    Decoding.jsonb_bytes (left Strict.Text.pack . Aeson.eitherDecodeStrict)+instance FromArray ('NotNull ('PGvararray ty)) y+  => FromValue ('PGvararray ty) y where+    fromValue = Decoding.array (fromArray @('NotNull ('PGvararray ty)) @y)+instance FromArray ('NotNull ('PGfixarray n ty)) y+  => FromValue ('PGfixarray n ty) y where+    fromValue = Decoding.array (fromArray @('NotNull ('PGfixarray n ty)) @y) instance   ( IsEnumType y   , HasDatatypeInfo y-  , LabelsFrom y ~ labels-  ) => FromValue ('PGenum labels) y where-    fromValue _ =+  , LabelsPG y ~ labels+  ) => FromValue ('PGenum labels) (Enumerated y) where+    fromValue =       let         greadConstructor           :: All ((~) '[]) xss@@ -412,29 +516,16 @@             then Just (SOP (Z Nil))             else SOP . S . unSOP <$> greadConstructor constructors name       in-        Decoding.enum+        fmap Enumerated+        . Decoding.enum         $ fmap to         . greadConstructor (constructorInfo (datatypeInfo (Proxy @y)))-        . Strict.unpack-+        . Strict.Text.unpack instance-  ( SListI fields-  , MapMaybes ys-  , IsProductType y (Maybes ys)-  , AllZip FromAliasedValue fields ys-  , FieldNamesFrom y ~ AliasesOf fields-  ) => FromValue ('PGcomposite fields) y where+  ( FromRow fields y+  ) => FromValue ('PGcomposite fields) (Composite y) where     fromValue =       let-        decoders-          :: forall pgs zs proxy-          . AllZip FromAliasedValue pgs zs-          => proxy ('PGcomposite pgs)-          -> NP Decoding.Value zs-        decoders _ = htrans (Proxy @FromAliasedValue) fromAliasedValue-          (hpure Proxy :: NP Proxy pgs)--        composite fields = do         -- <number of fields: 4 bytes>         -- [for each field]         --  <OID of field's type: sizeof(Oid) bytes>@@ -445,80 +536,103 @@         --    <value: <length> bytes>         --  [end if]         -- [end for]+        composite = Decoding.valueParser $ do           unitOfSize 4-          let-            each field = do-              unitOfSize 4-              len <- sized 4 Decoding.int-              if len == -1 then return Nothing else Just <$> sized len field-          htraverse' each fields--      in fmap (to . SOP . Z . maybes) . composite . decoders--class FromAliasedValue (pg :: (Symbol,PGType)) (y :: Type) where-  fromAliasedValue :: proxy pg -> Decoding.Value y-instance FromValue pg y => FromAliasedValue (alias ::: pg) y where-  fromAliasedValue _ = fromValue (Proxy @pg)+          hsequence' $ hpure $ Comp $ do+            unitOfSize 4+            len <- sized 4 Decoding.int+            if len == -1+              then return (K Nothing)+              else K . Just <$> bytesOfSize len+      in+        fmap Composite (Decoding.fn (fromRow @fields <=< composite)) --- | A `FromColumnValue` constraint lifts the `FromValue` parser+-- | A `FromField` constraint lifts the `FromValue` parser -- to a decoding of a @(Symbol, NullityType)@ to a `Type`, -- decoding `Null`s to `Maybe`s. You should not define instances for--- `FromColumnValue`, just use the provided instances.-class FromColumnValue (colty :: (Symbol,NullityType)) (y :: Type) where-  -- | >>> :set -XTypeOperators -XOverloadedStrings-  -- >>> newtype Id = Id { getId :: Int16 } deriving Show-  -- >>> instance FromValue 'PGint2 Id where fromValue = fmap Id . fromValue-  -- >>> fromColumnValue @("col" ::: 'NotNull 'PGint2) @Id (K (Just "\NUL\SOH"))-  -- Id {getId = 1}-  ---  -- >>> fromColumnValue @("col" ::: 'Null 'PGint2) @(Maybe Id) (K (Just "\NUL\SOH"))-  -- Just (Id {getId = 1})-  fromColumnValue :: K (Maybe Strict.ByteString) colty -> y+-- `FromField`, just use the provided instances.+class FromField (pg :: (Symbol, NullityType)) (y :: (Symbol, Type)) where+  fromField+    :: K (Maybe Strict.ByteString) pg+    -> (Either Strict.Text :.: P) y instance FromValue pg y-  => FromColumnValue (column ::: ('NotNull pg)) y where-    fromColumnValue = \case-      K Nothing -> error "fromColumnValue: saw NULL when expecting NOT NULL"-      K (Just bs) ->-        let-          errOrValue =-            Decoding.valueParser (fromValue @pg @y Proxy) bs-          err str = error $ "fromColumnValue: " ++ Strict.unpack str-        in-          either err id errOrValue+  => FromField (column ::: ('NotNull pg)) (column ::: y) where+    fromField = Comp . \case+      K Nothing -> Left "fromField: saw NULL when expecting NOT NULL"+      K (Just bytestring) -> P <$>+        Decoding.valueParser (fromValue @pg) bytestring instance FromValue pg y-  => FromColumnValue (column ::: ('Null pg)) (Maybe y) where-    fromColumnValue (K nullOrBytes)-      = either err id-      . Decoding.valueParser (fromValue @pg @y Proxy)-      <$> nullOrBytes-      where-        err str = error $ "fromColumnValue: " ++ Strict.unpack str+  => FromField (column ::: 'Null pg) (column ::: Maybe y) where+    fromField = Comp . \case+      K Nothing -> Right $ P Nothing+      K (Just bytestring) -> P . Just <$>+        Decoding.valueParser (fromValue @pg) bytestring +class FromArray (ty :: NullityType) (y :: Type) where+  fromArray :: Decoding.Array y+instance {-# OVERLAPPABLE #-} FromValue pg y+  => FromArray ('NotNull pg) y where+    fromArray = Decoding.valueArray (fromValue @pg @y)+instance {-# OVERLAPPABLE #-} FromValue pg y+  => FromArray ('Null pg) (Maybe y) where+    fromArray = Decoding.nullableValueArray (fromValue @pg @y)+instance {-# OVERLAPPING #-} FromArray array y+  => FromArray ('NotNull ('PGvararray array)) (Vector y) where+    fromArray =+      Decoding.dimensionArray Vector.replicateM (fromArray @array @y)+instance {-# OVERLAPPING #-} FromArray array y+  => FromArray ('Null ('PGvararray array)) (Maybe (Vector y)) where+    fromArray = Just <$> +      Decoding.dimensionArray Vector.replicateM (fromArray @array @y)+instance {-# OVERLAPPING #-}+  ( FromArray array y+  , All ((~) y) ys+  , SListI ys+  , IsProductType product ys )+  => FromArray ('NotNull ('PGfixarray n array)) product where+    fromArray =+      let+        rep _ = fmap (to . SOP . Z) . replicateMN+      in+        Decoding.dimensionArray rep (fromArray @array @y)+instance {-# OVERLAPPING #-}+  ( FromArray array y+  , All ((~) y) ys+  , SListI ys+  , IsProductType product ys )+  => FromArray ('Null ('PGfixarray n array)) (Maybe product) where+    fromArray =+      let+        rep _ = fmap (to . SOP . Z) . replicateMN+      in+        Just <$> Decoding.dimensionArray rep (fromArray @array @y)+ -- | A `FromRow` constraint generically sequences the parsings of the columns--- of a `RelationType` into the fields of a record `Type` provided they have+-- of a `RowType` into the fields of a record `Type` provided they have -- the same field names. You should not define instances of `FromRow`. -- Instead define `Generic` and `HasDatatypeInfo` instances which in turn -- provide `FromRow` instances.-class SListI results => FromRow (results :: RelationType) y where+class SListI result => FromRow (result :: RowType) y where   -- | >>> :set -XOverloadedStrings   -- >>> import Data.Text   -- >>> newtype UserId = UserId { getUserId :: Int16 } deriving Show-  -- >>> instance FromValue 'PGint2 UserId where fromValue = fmap UserId . fromValue+  -- >>> instance FromValue 'PGint2 UserId where fromValue = UserId <$> fromValue @'PGint2   -- >>> data UserRow = UserRow { userId :: UserId, userName :: Maybe Text } deriving (Show, GHC.Generic)   -- >>> instance Generic UserRow   -- >>> instance HasDatatypeInfo UserRow   -- >>> type User = '["userId" ::: 'NotNull 'PGint2, "userName" ::: 'Null 'PGtext]   -- >>> fromRow @User @UserRow (K (Just "\NUL\SOH") :* K (Just "bloodninja") :* Nil)-  -- UserRow {userId = UserId {getUserId = 1}, userName = Just "bloodninja"}-  fromRow :: NP (K (Maybe Strict.ByteString)) results -> y+  -- Right (UserRow {userId = UserId {getUserId = 1}, userName = Just "bloodninja"})+  fromRow :: NP (K (Maybe Strict.ByteString)) result -> Either Strict.Text y instance-  ( SListI results-  , IsProductType y ys-  , AllZip FromColumnValue results ys-  , FieldNamesFrom y ~ AliasesOf results-  ) => FromRow results y where+  ( SListI result+  , IsRecord y ys+  , AllZip FromField result ys+  ) => FromRow result y where     fromRow-      = to . SOP . Z . htrans (Proxy @FromColumnValue) (I . fromColumnValue)+      = fmap fromRecord+      . hsequence'+      . htrans (Proxy @FromField) fromField  -- | `Only` is a 1-tuple type, useful for encoding a single parameter with -- `toParams` or decoding a single value with `fromRow`.@@ -528,8 +642,21 @@ -- K (Just "foo") :* Nil -- -- >>> fromRow @'["fromOnly" ::: 'Null 'PGtext] @(Only (Maybe Text)) (K (Just "bar") :* Nil)--- Only {fromOnly = Just "bar"}+-- Right (Only {fromOnly = Just "bar"}) newtype Only x = Only { fromOnly :: x }   deriving (Functor,Foldable,Traversable,Eq,Ord,Read,Show,GHC.Generic) instance Generic (Only x) instance HasDatatypeInfo (Only x)++foldlN+  :: All ((~) x) xs+  => (z -> x -> z) -> z -> NP I xs -> z+foldlN f z = \case+  Nil -> z+  I x :* xs -> let z' = f z x in seq z' $ foldlN f z' xs++replicateMN+  :: forall x xs m. (All ((~) x) xs, Monad m, SListI xs)+  => m x -> m (NP I xs)+replicateMN mx = hsequence' $+  hcpure (Proxy :: Proxy ((~) x)) (Comp (I <$> mx)) 
src/Squeal/PostgreSQL/Definition.hs view
@@ -270,7 +270,7 @@ -} check   :: ( Has alias schema ('Table table)-     , HasAll aliases (TableToRelation table) subcolumns )+     , HasAll aliases (TableToRow table) subcolumns )   => NP Alias aliases   -- ^ specify the subcolumns which are getting checked   -> (forall tab. Condition schema '[tab ::: subcolumns] 'Ungrouped '[])@@ -304,7 +304,7 @@ -} unique   :: ( Has alias schema ('Table table)-     , HasAll aliases (TableToRelation table) subcolumns )+     , HasAll aliases (TableToRow table) subcolumns )   => NP Alias aliases   -- ^ specify subcolumns which together are unique for each row   -> TableConstraintExpression schema alias ('Unique aliases)@@ -807,9 +807,9 @@ createView   :: KnownSymbol view   => Alias view -- ^ the name of the view to add-  -> Query schema '[] relation+  -> Query schema '[] row     -- ^ query-  -> Definition schema (Create view ('View relation) schema)+  -> Definition schema (Create view ('View row) schema) createView alias query = UnsafeDefinition $   "CREATE" <+> "VIEW" <+> renderAlias alias <+> "AS"   <+> renderQuery query <> ";"@@ -857,19 +857,23 @@ createTypeEnumFrom   :: forall hask enum schema.   ( SOP.Generic hask-  , SOP.All KnownSymbol (LabelsFrom hask)+  , SOP.All KnownSymbol (LabelsPG hask)   , KnownSymbol enum   )   => Alias enum   -- ^ name of the user defined enumerated type-  -> Definition schema (Create enum ('Typedef (EnumFrom hask)) schema)+  -> Definition schema (Create enum ('Typedef (PG (Enumerated hask))) schema) createTypeEnumFrom enum = createTypeEnum enum-  (SOP.hpure label :: NP PGlabel (LabelsFrom hask))+  (SOP.hpure label :: NP PGlabel (LabelsPG hask))  {- | `createTypeComposite` creates a composite type. The composite type is specified by a list of attribute names and data types. ->>> type PGcomplex = 'PGcomposite '["real" ::: 'PGfloat8, "imaginary" ::: 'PGfloat8]+>>> :{+type PGcomplex = 'PGcomposite+  '[ "real"      ::: 'NotNull 'PGfloat8+   , "imaginary" ::: 'NotNull 'PGfloat8 ]+:}  >>> :{ let@@ -892,36 +896,39 @@   (renderCommaSeparated renderField fields) <> ";"   where     renderField :: Aliased (TypeExpression schema) x -> ByteString-    renderField (typ `As` field) =-      renderAlias field <+> renderTypeExpression typ+    renderField (typ `As` alias) =+      renderAlias alias <+> renderTypeExpression typ  -- | Composite types can also be generated from a Haskell type, for example ----- >>> data Complex = Complex {real :: Maybe Double, imaginary :: Maybe Double} deriving GHC.Generic+-- >>> data Complex = Complex {real :: Double, imaginary :: Double} deriving GHC.Generic -- >>> instance SOP.Generic Complex -- >>> instance SOP.HasDatatypeInfo Complex -- >>> printSQL $ createTypeCompositeFrom @Complex #complex -- CREATE TYPE "complex" AS ("real" float8, "imaginary" float8); createTypeCompositeFrom   :: forall hask ty schema.-  ( ZipAliased (FieldNamesFrom hask) (FieldTypesFrom hask)-  , SOP.All (PGTyped schema) (FieldTypesFrom hask)-  , KnownSymbol ty-  )+  ( SOP.All (FieldTyped schema) (RowPG hask)+  , KnownSymbol ty )   => Alias ty   -- ^ name of the user defined composite type-  -> Definition schema (Create ty ( 'Typedef (CompositeFrom hask)) schema)-createTypeCompositeFrom ty = createTypeComposite ty $ zipAs-  (SOP.hpure Alias :: NP Alias (FieldNamesFrom hask))-  (SOP.hcpure (SOP.Proxy :: SOP.Proxy (PGTyped schema)) pgtype-    :: NP (TypeExpression schema) (FieldTypesFrom hask))+  -> Definition schema (Create ty ( 'Typedef (PG (Composite hask))) schema)+createTypeCompositeFrom ty = createTypeComposite ty+  (SOP.hcpure (SOP.Proxy :: SOP.Proxy (FieldTyped schema)) fieldtype+    :: NP (Aliased (TypeExpression schema)) (RowPG hask)) +class FieldTyped schema ty where+  fieldtype :: Aliased (TypeExpression schema) ty+instance (KnownSymbol alias, PGTyped schema ty)+  => FieldTyped schema (alias ::: ty) where+    fieldtype = pgtype `As` Alias+ -- | Drop a type. -- -- >>> data Schwarma = Beef | Lamb | Chicken deriving GHC.Generic -- >>> instance SOP.Generic Schwarma -- >>> instance SOP.HasDatatypeInfo Schwarma--- >>> printSQL (dropType #schwarma :: Definition '["schwarma" ::: 'Typedef (EnumFrom Schwarma)] '[])+-- >>> printSQL (dropType #schwarma :: Definition '["schwarma" ::: 'Typedef (PG (Enumerated Schwarma))] '[]) -- DROP TYPE "schwarma"; dropType   :: Has tydef schema ('Typedef ty)@@ -938,15 +945,15 @@ -- | used in `createTable` commands as a column constraint to note that -- @NULL@ may be present in a column nullable-  :: TypeExpression schema ty+  :: TypeExpression schema (nullity ty)   -> ColumnTypeExpression schema ('NoDef :=> 'Null ty) nullable ty = UnsafeColumnTypeExpression $ renderTypeExpression ty <+> "NULL"  -- | used in `createTable` commands as a column constraint to ensure -- @NULL@ is not present in a column notNullable-  :: TypeExpression schema ty-  -> ColumnTypeExpression schema (def :=> 'NotNull ty)+  :: TypeExpression schema (nullity ty)+  -> ColumnTypeExpression schema ('NoDef :=> 'NotNull ty) notNullable ty = UnsafeColumnTypeExpression $ renderTypeExpression ty <+> "NOT NULL"  -- | used in `createTable` commands as a column constraint to give a default
src/Squeal/PostgreSQL/Expression.hs view
@@ -45,7 +45,9 @@   , nullIf     -- ** Collections   , array+  , index   , row+  , field     -- ** Functions   , unsafeBinaryOp   , unsafeUnaryOp@@ -61,12 +63,12 @@   , greatest   , least     -- ** Conditions-  , Condition   , true   , false   , not_   , (.&&)   , (.||)+  , Condition   , caseWhenThenElse   , ifThenElse   , (.==)@@ -86,16 +88,13 @@   , upper   , charLength   , like-    -- ** json or jsonb operators-  , PGarray-  , PGarrayOf-  , PGjsonKey-  , PGjson_+    -- ** Json+    -- *** Json and Jsonb operators   , (.->)   , (.->>)   , (.#>)   , (.#>>)-    -- *** jsonb only operators+    -- *** Jsonb operators   , (.@>)   , (.<@)   , (.?)@@ -124,8 +123,6 @@   , jsonbExtractPath   , jsonExtractPathAsText   , jsonbExtractPathAsText-  , jsonObjectKeys-  , jsonbObjectKeys   , jsonTypeof   , jsonbTypeof   , jsonStripNulls@@ -146,6 +143,9 @@     -- * Types   , TypeExpression (UnsafeTypeExpression, renderTypeExpression)   , PGTyped (pgtype)+  , typedef+  , typetable+  , typeview   , bool   , int2   , smallint@@ -191,6 +191,7 @@ import qualified Data.Aeson as JSON import Data.Ratio import Data.String+import Data.Word import Generics.SOP hiding (from) import GHC.OverloadedLabels import GHC.TypeLits@@ -217,14 +218,14 @@ -} newtype Expression   (schema :: SchemaType)-  (relations :: RelationsType)+  (from :: FromType)   (grouping :: Grouping)   (params :: [NullityType])   (ty :: NullityType)     = UnsafeExpression { renderExpression :: ByteString }     deriving (GHC.Generic,Show,Eq,Ord,NFData) -instance RenderSQL (Expression schema relations grouping params ty) where+instance RenderSQL (Expression schema from grouping params ty) where   renderSQL = renderExpression  {- | A `HasParameter` constraint is used to indicate a value that is@@ -247,10 +248,10 @@     -- >>> printSQL expr     -- ($1 :: int4)     parameter-      :: TypeExpression schema (PGTypeOf ty)-      -> Expression schema relations grouping params ty+      :: TypeExpression schema ty+      -> Expression schema from grouping params ty     parameter ty = UnsafeExpression $ parenthesized $-      "$" <> renderNat (Proxy @n) <+> "::"+      "$" <> renderNat @n <+> "::"         <+> renderTypeExpression ty instance {-# OVERLAPPING #-} HasParameter 1 schema (ty1:tys) ty1 instance {-# OVERLAPPABLE #-} (KnownNat n, HasParameter (n-1) schema params ty)@@ -263,84 +264,84 @@ -- >>> printSQL expr -- ($1 :: int4) param-  :: forall n schema params relations grouping ty-   . (PGTyped schema (PGTypeOf ty), HasParameter n schema params ty)-  => Expression schema relations grouping params ty -- ^ param+  :: forall n schema params from grouping ty+   . (PGTyped schema ty, HasParameter n schema params ty)+  => Expression schema from grouping params ty -- ^ param param = parameter @n pgtype -instance (HasUnique relation relations columns, Has column columns ty)-  => IsLabel column (Expression schema relations 'Ungrouped params ty) where+instance (HasUnique table from columns, Has column columns ty)+  => IsLabel column (Expression schema from 'Ungrouped params ty) where     fromLabel = UnsafeExpression $ renderAlias (Alias @column)-instance (HasUnique relation relations columns, Has column columns ty)+instance (HasUnique table from columns, Has column columns ty)   => IsLabel column-    (Aliased (Expression schema relations 'Ungrouped params) (column ::: ty)) where+    (Aliased (Expression schema from 'Ungrouped params) (column ::: ty)) where     fromLabel = fromLabel @column `As` Alias @column-instance (HasUnique relation relations columns, Has column columns ty)+instance (HasUnique table from columns, Has column columns ty)   => IsLabel column-    (NP (Aliased (Expression schema relations 'Ungrouped params)) '[column ::: ty]) where+    (NP (Aliased (Expression schema from 'Ungrouped params)) '[column ::: ty]) where     fromLabel = fromLabel @column :* Nil -instance (Has relation relations columns, Has column columns ty)-  => IsQualified relation column (Expression schema relations 'Ungrouped params ty) where-    relation ! column = UnsafeExpression $-      renderAlias relation <> "." <> renderAlias column-instance (Has relation relations columns, Has column columns ty)-  => IsQualified relation column-    (Aliased (Expression schema relations 'Ungrouped params) (column ::: ty)) where-    relation ! column = relation ! column `As` column-instance (Has relation relations columns, Has column columns ty)-  => IsQualified relation column-    (NP (Aliased (Expression schema relations 'Ungrouped params)) '[column ::: ty]) where-    relation ! column = relation ! column :* Nil+instance (Has table from columns, Has column columns ty)+  => IsQualified table column (Expression schema from 'Ungrouped params ty) where+    table ! column = UnsafeExpression $+      renderAlias table <> "." <> renderAlias column+instance (Has table from columns, Has column columns ty)+  => IsQualified table column+    (Aliased (Expression schema from 'Ungrouped params) (column ::: ty)) where+    table ! column = table ! column `As` column+instance (Has table from columns, Has column columns ty)+  => IsQualified table column+    (NP (Aliased (Expression schema from 'Ungrouped params)) '[column ::: ty]) where+    table ! column = table ! column :* Nil  instance-  ( HasUnique relation relations columns+  ( HasUnique table from columns   , Has column columns ty-  , GroupedBy relation column bys+  , GroupedBy table column bys   ) => IsLabel column-    (Expression schema relations ('Grouped bys) params ty) where+    (Expression schema from ('Grouped bys) params ty) where       fromLabel = UnsafeExpression $ renderAlias (Alias @column) instance-  ( HasUnique relation relations columns+  ( HasUnique table from columns   , Has column columns ty-  , GroupedBy relation column bys+  , GroupedBy table column bys   ) => IsLabel column-    ( Aliased (Expression schema relations ('Grouped bys) params)+    ( Aliased (Expression schema from ('Grouped bys) params)       (column ::: ty) ) where       fromLabel = fromLabel @column `As` Alias @column instance-  ( HasUnique relation relations columns+  ( HasUnique table from columns   , Has column columns ty-  , GroupedBy relation column bys+  , GroupedBy table column bys   ) => IsLabel column-    ( NP (Aliased (Expression schema relations ('Grouped bys) params))+    ( NP (Aliased (Expression schema from ('Grouped bys) params))       '[column ::: ty] ) where       fromLabel = fromLabel @column :* Nil  instance-  ( Has relation relations columns+  ( Has table from columns   , Has column columns ty-  , GroupedBy relation column bys-  ) => IsQualified relation column-    (Expression schema relations ('Grouped bys) params ty) where-      relation ! column = UnsafeExpression $-        renderAlias relation <> "." <> renderAlias column+  , GroupedBy table column bys+  ) => IsQualified table column+    (Expression schema from ('Grouped bys) params ty) where+      table ! column = UnsafeExpression $+        renderAlias table <> "." <> renderAlias column instance-  ( Has relation relations columns+  ( Has table from columns   , Has column columns ty-  , GroupedBy relation column bys-  ) => IsQualified relation column-    (Aliased (Expression schema relations ('Grouped bys) params)+  , GroupedBy table column bys+  ) => IsQualified table column+    (Aliased (Expression schema from ('Grouped bys) params)       (column ::: ty)) where-        relation ! column = relation ! column `As` column+        table ! column = table ! column `As` column instance-  ( Has relation relations columns+  ( Has table from columns   , Has column columns ty-  , GroupedBy relation column bys-  ) => IsQualified relation column-    ( NP (Aliased (Expression schema relations ('Grouped bys) params))+  , GroupedBy table column bys+  ) => IsQualified table column+    ( NP (Aliased (Expression schema from ('Grouped bys) params))       '[column ::: ty]) where-        relation ! column = relation ! column :* Nil+        table ! column = table ! column :* Nil  -- | analagous to `Nothing` --@@ -360,14 +361,14 @@  -- | return the leftmost value which is not NULL ----- >>> printSQL $ coalesce [null_, notNull true] false+-- >>> printSQL $ coalesce [null_, true] false -- COALESCE(NULL, TRUE, FALSE) coalesce-  :: [Expression schema relations grouping params ('Null ty)]+  :: [Expression schema from grouping params ('Null ty)]   -- ^ @NULL@s may be present-  -> Expression schema relations grouping params ('NotNull ty)+  -> Expression schema from grouping params ('NotNull ty)   -- ^ @NULL@ is absent-  -> Expression schema relations grouping params ('NotNull ty)+  -> Expression schema from grouping params ('NotNull ty) coalesce nullxs notNullx = UnsafeExpression $   "COALESCE" <> parenthesized (commaSeparated     ((renderExpression <$> nullxs) <> [renderExpression notNullx]))@@ -377,26 +378,26 @@ -- >>> printSQL $ fromNull true null_ -- COALESCE(NULL, TRUE) fromNull-  :: Expression schema relations grouping params ('NotNull ty)+  :: Expression schema from grouping params ('NotNull ty)   -- ^ what to convert @NULL@ to-  -> Expression schema relations grouping params ('Null ty)-  -> Expression schema relations grouping params ('NotNull ty)+  -> Expression schema from grouping params ('Null ty)+  -> Expression schema from grouping params ('NotNull ty) fromNull notNullx nullx = coalesce [nullx] notNullx  -- | >>> printSQL $ null_ & isNull -- NULL IS NULL isNull-  :: Expression schema relations grouping params ('Null ty)+  :: Expression schema from grouping params ('Null ty)   -- ^ possibly @NULL@-  -> Condition schema relations grouping params+  -> Condition schema from grouping params isNull x = UnsafeExpression $ renderExpression x <+> "IS NULL"  -- | >>> printSQL $ null_ & isNotNull -- NULL IS NOT NULL isNotNull-  :: Expression schema relations grouping params ('Null ty)+  :: Expression schema from grouping params ('Null ty)   -- ^ possibly @NULL@-  -> Condition schema relations grouping params+  -> Condition schema from grouping params isNotNull x = UnsafeExpression $ renderExpression x <+> "IS NOT NULL"  -- | analagous to `maybe` using @IS NULL@@@ -404,13 +405,13 @@ -- >>> printSQL $ matchNull true not_ null_ -- CASE WHEN NULL IS NULL THEN TRUE ELSE (NOT NULL) END matchNull-  :: Expression schema relations grouping params (nullty)+  :: Expression schema from grouping params (nullty)   -- ^ what to convert @NULL@ to-  -> ( Expression schema relations grouping params ('NotNull ty)-       -> Expression schema relations grouping params (nullty) )+  -> ( Expression schema from grouping params ('NotNull ty)+       -> Expression schema from grouping params (nullty) )   -- ^ function to perform when @NULL@ is absent-  -> Expression schema relations grouping params ('Null ty)-  -> Expression schema relations grouping params (nullty)+  -> Expression schema from grouping params ('Null ty)+  -> Expression schema from grouping params (nullty) matchNull y f x = ifThenElse (isNull x) y   (f (UnsafeExpression (renderExpression x))) @@ -423,55 +424,81 @@ NULL IF (FALSE, ($1 :: bool)) -} nullIf-  :: Expression schema relations grouping params ('NotNull ty)+  :: Expression schema from grouping params ('NotNull ty)   -- ^ @NULL@ is absent-  -> Expression schema relations grouping params ('NotNull ty)+  -> Expression schema from grouping params ('NotNull ty)   -- ^ @NULL@ is absent-  -> Expression schema relations grouping params ('Null ty)+  -> Expression schema from grouping params ('Null ty) nullIf x y = UnsafeExpression $ "NULL IF" <+> parenthesized   (renderExpression x <> ", " <> renderExpression y) --- | >>> printSQL $ array [null_, notNull false, notNull true]+-- | >>> printSQL $ array [null_, false, true] -- ARRAY[NULL, FALSE, TRUE] array-  :: [Expression schema relations grouping params ('Null ty)]+  :: [Expression schema from grouping params ty]   -- ^ array elements-  -> Expression schema relations grouping params (nullity ('PGvararray ty))+  -> Expression schema from grouping params (nullity ('PGvararray ty)) array xs = UnsafeExpression $   "ARRAY[" <> commaSeparated (renderExpression <$> xs) <> "]" +-- | >>> printSQL $ array [null_, false, true] & index 2+-- (ARRAY[NULL, FALSE, TRUE])[2]+index+  :: Word64 -- ^ index+  -> Expression schema from grouping params (nullity ('PGvararray ty)) -- ^ array+  -> Expression schema from grouping params (NullifyType ty)+index n expr = UnsafeExpression $+  parenthesized (renderExpression expr) <> "[" <> fromString (show n) <> "]"+ instance (KnownSymbol label, label `In` labels) => IsPGlabel label-  (Expression schema relations grouping params (nullity ('PGenum labels))) where+  (Expression schema from grouping params (nullity ('PGenum labels))) where   label = UnsafeExpression $ renderLabel (PGlabel @label)  -- | A row constructor is an expression that builds a row value -- (also called a composite value) using values for its member fields. ----- >>> type Complex = PGcomposite '["real" ::: 'PGfloat8, "imaginary" ::: 'PGfloat8]+-- >>> :{+-- type Complex = 'PGcomposite+--   '[ "real"      ::: 'NotNull 'PGfloat8+--    , "imaginary" ::: 'NotNull 'PGfloat8 ]+-- :}+-- -- >>> let i = row (0 `as` #real :* 1 `as` #imaginary) :: Expression '[] '[] 'Ungrouped '[] ('NotNull Complex) -- >>> printSQL i -- ROW(0, 1) row-  :: SListI (Nulls fields)-  => NP (Aliased (Expression schema relations grouping params)) (Nulls fields)+  :: SListI row+  => NP (Aliased (Expression schema from grouping params)) row   -- ^ zero or more expressions for the row field values-  -> Expression schema relations grouping params (nullity ('PGcomposite fields))+  -> Expression schema from grouping params (nullity ('PGcomposite row)) row exprs = UnsafeExpression $ "ROW" <> parenthesized   (renderCommaSeparated (\ (expr `As` _) -> renderExpression expr) exprs) -instance Has field fields ty => IsLabel field-  (   Expression schema relation grouping params (nullity ('PGcomposite fields))-   -> Expression schema relation grouping params ('Null ty) ) where-    fromLabel expr = UnsafeExpression $-      parenthesized (renderExpression expr) <> "." <>-        fromString (symbolVal (Proxy @field))+-- | >>> :{+-- type Complex = 'PGcomposite+--   '[ "real"      ::: 'NotNull 'PGfloat8+--    , "imaginary" ::: 'NotNull 'PGfloat8 ]+-- :}+--+-- >>> let i = row (0 `as` #real :* 1 `as` #imaginary) :: Expression '["complex" ::: 'Typedef Complex] '[] 'Ungrouped '[] ('NotNull Complex)+-- >>> printSQL $ i & field #complex #imaginary+-- (ROW(0, 1)::"complex")."imaginary"+field+  :: (Has tydef schema ('Typedef ('PGcomposite row)), Has field row ty)+  => Alias tydef -- ^ row type+  -> Alias field -- ^ field name+  -> Expression schema from grouping params ('NotNull ('PGcomposite row))+  -> Expression schema from grouping params ty+field td fld expr = UnsafeExpression $+  parenthesized (renderExpression expr <> "::" <> renderAlias td)+    <> "." <> renderAlias fld  instance Semigroup-  (Expression schema relations grouping params (nullity ('PGvararray ty))) where+  (Expression schema from grouping params (nullity ('PGvararray ty))) where     (<>) = unsafeBinaryOp "||"  instance Monoid-  (Expression schema relations grouping params (nullity ('PGvararray ty))) where+  (Expression schema from grouping params (nullity ('PGvararray ty))) where     mempty = array []     mappend = (<>) @@ -479,22 +506,22 @@ -- >>> printSQL expr -- GREATEST(CURRENT_TIMESTAMP, ($1 :: timestamp with time zone)) greatest-  :: Expression schema relations grouping params (nullty)+  :: Expression schema from grouping params (nullty)   -- ^ needs at least 1 argument-  -> [Expression schema relations grouping params (nullty)]+  -> [Expression schema from grouping params (nullty)]   -- ^ or more-  -> Expression schema relations grouping params (nullty)+  -> Expression schema from grouping params (nullty) greatest x xs = UnsafeExpression $ "GREATEST("   <> commaSeparated (renderExpression <$> (x:xs)) <> ")"  -- | >>> printSQL $ least currentTimestamp [null_] -- LEAST(CURRENT_TIMESTAMP, NULL) least-  :: Expression schema relations grouping params (nullty)+  :: Expression schema from grouping params (nullty)   -- ^ needs at least 1 argument-  -> [Expression schema relations grouping params (nullty)]+  -> [Expression schema from grouping params (nullty)]   -- ^ or more-  -> Expression schema relations grouping params (nullty)+  -> Expression schema from grouping params (nullty) least x xs = UnsafeExpression $ "LEAST("   <> commaSeparated (renderExpression <$> (x:xs)) <> ")" @@ -503,9 +530,9 @@ unsafeBinaryOp   :: ByteString   -- ^ operator-  -> Expression schema relations grouping params (ty0)-  -> Expression schema relations grouping params (ty1)-  -> Expression schema relations grouping params (ty2)+  -> Expression schema from grouping params (ty0)+  -> Expression schema from grouping params (ty1)+  -> Expression schema from grouping params (ty2) unsafeBinaryOp op x y = UnsafeExpression $ parenthesized $   renderExpression x <+> op <+> renderExpression y @@ -514,8 +541,8 @@ unsafeUnaryOp   :: ByteString   -- ^ operator-  -> Expression schema relations grouping params (ty0)-  -> Expression schema relations grouping params (ty1)+  -> Expression schema from grouping params (ty0)+  -> Expression schema from grouping params (ty1) unsafeUnaryOp op x = UnsafeExpression $ parenthesized $   op <+> renderExpression x @@ -524,8 +551,8 @@ unsafeFunction   :: ByteString   -- ^ function-  -> Expression schema relations grouping params (xty)-  -> Expression schema relations grouping params (yty)+  -> Expression schema from grouping params (xty)+  -> Expression schema from grouping params (yty) unsafeFunction fun x = UnsafeExpression $   fun <> parenthesized (renderExpression x) @@ -534,13 +561,13 @@   :: SListI elems   => ByteString   -- ^ function-  -> NP (Expression schema relations grouping params) elems-  -> Expression schema relations grouping params ret+  -> NP (Expression schema from grouping params) elems+  -> Expression schema from grouping params ret unsafeVariadicFunction fun x = UnsafeExpression $   fun <> parenthesized (commaSeparated (hcollapse (hmap (K . renderExpression) x))) -instance PGNum ty-  => Num (Expression schema relations grouping params (nullity ty)) where+instance ty `In` PGNum+  => Num (Expression schema from grouping params (nullity ty)) where     (+) = unsafeBinaryOp "+"     (-) = unsafeBinaryOp "-"     (*) = unsafeBinaryOp "*"@@ -551,13 +578,13 @@       . fromString       . show -instance (PGNum ty, PGFloating ty) => Fractional-  (Expression schema relations grouping params (nullity ty)) where+instance (ty `In` PGNum, ty `In` PGFloating) => Fractional+  (Expression schema from grouping params (nullity ty)) where     (/) = unsafeBinaryOp "/"     fromRational x = fromInteger (numerator x) / fromInteger (denominator x) -instance (PGNum ty, PGFloating ty) => Floating-  (Expression schema relations grouping params (nullity ty)) where+instance (ty `In` PGNum, ty `In` PGFloating) => Floating+  (Expression schema from grouping params (nullity ty)) where     pi = UnsafeExpression "pi()"     exp = unsafeFunction "exp"     log = unsafeFunction "ln"@@ -580,18 +607,18 @@  -- | >>> :{ -- let---   expression :: Expression schema relations grouping params (nullity 'PGfloat4)+--   expression :: Expression schema from grouping params (nullity 'PGfloat4) --   expression = atan2_ pi 2 -- in printSQL expression -- :} -- atan2(pi(), 2) atan2_-  :: PGFloating float-  => Expression schema relations grouping params (nullity float)+  :: float `In` PGFloating+  => Expression schema from grouping params (nullity float)   -- ^ numerator-  -> Expression schema relations grouping params (nullity float)+  -> Expression schema from grouping params (nullity float)   -- ^ denominator-  -> Expression schema relations grouping params (nullity float)+  -> Expression schema from grouping params (nullity float) atan2_ y x = UnsafeExpression $   "atan2(" <> renderExpression y <> ", " <> renderExpression x <> ")" @@ -604,9 +631,9 @@ cast   :: TypeExpression schema ty1   -- ^ type to cast as-  -> Expression schema relations grouping params (nullity ty0)+  -> Expression schema from grouping params ty0   -- ^ value to convert-  -> Expression schema relations grouping params (nullity ty1)+  -> Expression schema from grouping params ty1 cast ty x = UnsafeExpression $ parenthesized $   renderExpression x <+> "::" <+> renderTypeExpression ty @@ -614,135 +641,136 @@ -- -- >>> :{ -- let---   expression :: Expression schema relations grouping params (nullity 'PGint2)+--   expression :: Expression schema from grouping params (nullity 'PGint2) --   expression = 5 `quot_` 2 -- in printSQL expression -- :} -- (5 / 2) quot_-  :: PGIntegral int-  => Expression schema relations grouping params (nullity int)+  :: int `In` PGIntegral+  => Expression schema from grouping params (nullity int)   -- ^ numerator-  -> Expression schema relations grouping params (nullity int)+  -> Expression schema from grouping params (nullity int)   -- ^ denominator-  -> Expression schema relations grouping params (nullity int)+  -> Expression schema from grouping params (nullity int) quot_ = unsafeBinaryOp "/"  -- | remainder upon integer division -- -- >>> :{ -- let---   expression :: Expression schema relations grouping params (nullity 'PGint2)+--   expression :: Expression schema from grouping params (nullity 'PGint2) --   expression = 5 `rem_` 2 -- in printSQL expression -- :} -- (5 % 2) rem_-  :: PGIntegral int-  => Expression schema relations grouping params (nullity int)+  :: int `In` PGIntegral+  => Expression schema from grouping params (nullity int)   -- ^ numerator-  -> Expression schema relations grouping params (nullity int)+  -> Expression schema from grouping params (nullity int)   -- ^ denominator-  -> Expression schema relations grouping params (nullity int)+  -> Expression schema from grouping params (nullity int) rem_ = unsafeBinaryOp "%"  -- | >>> :{ -- let---   expression :: Expression schema relations grouping params (nullity 'PGfloat4)+--   expression :: Expression schema from grouping params (nullity 'PGfloat4) --   expression = trunc pi -- in printSQL expression -- :} -- trunc(pi()) trunc-  :: PGFloating frac-  => Expression schema relations grouping params (nullity frac)+  :: frac `In` PGFloating+  => Expression schema from grouping params (nullity frac)   -- ^ fractional number-  -> Expression schema relations grouping params (nullity frac)+  -> Expression schema from grouping params (nullity frac) trunc = unsafeFunction "trunc"  -- | >>> :{ -- let---   expression :: Expression schema relations grouping params (nullity 'PGfloat4)+--   expression :: Expression schema from grouping params (nullity 'PGfloat4) --   expression = round_ pi -- in printSQL expression -- :} -- round(pi()) round_-  :: PGFloating frac-  => Expression schema relations grouping params (nullity frac)+  :: frac `In` PGFloating+  => Expression schema from grouping params (nullity frac)   -- ^ fractional number-  -> Expression schema relations grouping params (nullity frac)+  -> Expression schema from grouping params (nullity frac) round_ = unsafeFunction "round"  -- | >>> :{ -- let---   expression :: Expression schema relations grouping params (nullity 'PGfloat4)+--   expression :: Expression schema from grouping params (nullity 'PGfloat4) --   expression = ceiling_ pi -- in printSQL expression -- :} -- ceiling(pi()) ceiling_-  :: PGFloating frac-  => Expression schema relations grouping params (nullity frac)+  :: frac `In` PGFloating+  => Expression schema from grouping params (nullity frac)   -- ^ fractional number-  -> Expression schema relations grouping params (nullity frac)+  -> Expression schema from grouping params (nullity frac) ceiling_ = unsafeFunction "ceiling" --- | A `Condition` is a boolean valued `Expression`. While SQL allows--- conditions to have @NULL@, Squeal instead chooses to disallow @NULL@,--- forcing one to handle the case of @NULL@ explicitly to produce--- a `Condition`.-type Condition schema relations grouping params =-  Expression schema relations grouping params ('NotNull 'PGbool)+-- | A `Condition` is an `Expression`, which can evaluate+-- to `true`, `false` or `null_`. This is because SQL uses+-- a three valued logic.+type Condition schema from grouping params =+  Expression schema from grouping params ('Null 'PGbool)  -- | >>> printSQL true -- TRUE-true :: Condition schema relations grouping params+true :: Expression schema from grouping params (nullity 'PGbool) true = UnsafeExpression "TRUE"  -- | >>> printSQL false -- FALSE-false :: Condition schema relations grouping params+false :: Expression schema from grouping params (nullity 'PGbool) false = UnsafeExpression "FALSE"  -- | >>> printSQL $ not_ true -- (NOT TRUE) not_-  :: Condition schema relations grouping params-  -> Condition schema relations grouping params+  :: Expression schema from grouping params (nullity 'PGbool)+  -> Expression schema from grouping params (nullity 'PGbool) not_ = unsafeUnaryOp "NOT"  -- | >>> printSQL $ true .&& false -- (TRUE AND FALSE) (.&&)-  :: Condition schema relations grouping params-  -> Condition schema relations grouping params-  -> Condition schema relations grouping params+  :: Expression schema from grouping params (nullity 'PGbool)+  -> Expression schema from grouping params (nullity 'PGbool)+  -> Expression schema from grouping params (nullity 'PGbool)+infixr 3 .&& (.&&) = unsafeBinaryOp "AND"  -- | >>> printSQL $ true .|| false -- (TRUE OR FALSE) (.||)-  :: Condition schema relations grouping params-  -> Condition schema relations grouping params-  -> Condition schema relations grouping params+  :: Expression schema from grouping params (nullity 'PGbool)+  -> Expression schema from grouping params (nullity 'PGbool)+  -> Expression schema from grouping params (nullity 'PGbool)+infixr 2 .|| (.||) = unsafeBinaryOp "OR"  -- | >>> :{ -- let---   expression :: Expression schema relations grouping params (nullity 'PGint2)+--   expression :: Expression schema from grouping params (nullity 'PGint2) --   expression = caseWhenThenElse [(true, 1), (false, 2)] 3 -- in printSQL expression -- :} -- CASE WHEN TRUE THEN 1 WHEN FALSE THEN 2 ELSE 3 END caseWhenThenElse-  :: [ ( Condition schema relations grouping params-       , Expression schema relations grouping params (ty)+  :: [ ( Condition schema from grouping params+       , Expression schema from grouping params ty      ) ]   -- ^ whens and thens-  -> Expression schema relations grouping params (ty)+  -> Expression schema from grouping params ty   -- ^ else-  -> Expression schema relations grouping params (ty)+  -> Expression schema from grouping params ty caseWhenThenElse whenThens else_ = UnsafeExpression $ mconcat   [ "CASE"   , mconcat@@ -758,103 +786,103 @@  -- | >>> :{ -- let---   expression :: Expression schema relations grouping params (nullity 'PGint2)+--   expression :: Expression schema from grouping params (nullity 'PGint2) --   expression = ifThenElse true 1 0 -- in printSQL expression -- :} -- CASE WHEN TRUE THEN 1 ELSE 0 END ifThenElse-  :: Condition schema relations grouping params-  -> Expression schema relations grouping params (ty) -- ^ then-  -> Expression schema relations grouping params (ty) -- ^ else-  -> Expression schema relations grouping params (ty)+  :: Condition schema from grouping params+  -> Expression schema from grouping params ty -- ^ then+  -> Expression schema from grouping params ty -- ^ else+  -> Expression schema from grouping params ty ifThenElse if_ then_ else_ = caseWhenThenElse [(if_,then_)] else_  -- | Comparison operations like `.==`, `./=`, `.>`, `.>=`, `.<` and `.<=` -- will produce @NULL@s if one of their arguments is @NULL@. ----- >>> printSQL $ notNull true .== null_+-- >>> printSQL $ true .== null_ -- (TRUE = NULL) (.==)-  :: Expression schema relations grouping params (nullity ty) -- ^ lhs-  -> Expression schema relations grouping params (nullity ty) -- ^ rhs-  -> Expression schema relations grouping params (nullity 'PGbool)+  :: Expression schema from grouping params (nullity0 ty) -- ^ lhs+  -> Expression schema from grouping params (nullity1 ty) -- ^ rhs+  -> Condition schema from grouping params (.==) = unsafeBinaryOp "=" infix 4 .== --- | >>> printSQL $ notNull true ./= null_+-- | >>> printSQL $ true ./= null_ -- (TRUE <> NULL) (./=)-  :: Expression schema relations grouping params (nullity ty) -- ^ lhs-  -> Expression schema relations grouping params (nullity ty) -- ^ rhs-  -> Expression schema relations grouping params (nullity 'PGbool)+  :: Expression schema from grouping params (nullity0 ty) -- ^ lhs+  -> Expression schema from grouping params (nullity1 ty) -- ^ rhs+  -> Condition schema from grouping params (./=) = unsafeBinaryOp "<>" infix 4 ./= --- | >>> printSQL $ notNull true .>= null_+-- | >>> printSQL $ true .>= null_ -- (TRUE >= NULL) (.>=)-  :: Expression schema relations grouping params (nullity ty) -- ^ lhs-  -> Expression schema relations grouping params (nullity ty) -- ^ rhs-  -> Expression schema relations grouping params (nullity 'PGbool)+  :: Expression schema from grouping params (nullity0 ty) -- ^ lhs+  -> Expression schema from grouping params (nullity1 ty) -- ^ rhs+  -> Condition schema from grouping params (.>=) = unsafeBinaryOp ">=" infix 4 .>= --- | >>> printSQL $ notNull true .< null_+-- | >>> printSQL $ true .< null_ -- (TRUE < NULL) (.<)-  :: Expression schema relations grouping params (nullity ty) -- ^ lhs-  -> Expression schema relations grouping params (nullity ty) -- ^ rhs-  -> Expression schema relations grouping params (nullity 'PGbool)+  :: Expression schema from grouping params (nullity0 ty) -- ^ lhs+  -> Expression schema from grouping params (nullity1 ty) -- ^ rhs+  -> Condition schema from grouping params (.<) = unsafeBinaryOp "<" infix 4 .< --- | >>> printSQL $ notNull true .<= null_+-- | >>> printSQL $ true .<= null_ -- (TRUE <= NULL) (.<=)-  :: Expression schema relations grouping params (nullity ty) -- ^ lhs-  -> Expression schema relations grouping params (nullity ty) -- ^ rhs-  -> Expression schema relations grouping params (nullity 'PGbool)+  :: Expression schema from grouping params (nullity0 ty) -- ^ lhs+  -> Expression schema from grouping params (nullity1 ty) -- ^ rhs+  -> Condition schema from grouping params (.<=) = unsafeBinaryOp "<=" infix 4 .<= --- | >>> printSQL $ notNull true .> null_+-- | >>> printSQL $ true .> null_ -- (TRUE > NULL) (.>)-  :: Expression schema relations grouping params (nullity ty) -- ^ lhs-  -> Expression schema relations grouping params (nullity ty) -- ^ rhs-  -> Expression schema relations grouping params (nullity 'PGbool)+  :: Expression schema from grouping params (nullity0 ty) -- ^ lhs+  -> Expression schema from grouping params (nullity1 ty) -- ^ rhs+  -> Condition schema from grouping params (.>) = unsafeBinaryOp ">" infix 4 .>  -- | >>> printSQL currentDate -- CURRENT_DATE currentDate-  :: Expression schema relations grouping params (nullity 'PGdate)+  :: Expression schema from grouping params (nullity 'PGdate) currentDate = UnsafeExpression "CURRENT_DATE"  -- | >>> printSQL currentTime -- CURRENT_TIME currentTime-  :: Expression schema relations grouping params (nullity 'PGtimetz)+  :: Expression schema from grouping params (nullity 'PGtimetz) currentTime = UnsafeExpression "CURRENT_TIME"  -- | >>> printSQL currentTimestamp -- CURRENT_TIMESTAMP currentTimestamp-  :: Expression schema relations grouping params (nullity 'PGtimestamptz)+  :: Expression schema from grouping params (nullity 'PGtimestamptz) currentTimestamp = UnsafeExpression "CURRENT_TIMESTAMP"  -- | >>> printSQL localTime -- LOCALTIME localTime-  :: Expression schema relations grouping params (nullity 'PGtime)+  :: Expression schema from grouping params (nullity 'PGtime) localTime = UnsafeExpression "LOCALTIME"  -- | >>> printSQL localTimestamp -- LOCALTIMESTAMP localTimestamp-  :: Expression schema relations grouping params (nullity 'PGtimestamp)+  :: Expression schema from grouping params (nullity 'PGtimestamp) localTimestamp = UnsafeExpression "LOCALTIMESTAMP"  {-----------------------------------------@@ -862,7 +890,7 @@ -----------------------------------------}  instance IsString-  (Expression schema relations grouping params (nullity 'PGtext)) where+  (Expression schema from grouping params (nullity 'PGtext)) where     fromString str = UnsafeExpression $       "E\'" <> fromString (escape =<< str) <> "\'"       where@@ -878,36 +906,36 @@           c -> [c]  instance Semigroup-  (Expression schema relations grouping params (nullity 'PGtext)) where+  (Expression schema from grouping params (nullity 'PGtext)) where     (<>) = unsafeBinaryOp "||"  instance Monoid-  (Expression schema relations grouping params (nullity 'PGtext)) where+  (Expression schema from grouping params (nullity 'PGtext)) where     mempty = fromString ""     mappend = (<>)  -- | >>> printSQL $ lower "ARRRGGG" -- lower(E'ARRRGGG') lower-  :: Expression schema relations grouping params (nullity 'PGtext)+  :: Expression schema from grouping params (nullity 'PGtext)   -- ^ string to lower case-  -> Expression schema relations grouping params (nullity 'PGtext)+  -> Expression schema from grouping params (nullity 'PGtext) lower = unsafeFunction "lower"  -- | >>> printSQL $ upper "eeee" -- upper(E'eeee') upper-  :: Expression schema relations grouping params (nullity 'PGtext)+  :: Expression schema from grouping params (nullity 'PGtext)   -- ^ string to upper case-  -> Expression schema relations grouping params (nullity 'PGtext)+  -> Expression schema from grouping params (nullity 'PGtext) upper = unsafeFunction "upper"  -- | >>> printSQL $ charLength "four" -- char_length(E'four') charLength-  :: Expression schema relations grouping params (nullity 'PGtext)+  :: Expression schema from grouping params (nullity 'PGtext)   -- ^ string to measure-  -> Expression schema relations grouping params (nullity 'PGint4)+  -> Expression schema from grouping params (nullity 'PGint4) charLength = unsafeFunction "char_length"  -- | The `like` expression returns true if the @string@ matches@@ -920,11 +948,11 @@ -- >>> printSQL $ "abc" `like` "a%" -- (E'abc' LIKE E'a%') like-  :: Expression schema relations grouping params (nullity 'PGtext)+  :: Expression schema from grouping params (nullity 'PGtext)   -- ^ string-  -> Expression schema relations grouping params (nullity 'PGtext)+  -> Expression schema from grouping params (nullity 'PGtext)   -- ^ pattern-  -> Expression schema relations grouping params (nullity 'PGbool)+  -> Expression schema from grouping params (nullity 'PGbool) like = unsafeBinaryOp "LIKE"  {-----------------------------------------@@ -938,34 +966,38 @@  -- | Get JSON value (object field or array element) at a key. (.->)-  :: (PGjson_ json, PGjsonKey key)-  => Expression schema relations grouping params (nullity json)-  -> Expression schema relations grouping params (nullity key)-  -> Expression schema relations grouping params ('Null json)+  :: (json `In` PGJsonType, key `In` PGJsonKey)+  => Expression schema from grouping params (nullity json)+  -> Expression schema from grouping params (nullity key)+  -> Expression schema from grouping params ('Null json)+infixl 8 .-> (.->) = unsafeBinaryOp "->"  -- | Get JSON value (object field or array element) at a key, as text. (.->>)-  :: (PGjson_ json, PGjsonKey key)-  => Expression schema relations grouping params (nullity json)-  -> Expression schema relations grouping params (nullity key)-  -> Expression schema relations grouping params ('Null 'PGtext)+  :: (json `In` PGJsonType, key `In` PGJsonKey)+  => Expression schema from grouping params (nullity json)+  -> Expression schema from grouping params (nullity key)+  -> Expression schema from grouping params ('Null 'PGtext)+infixl 8 .->> (.->>) = unsafeBinaryOp "->>"  -- | Get JSON value at a specified path. (.#>)-  :: (PGjson_ json, PGtextArray "(.#>)" path)-  => Expression schema relations grouping params (nullity json)-  -> Expression schema relations grouping params (nullity path)-  -> Expression schema relations grouping params ('Null json)+  :: (json `In` PGJsonType, PGTextArray "(.#>)" path)+  => Expression schema from grouping params (nullity json)+  -> Expression schema from grouping params (nullity path)+  -> Expression schema from grouping params ('Null json)+infixl 8 .#> (.#>) = unsafeBinaryOp "#>"  -- | Get JSON value at a specified path as text. (.#>>)-  :: (PGjson_ json, PGtextArray "(.#>>)" path)-  => Expression schema relations grouping params (nullity json)-  -> Expression schema relations grouping params (nullity path)-  -> Expression schema relations grouping params ('Null 'PGtext)+  :: (json `In` PGJsonType, PGTextArray "(.#>>)" path)+  => Expression schema from grouping params (nullity json)+  -> Expression schema from grouping params (nullity path)+  -> Expression schema from grouping params ('Null 'PGtext)+infixl 8 .#>> (.#>>) = unsafeBinaryOp "#>>"  -- Additional jsonb operators@@ -973,43 +1005,48 @@ -- | Does the left JSON value contain the right JSON path/value entries at the -- top level? (.@>)-  :: Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity 'PGjsonb)-  -> Condition schema relations grouping params+  :: Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity 'PGjsonb)+  -> Condition schema from grouping params+infixl 9 .@> (.@>) = unsafeBinaryOp "@>"  -- | Are the left JSON path/value entries contained at the top level within the -- right JSON value? (.<@)-  :: Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity 'PGjsonb)-  -> Condition schema relations grouping params+  :: Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity 'PGjsonb)+  -> Condition schema from grouping params+infixl 9 .<@ (.<@) = unsafeBinaryOp "<@"  -- | Does the string exist as a top-level key within the JSON value? (.?)-  :: Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity 'PGtext)-  -> Condition schema relations grouping params+  :: Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity 'PGtext)+  -> Condition schema from grouping params+infixl 9 .? (.?) = unsafeBinaryOp "?"  -- | Do any of these array strings exist as top-level keys? (.?|)-  :: Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity ('PGvararray 'PGtext))-  -> Condition schema relations grouping params+  :: Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity ('PGvararray ('NotNull 'PGtext)))+  -> Condition schema from grouping params+infixl 9 .?| (.?|) = unsafeBinaryOp "?|"  -- | Do all of these array strings exist as top-level keys? (.?&)-  :: Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity ('PGvararray 'PGtext))-  -> Condition schema relations grouping params+  :: Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity ('PGvararray ('NotNull 'PGtext)))+  -> Condition schema from grouping params+infixl 9 .?& (.?&) = unsafeBinaryOp "?&"  -- | Concatenate two jsonb values into a new jsonb value. instance-  Semigroup (Expression schema relations grouping param (nullity 'PGjsonb)) where+  Semigroup (Expression schema from grouping param (nullity 'PGjsonb)) where   (<>) = unsafeBinaryOp "||"  -- | Delete a key or keys from a JSON object, or remove an array element.@@ -1025,19 +1062,21 @@ -- @ integer @: Delete the array element with specified index (Negative integers -- count from the end). Throws an error if top level container is not an array. (.-.)-  :: (key `In` '[ 'PGtext, 'PGvararray 'PGtext, 'PGint4, 'PGint2 ]) -- hlint error without parens here-  => Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity key)-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  :: (key `In` '[ 'PGtext, 'PGvararray ('NotNull 'PGtext), 'PGint4, 'PGint2 ]) -- hlint error without parens here+  => Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity key)+  -> Expression schema from grouping params (nullity 'PGjsonb)+infixl 6 .-. (.-.) = unsafeBinaryOp "-"  -- | Delete the field or element with specified path (for JSON arrays, negative -- integers count from the end) (#-.)-  :: PGtextArray "(#-.)" arrayty-  => Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity arrayty)-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  :: PGTextArray "(#-.)" arrayty+  => Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity arrayty)+  -> Expression schema from grouping params (nullity 'PGjsonb)+infixl 6 #-. (#-.) = unsafeBinaryOp "#-"  {-----------------------------------------@@ -1045,12 +1084,18 @@ -----------------------------------------}  -- | Literal binary JSON-jsonbLit :: JSON.Value -> Expression schema relations grouping params (nullity 'PGjsonb)-jsonbLit = cast jsonb . UnsafeExpression . singleQuotedUtf8 . toStrict . JSON.encode+jsonbLit+  :: JSON.ToJSON x+  => x -> Expression schema from grouping params (nullity 'PGjsonb)+jsonbLit = cast jsonb . UnsafeExpression+  . singleQuotedUtf8 . toStrict . JSON.encode  -- | Literal JSON-jsonLit :: JSON.Value -> Expression schema relations grouping params (nullity 'PGjson)-jsonLit = cast json . UnsafeExpression . singleQuotedUtf8 . toStrict . JSON.encode+jsonLit+  :: JSON.ToJSON x+  => x -> Expression schema from grouping params (nullity 'PGjson)+jsonLit = cast json . UnsafeExpression+  . singleQuotedUtf8 . toStrict . JSON.encode  -- | Returns the value as json. Arrays and composites are converted -- (recursively) to arrays and objects; otherwise, if there is a cast from the@@ -1059,8 +1104,8 @@ -- number, a Boolean, or a null value, the text representation will be used, in -- such a fashion that it is a valid json value. toJson-  :: Expression schema relations grouping params (nullity ty)-  -> Expression schema relations grouping params (nullity 'PGjson)+  :: Expression schema from grouping params (nullity ty)+  -> Expression schema from grouping params (nullity 'PGjson) toJson = unsafeFunction "to_json"  -- | Returns the value as jsonb. Arrays and composites are converted@@ -1070,43 +1115,43 @@ -- number, a Boolean, or a null value, the text representation will be used, in -- such a fashion that it is a valid jsonb value. toJsonb-  :: Expression schema relations grouping params (nullity ty)-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  :: Expression schema from grouping params (nullity ty)+  -> Expression schema from grouping params (nullity 'PGjsonb) toJsonb = unsafeFunction "to_jsonb"  -- | Returns the array as a JSON array. A PostgreSQL multidimensional array -- becomes a JSON array of arrays. arrayToJson-  :: PGarray "arrayToJson" arr-  => Expression schema relations grouping params (nullity arr)-  -> Expression schema relations grouping params (nullity 'PGjson)+  :: PGArray "arrayToJson" arr+  => Expression schema from grouping params (nullity arr)+  -> Expression schema from grouping params (nullity 'PGjson) arrayToJson = unsafeFunction "array_to_json"  -- | Returns the row as a JSON object. rowToJson-  :: Expression schema relations grouping params (nullity ('PGcomposite ty))-  -> Expression schema relations grouping params (nullity 'PGjson)+  :: Expression schema from grouping params (nullity ('PGcomposite ty))+  -> Expression schema from grouping params (nullity 'PGjson) rowToJson = unsafeFunction "row_to_json"  -- | Builds a possibly-heterogeneously-typed JSON array out of a variadic -- argument list. jsonBuildArray   :: SListI elems-  => NP (Expression schema relations grouping params) elems-  -> Expression schema relations grouping params (nullity 'PGjson)+  => NP (Expression schema from grouping params) elems+  -> Expression schema from grouping params (nullity 'PGjson) jsonBuildArray = unsafeVariadicFunction "json_build_array"  -- | Builds a possibly-heterogeneously-typed (binary) JSON array out of a -- variadic argument list. jsonbBuildArray   :: SListI elems-  => NP (Expression schema relations grouping params) elems-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  => NP (Expression schema from grouping params) elems+  -> Expression schema from grouping params (nullity 'PGjsonb) jsonbBuildArray = unsafeVariadicFunction "jsonb_build_array"  unsafeRowFunction   :: All Top elems-  => NP (Aliased (Expression schema relations grouping params)) elems+  => NP (Aliased (Expression schema from grouping params)) elems   -> [ByteString] unsafeRowFunction =   (`appEndo` []) . hcfoldMap (Proxy :: Proxy Top)@@ -1118,8 +1163,8 @@ -- and values. jsonBuildObject   :: All Top elems-  => NP (Aliased (Expression schema relations grouping params)) elems-  -> Expression schema relations grouping params (nullity 'PGjson)+  => NP (Aliased (Expression schema from grouping params)) elems+  -> Expression schema from grouping params (nullity 'PGjson) jsonBuildObject   = unsafeFunction "json_build_object"   . UnsafeExpression@@ -1131,8 +1176,8 @@ -- between text and values. jsonbBuildObject   :: All Top elems-  => NP (Aliased (Expression schema relations grouping params)) elems-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  => NP (Aliased (Expression schema from grouping params)) elems+  -> Expression schema from grouping params (nullity 'PGjsonb) jsonbBuildObject   = unsafeFunction "jsonb_build_object"   . UnsafeExpression@@ -1144,9 +1189,9 @@ -- taken as alternating key/value pairs, or two dimensions such that each inner -- array has exactly two elements, which are taken as a key/value pair. jsonObject-  :: PGarrayOf "jsonObject" arr 'PGtext-  => Expression schema relations grouping params (nullity arr)-  -> Expression schema relations grouping params (nullity 'PGjson)+  :: PGArrayOf "jsonObject" arr ('NotNull 'PGtext)+  => Expression schema from grouping params (nullity arr)+  -> Expression schema from grouping params (nullity 'PGjson) jsonObject = unsafeFunction "json_object"  -- | Builds a binary JSON object out of a text array. The array must have either@@ -1154,19 +1199,19 @@ -- taken as alternating key/value pairs, or two dimensions such that each inner -- array has exactly two elements, which are taken as a key/value pair. jsonbObject-  :: PGarrayOf "jsonbObject" arr 'PGtext-  => Expression schema relations grouping params (nullity arr)-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  :: PGArrayOf "jsonbObject" arr ('NotNull 'PGtext)+  => Expression schema from grouping params (nullity arr)+  -> Expression schema from grouping params (nullity 'PGjsonb) jsonbObject = unsafeFunction "jsonb_object"  -- | This is an alternate form of 'jsonObject' that takes two arrays; one for -- keys and one for values, that are zipped pairwise to create a JSON object. jsonZipObject-  :: ( PGarrayOf "jsonZipObject" keysArray 'PGtext-     , PGarrayOf "jsonZipObject" valuesArray 'PGtext)-  => Expression schema relations grouping params (nullity keysArray)-  -> Expression schema relations grouping params (nullity valuesArray)-  -> Expression schema relations grouping params (nullity 'PGjson)+  :: ( PGArrayOf "jsonZipObject" keysArray ('NotNull 'PGtext)+     , PGArrayOf "jsonZipObject" valuesArray ('NotNull 'PGtext))+  => Expression schema from grouping params (nullity keysArray)+  -> Expression schema from grouping params (nullity valuesArray)+  -> Expression schema from grouping params (nullity 'PGjson) jsonZipObject ks vs =   unsafeVariadicFunction "json_object" (ks :* vs :* Nil) @@ -1174,11 +1219,11 @@ -- keys and one for values, that are zipped pairwise to create a binary JSON -- object. jsonbZipObject-  :: ( PGarrayOf "jsonbZipObject" keysArray 'PGtext-     , PGarrayOf "jsonbZipObject" valuesArray 'PGtext)-  => Expression schema relations grouping params (nullity keysArray)-  -> Expression schema relations grouping params (nullity valuesArray)-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  :: ( PGArrayOf "jsonbZipObject" keysArray ('NotNull 'PGtext)+     , PGArrayOf "jsonbZipObject" valuesArray ('NotNull 'PGtext))+  => Expression schema from grouping params (nullity keysArray)+  -> Expression schema from grouping params (nullity valuesArray)+  -> Expression schema from grouping params (nullity 'PGjsonb) jsonbZipObject ks vs =   unsafeVariadicFunction "jsonb_object" (ks :* vs :* Nil) @@ -1188,23 +1233,23 @@  -- | Returns the number of elements in the outermost JSON array. jsonArrayLength-  :: Expression schema relations grouping params (nullity 'PGjson)-  -> Expression schema relations grouping params (nullity 'PGint4)+  :: Expression schema from grouping params (nullity 'PGjson)+  -> Expression schema from grouping params (nullity 'PGint4) jsonArrayLength = unsafeFunction "json_array_length"  -- | Returns the number of elements in the outermost binary JSON array. jsonbArrayLength-  :: Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity 'PGint4)+  :: Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity 'PGint4) jsonbArrayLength = unsafeFunction "jsonb_array_length"  -- | Returns JSON value pointed to by the given path (equivalent to #> -- operator). jsonExtractPath   :: SListI elems-  => Expression schema relations grouping params (nullity 'PGjson)-  -> NP (Expression schema relations grouping params) elems-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  => Expression schema from grouping params (nullity 'PGjson)+  -> NP (Expression schema from grouping params) elems+  -> Expression schema from grouping params (nullity 'PGjsonb) jsonExtractPath x xs =   unsafeVariadicFunction "json_extract_path" (x :* xs) @@ -1212,9 +1257,9 @@ -- operator). jsonbExtractPath   :: SListI elems-  => Expression schema relations grouping params (nullity 'PGjsonb)-  -> NP (Expression schema relations grouping params) elems-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  => Expression schema from grouping params (nullity 'PGjsonb)+  -> NP (Expression schema from grouping params) elems+  -> Expression schema from grouping params (nullity 'PGjsonb) jsonbExtractPath x xs =   unsafeVariadicFunction "jsonb_extract_path" (x :* xs) @@ -1222,9 +1267,9 @@ -- operator), as text. jsonExtractPathAsText   :: SListI elems-  => Expression schema relations grouping params (nullity 'PGjson)-  -> NP (Expression schema relations grouping params) elems-  -> Expression schema relations grouping params (nullity 'PGjson)+  => Expression schema from grouping params (nullity 'PGjson)+  -> NP (Expression schema from grouping params) elems+  -> Expression schema from grouping params (nullity 'PGjson) jsonExtractPathAsText x xs =   unsafeVariadicFunction "json_extract_path_text" (x :* xs) @@ -1232,50 +1277,38 @@ -- operator), as text. jsonbExtractPathAsText   :: SListI elems-  => Expression schema relations grouping params (nullity 'PGjsonb)-  -> NP (Expression schema relations grouping params) elems-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  => Expression schema from grouping params (nullity 'PGjsonb)+  -> NP (Expression schema from grouping params) elems+  -> Expression schema from grouping params (nullity 'PGjsonb) jsonbExtractPathAsText x xs =   unsafeVariadicFunction "jsonb_extract_path_text" (x :* xs) --- | Returns set of keys in the outermost JSON object.-jsonObjectKeys-  :: Expression schema relations grouping params (nullity 'PGjson)-  -> Expression schema relations grouping params (nullity 'PGtext)-jsonObjectKeys = unsafeFunction "json_object_keys"---- | Returns set of keys in the outermost JSON object.-jsonbObjectKeys-  :: Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity 'PGtext)-jsonbObjectKeys = unsafeFunction "jsonb_object_keys"- -- | Returns the type of the outermost JSON value as a text string. Possible -- types are object, array, string, number, boolean, and null. jsonTypeof-  :: Expression schema relations grouping params (nullity 'PGjson)-  -> Expression schema relations grouping params (nullity 'PGtext)+  :: Expression schema from grouping params (nullity 'PGjson)+  -> Expression schema from grouping params (nullity 'PGtext) jsonTypeof = unsafeFunction "json_typeof"  -- | Returns the type of the outermost binary JSON value as a text string. -- Possible types are object, array, string, number, boolean, and null. jsonbTypeof-  :: Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity 'PGtext)+  :: Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity 'PGtext) jsonbTypeof = unsafeFunction "jsonb_typeof"  -- | Returns its argument with all object fields that have null values omitted. -- Other null values are untouched. jsonStripNulls-  :: Expression schema relations grouping params (nullity 'PGjson)-  -> Expression schema relations grouping params (nullity 'PGjson)+  :: Expression schema from grouping params (nullity 'PGjson)+  -> Expression schema from grouping params (nullity 'PGjson) jsonStripNulls = unsafeFunction "json_strip_nulls"  -- | Returns its argument with all object fields that have null values omitted. -- Other null values are untouched. jsonbStripNulls-  :: Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  :: Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity 'PGjsonb) jsonbStripNulls = unsafeFunction "jsonb_strip_nulls"  -- | @ jsonbSet target path new_value create_missing @@@ -1286,12 +1319,12 @@ -- operators, negative integers that appear in path count from the end of JSON -- arrays. jsonbSet-  :: PGtextArray "jsonbSet" arr-  => Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity arr)-  -> Expression schema relations grouping params (nullity 'PGjsonb)-  -> Maybe (Expression schema relations grouping params (nullity 'PGbool))-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  :: PGTextArray "jsonbSet" arr+  => Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity arr)+  -> Expression schema from grouping params (nullity 'PGjsonb)+  -> Maybe (Expression schema from grouping params (nullity 'PGbool))+  -> Expression schema from grouping params (nullity 'PGjsonb) jsonbSet tgt path val createMissing = case createMissing of   Just m -> unsafeVariadicFunction "jsonb_set" (tgt :* path :* val :* m :* Nil)   Nothing -> unsafeVariadicFunction "jsonb_set" (tgt :* path :* val :* Nil)@@ -1305,20 +1338,20 @@ -- exist. As with the path orientated operators, negative integers that appear -- in path count from the end of JSON arrays. jsonbInsert-  :: PGtextArray "jsonbInsert" arr-  => Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity arr)-  -> Expression schema relations grouping params (nullity 'PGjsonb)-  -> Maybe (Expression schema relations grouping params (nullity 'PGbool))-  -> Expression schema relations grouping params (nullity 'PGjsonb)+  :: PGTextArray "jsonbInsert" arr+  => Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity arr)+  -> Expression schema from grouping params (nullity 'PGjsonb)+  -> Maybe (Expression schema from grouping params (nullity 'PGbool))+  -> Expression schema from grouping params (nullity 'PGjsonb) jsonbInsert tgt path val insertAfter = case insertAfter of   Just i -> unsafeVariadicFunction "jsonb_insert" (tgt :* path :* val :* i :* Nil)   Nothing -> unsafeVariadicFunction "jsonb_insert" (tgt :* path :* val :* Nil)  -- | Returns its argument as indented JSON text. jsonbPretty-  :: Expression schema relations grouping params (nullity 'PGjsonb)-  -> Expression schema relations grouping params (nullity 'PGtext)+  :: Expression schema from grouping params (nullity 'PGjsonb)+  -> Expression schema from grouping params (nullity 'PGtext) jsonbPretty = unsafeFunction "jsonb_pretty"  {-----------------------------------------@@ -1328,16 +1361,16 @@ -- | escape hatch to define aggregate functions unsafeAggregate   :: ByteString -- ^ aggregate function-  -> Expression schema relations 'Ungrouped params (xty)-  -> Expression schema relations ('Grouped bys) params (yty)+  -> Expression schema from 'Ungrouped params (xty)+  -> Expression schema from ('Grouped bys) params (yty) unsafeAggregate fun x = UnsafeExpression $ mconcat   [fun, "(", renderExpression x, ")"]  -- | escape hatch to define aggregate functions over distinct values unsafeAggregateDistinct   :: ByteString -- ^ aggregate function-  -> Expression schema relations 'Ungrouped params (xty)-  -> Expression schema relations ('Grouped bys) params (yty)+  -> Expression schema from 'Ungrouped params (xty)+  -> Expression schema from ('Grouped bys) params (yty) unsafeAggregateDistinct fun x = UnsafeExpression $ mconcat   [fun, "(DISTINCT ", renderExpression x, ")"] @@ -1349,10 +1382,10 @@ -- :} -- sum("col") sum_-  :: PGNum ty-  => Expression schema relations 'Ungrouped params (nullity ty)+  :: ty `In` PGNum+  => Expression schema from 'Ungrouped params (nullity ty)   -- ^ what to sum-  -> Expression schema relations ('Grouped bys) params (nullity ty)+  -> Expression schema from ('Grouped bys) params (nullity ty) sum_ = unsafeAggregate "sum"  -- | >>> :{@@ -1363,19 +1396,19 @@ -- :} -- sum(DISTINCT "col") sumDistinct-  :: PGNum ty-  => Expression schema relations 'Ungrouped params (nullity ty)+  :: ty `In` PGNum+  => Expression schema from 'Ungrouped params (nullity ty)   -- ^ what to sum-  -> Expression schema relations ('Grouped bys) params (nullity ty)+  -> Expression schema from ('Grouped bys) params (nullity ty) sumDistinct = unsafeAggregateDistinct "sum"  -- | A constraint for `PGType`s that you can take averages of and the resulting -- `PGType`. class PGAvg ty avg | ty -> avg where   avg, avgDistinct-    :: Expression schema relations 'Ungrouped params (nullity ty)+    :: Expression schema from 'Ungrouped params (nullity ty)     -- ^ what to average-    -> Expression schema relations ('Grouped bys) params (nullity avg)+    -> Expression schema from ('Grouped bys) params (nullity avg)   avg = unsafeAggregate "avg"   avgDistinct = unsafeAggregateDistinct "avg" instance PGAvg 'PGint2 'PGnumeric@@ -1394,10 +1427,10 @@ -- :} -- bit_and("col") bitAnd-  :: PGIntegral int-  => Expression schema relations 'Ungrouped params (nullity int)+  :: int `In` PGIntegral+  => Expression schema from 'Ungrouped params (nullity int)   -- ^ what to aggregate-  -> Expression schema relations ('Grouped bys) params (nullity int)+  -> Expression schema from ('Grouped bys) params (nullity int) bitAnd = unsafeAggregate "bit_and"  -- | >>> :{@@ -1408,10 +1441,10 @@ -- :} -- bit_or("col") bitOr-  :: PGIntegral int-  => Expression schema relations 'Ungrouped params (nullity int)+  :: int `In` PGIntegral+  => Expression schema from 'Ungrouped params (nullity int)   -- ^ what to aggregate-  -> Expression schema relations ('Grouped bys) params (nullity int)+  -> Expression schema from ('Grouped bys) params (nullity int) bitOr = unsafeAggregate "bit_or"  -- | >>> :{@@ -1422,10 +1455,10 @@ -- :} -- bit_and(DISTINCT "col") bitAndDistinct-  :: PGIntegral int-  => Expression schema relations 'Ungrouped params (nullity int)+  :: int `In` PGIntegral+  => Expression schema from 'Ungrouped params (nullity int)   -- ^ what to aggregate-  -> Expression schema relations ('Grouped bys) params (nullity int)+  -> Expression schema from ('Grouped bys) params (nullity int) bitAndDistinct = unsafeAggregateDistinct "bit_and"  -- | >>> :{@@ -1436,10 +1469,10 @@ -- :} -- bit_or(DISTINCT "col") bitOrDistinct-  :: PGIntegral int-  => Expression schema relations 'Ungrouped params (nullity int)+  :: int `In` PGIntegral+  => Expression schema from 'Ungrouped params (nullity int)   -- ^ what to aggregate-  -> Expression schema relations ('Grouped bys) params (nullity int)+  -> Expression schema from ('Grouped bys) params (nullity int) bitOrDistinct = unsafeAggregateDistinct "bit_or"  -- | >>> :{@@ -1450,9 +1483,9 @@ -- :} -- bool_and("col") boolAnd-  :: Expression schema relations 'Ungrouped params (nullity 'PGbool)+  :: Expression schema from 'Ungrouped params (nullity 'PGbool)   -- ^ what to aggregate-  -> Expression schema relations ('Grouped bys) params (nullity 'PGbool)+  -> Expression schema from ('Grouped bys) params (nullity 'PGbool) boolAnd = unsafeAggregate "bool_and"  -- | >>> :{@@ -1463,9 +1496,9 @@ -- :} -- bool_or("col") boolOr-  :: Expression schema relations 'Ungrouped params (nullity 'PGbool)+  :: Expression schema from 'Ungrouped params (nullity 'PGbool)   -- ^ what to aggregate-  -> Expression schema relations ('Grouped bys) params (nullity 'PGbool)+  -> Expression schema from ('Grouped bys) params (nullity 'PGbool) boolOr = unsafeAggregate "bool_or"  -- | >>> :{@@ -1476,9 +1509,9 @@ -- :} -- bool_and(DISTINCT "col") boolAndDistinct-  :: Expression schema relations 'Ungrouped params (nullity 'PGbool)+  :: Expression schema from 'Ungrouped params (nullity 'PGbool)   -- ^ what to aggregate-  -> Expression schema relations ('Grouped bys) params (nullity 'PGbool)+  -> Expression schema from ('Grouped bys) params (nullity 'PGbool) boolAndDistinct = unsafeAggregateDistinct "bool_and"  -- | >>> :{@@ -1489,9 +1522,9 @@ -- :} -- bool_or(DISTINCT "col") boolOrDistinct-  :: Expression schema relations 'Ungrouped params (nullity 'PGbool)+  :: Expression schema from 'Ungrouped params (nullity 'PGbool)   -- ^ what to aggregate-  -> Expression schema relations ('Grouped bys) params (nullity 'PGbool)+  -> Expression schema from ('Grouped bys) params (nullity 'PGbool) boolOrDistinct = unsafeAggregateDistinct "bool_or"  -- | A special aggregation that does not require an input@@ -1499,7 +1532,7 @@ -- >>> printSQL countStar -- count(*) countStar-  :: Expression schema relations ('Grouped bys) params ('NotNull 'PGint8)+  :: Expression schema from ('Grouped bys) params ('NotNull 'PGint8) countStar = UnsafeExpression $ "count(*)"  -- | >>> :{@@ -1510,9 +1543,9 @@ -- :} -- count("col") count-  :: Expression schema relations 'Ungrouped params ty+  :: Expression schema from 'Ungrouped params ty   -- ^ what to count-  -> Expression schema relations ('Grouped bys) params ('NotNull 'PGint8)+  -> Expression schema from ('Grouped bys) params ('NotNull 'PGint8) count = unsafeAggregate "count"  -- | >>> :{@@ -1523,9 +1556,9 @@ -- :} -- count(DISTINCT "col") countDistinct-  :: Expression schema relations 'Ungrouped params ty+  :: Expression schema from 'Ungrouped params ty   -- ^ what to count-  -> Expression schema relations ('Grouped bys) params ('NotNull 'PGint8)+  -> Expression schema from ('Grouped bys) params ('NotNull 'PGint8) countDistinct = unsafeAggregateDistinct "count"  -- | synonym for `boolAnd`@@ -1538,9 +1571,9 @@ -- :} -- every("col") every-  :: Expression schema relations 'Ungrouped params (nullity 'PGbool)+  :: Expression schema from 'Ungrouped params (nullity 'PGbool)   -- ^ what to aggregate-  -> Expression schema relations ('Grouped bys) params (nullity 'PGbool)+  -> Expression schema from ('Grouped bys) params (nullity 'PGbool) every = unsafeAggregate "every"  -- | synonym for `boolAndDistinct`@@ -1553,16 +1586,16 @@ -- :} -- every(DISTINCT "col") everyDistinct-  :: Expression schema relations 'Ungrouped params (nullity 'PGbool)+  :: Expression schema from 'Ungrouped params (nullity 'PGbool)   -- ^ what to aggregate-  -> Expression schema relations ('Grouped bys) params (nullity 'PGbool)+  -> Expression schema from ('Grouped bys) params (nullity 'PGbool) everyDistinct = unsafeAggregateDistinct "every"  -- | minimum and maximum aggregation max_, min_, maxDistinct, minDistinct-  :: Expression schema relations 'Ungrouped params (nullity ty)+  :: Expression schema from 'Ungrouped params (nullity ty)   -- ^ what to aggregate-  -> Expression schema relations ('Grouped bys) params (nullity ty)+  -> Expression schema from ('Grouped bys) params (nullity ty) max_ = unsafeAggregate "max" min_ = unsafeAggregate "min" maxDistinct = unsafeAggregateDistinct "max"@@ -1573,134 +1606,153 @@ -----------------------------------------}  -- | `TypeExpression`s are used in `cast`s and `createTable` commands.-newtype TypeExpression (schema :: SchemaType) (ty :: PGType)+newtype TypeExpression (schema :: SchemaType) (ty :: NullityType)   = UnsafeTypeExpression { renderTypeExpression :: ByteString }   deriving (GHC.Generic,Show,Eq,Ord,NFData) -instance (Has alias schema ('Typedef ty))-  => IsLabel alias (TypeExpression schema ty) where-    fromLabel = UnsafeTypeExpression (renderAlias (fromLabel @alias))+-- | The enum or composite type in a `Typedef` can be expressed by its alias.+typedef+  :: Has alias schema ('Typedef ty)+  => Alias alias+  -> TypeExpression schema (nullity ty)+typedef = UnsafeTypeExpression . renderAlias +-- | The composite type corresponding to a `Table` definition can be expressed+-- by its alias.+typetable+  :: Has alias schema ('Table tab)+  => Alias alias+  -> TypeExpression schema (nullity ('PGcomposite (TableToRow tab)))+typetable = UnsafeTypeExpression . renderAlias++-- | The composite type corresponding to a `View` definition can be expressed+-- by its alias.+typeview+  :: Has alias schema ('View view)+  => Alias alias+  -> TypeExpression schema (nullity ('PGcomposite view))+typeview = UnsafeTypeExpression . renderAlias+ -- | logical Boolean (true/false)-bool :: TypeExpression schema 'PGbool+bool :: TypeExpression schema (nullity 'PGbool) bool = UnsafeTypeExpression "bool" -- | signed two-byte integer-int2, smallint :: TypeExpression schema 'PGint2+int2, smallint :: TypeExpression schema (nullity 'PGint2) int2 = UnsafeTypeExpression "int2" smallint = UnsafeTypeExpression "smallint" -- | signed four-byte integer-int4, int, integer :: TypeExpression schema 'PGint4+int4, int, integer :: TypeExpression schema (nullity 'PGint4) int4 = UnsafeTypeExpression "int4" int = UnsafeTypeExpression "int" integer = UnsafeTypeExpression "integer" -- | signed eight-byte integer-int8, bigint :: TypeExpression schema 'PGint8+int8, bigint :: TypeExpression schema (nullity 'PGint8) int8 = UnsafeTypeExpression "int8" bigint = UnsafeTypeExpression "bigint" -- | arbitrary precision numeric type-numeric :: TypeExpression schema 'PGnumeric+numeric :: TypeExpression schema (nullity 'PGnumeric) numeric = UnsafeTypeExpression "numeric" -- | single precision floating-point number (4 bytes)-float4, real :: TypeExpression schema 'PGfloat4+float4, real :: TypeExpression schema (nullity 'PGfloat4) float4 = UnsafeTypeExpression "float4" real = UnsafeTypeExpression "real" -- | double precision floating-point number (8 bytes)-float8, doublePrecision :: TypeExpression schema 'PGfloat8+float8, doublePrecision :: TypeExpression schema (nullity 'PGfloat8) float8 = UnsafeTypeExpression "float8" doublePrecision = UnsafeTypeExpression "double precision" -- | variable-length character string-text :: TypeExpression schema 'PGtext+text :: TypeExpression schema (nullity 'PGtext) text = UnsafeTypeExpression "text" -- | fixed-length character string char, character-  :: (KnownNat n, 1 <= n)-  => proxy n-  -> TypeExpression schema ('PGchar n)-char p = UnsafeTypeExpression $ "char(" <> renderNat p <> ")"-character p = UnsafeTypeExpression $  "character(" <> renderNat p <> ")"+  :: forall n schema nullity. (KnownNat n, 1 <= n)+  => TypeExpression schema (nullity ('PGchar n))+char = UnsafeTypeExpression $ "char(" <> renderNat @n <> ")"+character = UnsafeTypeExpression $  "character(" <> renderNat @n <> ")" -- | variable-length character string varchar, characterVarying-  :: (KnownNat n, 1 <= n)-  => proxy n-  -> TypeExpression schema ('PGvarchar n)-varchar p = UnsafeTypeExpression $ "varchar(" <> renderNat p <> ")"-characterVarying p = UnsafeTypeExpression $-  "character varying(" <> renderNat p <> ")"+  :: forall n schema nullity. (KnownNat n, 1 <= n)+  => TypeExpression schema (nullity ('PGvarchar n))+varchar = UnsafeTypeExpression $ "varchar(" <> renderNat @n <> ")"+characterVarying = UnsafeTypeExpression $+  "character varying(" <> renderNat @n <> ")" -- | binary data ("byte array")-bytea :: TypeExpression schema 'PGbytea+bytea :: TypeExpression schema (nullity 'PGbytea) bytea = UnsafeTypeExpression "bytea" -- | date and time (no time zone)-timestamp :: TypeExpression schema 'PGtimestamp+timestamp :: TypeExpression schema (nullity 'PGtimestamp) timestamp = UnsafeTypeExpression "timestamp" -- | date and time, including time zone-timestampWithTimeZone :: TypeExpression schema 'PGtimestamptz+timestampWithTimeZone :: TypeExpression schema (nullity 'PGtimestamptz) timestampWithTimeZone = UnsafeTypeExpression "timestamp with time zone" -- | calendar date (year, month, day)-date :: TypeExpression schema 'PGdate+date :: TypeExpression schema (nullity 'PGdate) date = UnsafeTypeExpression "date" -- | time of day (no time zone)-time :: TypeExpression schema 'PGtime+time :: TypeExpression schema (nullity 'PGtime) time = UnsafeTypeExpression "time" -- | time of day, including time zone-timeWithTimeZone :: TypeExpression schema 'PGtimetz+timeWithTimeZone :: TypeExpression schema (nullity 'PGtimetz) timeWithTimeZone = UnsafeTypeExpression "time with time zone" -- | time span-interval :: TypeExpression schema 'PGinterval+interval :: TypeExpression schema (nullity 'PGinterval) interval = UnsafeTypeExpression "interval" -- | universally unique identifier-uuid :: TypeExpression schema 'PGuuid+uuid :: TypeExpression schema (nullity 'PGuuid) uuid = UnsafeTypeExpression "uuid" -- | IPv4 or IPv6 host address-inet :: TypeExpression schema 'PGinet+inet :: TypeExpression schema (nullity 'PGinet) inet = UnsafeTypeExpression "inet" -- | textual JSON data-json :: TypeExpression schema 'PGjson+json :: TypeExpression schema (nullity 'PGjson) json = UnsafeTypeExpression "json" -- | binary JSON data, decomposed-jsonb :: TypeExpression schema 'PGjsonb+jsonb :: TypeExpression schema (nullity 'PGjsonb) jsonb = UnsafeTypeExpression "jsonb" -- | variable length array vararray   :: TypeExpression schema pg-  -> TypeExpression schema ('PGvararray pg)+  -> TypeExpression schema (nullity ('PGvararray pg)) vararray ty = UnsafeTypeExpression $ renderTypeExpression ty <> "[]" -- | fixed length array ----- >>> renderTypeExpression (fixarray (Proxy @2) json)+-- >>> renderTypeExpression (fixarray @2 json) -- "json[2]" fixarray-  :: KnownNat n-  => proxy n-  -> TypeExpression schema pg-  -> TypeExpression schema ('PGfixarray n pg)-fixarray p ty = UnsafeTypeExpression $-  renderTypeExpression ty <> "[" <> renderNat p <> "]"+  :: forall n schema nullity pg. KnownNat n+  => TypeExpression schema pg+  -> TypeExpression schema (nullity ('PGfixarray n pg))+fixarray ty = UnsafeTypeExpression $+  renderTypeExpression ty <> "[" <> renderNat @n <> "]"  -- | `pgtype` is a demoted version of a `PGType`-class PGTyped schema (ty :: PGType) where pgtype :: TypeExpression schema ty-instance PGTyped schema 'PGbool where pgtype = bool-instance PGTyped schema 'PGint2 where pgtype = int2-instance PGTyped schema 'PGint4 where pgtype = int4-instance PGTyped schema 'PGint8 where pgtype = int8-instance PGTyped schema 'PGnumeric where pgtype = numeric-instance PGTyped schema 'PGfloat4 where pgtype = float4-instance PGTyped schema 'PGfloat8 where pgtype = float8-instance PGTyped schema 'PGtext where pgtype = text+class PGTyped schema (ty :: NullityType) where+  pgtype :: TypeExpression schema ty+instance PGTyped schema (nullity 'PGbool) where pgtype = bool+instance PGTyped schema (nullity 'PGint2) where pgtype = int2+instance PGTyped schema (nullity 'PGint4) where pgtype = int4+instance PGTyped schema (nullity 'PGint8) where pgtype = int8+instance PGTyped schema (nullity 'PGnumeric) where pgtype = numeric+instance PGTyped schema (nullity 'PGfloat4) where pgtype = float4+instance PGTyped schema (nullity 'PGfloat8) where pgtype = float8+instance PGTyped schema (nullity 'PGtext) where pgtype = text instance (KnownNat n, 1 <= n)-  => PGTyped schema ('PGchar n) where pgtype = char (Proxy @n)+  => PGTyped schema (nullity ('PGchar n)) where pgtype = char @n instance (KnownNat n, 1 <= n)-  => PGTyped schema ('PGvarchar n) where pgtype = varchar (Proxy @n)-instance PGTyped schema 'PGbytea where pgtype = bytea-instance PGTyped schema 'PGtimestamp where pgtype = timestamp-instance PGTyped schema 'PGtimestamptz where pgtype = timestampWithTimeZone-instance PGTyped schema 'PGdate where pgtype = date-instance PGTyped schema 'PGtime where pgtype = time-instance PGTyped schema 'PGtimetz where pgtype = timeWithTimeZone-instance PGTyped schema 'PGinterval where pgtype = interval-instance PGTyped schema 'PGuuid where pgtype = uuid-instance PGTyped schema 'PGjson where pgtype = json-instance PGTyped schema 'PGjsonb where pgtype = jsonb-instance PGTyped schema ty => PGTyped schema ('PGvararray ty) where-  pgtype = vararray (pgtype @schema @ty)-instance (KnownNat n, PGTyped schema ty) => PGTyped schema ('PGfixarray n ty) where-  pgtype = fixarray (Proxy @n) (pgtype @schema @ty)+  => PGTyped schema (nullity ('PGvarchar n)) where pgtype = varchar @n+instance PGTyped schema (nullity 'PGbytea) where pgtype = bytea+instance PGTyped schema (nullity 'PGtimestamp) where pgtype = timestamp+instance PGTyped schema (nullity 'PGtimestamptz) where pgtype = timestampWithTimeZone+instance PGTyped schema (nullity 'PGdate) where pgtype = date+instance PGTyped schema (nullity 'PGtime) where pgtype = time+instance PGTyped schema (nullity 'PGtimetz) where pgtype = timeWithTimeZone+instance PGTyped schema (nullity 'PGinterval) where pgtype = interval+instance PGTyped schema (nullity 'PGuuid) where pgtype = uuid+instance PGTyped schema (nullity 'PGjson) where pgtype = json+instance PGTyped schema (nullity 'PGjsonb) where pgtype = jsonb+instance PGTyped schema ty+  => PGTyped schema (nullity ('PGvararray ty)) where+    pgtype = vararray (pgtype @schema @ty)+instance (KnownNat n, PGTyped schema ty)+  => PGTyped schema (nullity ('PGfixarray n ty)) where+    pgtype = fixarray @n (pgtype @schema @ty)
src/Squeal/PostgreSQL/Manipulation.hs view
@@ -42,13 +42,10 @@     -- * Delete   , deleteFrom   , deleteFrom_-    -- * With-  , with   ) where  import Control.DeepSeq import Data.ByteString hiding (foldr)-import Data.Monoid  import qualified Generics.SOP as SOP import qualified GHC.Generics as GHC@@ -180,16 +177,38 @@ in printSQL manipulation :} DELETE FROM "tab" WHERE ("col1" = "col2") RETURNING *++with manipulation:++>>> type ProductsTable = '[] :=> '["product" ::: 'NoDef :=> 'NotNull 'PGtext, "date" ::: 'Def :=> 'NotNull 'PGdate]++>>> :{+let+  manipulation :: Manipulation+    '[ "products" ::: 'Table ProductsTable+     , "products_deleted" ::: 'Table ProductsTable+     ] '[ 'NotNull 'PGdate] '[]+  manipulation = with+    (deleteFrom #products (#date .< param @1) ReturningStar `as` #deleted_rows)+    (insertQuery_ #products_deleted (selectStar (from (view (#deleted_rows `as` #t)))))+in printSQL manipulation+:}+WITH "deleted_rows" AS (DELETE FROM "products" WHERE ("date" < ($1 :: date)) RETURNING *) INSERT INTO "products_deleted" SELECT * FROM "deleted_rows" AS "t" -}+ newtype Manipulation   (schema :: SchemaType)   (params :: [NullityType])-  (columns :: RelationType)+  (columns :: RowType)     = UnsafeManipulation { renderManipulation :: ByteString }     deriving (GHC.Generic,Show,Eq,Ord,NFData)- instance RenderSQL (Manipulation schema params columns) where   renderSQL = renderManipulation+instance With Manipulation where+  with Done manip = manip+  with (cte :>> ctes) manip = UnsafeManipulation $+    "WITH" <+> renderCommonTableExpressions renderManipulation cte ctes+    <+> renderManipulation manip  -- | Convert a `Query` into a `Manipulation`. queryStatement@@ -212,13 +231,14 @@   :: ( SOP.SListI columns      , SOP.SListI results      , Has tab schema ('Table table)+     , row ~ TableToRow table      , columns ~ TableToColumns table )   => Alias tab -- ^ table to insert into   -> NP (Aliased (ColumnValue schema '[] params)) columns -- ^ row to insert   -> [NP (Aliased (ColumnValue schema '[] params)) columns] -- ^ more rows to insert-  -> ConflictClause schema columns params+  -> ConflictClause schema table params   -- ^ what to do in case of constraint conflict-  -> ReturningClause schema columns params results -- ^ results to return+  -> ReturningClause schema params row results -- ^ results to return   -> Manipulation schema params results insertRows tab rw rws conflict returning = UnsafeManipulation $   "INSERT" <+> "INTO" <+> renderAlias tab@@ -242,12 +262,13 @@   :: ( SOP.SListI columns      , SOP.SListI results      , Has tab schema ('Table table)+     , row ~ TableToRow table      , columns ~ TableToColumns table )   => Alias tab -- ^ table to insert into   -> NP (Aliased (ColumnValue schema '[] params)) columns -- ^ row to insert-  -> ConflictClause schema columns params+  -> ConflictClause schema table params   -- ^ what to do in case of constraint conflict-  -> ReturningClause schema columns params results -- ^ results to return+  -> ReturningClause schema params row results -- ^ results to return   -> Manipulation schema params results insertRow tab rw = insertRows tab rw [] @@ -278,12 +299,13 @@   :: ( SOP.SListI columns      , SOP.SListI results      , Has tab schema ('Table table)+     , row ~ TableToRow table      , columns ~ TableToColumns table )   => Alias tab -- ^ table to insert into-  -> Query schema params (ColumnsToRelation columns)-  -> ConflictClause schema columns params+  -> Query schema params (TableToRow table)+  -> ConflictClause schema table params   -- ^ what to do in case of constraint conflict-  -> ReturningClause schema columns params results -- ^ results to return+  -> ReturningClause schema params row results -- ^ results to return   -> Manipulation schema params results insertQuery tab query conflict returning = UnsafeManipulation $   "INSERT" <+> "INTO" <+> renderAlias tab@@ -297,7 +319,7 @@      , Has tab schema ('Table table)      , columns ~ TableToColumns table )   => Alias tab -- ^ table to insert into-  -> Query schema params (ColumnsToRelation columns)+  -> Query schema params (TableToRow table)   -> Manipulation schema params '[] insertQuery_ tab query =   insertQuery tab query OnConflictDoRaise (Returning Nil)@@ -309,7 +331,7 @@ -- existing value in the row for an update. data ColumnValue   (schema :: SchemaType)-  (columns :: RelationType)+  (columns :: RowType)   (params :: [NullityType])   (ty :: ColumnType)   where@@ -331,17 +353,15 @@ -- values are desired. data ReturningClause   (schema :: SchemaType)-  (columns :: ColumnsType)   (params :: [NullityType])-  (results :: RelationType)+  (row0 :: RowType)+  (row1 :: RowType)   where     ReturningStar-      :: results ~ ColumnsToRelation columns-      => ReturningClause schema columns params results+      :: ReturningClause schema params row row     Returning-      :: rel ~ ColumnsToRelation columns-      => NP (Aliased (Expression schema '[table ::: rel] 'Ungrouped params)) results-      -> ReturningClause schema columns params results+      :: NP (Aliased (Expression schema '[table ::: row0] 'Ungrouped params)) row1+      -> ReturningClause schema params row0 row1  -- | Render a `ReturningClause`. renderReturningClause@@ -359,18 +379,22 @@ -- `OnConflictDoNothing` simply avoids inserting a row. -- `OnConflictDoUpdate` updates the existing row that conflicts with the row -- proposed for insertion.-data ConflictClause (schema :: SchemaType) (columns :: ColumnsType) params where-  OnConflictDoRaise :: ConflictClause schema columns params-  OnConflictDoNothing :: ConflictClause schema columns params-  OnConflictDoUpdate-    :: NP (Aliased (ColumnValue schema (ColumnsToRelation columns) params)) columns-    -> [Condition schema '[table ::: ColumnsToRelation columns] 'Ungrouped params]-    -> ConflictClause schema columns params+data ConflictClause+  (schema :: SchemaType)+  (table :: TableType)+  (params :: [NullityType]) where+    OnConflictDoRaise :: ConflictClause schema table params+    OnConflictDoNothing :: ConflictClause schema table params+    OnConflictDoUpdate+      :: (row ~ TableToRow table, columns ~ TableToColumns table)+      => NP (Aliased (ColumnValue schema row params)) columns+      -> [Condition schema '[t ::: row] 'Ungrouped params]+      -> ConflictClause schema table params  -- | Render a `ConflictClause`. renderConflictClause-  :: SOP.SListI columns-  => ConflictClause schema columns params+  :: SOP.SListI (TableToColumns table)+  => ConflictClause schema table params   -> ByteString renderConflictClause = \case   OnConflictDoRaise -> ""@@ -402,13 +426,14 @@   :: ( SOP.SListI columns      , SOP.SListI results      , Has tab schema ('Table table)+     , row ~ TableToRow table      , columns ~ TableToColumns table )   => Alias tab -- ^ table to update-  -> NP (Aliased (ColumnValue schema (ColumnsToRelation columns) params)) columns+  -> NP (Aliased (ColumnValue schema row params)) columns   -- ^ modified values to replace old values-  -> Condition schema '[tab ::: ColumnsToRelation columns] 'Ungrouped params+  -> (forall t. Condition schema '[t ::: row] 'Ungrouped params)   -- ^ condition under which to perform update on a row-  -> ReturningClause schema columns params results -- ^ results to return+  -> ReturningClause schema params row results -- ^ results to return   -> Manipulation schema params results update tab columns wh returning = UnsafeManipulation $   "UPDATE"@@ -432,11 +457,12 @@ update_   :: ( SOP.SListI columns      , Has tab schema ('Table table)+     , row ~ TableToRow table      , columns ~ TableToColumns table )   => Alias tab -- ^ table to update-  -> NP (Aliased (ColumnValue schema (ColumnsToRelation columns) params)) columns+  -> NP (Aliased (ColumnValue schema row params)) columns   -- ^ modified values to replace old values-  -> Condition schema '[tab ::: ColumnsToRelation columns] 'Ungrouped params+  -> (forall t. Condition schema '[t ::: row] 'Ungrouped params)   -- ^ condition under which to perform update on a row   -> Manipulation schema params '[] update_ tab columns wh = update tab columns wh (Returning Nil)@@ -449,11 +475,12 @@ deleteFrom   :: ( SOP.SListI results      , Has tab schema ('Table table)+     , row ~ TableToRow table      , columns ~ TableToColumns table )   => Alias tab -- ^ table to delete from-  -> Condition schema '[tab ::: ColumnsToRelation columns] 'Ungrouped params+  -> Condition schema '[tab ::: row] 'Ungrouped params   -- ^ condition under which to delete a row-  -> ReturningClause schema columns params results -- ^ results to return+  -> ReturningClause schema params row results -- ^ results to return   -> Manipulation schema params results deleteFrom tab wh returning = UnsafeManipulation $   "DELETE FROM" <+> renderAlias tab@@ -463,45 +490,10 @@ -- | Delete rows returning `Nil`. deleteFrom_   :: ( Has tab schema ('Table table)+     , row ~ TableToRow table      , columns ~ TableToColumns table )   => Alias tab -- ^ table to delete from-  -> Condition schema '[tab ::: ColumnsToRelation columns] 'Ungrouped params+  -> (forall t. Condition schema '[t ::: row] 'Ungrouped params)   -- ^ condition under which to delete a row   -> Manipulation schema params '[] deleteFrom_ tab wh = deleteFrom tab wh (Returning Nil)--{------------------------------------------WITH statements------------------------------------------}---- | `with` provides a way to write auxiliary statements for use in a larger statement.--- These statements, which are often referred to as Common Table Expressions or CTEs,--- can be thought of as defining temporary tables that exist just for one statement.------ >>> type ProductsTable = '[] :=> '["product" ::: 'NoDef :=> 'NotNull 'PGtext, "date" ::: 'Def :=> 'NotNull 'PGdate]------ >>> :{--- let---   manipulation :: Manipulation '["products" ::: 'Table ProductsTable, "products_deleted" ::: 'Table ProductsTable] '[ 'NotNull 'PGdate] '[]---   manipulation = with---     (deleteFrom #products (#date .< param @1) ReturningStar `as` #deleted_rows)---     (insertQuery_ #products_deleted (selectStar (from (view (#deleted_rows `as` #t)))))--- in printSQL manipulation--- :}--- WITH "deleted_rows" AS (DELETE FROM "products" WHERE ("date" < ($1 :: date)) RETURNING *) INSERT INTO "products_deleted" SELECT * FROM "deleted_rows" AS "t"-with-  :: SOP.SListI commons-  => NP (Aliased (Manipulation schema params)) (common ': commons)-  -- ^ common table expressions-  -> Manipulation (With (common ': commons) schema) params results-  -> Manipulation schema params results-with commons manipulation = UnsafeManipulation $-  "WITH" <+> renderCommaSeparated renderCommon commons-  <+> renderManipulation manipulation-  where-    renderCommon-      :: Aliased (Manipulation schema params) common-      -> ByteString-    renderCommon (common `As` alias) =-      renderAlias alias <+> "AS" <+>-        parenthesized (renderManipulation common)
src/Squeal/PostgreSQL/Migration.hs view
@@ -105,9 +105,6 @@     Migration (..)   , migrateUp   , migrateDown-    -- * Aligned lists-  , AlignedList (..)-  , single     -- * Migration table   , MigrationsTable   , createMigrations@@ -116,15 +113,12 @@   , selectMigration   ) where -import Control.Category import Control.Monad import Control.Monad.Base import Control.Monad.Trans.Control-import Data.Monoid import Generics.SOP (K(..)) import Data.Function ((&)) import Data.Text (Text)-import Prelude hiding (id, (.))  import Squeal.PostgreSQL @@ -136,21 +130,6 @@   , up :: PQ schema0 schema1 io () -- ^ The `up` instruction of a `Migration`.   , down :: PQ schema1 schema0 io () -- ^ The `down` instruction of a `Migration`.   }---- | An `AlignedList` is a type-aligned list or free category.-data AlignedList p x0 x1 where-  Done :: AlignedList p x x-  (:>>) :: p x0 x1 -> AlignedList p x1 x2 -> AlignedList p x0 x2-infixr 7 :>>-instance Category (AlignedList p) where-  id = Done-  (.) list = \case-    Done -> list-    step :>> steps -> step :>> (steps >>> list)---- | A `single` step.-single :: p x0 x1 -> AlignedList p x0 x1-single step = step :>> Done  -- | Run `Migration`s by creating the `MigrationsTable` -- if it does not exist and then in a transaction, for each each `Migration`
src/Squeal/PostgreSQL/PQ.hs view
@@ -50,7 +50,7 @@   , MonadPQ (..)   , PQRun   , pqliftWith-    -- * Result+    -- * Results   , LibPQ.Result   , LibPQ.Row   , ntuples@@ -62,6 +62,11 @@   , LibPQ.ExecStatus (..)   , resultStatus   , resultErrorMessage+  , resultErrorCode+    -- * Exceptions+  , SquealException (..)+  , catchSqueal+  , handleSqueal   ) where  import Control.Exception.Lifted@@ -73,9 +78,10 @@ import Data.Foldable import Data.Function ((&)) import Data.Kind-import Data.Monoid+import Data.Text (pack, Text) import Data.Traversable import Generics.SOP+import PostgreSQL.Binary.Encoding (encodingBytes)  import qualified Database.PostgreSQL.LibPQ as LibPQ @@ -90,7 +96,6 @@ import Control.Monad.Trans.Reader import Control.Monad.Trans.Maybe import Control.Monad.Trans.Cont-import Control.Monad.Trans.List  import qualified Control.Monad.Trans.State.Lazy as Lazy import qualified Control.Monad.Trans.State.Strict as Strict@@ -269,7 +274,7 @@   define (UnsafeDefinition q) = PQ $ \ (K conn) -> do     resultMaybe <- liftBase $ LibPQ.exec conn q     case resultMaybe of-      Nothing -> error+      Nothing -> throw $ ResultException         "define: LibPQ.exec returned no results"       Just result -> return $ K (K result) @@ -393,14 +398,17 @@     (UnsafeManipulation q :: Manipulation schema ps ys) (params :: x) =       PQ $ \ (K conn) -> do         let-          toParam' bytes = (LibPQ.invalidOid,bytes,LibPQ.Binary)+          toParam' encoding =+            (LibPQ.invalidOid, encodingBytes encoding, LibPQ.Binary)           params' = fmap (fmap toParam') (hcollapse (toParams @x @ps params))           q' = q <> ";"         resultMaybe <- liftBase $ LibPQ.execParams conn q' params' LibPQ.Binary         case resultMaybe of-          Nothing -> error+          Nothing -> throw $ ResultException             "manipulateParams: LibPQ.execParams returned no results"-          Just result -> return $ K (K result)+          Just result -> do+            tryResult result+            return $ K (K result)    traversePrepared     (UnsafeManipulation q :: Manipulation schema xs ys) (list :: list x) =@@ -408,29 +416,25 @@         let temp = "temporary_statement"         prepResultMaybe <- LibPQ.prepare conn temp q Nothing         case prepResultMaybe of-          Nothing -> error+          Nothing -> throw $ ResultException             "traversePrepared: LibPQ.prepare returned no results"-          Just prepResult -> do-            status <- LibPQ.resultStatus prepResult-            unless (status == LibPQ.CommandOk) . error $-              "traversePrepared: LibPQ.prepare status " <> show status+          Just prepResult -> tryResult prepResult         results <- for list $ \ params -> do           let-            toParam' bytes = (bytes,LibPQ.Binary)+            toParam' encoding = (encodingBytes encoding,LibPQ.Binary)             params' = fmap (fmap toParam') (hcollapse (toParams @x @xs params))           resultMaybe <- LibPQ.execPrepared conn temp params' LibPQ.Binary           case resultMaybe of-            Nothing -> error+            Nothing -> throw $ ResultException               "traversePrepared: LibPQ.execParams returned no results"-            Just result -> return $ K result+            Just result -> do+              tryResult result+              return $ K result         deallocResultMaybe <- LibPQ.exec conn ("DEALLOCATE " <> temp <> ";")         case deallocResultMaybe of-          Nothing -> error+          Nothing -> throw $ ResultException             "traversePrepared: LibPQ.exec DEALLOCATE returned no results"-          Just deallocResult -> do-            status <- LibPQ.resultStatus deallocResult-            unless (status == LibPQ.CommandOk) . error $-              "traversePrepared: DEALLOCATE status " <> show status+          Just deallocResult -> tryResult deallocResult         return (K results)    traversePrepared_@@ -439,29 +443,23 @@         let temp = "temporary_statement"         prepResultMaybe <- LibPQ.prepare conn temp q Nothing         case prepResultMaybe of-          Nothing -> error+          Nothing -> throw $ ResultException             "traversePrepared_: LibPQ.prepare returned no results"-          Just prepResult -> do-            status <- LibPQ.resultStatus prepResult-            unless (status == LibPQ.CommandOk) . error $-              "traversePrepared: LibPQ.prepare status " <> show status+          Just prepResult -> tryResult prepResult         for_ list $ \ params -> do           let-            toParam' bytes = (bytes,LibPQ.Binary)+            toParam' encoding = (encodingBytes encoding, LibPQ.Binary)             params' = fmap (fmap toParam') (hcollapse (toParams @x @xs params))           resultMaybe <- LibPQ.execPrepared conn temp params' LibPQ.Binary           case resultMaybe of-            Nothing -> error+            Nothing -> throw $ ResultException               "traversePrepared_: LibPQ.execParams returned no results"-            Just _result -> return ()+            Just result -> tryResult result         deallocResultMaybe <- LibPQ.exec conn ("DEALLOCATE " <> temp <> ";")         case deallocResultMaybe of-          Nothing -> error+          Nothing -> throw $ ResultException             "traversePrepared: LibPQ.exec DEALLOCATE returned no results"-          Just deallocResult -> do-            status <- LibPQ.resultStatus deallocResult-            unless (status == LibPQ.CommandOk) . error $-              "traversePrepared: DEALLOCATE status " <> show status+          Just deallocResult -> tryResult deallocResult         return (K ())    liftPQ pq = PQ $ \ (K conn) -> do@@ -479,7 +477,6 @@ instance (Monoid w, MonadPQ schema m) => MonadPQ schema (Strict.RWST r w s m) instance (Monoid w, MonadPQ schema m) => MonadPQ schema (Lazy.RWST r w s m) instance MonadPQ schema m => MonadPQ schema (ContT r m)-instance MonadPQ schema m => MonadPQ schema (ListT m)  instance (Monad m, schema0 ~ schema1)   => Applicative (PQ schema0 schema1 m) where@@ -534,14 +531,16 @@   -> io y getRow r (K result :: K LibPQ.Result columns) = liftBase $ do   numRows <- LibPQ.ntuples result-  when (numRows < r) $ error $-    "getRow: expected at least " <> show r <> "rows but only saw "-    <> show numRows+  when (numRows < r) $ throw $ ResultException $+    "getRow: expected at least " <> pack (show r) <> "rows but only saw "+    <> pack (show numRows)   let len = fromIntegral (lengthSList (Proxy @columns))   row' <- traverse (LibPQ.getvalue result r) [0 .. len - 1]   case fromList row' of-    Nothing -> error "getRow: found unexpected length"-    Just row -> return $ fromRow @columns row+    Nothing -> throw $ ResultException "getRow: found unexpected length"+    Just row -> case fromRow @columns row of+      Left parseError -> throw $ ParseException $ "getRow: " <> parseError+      Right y -> return y  -- | Intended to be used for unfolding in streaming libraries, `nextRow` -- takes a total number of rows (which can be found with `ntuples`)@@ -558,8 +557,10 @@     let len = fromIntegral (lengthSList (Proxy @columns))     row' <- traverse (LibPQ.getvalue result r) [0 .. len - 1]     case fromList row' of-      Nothing -> error "nextRow: found unexpected length"-      Just row -> return $ Just (r+1, fromRow @columns row)+      Nothing -> throw $ ResultException "nextRow: found unexpected length"+      Just row -> case fromRow @columns row of+        Left parseError -> throw $ ParseException $ "nextRow: " <> parseError+        Right y -> return $ Just (r+1, y)  -- | Get all rows from a `LibPQ.Result`. getRows@@ -572,8 +573,10 @@   for [0 .. numRows - 1] $ \ r -> do     row' <- traverse (LibPQ.getvalue result r) [0 .. len - 1]     case fromList row' of-      Nothing -> error "getRows: found unexpected length"-      Just row -> return $ fromRow @columns row+      Nothing -> throw $ ResultException "getRows: found unexpected length"+      Just row -> case fromRow @columns row of+        Left parseError -> throw $ ParseException $ "getRows: " <> parseError+        Right y -> return y  -- | Get the first row if possible from a `LibPQ.Result`. firstRow@@ -586,8 +589,10 @@     let len = fromIntegral (lengthSList (Proxy @columns))     row' <- traverse (LibPQ.getvalue result 0) [0 .. len - 1]     case fromList row' of-      Nothing -> error "firstRow: found unexpected length"-      Just row -> return . Just $ fromRow @columns row+      Nothing -> throw $ ResultException "firstRow: found unexpected length"+      Just row -> case fromRow @columns row of+        Left parseError -> throw $ ParseException $ "firstRow: " <> parseError+        Right y -> return $ Just y  -- | Lifts actions on results from @LibPQ@. liftResult@@ -609,3 +614,55 @@ resultErrorMessage   :: MonadBase IO io => K LibPQ.Result results -> io (Maybe ByteString) resultErrorMessage = liftResult LibPQ.resultErrorMessage++-- | Returns the error code most recently generated by an operation+-- on the connection.+--+-- https://www.postgresql.org/docs/current/static/errcodes-appendix.html+resultErrorCode+  :: MonadBase IO io+  => K LibPQ.Result results+  -> io (Maybe ByteString)+resultErrorCode = liftResult (flip LibPQ.resultErrorField LibPQ.DiagSqlstate)++-- | `Exception`s that can be thrown by Squeal.+data SquealException+  = PQException+  { sqlExecStatus :: LibPQ.ExecStatus+  , sqlStateCode :: Maybe ByteString+    -- ^ https://www.postgresql.org/docs/current/static/errcodes-appendix.html+  , sqlErrorMessage :: Maybe ByteString+  }+  | ResultException Text+  | ParseException Text+  deriving (Eq, Show)+instance Exception SquealException++tryResult+  :: MonadBase IO io+  => LibPQ.Result+  -> io ()+tryResult result = liftBase $ do+  status <- LibPQ.resultStatus result+  case status of+    LibPQ.CommandOk -> return ()+    LibPQ.TuplesOk -> return ()+    _ -> do+      stateCode <- LibPQ.resultErrorField result LibPQ.DiagSqlstate+      msg <- LibPQ.resultErrorMessage result+      throw $ PQException status stateCode msg++-- | Catch `SquealException`s.+catchSqueal+  :: MonadBaseControl IO io+  => io a+  -> (SquealException -> io a) -- ^ handler+  -> io a+catchSqueal = catch++-- | Handle `SquealException`s.+handleSqueal+  :: MonadBaseControl IO io+  => (SquealException -> io a) -- ^ handler+  -> io a -> io a+handleSqueal = handle
src/Squeal/PostgreSQL/Query.hs view
@@ -29,21 +29,43 @@ module Squeal.PostgreSQL.Query   ( -- * Queries     Query (UnsafeQuery, renderQuery)-  , union-  , unionAll-  , intersect-  , intersectAll-  , except-  , exceptAll-    -- * Select+    -- ** Select   , select   , selectDistinct   , selectStar   , selectDistinctStar   , selectDotStar   , selectDistinctDotStar+    -- ** Values   , values   , values_+    -- ** Set Operations+  , union+  , unionAll+  , intersect+  , intersectAll+  , except+  , exceptAll+    -- ** With+  , With (with)+  , CommonTableExpression (..)+  , renderCommonTableExpression+  , renderCommonTableExpressions+    -- ** Json+  , jsonEach+  , jsonbEach+  , jsonEachAsText+  , jsonbEachAsText+  , jsonObjectKeys+  , jsonbObjectKeys+  , jsonPopulateRecord+  , jsonbPopulateRecord+  , jsonPopulateRecordSet+  , jsonbPopulateRecordSet+  , jsonToRecord+  , jsonbToRecord+  , jsonToRecordSet+  , jsonbToRecordSet     -- * Table Expressions   , TableExpression (..)   , renderTableExpression@@ -54,22 +76,7 @@   , orderBy   , limit   , offset-    -- ** JSON table expressions-  , PGjson_each-  , PGjsonb_each-  , jsonEach-  , jsonbEach-  , jsonEachAsText-  , jsonbEachAsText-  , jsonPopulateRecordAs-  , jsonbPopulateRecordAs-  , jsonPopulateRecordSetAs-  , jsonbPopulateRecordSetAs-  , jsonToRecordAs-  , jsonbToRecordAs-  , jsonToRecordSetAs-  , jsonbToRecordSetAs-    -- * From+    -- * From Clauses   , FromClause (..)   , table   , subquery@@ -89,11 +96,37 @@     -- * Sorting   , SortExpression (..)   , renderSortExpression+    -- * Subquery Expressions+  , in_+  , rowIn+  , eqAll+  , rowEqAll+  , eqAny+  , rowEqAny+  , neqAll+  , rowNeqAll+  , neqAny+  , rowNeqAny+  , allLt+  , rowLtAll+  , ltAny+  , rowLtAny+  , lteAll+  , rowLteAll+  , lteAny+  , rowLteAny+  , gtAll+  , rowGtAll+  , gtAny+  , rowGtAny+  , gteAll+  , rowGteAll+  , gteAny+  , rowGteAny   ) where  import Control.DeepSeq import Data.ByteString (ByteString)-import Data.Monoid hiding (All) import Data.String import Data.Word import Generics.SOP hiding (from)@@ -107,9 +140,7 @@  {- | The process of retrieving or the command to retrieve data from a database-is called a `Query`. The `select`, `selectStar`, `selectDotStar`,-`selectDistinct`, `selectDistinctStar` and `selectDistinctDotStar` commands-are used to specify queries.+is called a `Query`. Let's see some examples of queries.  simple query: @@ -280,6 +311,16 @@ :} SELECT "t1".* FROM "tab" AS "t1" CROSS JOIN "tab" AS "t2" +value queries:++>>> :{+let+  query :: Query '[] '[] '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+  query = values (1 `as` #foo :* true `as` #bar) [2 `as` #foo :* false `as` #bar]+in printSQL query+:}+SELECT * FROM (VALUES (1, TRUE), (2, FALSE)) AS t ("foo", "bar")+ set operations:  >>> :{@@ -295,11 +336,30 @@ in printSQL query :} (SELECT * FROM "tab" AS "tab") UNION ALL (SELECT * FROM "tab" AS "tab")++with queries:++>>> :{+let+  query :: Query+    '[ "t1" ::: 'View+       '[ "c1" ::: 'NotNull 'PGtext+        , "c2" ::: 'NotNull 'PGtext] ]+    '[]+    '[ "c1" ::: 'NotNull 'PGtext+     , "c2" ::: 'NotNull 'PGtext ]+  query = with (+    selectStar (from (view #t1)) `as` #t2 :>>+    selectStar (from (view #t2)) `as` #t3+    ) (selectStar (from (view #t3)))+in printSQL query+:}+WITH "t2" AS (SELECT * FROM "t1" AS "t1"), "t3" AS (SELECT * FROM "t2" AS "t2") SELECT * FROM "t3" AS "t3" -} newtype Query   (schema :: SchemaType)   (params :: [NullityType])-  (columns :: RelationType)+  (columns :: RowType)     = UnsafeQuery { renderQuery :: ByteString }     deriving (GHC.Generic,Show,Eq,Ord,NFData) instance RenderSQL (Query schema params columns) where renderSQL = renderQuery@@ -381,9 +441,9 @@ -- the intermediate table are actually output. select   :: SListI columns-  => NP (Aliased (Expression schema relations grouping params)) (column ': columns)+  => NP (Aliased (Expression schema from grouping params)) (column ': columns)   -- ^ select list-  -> TableExpression schema params relations grouping+  -> TableExpression schema params from grouping   -- ^ intermediate virtual table   -> Query schema params (column ': columns) select list rels = UnsafeQuery $@@ -395,9 +455,9 @@ -- be subject to the elimination of duplicate rows using `selectDistinct`. selectDistinct   :: SListI columns-  => NP (Aliased (Expression schema relations 'Ungrouped params)) (column ': columns)+  => NP (Aliased (Expression schema from 'Ungrouped params)) (column ': columns)   -- ^ select list-  -> TableExpression schema params relations 'Ungrouped+  -> TableExpression schema params from 'Ungrouped   -- ^ intermediate virtual table   -> Query schema params (column ': columns) selectDistinct list rels = UnsafeQuery $@@ -408,8 +468,8 @@ -- | The simplest kind of query is `selectStar` which emits all columns -- that the table expression produces. selectStar-  :: HasUnique relation relations columns-  => TableExpression schema params relations 'Ungrouped+  :: HasUnique table from columns+  => TableExpression schema params from 'Ungrouped   -- ^ intermediate virtual table   -> Query schema params columns selectStar rels = UnsafeQuery $ "SELECT" <+> "*" <+> renderTableExpression rels@@ -417,8 +477,8 @@ -- | A `selectDistinctStar` emits all columns that the table expression -- produces and eliminates duplicate rows. selectDistinctStar-  :: HasUnique relation relations columns-  => TableExpression schema params relations 'Ungrouped+  :: HasUnique table from columns+  => TableExpression schema params from 'Ungrouped   -- ^ intermediate virtual table   -> Query schema params columns selectDistinctStar rels = UnsafeQuery $@@ -427,27 +487,27 @@ -- | When working with multiple tables, it can also be useful to ask -- for all the columns of a particular table, using `selectDotStar`. selectDotStar-  :: Has relation relations columns-  => Alias relation+  :: Has table from columns+  => Alias table   -- ^ particular virtual subtable-  -> TableExpression schema params relations 'Ungrouped+  -> TableExpression schema params from 'Ungrouped   -- ^ intermediate virtual table   -> Query schema params columns-selectDotStar rel relations = UnsafeQuery $-  "SELECT" <+> renderAlias rel <> ".*" <+> renderTableExpression relations+selectDotStar rel tab = UnsafeQuery $+  "SELECT" <+> renderAlias rel <> ".*" <+> renderTableExpression tab  -- | A `selectDistinctDotStar` asks for all the columns of a particular table, -- and eliminates duplicate rows. selectDistinctDotStar-  :: Has relation relations columns-  => Alias relation+  :: Has table from columns+  => Alias table   -- ^ particular virtual table-  -> TableExpression schema params relations 'Ungrouped+  -> TableExpression schema params from 'Ungrouped   -- ^ intermediate virtual table   -> Query schema params columns-selectDistinctDotStar rel relations = UnsafeQuery $+selectDistinctDotStar rel tab = UnsafeQuery $   "SELECT DISTINCT" <+> renderAlias rel <> ".*"-  <+> renderTableExpression relations+  <+> renderTableExpression tab  -- | `values` computes a row value or set of row values -- specified by value expressions. It is most commonly used@@ -501,13 +561,13 @@ data TableExpression   (schema :: SchemaType)   (params :: [NullityType])-  (relations :: RelationsType)+  (from :: FromType)   (grouping :: Grouping)     = TableExpression-    { fromClause :: FromClause schema params relations+    { fromClause :: FromClause schema params from     -- ^ A table reference that can be a table name, or a derived table such     -- as a subquery, a @JOIN@ construct, or complex combinations of these.-    , whereClause :: [Condition schema relations 'Ungrouped params]+    , whereClause :: [Condition schema from 'Ungrouped params]     -- ^ optional search coditions, combined with `.&&`. After the processing     -- of the `fromClause` is done, each row of the derived virtual table     -- is checked against the search condition. If the result of the@@ -516,20 +576,20 @@     -- at least one column of the table generated in the `fromClause`;     -- this is not required, but otherwise the WHERE clause will     -- be fairly useless.-    , groupByClause :: GroupByClause relations grouping+    , groupByClause :: GroupByClause from grouping     -- ^ The `groupByClause` is used to group together those rows in a table     -- that have the same values in all the columns listed. The order in which     -- the columns are listed does not matter. The effect is to combine each     -- set of rows having common values into one group row that represents all     -- rows in the group. This is done to eliminate redundancy in the output     -- and/or compute aggregates that apply to these groups.-    , havingClause :: HavingClause schema relations grouping params+    , havingClause :: HavingClause schema from grouping params     -- ^ If a table has been grouped using `groupBy`, but only certain groups     -- are of interest, the `havingClause` can be used, much like a     -- `whereClause`, to eliminate groups from the result. Expressions in the     -- `havingClause` can refer both to grouped expressions and to ungrouped     -- expressions (which necessarily involve an aggregate function).-    , orderByClause :: [SortExpression schema relations grouping params]+    , orderByClause :: [SortExpression schema from grouping params]     -- ^ The `orderByClause` is for optional sorting. When more than one     -- `SortExpression` is specified, the later (right) values are used to sort     -- rows that are equal according to the earlier (left) values.@@ -547,7 +607,7 @@  -- | Render a `TableExpression` renderTableExpression-  :: TableExpression schema params relations grouping+  :: TableExpression schema params from grouping   -> ByteString renderTableExpression   (TableExpression frm' whs' grps' hvs' srts' lims' offs') = mconcat@@ -581,16 +641,16 @@ -- `group`, `having`, `orderBy`, `limit` and `offset`, using the `&` operator -- to match the left-to-right sequencing of their placement in SQL. from-  :: FromClause schema params relations -- ^ table reference-  -> TableExpression schema params relations 'Ungrouped+  :: FromClause schema params from -- ^ table reference+  -> TableExpression schema params from 'Ungrouped from rels = TableExpression rels [] NoGroups NoHaving [] [] []  -- | A `where_` is an endomorphism of `TableExpression`s which adds a -- search condition to the `whereClause`. where_-  :: Condition schema relations 'Ungrouped params -- ^ filtering condition-  -> TableExpression schema params relations grouping-  -> TableExpression schema params relations grouping+  :: Condition schema from 'Ungrouped params -- ^ filtering condition+  -> TableExpression schema params from grouping+  -> TableExpression schema params from grouping where_ wh rels = rels {whereClause = wh : whereClause rels}  -- | A `groupBy` is a transformation of `TableExpression`s which switches@@ -598,9 +658,9 @@ -- a "grand total" aggregation query. groupBy   :: SListI bys-  => NP (By relations) bys -- ^ grouped columns-  -> TableExpression schema params relations 'Ungrouped-  -> TableExpression schema params relations ('Grouped bys)+  => NP (By from) bys -- ^ grouped columns+  -> TableExpression schema params from 'Ungrouped+  -> TableExpression schema params from ('Grouped bys) groupBy bys rels = TableExpression   { fromClause = fromClause rels   , whereClause = whereClause rels@@ -614,218 +674,176 @@ -- | A `having` is an endomorphism of `TableExpression`s which adds a -- search condition to the `havingClause`. having-  :: Condition schema relations ('Grouped bys) params -- ^ having condition-  -> TableExpression schema params relations ('Grouped bys)-  -> TableExpression schema params relations ('Grouped bys)+  :: Condition schema from ('Grouped bys) params -- ^ having condition+  -> TableExpression schema params from ('Grouped bys)+  -> TableExpression schema params from ('Grouped bys) having hv rels = rels   { havingClause = case havingClause rels of Having hvs -> Having (hv:hvs) }  -- | An `orderBy` is an endomorphism of `TableExpression`s which appends an -- ordering to the right of the `orderByClause`. orderBy-  :: [SortExpression schema relations grouping params] -- ^ sort expressions-  -> TableExpression schema params relations grouping-  -> TableExpression schema params relations grouping+  :: [SortExpression schema from grouping params] -- ^ sort expressions+  -> TableExpression schema params from grouping+  -> TableExpression schema params from grouping orderBy srts rels = rels {orderByClause = orderByClause rels ++ srts}  -- | A `limit` is an endomorphism of `TableExpression`s which adds to the -- `limitClause`. limit   :: Word64 -- ^ limit parameter-  -> TableExpression schema params relations grouping-  -> TableExpression schema params relations grouping+  -> TableExpression schema params from grouping+  -> TableExpression schema params from grouping limit lim rels = rels {limitClause = lim : limitClause rels}  -- | An `offset` is an endomorphism of `TableExpression`s which adds to the -- `offsetClause`. offset   :: Word64 -- ^ offset parameter-  -> TableExpression schema params relations grouping-  -> TableExpression schema params relations grouping+  -> TableExpression schema params from grouping+  -> TableExpression schema params from grouping offset off rels = rels {offsetClause = off : offsetClause rels}  {----------------------------------------- JSON stuff -----------------------------------------} -type PGjson_each_variant val tab =-  '[ tab ::: '[ "key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull val ] ]---- | The type of a `json_each` `FromClause`.-type PGjson_each tab = PGjson_each_variant 'PGjson tab--- | The type of a `jsonb_each` `FromClause`.-type PGjsonb_each tab = PGjson_each_variant 'PGjsonb tab--- | The type of a `json_each_text` `FromClause`.-type PGjson_each_text tab = PGjson_each_variant 'PGtext tab--- | The type of a `jsonb_each_text` `FromClause`.-type PGjsonb_each_text tab = PGjson_each_variant 'PGtext tab--unsafeAliasedFromClauseExpression-  :: Aliased (Expression schema' relations' grouping' params') ty'-  -> FromClause schema params relations-unsafeAliasedFromClauseExpression aliasedExpr = UnsafeFromClause-  (renderAliasedAs renderExpression aliasedExpr)+unsafeSetOfFunction+  :: ByteString+  -> Expression schema '[] 'Ungrouped params ty+  -> Query schema params row+unsafeSetOfFunction fun expr = UnsafeQuery $+  "SELECT * FROM " <> fun <> "(" <> renderExpression expr <> ")"  -- | Expands the outermost JSON object into a set of key/value pairs. jsonEach-  :: Aliased (Expression schema '[] 'Ungrouped params) '(tab, nullity 'PGjson)-  -> FromClause schema params (PGjson_each tab)-jsonEach (As jexpr jname) = unsafeAliasedFromClauseExpression-  (As (unsafeFunction "json_each" jexpr) jname)+  :: Expression schema '[] 'Ungrouped params (nullity 'PGjson) -- ^ json object+  -> Query schema params+      '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGjson]+jsonEach = unsafeSetOfFunction "json_each"  -- | Expands the outermost binary JSON object into a set of key/value pairs. jsonbEach-  :: Aliased (Expression schema '[] 'Ungrouped params) '(tab, nullity 'PGjsonb)-  -> FromClause schema params (PGjsonb_each tab)-jsonbEach (As jexpr jname) = unsafeAliasedFromClauseExpression-  (As (unsafeFunction "jsonb_each" jexpr) jname)+  :: Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -- ^ jsonb object+  -> Query schema params+      '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGjsonb]+jsonbEach = unsafeSetOfFunction "jsonb_each"  -- | Expands the outermost JSON object into a set of key/value pairs. jsonEachAsText-  :: Aliased (Expression schema '[] 'Ungrouped params) '(tab, nullity 'PGjson)-  -> FromClause schema params (PGjson_each_text tab)-jsonEachAsText (As jexpr jname) = unsafeAliasedFromClauseExpression-  (As (unsafeFunction "json_each" jexpr) jname)+  :: Expression schema '[] 'Ungrouped params (nullity 'PGjson) -- ^ json object+  -> Query schema params+      '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGtext]+jsonEachAsText = unsafeSetOfFunction "json_each_text"  -- | Expands the outermost binary JSON object into a set of key/value pairs. jsonbEachAsText-  :: Aliased (Expression schema '[] 'Ungrouped params) '(tab, nullity 'PGjsonb)-  -> FromClause schema params (PGjsonb_each_text tab)-jsonbEachAsText (As jexpr jname) = unsafeAliasedFromClauseExpression-  (As (unsafeFunction "jsonb_each" jexpr) jname)+  :: Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -- ^ jsonb object+  -> Query schema params+    '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGtext]+jsonbEachAsText = unsafeSetOfFunction "jsonb_each_text" -nullRow-  :: Has tab schema ('Table table)-  => Alias tab-  -> Expression schema relations grouping params-     (nullity ('PGcomposite (RelationToRowType (TableToRelation table))))-nullRow tab = UnsafeExpression ("null::"<+>renderAlias tab)+-- | Returns set of keys in the outermost JSON object.+jsonObjectKeys+  :: Expression schema '[] 'Ungrouped params (nullity 'PGjson) -- ^ json object+  -> Query schema params '["json_object_keys" ::: 'NotNull 'PGtext]+jsonObjectKeys = unsafeSetOfFunction "json_object_keys" +-- | Returns set of keys in the outermost JSON object.+jsonbObjectKeys+  :: Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -- ^ jsonb object+  -> Query schema params '["jsonb_object_keys" ::: 'NotNull 'PGtext]+jsonbObjectKeys = unsafeSetOfFunction "jsonb_object_keys"++unsafePopulateFunction+  :: ByteString+  -> TypeExpression schema (nullity ('PGcomposite row))+  -> Expression schema '[] 'Ungrouped params ty+  -> Query schema params row+unsafePopulateFunction fun ty expr = UnsafeQuery $+  "SELECT * FROM " <> fun <> "("+    <> "null::" <> renderTypeExpression ty <> ", "+    <> renderExpression expr <> ")"+ -- | Expands the JSON expression to a row whose columns match the record -- type defined by the given table.-jsonPopulateRecordAs-  :: (KnownSymbol alias, Has tab schema ('Table table))-  => Alias tab-  -> Expression schema '[] 'Ungrouped params (nullity 'PGjson)-  -> Alias alias-  -> FromClause schema params '[alias ::: TableToRelation table]-jsonPopulateRecordAs tableName expr alias = unsafeAliasedFromClauseExpression-  (unsafeVariadicFunction "json_populate_record"-   (nullRow tableName :* expr :* Nil) `As` alias)+jsonPopulateRecord+  :: TypeExpression schema (nullity ('PGcomposite row)) -- ^ row type+  -> Expression schema '[] 'Ungrouped params (nullity 'PGjson) -- ^ json object+  -> Query schema params row+jsonPopulateRecord = unsafePopulateFunction "json_populate_record"  -- | Expands the binary JSON expression to a row whose columns match the record -- type defined by the given table.-jsonbPopulateRecordAs-  :: (KnownSymbol alias, Has tab schema ('Table table))-  => Alias tab-  -> Expression schema '[] 'Ungrouped params (nullity 'PGjsonb)-  -> Alias alias-  -> FromClause schema params '[alias ::: TableToRelation table]-jsonbPopulateRecordAs tableName expr alias = unsafeAliasedFromClauseExpression-  (unsafeVariadicFunction "jsonb_populate_record"-   (nullRow tableName :* expr :* Nil) `As` alias)+jsonbPopulateRecord+  :: TypeExpression schema (nullity ('PGcomposite row)) -- ^ row type+  -> Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -- ^ jsonb object+  -> Query schema params row+jsonbPopulateRecord = unsafePopulateFunction "jsonb_populate_record"  -- | Expands the outermost array of objects in the given JSON expression to a -- set of rows whose columns match the record type defined by the given table.-jsonPopulateRecordSetAs-  :: (KnownSymbol alias, Has tab schema ('Table table))-  => Alias tab-  -> Expression schema '[] 'Ungrouped params (nullity 'PGjson)-  -> Alias alias-  -> FromClause schema params '[alias ::: TableToRelation table]-jsonPopulateRecordSetAs tableName expr alias = unsafeAliasedFromClauseExpression-  (unsafeVariadicFunction "json_populate_record_set"-   (nullRow tableName :* expr :* Nil) `As` alias)+jsonPopulateRecordSet+  :: TypeExpression schema (nullity ('PGcomposite row)) -- ^ row type+  -> Expression schema '[] 'Ungrouped params (nullity 'PGjson) -- ^ json array+  -> Query schema params row+jsonPopulateRecordSet = unsafePopulateFunction "json_populate_record_set"  -- | Expands the outermost array of objects in the given binary JSON expression -- to a set of rows whose columns match the record type defined by the given -- table.-jsonbPopulateRecordSetAs-  :: (KnownSymbol alias, Has tab schema ('Table table))-  => Alias tab-  -> Expression schema '[] 'Ungrouped params (nullity 'PGjsonb)-  -> Alias alias-  -> FromClause schema params '[alias ::: TableToRelation table]-jsonbPopulateRecordSetAs tableName expr alias = unsafeAliasedFromClauseExpression-  (unsafeVariadicFunction "jsonb_populate_record_set"-   (nullRow tableName :* expr :* Nil) `As` alias)--renderTableTypeExpression-  :: All Top types-  => Aliased (NP (Aliased (TypeExpression schema))) (tab ::: types)-  -> ByteString-renderTableTypeExpression (hc `As` tab)-  = (renderAlias tab <>)-  . parenthesized-  . commaSeparated-  . flip appEndo []-  . hcfoldMap-    (Proxy :: Proxy Top)-    (\(ty `As` name) -> Endo-      ((renderAlias name <+> renderTypeExpression ty):))-  $ hc+jsonbPopulateRecordSet+  :: TypeExpression schema (nullity ('PGcomposite row)) -- ^ row type+  -> Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -- ^ jsonb array+  -> Query schema params row+jsonbPopulateRecordSet = unsafePopulateFunction "jsonb_populate_record_set" -unsafeTableAliasedFromClauseExpression-  :: All Top types-  => Expression schema' relations' grouping' params' ty'-  -> Aliased (NP (Aliased (TypeExpression schema))) (tab ::: types)-  -> FromClause schema params '[alias ::: types]-unsafeTableAliasedFromClauseExpression expr types = UnsafeFromClause-  (renderExpression expr-   <+> "AS"-   <+> renderTableTypeExpression types)+unsafeRecordFunction+  :: (SListI record, json `In` PGJsonType)+  => ByteString+  -> Expression schema '[] 'Ungrouped params (nullity json)+  -> NP (Aliased (TypeExpression schema)) record+  -> Query schema params record+unsafeRecordFunction fun expr types = UnsafeQuery $+  "SELECT * FROM " <> fun <> "("+    <> renderExpression expr <> ")"+    <+> "AS" <+> "x" <> parenthesized (renderCommaSeparated renderTy types)+    where+      renderTy :: Aliased (TypeExpression schema) ty -> ByteString+      renderTy (ty `As` alias) =+        renderAlias alias <+> renderTypeExpression ty --- | Builds an arbitrary record from a JSON object. As with all functions--- returning record, the caller must explicitly define the structure of the--- record with an AS clause.-jsonToRecordAs-  :: All Top types-  => Expression schema '[] 'Ungrouped params (nullity 'PGjson)-  -> Aliased (NP (Aliased (TypeExpression schema))) (tab ::: types)-  -> FromClause schema params '[tab ::: types]-jsonToRecordAs expr types =-  unsafeTableAliasedFromClauseExpression-  (unsafeFunction "json_to_record" expr)-  types+-- | Builds an arbitrary record from a JSON object.+jsonToRecord+  :: SListI record+  => Expression schema '[] 'Ungrouped params (nullity 'PGjson) -- ^ json object+  -> NP (Aliased (TypeExpression schema)) record -- ^ record types+  -> Query schema params record+jsonToRecord = unsafeRecordFunction "json_to_record" --- | Builds an arbitrary record from a binary JSON object. As with all functions--- returning record, the caller must explicitly define the structure of the--- record with an AS clause.-jsonbToRecordAs-  :: All Top types-  => Expression schema '[] 'Ungrouped params (nullity 'PGjsonb)-  -> Aliased (NP (Aliased (TypeExpression schema))) (tab ::: types)-  -> FromClause schema params '[tab ::: types]-jsonbToRecordAs expr types =-  unsafeTableAliasedFromClauseExpression-  (unsafeFunction "jsonb_to_record" expr)-  types+-- | Builds an arbitrary record from a binary JSON object.+jsonbToRecord+  :: SListI record+  => Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -- ^ jsonb object+  -> NP (Aliased (TypeExpression schema)) record -- ^ record types+  -> Query schema params record+jsonbToRecord = unsafeRecordFunction "jsonb_to_record" --- | Builds an arbitrary set of records from a JSON array of objects (see note--- below). As with all functions returning record, the caller must explicitly--- define the structure of the record with an AS clause.-jsonToRecordSetAs-  :: All Top types-  => Expression schema '[] 'Ungrouped params (nullity 'PGjson)-  -> Aliased (NP (Aliased (TypeExpression schema))) (tab ::: types)-  -> FromClause schema params '[tab ::: types]-jsonToRecordSetAs expr types =-  unsafeTableAliasedFromClauseExpression-  (unsafeFunction "json_to_recordset" expr)-  types+-- | Builds an arbitrary set of records from a JSON array of objects.+jsonToRecordSet+  :: SListI record+  => Expression schema '[] 'Ungrouped params (nullity 'PGjson) -- ^ json array+  -> NP (Aliased (TypeExpression schema)) record -- ^ record types+  -> Query schema params record+jsonToRecordSet = unsafeRecordFunction "json_to_record_set" --- | Builds an arbitrary set of records from a binary JSON array of objects (see--- note below). As with all functions returning record, the caller must--- explicitly define the structure of the record with an AS clause.-jsonbToRecordSetAs-  :: All Top types-  => Expression schema '[] 'Ungrouped params (nullity 'PGjsonb)-  -> Aliased (NP (Aliased (TypeExpression schema))) (tab ::: types)-  -> FromClause schema params '[tab ::: types]-jsonbToRecordSetAs expr types =-  unsafeTableAliasedFromClauseExpression-  (unsafeFunction "jsonb_to_recordset" expr)-  types+-- | Builds an arbitrary set of records from a binary JSON array of objects.+jsonbToRecordSet+  :: SListI record+  => Expression schema '[] 'Ungrouped params (nullity 'PGjsonb) -- ^ jsonb array+  -> NP (Aliased (TypeExpression schema)) record -- ^ record types+  -> Query schema params record+jsonbToRecordSet = unsafeRecordFunction "jsonb_to_record_set"  {----------------------------------------- FROM clauses@@ -835,7 +853,7 @@ A `FromClause` can be a table name, or a derived table such as a subquery, a @JOIN@ construct, or complex combinations of these. -}-newtype FromClause schema params relations+newtype FromClause schema params from   = UnsafeFromClause { renderFromClause :: ByteString }   deriving (GHC.Generic,Show,Eq,Ord,NFData) @@ -843,7 +861,7 @@ table   :: Has tab schema ('Table table)   => Aliased Alias (alias ::: tab)-  -> FromClause schema params '[alias ::: TableToRelation table]+  -> FromClause schema params '[alias ::: TableToRow table] table (tab `As` alias) = UnsafeFromClause $   renderAlias tab <+> "AS" <+> renderAlias alias @@ -855,9 +873,9 @@  -- | `view` derives a table from a `View`. view-  :: Has view schema ('View rel)+  :: Has view schema ('View row)   => Aliased Alias (alias ::: view)-  -> FromClause schema params '[alias ::: rel]+  -> FromClause schema params '[alias ::: row] view (vw `As` alias) = UnsafeFromClause $   renderAlias vw <+> "AS" <+> renderAlias alias @@ -903,7 +921,7 @@   -- ^ @on@ condition   -> FromClause schema params left   -- ^ left-  -> FromClause schema params (Join left (NullifyRelations right))+  -> FromClause schema params (Join left (NullifyFrom right)) leftOuterJoin right on left = UnsafeFromClause $   renderFromClause left <+> "LEFT OUTER JOIN" <+> renderFromClause right   <+> "ON" <+> renderExpression on@@ -921,7 +939,7 @@   -- ^ @on@ condition   -> FromClause schema params left   -- ^ left-  -> FromClause schema params (Join (NullifyRelations left) right)+  -> FromClause schema params (Join (NullifyFrom left) right) rightOuterJoin right on left = UnsafeFromClause $   renderFromClause left <+> "RIGHT OUTER JOIN" <+> renderFromClause right   <+> "ON" <+> renderExpression on@@ -941,7 +959,7 @@   -> FromClause schema params left   -- ^ left   -> FromClause schema params-      (Join (NullifyRelations left) (NullifyRelations right))+      (Join (NullifyFrom left) (NullifyFrom right)) fullOuterJoin right on left = UnsafeFromClause $   renderFromClause left <+> "FULL OUTER JOIN" <+> renderFromClause right   <+> "ON" <+> renderExpression on@@ -956,20 +974,20 @@ -- column @col@; otherwise @By2 (\#tab \! \#col)@ will reference a table -- qualified column @tab.col@. data By-    (relations :: RelationsType)+    (from :: FromType)     (by :: (Symbol,Symbol)) where     By1-      :: (HasUnique relation relations columns, Has column columns ty)+      :: (HasUnique table from columns, Has column columns ty)       => Alias column-      -> By relations '(relation, column)+      -> By from '(table, column)     By2-      :: (Has relation relations columns, Has column columns ty)-      => Alias relation+      :: (Has table from columns, Has column columns ty)+      => Alias table       -> Alias column-      -> By relations '(relation, column)-deriving instance Show (By relations by)-deriving instance Eq (By relations by)-deriving instance Ord (By relations by)+      -> By from '(table, column)+deriving instance Show (By from by)+deriving instance Eq (By from by)+deriving instance Ord (By from by)  instance (HasUnique rel rels cols, Has col cols ty, by ~ '(rel, col))   => IsLabel col (By rels by) where fromLabel = By1 fromLabel@@ -982,7 +1000,7 @@     rel ! col = By2 rel col :* Nil  -- | Renders a `By`.-renderBy :: By relations by -> ByteString+renderBy :: By from by -> ByteString renderBy = \case   By1 column -> renderAlias column   By2 rel column -> renderAlias rel <> "." <> renderAlias column@@ -993,15 +1011,15 @@ -- done on @NoGroups@ while all output `Expression`s must be aggregated -- in @Group Nil@. In general, all output `Expression`s in the -- complement of @bys@ must be aggregated in @Group bys@.-data GroupByClause relations grouping where-  NoGroups :: GroupByClause relations 'Ungrouped+data GroupByClause from grouping where+  NoGroups :: GroupByClause from 'Ungrouped   Group     :: SListI bys-    => NP (By relations) bys-    -> GroupByClause relations ('Grouped bys)+    => NP (By from) bys+    -> GroupByClause from ('Grouped bys)  -- | Renders a `GroupByClause`.-renderGroupByClause :: GroupByClause relations grouping -> ByteString+renderGroupByClause :: GroupByClause from grouping -> ByteString renderGroupByClause = \case   NoGroups -> ""   Group Nil -> ""@@ -1011,17 +1029,17 @@ -- An `Ungrouped` `TableExpression` may only use `NoHaving` while a `Grouped` -- `TableExpression` must use `Having` whose conditions are combined with -- `.&&`.-data HavingClause schema relations grouping params where-  NoHaving :: HavingClause schema relations 'Ungrouped params+data HavingClause schema from grouping params where+  NoHaving :: HavingClause schema from 'Ungrouped params   Having-    :: [Condition schema relations ('Grouped bys) params]-    -> HavingClause schema relations ('Grouped bys) params-deriving instance Show (HavingClause schema relations grouping params)-deriving instance Eq (HavingClause schema relations grouping params)-deriving instance Ord (HavingClause schema relations grouping params)+    :: [Condition schema from ('Grouped bys) params]+    -> HavingClause schema from ('Grouped bys) params+deriving instance Show (HavingClause schema from grouping params)+deriving instance Eq (HavingClause schema from grouping params)+deriving instance Ord (HavingClause schema from grouping params)  -- | Render a `HavingClause`.-renderHavingClause :: HavingClause schema relations grouping params -> ByteString+renderHavingClause :: HavingClause schema from grouping params -> ByteString renderHavingClause = \case   NoHaving -> ""   Having [] -> ""@@ -1040,29 +1058,29 @@ -- `AscNullsLast`, `DescNullsFirst` and `DescNullsLast` options are used to -- determine whether nulls appear before or after non-null values in the sort -- ordering of a `Null` result column.-data SortExpression schema relations grouping params where+data SortExpression schema from grouping params where     Asc-      :: Expression schema relations grouping params ('NotNull ty)-      -> SortExpression schema relations grouping params+      :: Expression schema from grouping params ('NotNull ty)+      -> SortExpression schema from grouping params     Desc-      :: Expression schema relations grouping params ('NotNull ty)-      -> SortExpression schema relations grouping params+      :: Expression schema from grouping params ('NotNull ty)+      -> SortExpression schema from grouping params     AscNullsFirst-      :: Expression schema relations grouping params  ('Null ty)-      -> SortExpression schema relations grouping params+      :: Expression schema from grouping params  ('Null ty)+      -> SortExpression schema from grouping params     AscNullsLast-      :: Expression schema relations grouping params  ('Null ty)-      -> SortExpression schema relations grouping params+      :: Expression schema from grouping params  ('Null ty)+      -> SortExpression schema from grouping params     DescNullsFirst-      :: Expression schema relations grouping params  ('Null ty)-      -> SortExpression schema relations grouping params+      :: Expression schema from grouping params  ('Null ty)+      -> SortExpression schema from grouping params     DescNullsLast-      :: Expression schema relations grouping params  ('Null ty)-      -> SortExpression schema relations grouping params-deriving instance Show (SortExpression schema relations grouping params)+      :: Expression schema from grouping params  ('Null ty)+      -> SortExpression schema from grouping params+deriving instance Show (SortExpression schema from grouping params)  -- | Render a `SortExpression`.-renderSortExpression :: SortExpression schema relations grouping params -> ByteString+renderSortExpression :: SortExpression schema from grouping params -> ByteString renderSortExpression = \case   Asc expression -> renderExpression expression <+> "ASC"   Desc expression -> renderExpression expression <+> "DESC"@@ -1072,3 +1090,326 @@     <+> "DESC NULLS FIRST"   AscNullsLast expression -> renderExpression expression <+> "ASC NULLS LAST"   DescNullsLast expression -> renderExpression expression <+> "DESC NULLS LAST"++unsafeSubqueryExpression+  :: ByteString+  -> Expression schema from grp params ty+  -> Query schema params '[alias ::: ty]+  -> Expression schema from grp params (nullity 'PGbool)+unsafeSubqueryExpression op x q = UnsafeExpression $+  renderExpression x <+> op <+> parenthesized (renderQuery q)++unsafeRowSubqueryExpression+  :: SListI row+  => ByteString+  -> NP (Aliased (Expression schema from grp params)) row+  -> Query schema params row+  -> Expression schema from grp params (nullity 'PGbool)+unsafeRowSubqueryExpression op xs q = UnsafeExpression $+  renderExpression (row xs) <+> op <+> parenthesized (renderQuery q)++-- | The right-hand side is a sub`Query`, which must return exactly one column.+-- The left-hand expression is evaluated and compared to each row of the+-- sub`Query` result. The result of `in_` is `true` if any equal subquery row is found.+-- The result is `false` if no equal row is found+-- (including the case where the subquery returns no rows).+--+-- >>> printSQL $ true `in_` values_ (true `as` #foo)+-- TRUE IN (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+in_+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+in_ = unsafeSubqueryExpression "IN"++{- | The left-hand side of this form of `rowIn` is a row constructor.+The right-hand side is a sub`Query`,+which must return exactly as many columns as+there are expressions in the left-hand row.+The left-hand expressions are evaluated and compared row-wise to each row+of the subquery result. The result of `rowIn`+is `true` if any equal subquery row is found.+The result is `false` if no equal row is found+(including the case where the subquery returns no rows).++>>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+>>> printSQL $ myRow `rowIn` values_ myRow+ROW(1, FALSE) IN (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+-}+rowIn+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowIn = unsafeRowSubqueryExpression "IN"++-- | >>> printSQL $ true `eqAll` values_ (true `as` #foo)+-- TRUE = ALL (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+eqAll+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+eqAll = unsafeSubqueryExpression "= ALL"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowEqAll` values_ myRow+-- ROW(1, FALSE) = ALL (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowEqAll+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowEqAll = unsafeRowSubqueryExpression "= ALL"++-- | >>> printSQL $ true `eqAny` values_ (true `as` #foo)+-- TRUE = ANY (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+eqAny+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+eqAny = unsafeSubqueryExpression "= ANY"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowEqAny` values_ myRow+-- ROW(1, FALSE) = ANY (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowEqAny+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowEqAny = unsafeRowSubqueryExpression "= ANY"++-- | >>> printSQL $ true `neqAll` values_ (true `as` #foo)+-- TRUE <> ALL (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+neqAll+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+neqAll = unsafeSubqueryExpression "<> ALL"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowNeqAll` values_ myRow+-- ROW(1, FALSE) <> ALL (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowNeqAll+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowNeqAll = unsafeRowSubqueryExpression "<> ALL"++-- | >>> printSQL $ true `neqAny` values_ (true `as` #foo)+-- TRUE <> ANY (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+neqAny+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+neqAny = unsafeSubqueryExpression "<> ANY"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowNeqAny` values_ myRow+-- ROW(1, FALSE) <> ANY (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowNeqAny+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowNeqAny = unsafeRowSubqueryExpression "<> ANY"++-- | >>> printSQL $ true `allLt` values_ (true `as` #foo)+-- TRUE ALL < (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+allLt+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+allLt = unsafeSubqueryExpression "ALL <"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowLtAll` values_ myRow+-- ROW(1, FALSE) ALL < (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowLtAll+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowLtAll = unsafeRowSubqueryExpression "ALL <"++-- | >>> printSQL $ true `ltAny` values_ (true `as` #foo)+-- TRUE ANY < (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+ltAny+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+ltAny = unsafeSubqueryExpression "ANY <"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowLtAll` values_ myRow+-- ROW(1, FALSE) ALL < (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowLtAny+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowLtAny = unsafeRowSubqueryExpression "ANY <"++-- | >>> printSQL $ true `lteAll` values_ (true `as` #foo)+-- TRUE <= ALL (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+lteAll+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+lteAll = unsafeSubqueryExpression "<= ALL"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowLteAll` values_ myRow+-- ROW(1, FALSE) <= ALL (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowLteAll+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowLteAll = unsafeRowSubqueryExpression "<= ALL"++-- | >>> printSQL $ true `lteAny` values_ (true `as` #foo)+-- TRUE <= ANY (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+lteAny+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+lteAny = unsafeSubqueryExpression "<= ANY"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowLteAny` values_ myRow+-- ROW(1, FALSE) <= ANY (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowLteAny+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowLteAny = unsafeRowSubqueryExpression "<= ANY"++-- | >>> printSQL $ true `gtAll` values_ (true `as` #foo)+-- TRUE > ALL (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+gtAll+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+gtAll = unsafeSubqueryExpression "> ALL"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowGtAll` values_ myRow+-- ROW(1, FALSE) > ALL (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowGtAll+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowGtAll = unsafeRowSubqueryExpression "> ALL"++-- | >>> printSQL $ true `gtAny` values_ (true `as` #foo)+-- TRUE > ANY (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+gtAny+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+gtAny = unsafeSubqueryExpression "> ANY"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowGtAny` values_ myRow+-- ROW(1, FALSE) > ANY (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowGtAny+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowGtAny = unsafeRowSubqueryExpression "> ANY"++-- | >>> printSQL $ true `gteAll` values_ (true `as` #foo)+-- TRUE >= ALL (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+gteAll+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+gteAll = unsafeSubqueryExpression ">= ALL"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowGteAll` values_ myRow+-- ROW(1, FALSE) >= ALL (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowGteAll+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowGteAll = unsafeRowSubqueryExpression ">= ALL"++-- | >>> printSQL $ true `gteAny` values_ (true `as` #foo)+-- TRUE >= ANY (SELECT * FROM (VALUES (TRUE)) AS t ("foo"))+gteAny+  :: Expression schema from grp params ty -- ^ expression+  -> Query schema params '[alias ::: ty] -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+gteAny = unsafeSubqueryExpression ">= ANY"++-- | >>> let myRow = 1 `as` #foo :* false `as` #bar :: NP (Aliased (Expression '[] '[] 'Ungrouped '[])) '["foo" ::: 'NotNull 'PGint2, "bar" ::: 'NotNull 'PGbool]+-- >>> printSQL $ myRow `rowGteAny` values_ myRow+-- ROW(1, FALSE) >= ANY (SELECT * FROM (VALUES (1, FALSE)) AS t ("foo", "bar"))+rowGteAny+  :: SListI row+  => NP (Aliased (Expression schema from grp params)) row -- ^ row constructor+  -> Query schema params row -- ^ subquery+  -> Expression schema from grp params (nullity 'PGbool)+rowGteAny = unsafeRowSubqueryExpression ">= ANY"++-- | A `CommonTableExpression` is an auxiliary statement in a `with` clause.+data CommonTableExpression statement+  (params :: [NullityType])+  (schema0 :: SchemaType)+  (schema1 :: SchemaType) where+  CommonTableExpression+    :: Aliased (statement schema params) (alias ::: cte)+    -> CommonTableExpression+      statement params schema (alias ::: 'View cte ': schema)+instance (KnownSymbol alias, schema1 ~ (alias ::: 'View cte ': schema))+  => Aliasable alias+    (statement schema params cte)+    (CommonTableExpression statement params schema schema1) where+      statement `as` alias = CommonTableExpression (statement `as` alias)+instance (KnownSymbol alias, schema1 ~ (alias ::: 'View cte ': schema))+  => Aliasable alias (statement schema params cte)+    (AlignedList (CommonTableExpression statement params) schema schema1) where+      statement `as` alias = single (statement `as` alias)++-- | render a `CommonTableExpression`.+renderCommonTableExpression+  :: (forall sch ps row. statement ps sch row -> ByteString) -- ^ render statement+  -> CommonTableExpression statement params schema0 schema1 -> ByteString+renderCommonTableExpression renderStatement+  (CommonTableExpression (statement `As` alias)) =+    renderAlias alias <+> "AS" <+> parenthesized (renderStatement statement)++-- | render a non-empty `AlignedList` of `CommonTableExpression`s.+renderCommonTableExpressions+  :: (forall sch ps row. statement ps sch row -> ByteString) -- ^ render statement+  -> CommonTableExpression statement params schema0 schema1+  -> AlignedList (CommonTableExpression statement params) schema1 schema2+  -> ByteString+renderCommonTableExpressions renderStatement cte ctes =+  renderCommonTableExpression renderStatement cte <> case ctes of+    Done           -> ""+    cte' :>> ctes' -> "," <+>+      renderCommonTableExpressions renderStatement cte' ctes'++-- | `with` provides a way to write auxiliary statements for use in a larger query.+-- These statements, referred to as `CommonTableExpression`s, can be thought of as+-- defining temporary tables that exist just for one query.+class With statement where+  with+    :: AlignedList (CommonTableExpression statement params) schema0 schema1+    -- ^ common table expressions+    -> statement schema1 params row+    -- ^ larger query+    -> statement schema0 params row+instance With Query where+  with Done query = query+  with (cte :>> ctes) query = UnsafeQuery $+    "WITH" <+> renderCommonTableExpressions renderQuery cte ctes+      <+> renderQuery query
src/Squeal/PostgreSQL/Render.hs view
@@ -9,12 +9,14 @@ -}  {-# LANGUAGE-    FlexibleContexts+    AllowAmbiguousTypes+  , FlexibleContexts   , MagicHash   , OverloadedStrings   , PolyKinds   , RankNTypes   , ScopedTypeVariables+  , TypeApplications #-}  module Squeal.PostgreSQL.Render@@ -28,6 +30,7 @@   , renderCommaSeparated   , renderCommaSeparatedMaybe   , renderNat+  , renderSymbol   , RenderSQL (..)   , printSQL   ) where@@ -51,6 +54,7 @@  -- | Concatenate two `ByteString`s with a space between. (<+>) :: ByteString -> ByteString -> ByteString+infixr 7 <+> str1 <+> str2 = str1 <> " " <> str2  -- | Comma separate a list of `ByteString`s.@@ -92,8 +96,12 @@   . hmap (K . render)  -- | Render a promoted `Nat`.-renderNat :: KnownNat n => proxy n -> ByteString-renderNat (_ :: proxy n) = fromString (show (natVal' (proxy# :: Proxy# n)))+renderNat :: forall n. KnownNat n => ByteString+renderNat = fromString (show (natVal' (proxy# :: Proxy# n)))++-- | Render a promoted `Symbol`.+renderSymbol :: forall s. KnownSymbol s => ByteString+renderSymbol = fromString (symbolVal' (proxy# :: Proxy# s))  -- | A class for rendering SQL class RenderSQL sql where
src/Squeal/PostgreSQL/Schema.hs view
@@ -20,6 +20,7 @@   , FlexibleInstances   , FunctionalDependencies   , GADTs+  , LambdaCase   , OverloadedStrings   , RankNTypes   , ScopedTypeVariables@@ -33,18 +34,24 @@ #-}  module Squeal.PostgreSQL.Schema-  ( -- * Types+  ( -- * Postgres Types     PGType (..)-  , HasOid (..)   , NullityType (..)+  , RowType+  , FromType+    -- * Haskell to Postgres Types+  , PG+  , NullPG+  , TuplePG+  , RowPG+  , Json (..)+  , Jsonb (..)+  , Composite (..)+  , Enumerated (..)+    -- * Schema Types   , ColumnType-    -- * Tables   , ColumnsType-  , RelationType-  , NilRelation-  , RelationsType   , TableType-    -- * Schema   , SchemumType (..)   , SchemaType     -- * Constraints@@ -52,7 +59,6 @@   , ColumnConstraint (..)   , TableConstraint (..)   , TableConstraints-  , NilTableConstraints   , Uniquely     -- * Aliases   , (:::)@@ -62,8 +68,6 @@   , Aliased (As)   , Aliasable (as)   , renderAliasedAs-  , AliasesOf-  , ZipAliased (..)   , Has   , HasUnique   , HasAll@@ -75,62 +79,48 @@   , PGlabel (..)   , renderLabel   , renderLabels+  , LabelsPG     -- * Grouping   , Grouping (..)   , GroupedBy-    -- * Type Families-  , Join-  , With+    -- * Aligned lists+  , AlignedList (..)+  , single+    -- * Data Definitions   , Create   , Drop   , Alter   , Rename+  , DropIfConstraintsInvolve+    -- * Lists+  , Join   , Elem   , In+  , Length+    -- * Type Classifications+  , HasOid (..)   , PGNum   , PGIntegral   , PGFloating   , PGTypeOf-  , PGarrayOf-  , PGarray-  , PGtextArray-  , SameTypes+  , PGArrayOf+  , PGArray+  , PGTextArray+  , PGJsonType+  , PGJsonKey   , SamePGType   , AllNotNull   , NotAllNull+    -- * Nullifications   , NullifyType-  , NullifyRelation-  , NullifyRelations-  , ColumnsToRelation+  , NullifyRow+  , NullifyFrom+    -- * Table Conversions   , TableToColumns-  , TableToRelation-  , RelationToRowType-  , RelationToNullityTypes-  , ConstraintInvolves-  , DropIfConstraintsInvolve-    -- ** JSON support-  , PGjson_-  , PGjsonKey-    -- * Embedding-  , PG-  , EnumFrom-  , LabelsFrom-  , CompositeFrom-  , FieldNamesFrom-  , FieldTypesFrom-  , ConstructorsOf-  , ConstructorNameOf-  , ConstructorNamesOf-  , FieldsOf-  , FieldNameOf-  , FieldNamesOf-  , FieldTypeOf-  , FieldTypesOf-  , RecordCodeOf-  , MapMaybes (..)-  , Nulls+  , TableToRow   ) where +import Control.Category import Control.DeepSeq import Data.Aeson (Value) import Data.ByteString (ByteString)@@ -144,10 +134,13 @@ import Data.Word (Word16, Word32, Word64) import Data.Type.Bool import Data.UUID.Types (UUID)+import Data.Vector (Vector) import Generics.SOP+import Generics.SOP.Record import GHC.OverloadedLabels import GHC.TypeLits import Network.IP.Addr+import Prelude hiding (id, (.))  import qualified Data.ByteString.Lazy as Lazy import qualified Data.Text.Lazy as Lazy@@ -183,10 +176,10 @@   | PGinet -- ^ IPv4 or IPv6 host address   | PGjson -- ^	textual JSON data   | PGjsonb -- ^ binary JSON data, decomposed-  | PGvararray PGType -- ^ variable length array-  | PGfixarray Nat PGType -- ^ fixed length array-  | PGenum [Symbol]-  | PGcomposite [(Symbol, PGType)]+  | PGvararray NullityType -- ^ variable length array+  | PGfixarray Nat NullityType -- ^ fixed length array+  | PGenum [Symbol] -- ^ enumerated (enum) types are data types that comprise a static, ordered set of values.+  | PGcomposite RowType -- ^ a composite type represents the structure of a row or record; it is essentially just a list of field names and their data types.   | UnsafePGType Symbol -- ^ an escape hatch for unsupported PostgreSQL types  -- | The object identifier of a `PGType`.@@ -283,9 +276,6 @@  -- | A `TableConstraints` is a row of `TableConstraint`s. type TableConstraints = [(Symbol,TableConstraint)]--- | A monokinded empty `TableConstraints`.-type family NilTableConstraints :: TableConstraints where-  NilTableConstraints = '[]  -- | A `ForeignKey` must reference columns that either are -- a `PrimaryKey` or form a `Unique` constraint.@@ -309,36 +299,39 @@ -- :} type TableType = (TableConstraints,ColumnsType) --- | `RelationType` is a row of `NullityType`------ >>> :{--- type family PersonRelation :: RelationType where---   PersonRelation =---     '[ "name"        ::: 'NotNull 'PGtext---      , "age"         ::: 'NotNull 'PGint4---      , "dateOfBirth" :::    'Null 'PGdate---      ]--- :}-type RelationType = [(Symbol,NullityType)]--- | A monokinded empty `RelationType`.-type family NilRelation :: RelationType where NilRelation = '[]+{- | A `RowType` is a row of `NullityType`. They correspond to Haskell+record types by means of `RowPG` and are used in many places. --- | `RelationsType` is a row of `RelationType`s, thought of as a product.-type RelationsType = [(Symbol,RelationType)]+>>> :{+type family PersonRow :: RowType where+  PersonRow =+    '[ "name"        ::: 'NotNull 'PGtext+     , "age"         ::: 'NotNull 'PGint4+     , "dateOfBirth" :::    'Null 'PGdate+     ]+:}+-}+type RowType = [(Symbol,NullityType)] --- | `ColumnsToRelation` removes column constraints.-type family ColumnsToRelation (columns :: ColumnsType) :: RelationType where-  ColumnsToRelation '[] = '[]-  ColumnsToRelation (column ::: constraint :=> ty ': columns) =-    column ::: ty ': ColumnsToRelation columns+{- | `FromType` is a row of `RowType`s. It can be thought of as+a product, or horizontal gluing and is used in `Squeal.PostgreSQL.Query.FromClause`s+and `Squeal.PostgreSQL.Query.TableExpression`s.+-}+type FromType = [(Symbol,RowType)] +-- | `ColumnsToRow` removes column constraints.+type family ColumnsToRow (columns :: ColumnsType) :: RowType where+  ColumnsToRow '[] = '[]+  ColumnsToRow (column ::: constraint :=> ty ': columns) =+    column ::: ty ': ColumnsToRow columns+ -- | `TableToColumns` removes table constraints. type family TableToColumns (table :: TableType) :: ColumnsType where   TableToColumns (constraints :=> columns) = columns --- | Convert a table to a relation.-type family TableToRelation (table :: TableType) :: RelationType where-  TableToRelation tab = ColumnsToRelation (TableToColumns tab)+-- | Convert a table to a row type.+type family TableToRow (table :: TableType) :: RowType where+  TableToRow tab = ColumnsToRow (TableToColumns tab)  -- | `Grouping` is an auxiliary namespace, created by -- @GROUP BY@ clauses (`Squeal.PostgreSQL.Query.group`), and used@@ -351,15 +344,15 @@ a member of the auxiliary namespace created by @GROUP BY@ clauses and thus, may be called in an output `Squeal.PostgreSQL.Expression.Expression` without aggregating. -}-class (KnownSymbol relation, KnownSymbol column)-  => GroupedBy relation column bys where-instance {-# OVERLAPPING #-} (KnownSymbol relation, KnownSymbol column)-  => GroupedBy relation column ('(table,column) ': bys)+class (KnownSymbol table, KnownSymbol column)+  => GroupedBy table column bys where+instance {-# OVERLAPPING #-} (KnownSymbol table, KnownSymbol column)+  => GroupedBy table column ('(table,column) ': bys) instance {-# OVERLAPPABLE #-}-  ( KnownSymbol relation+  ( KnownSymbol table   , KnownSymbol column-  , GroupedBy relation column bys-  ) => GroupedBy relation column (tabcol ': bys)+  , GroupedBy table column bys+  ) => GroupedBy table column (tabcol ': bys)  -- | `Alias`es are proxies for a type level string or `Symbol` -- and have an `IsLabel` instance so that with @-XOverloadedLabels@@@ -420,7 +413,7 @@   | aliased -> expression   , aliased -> alias   where as :: expression -> Alias alias -> aliased-instance (alias ~ alias1, KnownSymbol alias) => Aliasable alias+instance (KnownSymbol alias, alias ~ alias1) => Aliasable alias   (expression ty)   (Aliased expression (alias1 ::: ty))     where@@ -441,41 +434,6 @@ renderAliasedAs render (expression `As` alias) =   render expression <> " AS " <> renderAlias alias --- | `AliasesOf` retains the AliasesOf in a row.-type family AliasesOf aliaseds where-  AliasesOf '[] = '[]-  AliasesOf (alias ::: ty ': tys) = alias ': AliasesOf tys---- | The `ZipAliased` class provides a type family for zipping--- `Symbol` lists together with arbitrary lists of the same size,--- with an associated type family `ZipAs`, together with--- a method `zipAs` for zipping heterogeneous lists of `Alias`es--- together with a heterogeneous list of expressions into--- a heterogeneous list of `Aliased` expressions.-class-  ( SListI (ZipAs ns xs)-  , All KnownSymbol ns-  ) => ZipAliased ns xs where--  type family ZipAs-    (ns :: [Symbol]) (xs :: [k]) = (zs :: [(Symbol,k)]) | zs -> ns xs--  zipAs-    :: NP Alias ns-    -> NP expr xs-    -> NP (Aliased expr) (ZipAs ns xs)--instance ZipAliased '[] '[] where-  type ZipAs '[] '[] = '[]-  zipAs Nil Nil = Nil--instance-  ( KnownSymbol n-  , ZipAliased ns xs-  ) => ZipAliased (n ': ns) (x ': xs) where-  type ZipAs (n ': ns) (x ': xs) = '(n,x) ': ZipAs ns xs-  zipAs (n :* ns) (x :* xs) = x `As` n :* zipAs ns xs- -- | @HasUnique alias fields field@ is a constraint that proves that -- @fields@ is a singleton of @alias ::: field@. type HasUnique alias fields field = fields ~ '[alias ::: field]@@ -522,21 +480,15 @@ -- | @In x xs@ is a constraint that proves that @x@ is in @xs@. type family In x xs :: Constraint where In x xs = Elem x xs ~ 'True --- | `PGNum` is a constraint on `PGType` whose--- `Squeal.PostgreSQL.Expression.Expression`s have a `Num` constraint.-type PGNum ty =-  In ty '[ 'PGint2, 'PGint4, 'PGint8, 'PGnumeric, 'PGfloat4, 'PGfloat8]+-- | Numeric Postgres types.+type PGNum =+  '[ 'PGint2, 'PGint4, 'PGint8, 'PGnumeric, 'PGfloat4, 'PGfloat8] --- | `PGFloating` is a constraint on `PGType` whose--- `Squeal.PostgreSQL.Expression.Expression`s--- have `Fractional` and `Floating` constraints.-type PGFloating ty = In ty '[ 'PGfloat4, 'PGfloat8, 'PGnumeric]+-- | Floating Postgres types.+type PGFloating = '[ 'PGfloat4, 'PGfloat8, 'PGnumeric] --- | `PGIntegral` is a constraint on `PGType` whose--- `Squeal.PostgreSQL.Expression.Expression`s--- have `Squeal.PostgreSQL.Expression.div_` and--- `Squeal.PostgreSQL.Expression.mod_` functions.-type PGIntegral ty = In ty '[ 'PGint2, 'PGint4, 'PGint8]+-- | Integral Postgres types.+type PGIntegral = '[ 'PGint2, 'PGint4, 'PGint8]  -- | Error message helper for displaying unavailable\/unknown\/placeholder type -- variables whose kind is known.@@ -547,40 +499,32 @@ type ErrPGvararrayOf t = ErrArrayOf ('ShowType 'PGvararray) t  -- | Ensure a type is a valid array type.-type family PGarray name arr :: Constraint where-  PGarray name ('PGvararray x) = ()-  PGarray name ('PGfixarray n x) = ()-  PGarray name val = TypeError-    ('Text name :<>: 'Text ": Unsatisfied PGarray constraint. Expected either: "+type family PGArray name arr :: Constraint where+  PGArray name ('PGvararray x) = ()+  PGArray name ('PGfixarray n x) = ()+  PGArray name val = TypeError+    ('Text name :<>: 'Text ": Unsatisfied PGArray constraint. Expected either: "      :$$: 'Text " • " :<>: ErrPGvararrayOf (Placeholder PGType)      :$$: 'Text " • " :<>: ErrPGfixarrayOf (Placeholder PGType)      :$$: 'Text "But got: " :<>: 'ShowType val)  -- | Ensure a type is a valid array type with a specific element type.-type family PGarrayOf name arr ty :: Constraint where-  PGarrayOf name ('PGvararray x) ty = x ~ ty-  PGarrayOf name ('PGfixarray n x) ty = x ~ ty-  PGarrayOf name val ty = TypeError-    ( 'Text name :<>: 'Text "Unsatisfied PGarrayOf constraint. Expected either: "+type family PGArrayOf name arr ty :: Constraint where+  PGArrayOf name ('PGvararray x) ty = x ~ ty+  PGArrayOf name ('PGfixarray n x) ty = x ~ ty+  PGArrayOf name val ty = TypeError+    ( 'Text name :<>: 'Text "Unsatisfied PGArrayOf constraint. Expected either: "       :$$: 'Text " • " :<>: ErrPGvararrayOf ( 'ShowType ty )       :$$: 'Text " • " :<>: ErrPGfixarrayOf ( 'ShowType ty )       :$$: 'Text "But got: " :<>: 'ShowType val)  -- | Ensure a type is a valid array type whose elements are text.-type PGtextArray name arr = PGarrayOf name arr 'PGtext+type PGTextArray name arr = PGArrayOf name arr ('NotNull 'PGtext)  -- | `PGTypeOf` forgets about @NULL@ and any column constraints. type family PGTypeOf (ty :: NullityType) :: PGType where   PGTypeOf (nullity pg) = pg --- | `SameTypes` is a constraint that proves two `ColumnsType`s have the same--- length and the same `ColumnType`s.-type family SameTypes (columns0 :: ColumnsType) (columns1 :: ColumnsType)-  :: Constraint where-  SameTypes '[] '[] = ()-  SameTypes (column0 ::: def0 :=> ty0 ': columns0) (column1 ::: def1 :=> ty1 ': columns1)-    = (ty0 ~ ty1, SameTypes columns0 columns1)- -- | Equality constraint on the underlying `PGType` of two columns. class SamePGType   (ty0 :: (Symbol,ColumnType)) (ty1 :: (Symbol,ColumnType)) where@@ -599,34 +543,24 @@   NotAllNull (column ::: def :=> 'NotNull ty ': columns) = ()   NotAllNull (column ::: def :=> 'Null ty ': columns) = NotAllNull columns --- | `NullifyType` is an idempotent that nullifies a `ColumnType`.+-- | `NullifyType` is an idempotent that nullifies a `NullityType`. type family NullifyType (ty :: NullityType) :: NullityType where   NullifyType ('Null ty) = 'Null ty   NullifyType ('NotNull ty) = 'Null ty --- | `NullifyRelation` is an idempotent that nullifies a `ColumnsType`.-type family NullifyRelation (columns :: RelationType) :: RelationType where-  NullifyRelation '[] = '[]-  NullifyRelation (column ::: ty ': columns) =-    column ::: NullifyType ty ': NullifyRelation columns+-- | `NullifyRow` is an idempotent that nullifies a `RowType`.+type family NullifyRow (columns :: RowType) :: RowType where+  NullifyRow '[] = '[]+  NullifyRow (column ::: ty ': columns) =+    column ::: NullifyType ty ': NullifyRow columns --- | `NullifyRelations` is an idempotent that nullifies a `RelationsType`+-- | `NullifyFrom` is an idempotent that nullifies a `FromType` -- used to nullify the left or right hand side of an outer join -- in a `Squeal.PostgreSQL.Query.FromClause`.-type family NullifyRelations (tables :: RelationsType) :: RelationsType where-  NullifyRelations '[] = '[]-  NullifyRelations (table ::: columns ': tables) =-    table ::: NullifyRelation columns ': NullifyRelations tables---- | `RelationToRowType` drops the nullity constraints of its argument relations.-type family RelationToRowType (tables :: RelationType) :: [(Symbol, PGType)] where-  RelationToRowType (nullity x : xs) = x : RelationToRowType xs-  RelationToRowType '[] = '[]---- | `RelationToNullityTypes` drops the column constraints.-type family RelationToNullityTypes (rel :: RelationType) :: [NullityType] where-  RelationToNullityTypes ('(k, x) : xs) = x : RelationToNullityTypes xs-  RelationToNullityTypes '[]            = '[]+type family NullifyFrom (tables :: FromType) :: FromType where+  NullifyFrom '[] = '[]+  NullifyFrom (table ::: columns ': tables) =+    table ::: NullifyRow columns ': NullifyFrom tables  -- | `Join` is simply promoted `++` and is used in @JOIN@s in -- `Squeal.PostgreSQL.Query.FromClause`s.@@ -659,19 +593,6 @@   Alter alias x1 (alias ::: x0 ': xs) = alias ::: x1 ': xs   Alter alias x1 (x0 ': xs) = x0 ': Alter alias x1 xs --- type family AddConstraint constraint ty where---   AddConstraint constraint (constraints :=> ty)---     = AsSet (constraint ': constraints) :=> ty---- type family DeleteFromList (e :: elem) (list :: [elem]) where---   DeleteFromList elem '[] = '[]---   DeleteFromList elem (x ': xs) =---     If (Cmp elem x == 'EQ) xs (x ': DeleteFromList elem xs)---- type family DropConstraint constraint ty where---   DropConstraint constraint (constraints :=> ty)---     = (AsSet (DeleteFromList constraint constraints)) :=> ty- -- | @Rename alias0 alias1 xs@ replaces the alias @alias0@ by @alias1@ in @xs@ -- and is used in `Squeal.PostgreSQL.Definition.alterTableRename` and -- `Squeal.PostgreSQL.Definition.renameColumn`.@@ -679,26 +600,6 @@   Rename alias0 alias1 ((alias0 ::: x0) ': xs) = (alias1 ::: x0) ': xs   Rename alias0 alias1 (x ': xs) = x ': Rename alias0 alias1 xs --- | `MapMaybes` is used in the binary instances of composite types.-class MapMaybes xs where-  type family Maybes (xs :: [Type]) = (mxs :: [Type]) | mxs -> xs-  maybes :: NP Maybe xs -> NP I (Maybes xs)-  unMaybes :: NP I (Maybes xs) -> NP Maybe xs-instance MapMaybes '[] where-  type Maybes '[] = '[]-  maybes Nil = Nil-  unMaybes Nil = Nil-instance MapMaybes xs => MapMaybes (x ': xs) where-  type Maybes (x ': xs) = Maybe x ': Maybes xs-  maybes (x :* xs) = I x :* maybes xs-  unMaybes (I mx :* xs) = mx :* unMaybes xs---- | `Nulls` is used to construct a `Squeal.Postgresql.Expression.row`--- of a composite type.-type family Nulls tys where-  Nulls '[] = '[]-  Nulls (field ::: ty ': tys) = field ::: 'Null ty ': Nulls tys- -- | Check if a `TableConstraint` involves a column type family ConstraintInvolves column constraint where   ConstraintInvolves column ('Check columns) = column `Elem` columns@@ -715,25 +616,46 @@         (DropIfConstraintsInvolve column constraints)         (alias ::: constraint ': DropIfConstraintsInvolve column constraints) +{- | Calculate the `Length` of a type level list++>>> :kind! Length '[Char,String,Bool,Double]+Length '[Char,String,Bool,Double] :: Nat+= 4+-}+type family Length (xs :: [k]) :: Nat where+  Length (x : xs) = 1 + Length xs+  Length '[] = 0+ -- | A `SchemumType` is a user-defined type, either a `Table`, -- `View` or `Typedef`. data SchemumType   = Table TableType-  | View RelationType+  | View RowType   | Typedef PGType --- | The schema of a database consists of a list of aliased,--- user-defined `SchemumType`s.-type SchemaType = [(Symbol,SchemumType)]+{- | The schema of a database consists of a list of aliased,+user-defined `SchemumType`s. --- | Used in `Squeal.Postgresql.Manipulation.with`.-type family With-  (relations :: RelationsType)-  (schema :: SchemaType)-  :: SchemaType where-    With '[] schema = schema-    With (alias ::: rel ': rels) schema =-      alias ::: 'View rel ': With rels schema+>>> :{+type family Schema :: SchemaType where+  Schema =+    '[ "users" ::: 'Table (+        '[ "pk_users" ::: 'PrimaryKey '["id"] ] :=>+        '[ "id"   :::   'Def :=> 'NotNull 'PGint4+        , "name" ::: 'NoDef :=> 'NotNull 'PGtext+        ])+    , "emails" ::: 'Table (+        '[ "pk_emails"  ::: 'PrimaryKey '["id"]+        , "fk_user_id" ::: 'ForeignKey '["user_id"] "users" '["id"]+        ] :=>+        '[ "id"      :::   'Def :=> 'NotNull 'PGint4+        , "user_id" ::: 'NoDef :=> 'NotNull 'PGint4+        , "email"   ::: 'NoDef :=>    'Null 'PGtext+        ])+    ]+:}+-}+type SchemaType = [(Symbol,SchemumType)]  -- | `IsPGlabel` looks very much like the `IsLabel` class. Whereas -- the overloaded label, `fromLabel` is used for column references,@@ -749,105 +671,166 @@ -- | Renders a label renderLabel :: KnownSymbol label => proxy label -> ByteString renderLabel (_ :: proxy label) =-  "\'" <> fromString (symbolVal (Proxy @label)) <> "\'"+  "\'" <> renderSymbol @label <> "\'" -- | Renders a list of labels renderLabels   :: All KnownSymbol labels => NP PGlabel labels -> [ByteString] renderLabels = hcollapse   . hcmap (Proxy @KnownSymbol) (K . renderLabel) --- | The `PG` type family embeds a subset of Haskell types--- as Postgres basic types.------ >>> :kind! PG LocalTime--- PG LocalTime :: PGType--- = 'PGtimestamp-type family PG (hask :: Type) :: PGType where-  PG Bool = 'PGbool-  PG Int16 = 'PGint2-  PG Int32 = 'PGint4-  PG Int64 = 'PGint8-  PG Word16 = 'PGint2-  PG Word32 = 'PGint4-  PG Word64 = 'PGint8-  PG Scientific = 'PGnumeric-  PG Float = 'PGfloat4-  PG Double = 'PGfloat8-  PG Char = 'PGchar 1-  PG Text = 'PGtext-  PG Lazy.Text = 'PGtext-  PG ByteString = 'PGbytea-  PG Lazy.ByteString = 'PGbytea-  PG LocalTime = 'PGtimestamp-  PG UTCTime = 'PGtimestamptz-  PG Day = 'PGdate-  PG TimeOfDay = 'PGtime-  PG (TimeOfDay, TimeZone) = 'PGtimetz-  PG DiffTime = 'PGinterval-  PG UUID = 'PGuuid-  PG (NetAddr IP) = 'PGinet-  PG Value = 'PGjson-  PG ty = TypeError-    ('Text "There is no Postgres basic type for " ':<>: 'ShowType ty)+{- | The `PG` type family embeds a subset of Haskell types+as Postgres types. As an open type family, `PG` is extensible. --- | The `EnumFrom` type family embeds Haskell enum types, ADTs with--- nullary constructors, as Postgres enum types------ >>> data Schwarma = Beef | Lamb | Chicken deriving GHC.Generic--- >>> instance Generic Schwarma--- >>> instance HasDatatypeInfo Schwarma--- >>> :kind! EnumFrom Schwarma--- EnumFrom Schwarma :: PGType--- = 'PGenum '["Beef", "Lamb", "Chicken"]-type family EnumFrom (hask :: Type) :: PGType where-  EnumFrom hask = 'PGenum (LabelsFrom hask)+>>> :kind! PG LocalTime+PG LocalTime :: PGType+= 'PGtimestamp --- | The `LabelsFrom` type family calculates the constructors of a--- Haskell enum type.------ >>> data Schwarma = Beef | Lamb | Chicken deriving GHC.Generic--- >>> instance Generic Schwarma--- >>> instance HasDatatypeInfo Schwarma--- >>> :kind! LabelsFrom Schwarma--- LabelsFrom Schwarma :: [Type.ConstructorName]--- = '["Beef", "Lamb", "Chicken"]-type family LabelsFrom (hask :: Type) :: [Type.ConstructorName] where-  LabelsFrom hask =+>>> newtype MyDouble = My Double+>>> type instance PG MyDouble = 'PGfloat8+-}+type family PG (hask :: Type) :: PGType+type instance PG Bool = 'PGbool+type instance PG Int16 = 'PGint2+type instance PG Int32 = 'PGint4+type instance PG Int64 = 'PGint8+type instance PG Word16 = 'PGint2+type instance PG Word32 = 'PGint4+type instance PG Word64 = 'PGint8+type instance PG Scientific = 'PGnumeric+type instance PG Float = 'PGfloat4+type instance PG Double = 'PGfloat8+type instance PG Char = 'PGchar 1+type instance PG Text = 'PGtext+type instance PG Lazy.Text = 'PGtext+type instance PG String = 'PGtext+type instance PG ByteString = 'PGbytea+type instance PG Lazy.ByteString = 'PGbytea+type instance PG LocalTime = 'PGtimestamp+type instance PG UTCTime = 'PGtimestamptz+type instance PG Day = 'PGdate+type instance PG TimeOfDay = 'PGtime+type instance PG (TimeOfDay, TimeZone) = 'PGtimetz+type instance PG DiffTime = 'PGinterval+type instance PG UUID = 'PGuuid+type instance PG (NetAddr IP) = 'PGinet+type instance PG Value = 'PGjson+type instance PG (Json hask) = 'PGjson+type instance PG (Jsonb hask) = 'PGjsonb+type instance PG (Vector hask) = 'PGvararray (NullPG hask)+type instance PG (hask, hask) = 'PGfixarray 2 (NullPG hask)+type instance PG (hask, hask, hask) = 'PGfixarray 3 (NullPG hask)+type instance PG (hask, hask, hask, hask) = 'PGfixarray 4 (NullPG hask)+type instance PG (hask, hask, hask, hask, hask) = 'PGfixarray 5 (NullPG hask)+type instance PG (hask, hask, hask, hask, hask, hask)+  = 'PGfixarray 6 (NullPG hask)+type instance PG (hask, hask, hask, hask, hask, hask, hask)+  = 'PGfixarray 7 (NullPG hask)+type instance PG (hask, hask, hask, hask, hask, hask, hask, hask)+  = 'PGfixarray 8 (NullPG hask)+type instance PG (hask, hask, hask, hask, hask, hask, hask, hask, hask)+  = 'PGfixarray 9 (NullPG hask)+type instance PG (hask, hask, hask, hask, hask, hask, hask, hask, hask, hask)+  = 'PGfixarray 10 (NullPG hask)+type instance PG (Composite hask) = 'PGcomposite (RowPG hask)+type instance PG (Enumerated hask) = 'PGenum (LabelsPG hask)++{- | The `Json` newtype is an indication that the Haskell+type it's applied to should be stored as `PGjson`.+-}+newtype Json hask = Json {getJson :: hask}+  deriving (Eq, Ord, Show, Read, GHC.Generic)++{- | The `Jsonb` newtype is an indication that the Haskell+type it's applied to should be stored as `PGjsonb`.+-}+newtype Jsonb hask = Jsonb {getJsonb :: hask}+  deriving (Eq, Ord, Show, Read, GHC.Generic)++{- | The `Composite` newtype is an indication that the Haskell+type it's applied to should be stored as a `PGcomposite`.+-}+newtype Composite record = Composite {getComposite :: record}+  deriving (Eq, Ord, Show, Read, GHC.Generic)++{- | The `Enumerated` newtype is an indication that the Haskell+type it's applied to should be stored as `PGenum`.+-}+newtype Enumerated enum = Enumerated {getEnumerated :: enum}+  deriving (Eq, Ord, Show, Read, GHC.Generic)++{-| The `LabelsPG` type family calculates the constructors of a+Haskell enum type.++>>> data Schwarma = Beef | Lamb | Chicken deriving GHC.Generic+>>> instance Generic Schwarma+>>> instance HasDatatypeInfo Schwarma+>>> :kind! LabelsPG Schwarma+LabelsPG Schwarma :: [Type.ConstructorName]+= '["Beef", "Lamb", "Chicken"]+-}+type family LabelsPG (hask :: Type) :: [Type.ConstructorName] where+  LabelsPG hask =     ConstructorNamesOf (ConstructorsOf (DatatypeInfoOf hask)) --- | The `CompositeFrom` type family embeds Haskell record types as--- Postgres composite types, as long as the record fields--- are `Maybe`s of Haskell types that can be embedded as basic types--- with the `PG` type family.------ >>> data Row = Row { a :: Maybe Int16, b :: Maybe LocalTime } deriving GHC.Generic--- >>> instance Generic Row--- >>> instance HasDatatypeInfo Row--- >>> :kind! CompositeFrom Row--- CompositeFrom Row :: PGType--- = 'PGcomposite '['("a", 'PGint2), '("b", 'PGtimestamp)]-type family CompositeFrom (hask :: Type) :: PGType where-  CompositeFrom hask =-    'PGcomposite (ZipAs (FieldNamesFrom hask) (FieldTypesFrom hask))+{- | `RowPG` turns a Haskell record type into a `RowType`. --- | >>> data Row = Row { a :: Maybe Int16, b :: Maybe LocalTime } deriving GHC.Generic--- >>> instance Generic Row--- >>> instance HasDatatypeInfo Row--- >>> :kind! FieldNamesFrom Row--- FieldNamesFrom Row :: [Type.FieldName]--- = '["a", "b"]-type family FieldNamesFrom (hask :: Type) :: [Type.FieldName] where-  FieldNamesFrom hask = FieldNamesOf (FieldsOf (DatatypeInfoOf hask))+>>> data Person = Person { name :: Text, age :: Int32 } deriving GHC.Generic+>>> instance Generic Person+>>> instance HasDatatypeInfo Person+>>> :kind! RowPG Person+RowPG Person :: [(Symbol, NullityType)]+= '["name" ::: 'NotNull 'PGtext, "age" ::: 'NotNull 'PGint4]+-}+type family RowPG (hask :: Type) :: RowType where+  RowPG hask = RowOf (RecordCodeOf hask) --- | >>> data Row = Row { a :: Maybe Int16, b :: Maybe LocalTime } deriving GHC.Generic--- >>> instance Generic Row--- >>> instance HasDatatypeInfo Row--- >>> :kind! FieldTypesFrom Row--- FieldTypesFrom Row :: [PGType]--- = '['PGint2, 'PGtimestamp]-type family FieldTypesFrom (hask :: Type) :: [PGType] where-  FieldTypesFrom hask = FieldTypesOf (RecordCodeOf hask (Code hask))+type family RowOf (fields :: [(Symbol, Type)]) :: RowType where+  RowOf '[] = '[]+  RowOf (field ': fields) = FieldPG field ': RowOf fields +type family FieldPG (field :: (Symbol, Type)) :: (Symbol, NullityType) where+  FieldPG (field ::: hask) = field ::: NullPG hask++{- | `NullPG` turns a Haskell type into a `NullityType`.++>>> :kind! NullPG Double+NullPG Double :: NullityType+= 'NotNull 'PGfloat8+>>> :kind! NullPG (Maybe Double)+NullPG (Maybe Double) :: NullityType+= 'Null 'PGfloat8+-}+type family NullPG (hask :: Type) :: NullityType where+  NullPG (Maybe hask) = 'Null (PG hask)+  NullPG hask = 'NotNull (PG hask)++{- | `TuplePG` turns a Haskell tuple type (including record types) into+the corresponding list of `NullityType`s.++>>> :kind! TuplePG (Double, Maybe Char)+TuplePG (Double, Maybe Char) :: [NullityType]+= '['NotNull 'PGfloat8, 'Null ('PGchar 1)]+-}+type family TuplePG (hask :: Type) :: [NullityType] where+  TuplePG hask = TupleOf (TupleCodeOf hask (Code hask))++type family TupleOf (tuple :: [Type]) :: [NullityType] where+  TupleOf '[] = '[]+  TupleOf (hask ': tuple) = NullPG hask ': TupleOf tuple++type family TupleCodeOf (hask :: Type) (code :: [[Type]]) :: [Type] where+  TupleCodeOf hask '[tuple] = tuple+  TupleCodeOf hask '[] =+    TypeError+      (    'Text "The type `" :<>: 'ShowType hask :<>: 'Text "' is not a tuple type."+      :$$: 'Text "It is a void type with no constructors."+      )+  TupleCodeOf hask (_ ': _ ': _) =+    TypeError+      (    'Text "The type `" :<>: 'ShowType hask :<>: 'Text "' is not a tuple type."+      :$$: 'Text "It is a sum type with more than one constructor."+      )+ -- | Calculates constructors of a datatype. type family ConstructorsOf (datatype :: Type.DatatypeInfo)   :: [Type.ConstructorInfo] where@@ -875,47 +858,23 @@     ConstructorNamesOf (constructor ': constructors) =       ConstructorNameOf constructor ': ConstructorNamesOf constructors --- | Calculate the fields of a datatype.-type family FieldsOf (datatype :: Type.DatatypeInfo)-  :: [Type.FieldInfo] where-    FieldsOf ('Type.ADT _module _datatype '[ 'Type.Record _name fields]) =-      fields-    FieldsOf ('Type.Newtype _module _datatype ('Type.Record _name fields)) =-      fields---- | Calculate the name of a field.-type family FieldNameOf (field :: Type.FieldInfo) :: Type.FieldName where-  FieldNameOf ('Type.FieldInfo name) = name---- | Calculate the names of fields.-type family FieldNamesOf (fields :: [Type.FieldInfo])-  :: [Type.FieldName] where-    FieldNamesOf '[] = '[]-    FieldNamesOf (field ': fields) = FieldNameOf field ': FieldNamesOf fields---- | >>> :kind! FieldTypeOf (Maybe Int16)--- FieldTypeOf (Maybe Int16) :: PGType--- = 'PGint2-type family FieldTypeOf (maybe :: Type) where-  FieldTypeOf (Maybe hask) = PG hask-  FieldTypeOf ty = TypeError-    ('Text "FieldTypeOf error: non-Maybe type " ':<>: 'ShowType ty)---- | Calculate the types of fields.-type family FieldTypesOf (fields :: [Type]) where-  FieldTypesOf '[] = '[]-  FieldTypesOf (field ': fields) = FieldTypeOf field ': FieldTypesOf fields---- | Inspect the code of an algebraic datatype and ensure it's a product,--- otherwise generate a type error-type family RecordCodeOf (hask :: Type) (code ::[[Type]]) :: [Type] where-  RecordCodeOf _hask '[tys] = tys-  RecordCodeOf hask _tys = TypeError-    ('Text "RecordCodeOf error: non-Record type " ':<>: 'ShowType hask)- -- | Is a type a valid JSON key?-type PGjsonKey key = key `In` '[ 'PGint2, 'PGint4, 'PGtext ]+type PGJsonKey = '[ 'PGint2, 'PGint4, 'PGtext ]  -- | Is a type a valid JSON type?-type PGjson_ json = json `In` '[ 'PGjson, 'PGjsonb ]+type PGJsonType = '[ 'PGjson, 'PGjsonb ] +-- | An `AlignedList` is a type-aligned list or free category.+data AlignedList p x0 x1 where+  Done :: AlignedList p x x+  (:>>) :: p x0 x1 -> AlignedList p x1 x2 -> AlignedList p x0 x2+infixr 7 :>>+instance Category (AlignedList p) where+  id = Done+  (.) list = \case+    Done -> list+    step :>> steps -> step :>> (steps >>> list)++-- | A `single` step.+single :: p x0 x1 -> AlignedList p x0 x1+single step = step :>> Done
src/Squeal/PostgreSQL/Transaction.hs view
@@ -9,9 +9,11 @@ -}  {-# LANGUAGE-    FlexibleContexts+    DataKinds+  , FlexibleContexts   , LambdaCase   , OverloadedStrings+  , TypeInType #-}  module Squeal.PostgreSQL.Transaction@@ -39,7 +41,6 @@ import Control.Monad.Base import Control.Monad.Trans.Control import Data.ByteString-import Data.Monoid import Generics.SOP  import qualified Database.PostgreSQL.LibPQ as LibPQ@@ -69,16 +70,16 @@ transactionally_ = transactionally defaultMode  -- | @BEGIN@ a transaction.-begin :: MonadPQ schema tx => TransactionMode -> tx (K Result NilRelation)+begin :: MonadPQ schema tx => TransactionMode -> tx (K Result ('[] :: RowType)) begin mode = manipulate . UnsafeManipulation $   "BEGIN" <+> renderTransactionMode mode <> ";"  -- | @COMMIT@ a schema invariant transaction.-commit :: MonadPQ schema tx => tx (K Result NilRelation)+commit :: MonadPQ schema tx => tx (K Result ('[] :: RowType)) commit = manipulate $ UnsafeManipulation "COMMIT;"  -- | @ROLLBACK@ a schema invariant transaction.-rollback :: MonadPQ schema tx => tx (K Result NilRelation)+rollback :: MonadPQ schema tx => tx (K Result ('[] :: RowType)) rollback = manipulate $ UnsafeManipulation "ROLLBACK;"  -- | Run a schema changing computation `transactionallySchema`.
+ test/Specs/ExceptionHandling.hs view
@@ -0,0 +1,121 @@+{-# LANGUAGE DataKinds             #-}+{-# LANGUAGE DeriveGeneric         #-}+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleContexts      #-}+{-# LANGUAGE OverloadedLabels      #-}+{-# LANGUAGE OverloadedLists       #-}+{-# LANGUAGE OverloadedStrings     #-}+{-# LANGUAGE TypeApplications      #-}+{-# LANGUAGE TypeFamilies          #-}+{-# LANGUAGE TypeOperators         #-}+module ExceptionHandling+  ( specs+  , User (..)+  )+where++import           Control.Monad               (void)+import           Control.Monad.Base          (MonadBase)+import qualified Data.ByteString.Char8       as Char8+import           Data.Int                    (Int16)+import           Data.Text                   (Text)+import           Data.Vector                 (Vector)+import qualified Generics.SOP                as SOP+import qualified GHC.Generics                as GHC+import           Squeal.PostgreSQL+import           Squeal.PostgreSQL.Migration+import           Test.Hspec++type Schema =+  '[ "users" ::: 'Table (+       '[ "pk_users" ::: 'PrimaryKey '["id"]+        , "unique_names" ::: 'Unique '["name"]+        ] :=>+       '[ "id" ::: 'Def :=> 'NotNull 'PGint4+        , "name" ::: 'NoDef :=> 'NotNull 'PGtext+        , "vec" ::: 'NoDef :=> 'NotNull ('PGvararray ('Null 'PGint2))+        ])+   , "emails" ::: 'Table (+       '[  "pk_emails" ::: 'PrimaryKey '["id"]+        , "fk_user_id" ::: 'ForeignKey '["user_id"] "users" '["id"]+        ] :=>+       '[ "id" ::: 'Def :=> 'NotNull 'PGint4+        , "user_id" ::: 'NoDef :=> 'NotNull 'PGint4+        , "email" ::: 'NoDef :=> 'Null 'PGtext+        ])+   ]++data User =+  User { userName  :: Text+       , userEmail :: Maybe Text+       , userVec   :: Vector (Maybe Int16) }+  deriving (Show, GHC.Generic)+instance SOP.Generic User+instance SOP.HasDatatypeInfo User++insertUser :: Manipulation Schema '[ 'NotNull 'PGtext, 'NotNull ('PGvararray ('Null 'PGint2))]+  '[ "fromOnly" ::: 'NotNull 'PGint4 ]+insertUser = insertRows #users+  (Default `as` #id :* Set (param @1) `as` #name :* Set (param @2) `as` #vec) []+  OnConflictDoRaise (Returning (#id `as` #fromOnly))++setup :: Definition '[] Schema+setup =+  createTable #users+    ( serial `as` #id :*+      (text & notNullable) `as` #name :*+      (vararray int2 & notNullable) `as` #vec )+    ( primaryKey #id `as` #pk_users+    :* unique #name `as` #unique_names )+  >>>+  createTable #emails+    ( serial `as` #id :*+      (int & notNullable) `as` #user_id :*+      (text & nullable) `as` #email )+    ( primaryKey #id `as` #pk_emails :*+      foreignKey #user_id #users #id+        OnDeleteCascade OnUpdateCascade `as` #fk_user_id )++teardown :: Definition Schema '[]+teardown = dropTable #emails >>> dropTable #users++migration :: Migration IO '[] Schema+migration = Migration { name = "test"+                      , up = void $ define setup+                      , down = void $ define teardown }++setupDB :: IO ()+setupDB = void . withConnection connectionString $+  migrateUp $ single migration++dropDB :: IO ()+dropDB = void . withConnection connectionString $+  migrateDown $ single migration++connectionString :: Char8.ByteString+connectionString = "host=localhost port=5432 dbname=exampledb"++testUser :: User+testUser = User "TestUser" Nothing []++newUser :: (MonadBase IO m, MonadPQ Schema m) => User -> m ()+newUser u = void $ manipulateParams insertUser (userName u, userVec u)++insertUserTwice :: (MonadBase IO m, MonadPQ Schema m) => m ()+insertUserTwice = newUser testUser >> newUser testUser++specs :: SpecWith ()+specs = before_ setupDB $ after_ dropDB $+  describe "Exceptions" $ do++    let+      dupKeyErr = PQException FatalError (Just "23505")+        (Just "ERROR:  duplicate key value violates unique constraint \"unique_names\"\nDETAIL:  Key (name)=(TestUser) already exists.\n")++    it "should be thrown for unique constraint violation in a manipulation" $+      withConnection connectionString insertUserTwice+       `shouldThrow` (== dupKeyErr)++    it "should be rethrown for unique constraint violation in a manipulation by a transaction" $+      withConnection connectionString (transactionally_ insertUserTwice)+       `shouldThrow` (== dupKeyErr)
+ test/Specs/Specs.hs view
@@ -0,0 +1,7 @@+module Specs where++import           Test.Hspec+import qualified ExceptionHandling++main :: IO ()+main = hspec ExceptionHandling.specs