on b63086c help sign in
squeal-postgresql/squeal-postgresql.cabal+1
since splitsnapshots
unifiedsplit
@@ -28,6 +28,7 @@ library
28 Squeal.PostgreSQL.Definition.Function
28 Squeal.PostgreSQL.Definition.Function
29 Squeal.PostgreSQL.Definition.Index
29 Squeal.PostgreSQL.Definition.Index
30 Squeal.PostgreSQL.Definition.Table
30 Squeal.PostgreSQL.Definition.Table
31+ Squeal.PostgreSQL.Definition.Table.Column
31 Squeal.PostgreSQL.Definition.Table.Constraint
32 Squeal.PostgreSQL.Definition.Table.Constraint
32 Squeal.PostgreSQL.Definition.Type
33 Squeal.PostgreSQL.Definition.Type
33 Squeal.PostgreSQL.Definition.Schema
34 Squeal.PostgreSQL.Definition.Schema
squeal-postgresql/src/Squeal/PostgreSQL.hs+1
@@ -199,6 +199,7 @@ import Squeal.PostgreSQL.Definition.Function as X
199import Squeal.PostgreSQL.Definition.Index as X
199import Squeal.PostgreSQL.Definition.Index as X
200import Squeal.PostgreSQL.Definition.Schema as X
200import Squeal.PostgreSQL.Definition.Schema as X
201import Squeal.PostgreSQL.Definition.Table as X
201import Squeal.PostgreSQL.Definition.Table as X
202+import Squeal.PostgreSQL.Definition.Table.Column as X
202import Squeal.PostgreSQL.Definition.Table.Constraint as X
203import Squeal.PostgreSQL.Definition.Table.Constraint as X
203import Squeal.PostgreSQL.Definition.Type as X
204import Squeal.PostgreSQL.Definition.Type as X
204import Squeal.PostgreSQL.Definition.View as X
205import Squeal.PostgreSQL.Definition.View as X
squeal-postgresql/src/Squeal/PostgreSQL/Definition.hs+26
@@ -35,6 +35,8 @@ module Squeal.PostgreSQL.Definition
35 Definition (..)
35 Definition (..)
36 , (>>>)
36 , (>>>)
37 , manipDefinition
37 , manipDefinition
38+ , PGNullityTyped (..)
39+ , hask
38 ) where
40 ) where
39
41
40import Control.Category
42import Control.Category
@@ -45,7 +47,10 @@ import Prelude hiding ((.), id)
45
47
46import qualified GHC.Generics as GHC
48import qualified GHC.Generics as GHC
47
49
50+import Squeal.PostgreSQL.Definition.Table.Column
51+import Squeal.PostgreSQL.Expression.Type
48import Squeal.PostgreSQL.Manipulation
52import Squeal.PostgreSQL.Manipulation
53+import Squeal.PostgreSQL.PG
49import Squeal.PostgreSQL.Render
54import Squeal.PostgreSQL.Render
50import Squeal.PostgreSQL.Schema
55import Squeal.PostgreSQL.Schema
51
56
@@ -80,3 +85,24 @@ manipDefinition
80 -- ^ no input or output
85 -- ^ no input or output
81 -> Definition schemas schemas
86 -> Definition schemas schemas
82manipDefinition = UnsafeDefinition . (<> ";") . renderSQL
87manipDefinition = UnsafeDefinition . (<> ";") . renderSQL
88+
89+-- | Like @PGTyped@ but also accounts for nullity.
90+class PGNullityTyped schemas (nullty :: NullityType) where
91+ pgNullityType :: ColumnTypeExpression schemas ('NoDef :=> nullty)
92+
93+instance PGTyped schemas ('Null ty) => PGNullityTyped schemas ('Null ty) where
94+ pgNullityType = nullable (pgtype @_ @('Null ty))
95+
96+instance PGTyped schemas ('NotNull ty) => PGNullityTyped schemas ('NotNull ty) where
97+ pgNullityType = notNullable (pgtype @_ @('NotNull ty))
98+
99+-- | Allow you to specify pg column types in relation to haskell types.
100+-- >>> printSQL $ hask @(Maybe String)
101+-- text NULL
102+--
103+-- >>> printSQL $ hask @Double
104+-- float8 NOT NULL
105+hask
106+ :: forall h schemas. PGNullityTyped schemas (NullPG h)
107+ => ColumnTypeExpression schemas ('NoDef :=> NullPG h)
108+hask = pgNullityType
squeal-postgresql/src/Squeal/PostgreSQL/Definition/Table.hs+1−1
@@ -62,9 +62,9 @@ import qualified GHC.Generics as GHC
62
62
63import Squeal.PostgreSQL.Alias
63import Squeal.PostgreSQL.Alias
64import Squeal.PostgreSQL.Definition
64import Squeal.PostgreSQL.Definition
65+import Squeal.PostgreSQL.Definition.Table.Column
65import Squeal.PostgreSQL.Definition.Table.Constraint
66import Squeal.PostgreSQL.Definition.Table.Constraint
66import Squeal.PostgreSQL.Expression
67import Squeal.PostgreSQL.Expression
67−import Squeal.PostgreSQL.Expression.Type
68import Squeal.PostgreSQL.List
68import Squeal.PostgreSQL.List
69import Squeal.PostgreSQL.Render
69import Squeal.PostgreSQL.Render
70import Squeal.PostgreSQL.Schema
70import Squeal.PostgreSQL.Schema
squeal-postgresql/src/Squeal/PostgreSQL/Definition/Table/Column.hsnew file+105
@@ -0,0 +1,105 @@
1+{-|
2+Module: Squeal.PostgreSQL.Definition.Table.Column
3+Description: Column type expressions
4+Copyright: (c) Eitan Chatav, 2017
5+Maintainer: eitan@morphism.tech
6+Stability: experimental
7+
8+Column type expressions.
9+-}
10+
11+{-# LANGUAGE
12+ AllowAmbiguousTypes
13+ , ConstraintKinds
14+ , DeriveAnyClass
15+ , DeriveGeneric
16+ , DerivingStrategies
17+ , FlexibleContexts
18+ , FlexibleInstances
19+ , GADTs
20+ , LambdaCase
21+ , MultiParamTypeClasses
22+ , OverloadedLabels
23+ , OverloadedStrings
24+ , RankNTypes
25+ , ScopedTypeVariables
26+ , TypeApplications
27+ , TypeInType
28+ , TypeOperators
29+ , UndecidableSuperClasses
30+#-}
31+
32+module Squeal.PostgreSQL.Definition.Table.Column
33+ ( ColumnTypeExpression (..)
34+ , nullable
35+ , notNullable
36+ , default_
37+ , serial2
38+ , smallserial
39+ , serial4
40+ , serial
41+ , serial8
42+ , bigserial
43+ ) where
44+
45+import Control.DeepSeq
46+import Data.ByteString
47+
48+import qualified GHC.Generics as GHC
49+
50+import Squeal.PostgreSQL.Alias
51+import Squeal.PostgreSQL.Expression
52+import Squeal.PostgreSQL.Expression.Type
53+import Squeal.PostgreSQL.Render
54+import Squeal.PostgreSQL.Schema
55+
56+-- $setup
57+-- >>> import Squeal.PostgreSQL
58+
59+-- | `ColumnTypeExpression`s are used in `createTable` commands.
60+newtype ColumnTypeExpression (schemas :: SchemasType) (ty :: ColumnType)
61+ = UnsafeColumnTypeExpression { renderColumnTypeExpression :: ByteString }
62+ deriving (GHC.Generic,Show,Eq,Ord,NFData)
63+instance RenderSQL (ColumnTypeExpression schemas ty) where
64+ renderSQL = renderColumnTypeExpression
65+
66+-- | used in `createTable` commands as a column constraint to note that
67+-- @NULL@ may be present in a column
68+nullable
69+ :: TypeExpression schemas (nullity ty)
70+ -> ColumnTypeExpression schemas ('NoDef :=> 'Null ty)
71+nullable ty = UnsafeColumnTypeExpression $ renderSQL ty <+> "NULL"
72+
73+-- | used in `createTable` commands as a column constraint to ensure
74+-- @NULL@ is not present in a column
75+notNullable
76+ :: TypeExpression schemas (nullity ty)
77+ -> ColumnTypeExpression schemas ('NoDef :=> 'NotNull ty)
78+notNullable ty = UnsafeColumnTypeExpression $ renderSQL ty <+> "NOT NULL"
79+
80+-- | used in `createTable` commands as a column constraint to give a default
81+default_
82+ :: Expression '[] '[] 'Ungrouped schemas '[] '[] ty
83+ -> ColumnTypeExpression schemas ('NoDef :=> ty)
84+ -> ColumnTypeExpression schemas ('Def :=> ty)
85+default_ x ty = UnsafeColumnTypeExpression $
86+ renderSQL ty <+> "DEFAULT" <+> renderExpression x
87+
88+-- | not a true type, but merely a notational convenience for creating
89+-- unique identifier columns with type `PGint2`
90+serial2, smallserial
91+ :: ColumnTypeExpression schemas ('Def :=> 'NotNull 'PGint2)
92+serial2 = UnsafeColumnTypeExpression "serial2"
93+smallserial = UnsafeColumnTypeExpression "smallserial"
94+-- | not a true type, but merely a notational convenience for creating
95+-- unique identifier columns with type `PGint4`
96+serial4, serial
97+ :: ColumnTypeExpression schemas ('Def :=> 'NotNull 'PGint4)
98+serial4 = UnsafeColumnTypeExpression "serial4"
99+serial = UnsafeColumnTypeExpression "serial"
100+-- | not a true type, but merely a notational convenience for creating
101+-- unique identifier columns with type `PGint8`
102+serial8, bigserial
103+ :: ColumnTypeExpression schemas ('Def :=> 'NotNull 'PGint8)
104+serial8 = UnsafeColumnTypeExpression "serial8"
105+bigserial = UnsafeColumnTypeExpression "bigserial"
squeal-postgresql/src/Squeal/PostgreSQL/Expression/Type.hs+4−95
@@ -23,16 +23,15 @@ Type expressions.
23 , ScopedTypeVariables
23 , ScopedTypeVariables
24 , TypeApplications
24 , TypeApplications
25 , TypeOperators
25 , TypeOperators
26− , UndecidableInstances
27#-}
26#-}
28
27
29module Squeal.PostgreSQL.Expression.Type
28module Squeal.PostgreSQL.Expression.Type
30− ( -- * type casting
29+ ( TypeExpression (..)
31− cast
30+ , cast
32 , astype
31 , astype
33 , inferredtype
32 , inferredtype
34− -- * type expressions
33+ , PGTyped (..)
35− , TypeExpression (..)
34+ , FieldTyped (..)
36 , typedef
35 , typedef
37 , typetable
36 , typetable
38 , typeview
37 , typeview
@@ -79,22 +78,6 @@ module Squeal.PostgreSQL.Expression.Type
79 , tsrange
78 , tsrange
80 , tstzrange
79 , tstzrange
81 , daterange
80 , daterange
82− -- * column type definitions
83− , ColumnTypeExpression (..)
84− , nullable
85− , notNullable
86− , default_
87− , serial2
88− , smallserial
89− , serial4
90− , serial
91− , serial8
92− , bigserial
93− , hask
94− -- * type inference
95− , PGTyped (..)
96− , PGNullityTyped (..)
97− , FieldTyped (..)
98 ) where
81 ) where
99
82
100import Control.DeepSeq
83import Control.DeepSeq
@@ -108,7 +91,6 @@ import qualified Generics.SOP as SOP
108
91
109import Squeal.PostgreSQL.Alias
92import Squeal.PostgreSQL.Alias
110import Squeal.PostgreSQL.Expression
93import Squeal.PostgreSQL.Expression
111−import Squeal.PostgreSQL.PG
112import Squeal.PostgreSQL.Render
94import Squeal.PostgreSQL.Render
113import Squeal.PostgreSQL.Schema
95import Squeal.PostgreSQL.Schema
114
96
@@ -150,7 +132,6 @@ astype = cast
150inferredtype
132inferredtype
151 :: PGTyped schemas ty
133 :: PGTyped schemas ty
152 => Expression outer common grp schemas params from ty
134 => Expression outer common grp schemas params from ty
153− -- ^ value
154 -> Expression outer common grp schemas params from ty
135 -> Expression outer common grp schemas params from ty
155inferredtype = astype pgtype
136inferredtype = astype pgtype
156
137
@@ -170,7 +151,6 @@ instance RenderSQL (TypeExpression schemas ty) where
170typedef
151typedef
171 :: (Has sch schemas schema, Has td schema ('Typedef ty))
152 :: (Has sch schemas schema, Has td schema ('Typedef ty))
172 => QualifiedAlias sch td
153 => QualifiedAlias sch td
173− -- ^ type alias
174 -> TypeExpression schemas (null ty)
154 -> TypeExpression schemas (null ty)
175typedef = UnsafeTypeExpression . renderSQL
155typedef = UnsafeTypeExpression . renderSQL
176
156
@@ -179,7 +159,6 @@ typedef = UnsafeTypeExpression . renderSQL
179typetable
159typetable
180 :: (Has sch schemas schema, Has tab schema ('Table table))
160 :: (Has sch schemas schema, Has tab schema ('Table table))
181 => QualifiedAlias sch tab
161 => QualifiedAlias sch tab
182− -- ^ table alias
183 -> TypeExpression schemas (null ('PGcomposite (TableToRow table)))
162 -> TypeExpression schemas (null ('PGcomposite (TableToRow table)))
184typetable = UnsafeTypeExpression . renderSQL
163typetable = UnsafeTypeExpression . renderSQL
185
164
@@ -188,7 +167,6 @@ typetable = UnsafeTypeExpression . renderSQL
188typeview
167typeview
189 :: (Has sch schemas schema, Has vw schema ('View view))
168 :: (Has sch schemas schema, Has vw schema ('View view))
190 => QualifiedAlias sch vw
169 => QualifiedAlias sch vw
191− -- ^ view alias
192 -> TypeExpression schemas (null ('PGcomposite view))
170 -> TypeExpression schemas (null ('PGcomposite view))
193typeview = UnsafeTypeExpression . renderSQL
171typeview = UnsafeTypeExpression . renderSQL
194
172
@@ -375,72 +353,3 @@ class FieldTyped schemas ty where
375instance (KnownSymbol alias, PGTyped schemas ty)
353instance (KnownSymbol alias, PGTyped schemas ty)
376 => FieldTyped schemas (alias ::: ty) where
354 => FieldTyped schemas (alias ::: ty) where
377 fieldtype = pgtype `As` Alias
355 fieldtype = pgtype `As` Alias
378−
379−-- | `ColumnTypeExpression`s are used in `createTable` commands.
380−newtype ColumnTypeExpression (schemas :: SchemasType) (ty :: ColumnType)
381− = UnsafeColumnTypeExpression { renderColumnTypeExpression :: ByteString }
382− deriving (GHC.Generic,Show,Eq,Ord,NFData)
383−instance RenderSQL (ColumnTypeExpression schemas ty) where
384− renderSQL = renderColumnTypeExpression
385−
386−-- | used in `createTable` commands as a column constraint to note that
387−-- @NULL@ may be present in a column
388−nullable
389− :: TypeExpression schemas (nullity ty)
390− -> ColumnTypeExpression schemas ('NoDef :=> 'Null ty)
391−nullable ty = UnsafeColumnTypeExpression $ renderSQL ty <+> "NULL"
392−
393−-- | used in `createTable` commands as a column constraint to ensure
394−-- @NULL@ is not present in a column
395−notNullable
396− :: TypeExpression schemas (nullity ty)
397− -> ColumnTypeExpression schemas ('NoDef :=> 'NotNull ty)
398−notNullable ty = UnsafeColumnTypeExpression $ renderSQL ty <+> "NOT NULL"
399−
400−-- | used in `createTable` commands as a column constraint to give a default
401−default_
402− :: Expression '[] '[] 'Ungrouped schemas '[] '[] ty
403− -> ColumnTypeExpression schemas ('NoDef :=> ty)
404− -> ColumnTypeExpression schemas ('Def :=> ty)
405−default_ x ty = UnsafeColumnTypeExpression $
406− renderSQL ty <+> "DEFAULT" <+> renderExpression x
407−
408−-- | not a true type, but merely a notational convenience for creating
409−-- unique identifier columns with type `PGint2`
410−serial2, smallserial
411− :: ColumnTypeExpression schemas ('Def :=> 'NotNull 'PGint2)
412−serial2 = UnsafeColumnTypeExpression "serial2"
413−smallserial = UnsafeColumnTypeExpression "smallserial"
414−-- | not a true type, but merely a notational convenience for creating
415−-- unique identifier columns with type `PGint4`
416−serial4, serial
417− :: ColumnTypeExpression schemas ('Def :=> 'NotNull 'PGint4)
418−serial4 = UnsafeColumnTypeExpression "serial4"
419−serial = UnsafeColumnTypeExpression "serial"
420−-- | not a true type, but merely a notational convenience for creating
421−-- unique identifier columns with type `PGint8`
422−serial8, bigserial
423− :: ColumnTypeExpression schemas ('Def :=> 'NotNull 'PGint8)
424−serial8 = UnsafeColumnTypeExpression "serial8"
425−bigserial = UnsafeColumnTypeExpression "bigserial"
426−
427−-- | Like @PGTyped@ but also accounts for nullity.
428−class PGNullityTyped schemas (nullty :: NullityType) where
429− pgNullityType :: ColumnTypeExpression schemas ('NoDef :=> nullty)
430−
431−instance PGTyped schemas ('Null ty) => PGNullityTyped schemas ('Null ty) where
432− pgNullityType = nullable (pgtype @_ @('Null ty))
433−
434−instance PGTyped schemas ('NotNull ty) => PGNullityTyped schemas ('NotNull ty) where
435− pgNullityType = notNullable (pgtype @_ @('NotNull ty))
436−
437−-- | Allow you to specify pg column types in relation to haskell types.
438−-- >>> printSQL $ hask @(Maybe String)
439−-- text NULL
440−--
441−-- >>> printSQL $ hask @Double
442−-- float8 NOT NULL
443−hask
444− :: forall hask schemas. PGNullityTyped schemas (NullPG hask)
445− => ColumnTypeExpression schemas ('NoDef :=> NullPG hask)
446−hask = pgNullityType
squeal-postgresql/src/Squeal/PostgreSQL/Migration.hs+1
@@ -168,6 +168,7 @@ import Squeal.PostgreSQL.Alias
168import Squeal.PostgreSQL.Binary
168import Squeal.PostgreSQL.Binary
169import Squeal.PostgreSQL.Definition
169import Squeal.PostgreSQL.Definition
170import Squeal.PostgreSQL.Definition.Table
170import Squeal.PostgreSQL.Definition.Table
171+import Squeal.PostgreSQL.Definition.Table.Column
171import Squeal.PostgreSQL.Definition.Table.Constraint
172import Squeal.PostgreSQL.Definition.Table.Constraint
172import Squeal.PostgreSQL.Expression.Comparison
173import Squeal.PostgreSQL.Expression.Comparison
173import Squeal.PostgreSQL.Expression.Parameter
174import Squeal.PostgreSQL.Expression.Parameter