@@ -44,7 +44,7 @@ module Squeal.PostgreSQL.Definition
44 , alterTable
44 , alterTable
45 , alterTableRename
45 , alterTableRename
46 , alterTableAddConstraint
46 , alterTableAddConstraint
47− , AlterColumns (UnsafeAlterColumns, renderAlterColumns)
47+ , AlterTable (UnsafeAlterTable, renderAlterTable)
48 , addColumnDefault
48 , addColumnDefault
49 , addColumnNull
49 , addColumnNull
50 , dropColumn
50 , dropColumn
@@ -82,8 +82,8 @@ statements
82-- database, like a `createTable`, `dropTable`, or `alterTable` command.
82-- database, like a `createTable`, `dropTable`, or `alterTable` command.
83-- `Definition`s may be composed using the `>>>` operator.
83-- `Definition`s may be composed using the `>>>` operator.
84newtype Definition
84newtype Definition
85− (schema0 :: TablesType)
85+ (schema0 :: SchemaType)
86− (schema1 :: TablesType)
86+ (schema1 :: SchemaType)
87 = UnsafeDefinition { renderDefinition :: ByteString }
87 = UnsafeDefinition { renderDefinition :: ByteString }
88 deriving (GHC.Generic,Show,Eq,Ord,NFData)
88 deriving (GHC.Generic,Show,Eq,Ord,NFData)
@@ -105,13 +105,15 @@ CREATE statements
106-- "CREATE TABLE tab (a int, b real);"
106-- "CREATE TABLE tab (a int, b real);"
107createTable
107createTable
108+ :: ( KnownSymbol tab
108− :: (KnownSymbol table, SOP.SListI columns)
109+ , SOP.SListI columns
110+ , table ~ (constraints :=> (column ': columns)))
109− => Alias table -- ^ the name of the table to add
111+ => Alias tab -- ^ the name of the table to add
110 -> NP (Aliased TypeExpression) (column ': columns)
112 -> NP (Aliased TypeExpression) (column ': columns)
111 -- ^ the names and datatype of each column
113 -- ^ the names and datatype of each column
112− -> [TableConstraint schema (column ': columns)]
114+ -> NP (TableConstraint schema (column ': columns)) constraints
113 -- ^ constraints that must hold for the table
115 -- ^ constraints that must hold for the table
114− -> Definition schema (Create table (column ': columns) schema)
116+ -> Definition schema (Create tab table schema)
115createTable table columns constraints = UnsafeDefinition $
117createTable table columns constraints = UnsafeDefinition $
116 "CREATE TABLE" <+> renderAlias table
118 "CREATE TABLE" <+> renderAlias table
117 <+> parenthesized
119 <+> parenthesized
@@ -140,8 +142,9 @@ createTable table columns constraints = UnsafeDefinition $
140-- violate a constraint, an error is raised. This applies
142-- violate a constraint, an error is raised. This applies
141-- even if the value came from the default value definition.
143-- even if the value came from the default value definition.
142newtype TableConstraint
144newtype TableConstraint
143− (schema :: TablesType)
145+ (schema :: SchemaType)
144 (columns :: ColumnsType)
146 (columns :: ColumnsType)
147+ (tableConstraint :: TableConstraint')
145 = UnsafeTableConstraint { renderTableConstraint :: ByteString }
148 = UnsafeTableConstraint { renderTableConstraint :: ByteString }
146 deriving (GHC.Generic,Show,Eq,Ord,NFData)
149 deriving (GHC.Generic,Show,Eq,Ord,NFData)
@@ -160,7 +163,7 @@ newtype TableConstraint
161 :: Condition '[table ::: columns] 'Ungrouped '[]
164 :: Condition '[table ::: columns] 'Ungrouped '[]
162 -- ^ condition to check
165 -- ^ condition to check
163− -> TableConstraint schema columns
166+ -> TableConstraint schema columns 'Check
164check condition = UnsafeTableConstraint $
167check condition = UnsafeTableConstraint $
165 "CHECK" <+> parenthesized (renderExpression condition)
168 "CHECK" <+> parenthesized (renderExpression condition)
@@ -179,7 +182,7 @@ unique
179 :: SOP.SListI subcolumns
182 :: SOP.SListI subcolumns
180 => NP (Column columns) subcolumns
183 => NP (Column columns) subcolumns
181 -- ^ unique column or group of columns
184 -- ^ unique column or group of columns
182− -> TableConstraint schema columns
185+ -> TableConstraint schema columns ( 'Uniques subcolumns)
183unique columns = UnsafeTableConstraint $
186unique columns = UnsafeTableConstraint $
184 "UNIQUE" <+> parenthesized (renderCommaSeparated renderColumn columns)
187 "UNIQUE" <+> parenthesized (renderCommaSeparated renderColumn columns)
@@ -199,7 +202,7 @@ primaryKey
199 :: (SOP.SListI subcolumns, AllNotNull subcolumns)
202 :: (SOP.SListI subcolumns, AllNotNull subcolumns)
200 => NP (Column columns) subcolumns
203 => NP (Column columns) subcolumns
201 -- ^ identifying column or group of columns
204 -- ^ identifying column or group of columns
202− -> TableConstraint schema columns
205+ -> TableConstraint schema columns ('Uniques subcolumns)
203primaryKey columns = UnsafeTableConstraint $
206primaryKey columns = UnsafeTableConstraint $
204 "PRIMARY KEY" <+> parenthesized (renderCommaSeparated renderColumn columns)
207 "PRIMARY KEY" <+> parenthesized (renderCommaSeparated renderColumn columns)
@@ -237,8 +240,8 @@ primaryKey columns = UnsafeTableConstraint $
238-- "CREATE TABLE users (id serial, username text NOT NULL, PRIMARY KEY (id)); CREATE TABLE emails (id serial, userid integer NOT NULL, email text NOT NULL, PRIMARY KEY (id), FOREIGN KEY (userid) REFERENCES users (id) ON DELETE CASCADE ON UPDATE RESTRICT);"
241-- "CREATE TABLE users (id serial, username text NOT NULL, PRIMARY KEY (id)); CREATE TABLE emails (id serial, userid integer NOT NULL, email text NOT NULL, PRIMARY KEY (id), FOREIGN KEY (userid) REFERENCES users (id) ON DELETE CASCADE ON UPDATE RESTRICT);"
239foreignKey
242foreignKey
240− :: ( HasTable reftable schema refcolumns
243+ :: ( {-(reftable ::: refcolumns) `In` schema
241− , SameTypes subcolumns refsubcolumns
244+ , -}SameTypes subcolumns refsubcolumns
242 , AllNotNull subcolumns
245 , AllNotNull subcolumns
243 , SOP.SListI subcolumns
246 , SOP.SListI subcolumns
244 , SOP.SListI refsubcolumns)
247 , SOP.SListI refsubcolumns)
@@ -253,6 +256,7 @@ foreignKey
253 -> OnUpdateClause
256 -> OnUpdateClause
254 -- ^ what to do when reference is updated
257 -- ^ what to do when reference is updated
255 -> TableConstraint schema columns
258 -> TableConstraint schema columns
259+ ('ForeignKey subcolumns reftable refsubcolumns)
256foreignKey columns reftable refcolumns onDelete onUpdate =
260foreignKey columns reftable refcolumns onDelete onUpdate =
257 UnsafeTableConstraint $
261 UnsafeTableConstraint $
258 "FOREIGN KEY" <+> parenthesized (renderCommaSeparated renderColumn columns)
262 "FOREIGN KEY" <+> parenthesized (renderCommaSeparated renderColumn columns)
@@ -320,14 +324,14 @@ ALTER statements
321-- | `alterTable` changes the definition of a table from the schema.
325-- | `alterTable` changes the definition of a table from the schema.
322alterTable
326alterTable
323− :: HasTable table schema columns0
327+ :: (tab ::: table0) `In` schema
324− => Alias table -- ^ table to alter
328+ => Alias tab -- ^ table to alter
325− -> AlterColumns columns0 columns1 -- ^ alteration to perform
329+ -> AlterTable schema table0 table1 -- ^ alteration to perform
326− -> Definition schema (Alter table schema columns1)
330+ -> Definition schema (Alter tab schema table1)
327alterTable table alteration = UnsafeDefinition $
331alterTable table alteration = UnsafeDefinition $
328 "ALTER TABLE"
332 "ALTER TABLE"
329 <+> renderAlias table
333 <+> renderAlias table
330− <+> renderAlterColumns alteration
334+ <+> renderAlterTable alteration
333-- | `alterTableRename` changes the name of a table from the schema.
337-- | `alterTableRename` changes the name of a table from the schema.
@@ -354,21 +358,30 @@ alterTableRename table0 table1 = UnsafeDefinition $
354-- in renderDefinition definition
358-- in renderDefinition definition
356-- "ALTER TABLE tab ADD CHECK ((col > 0));"
360-- "ALTER TABLE tab ADD CHECK ((col > 0));"
357−alterTableAddConstraint
361+-- alterTableAddConstraint
358− :: HasTable table schema columns
362+-- :: (HasTable table schema columns, (table ::: table0) `In` schema)
359− => Alias table -- ^ table to constrain
363+-- => Alias table -- ^ table to constrain
360− -> TableConstraint schema columns -- ^ what constraint to add
364+-- -> TableConstraint schema columns constraint -- ^ what constraint to add
361− -> Definition schema schema
365+-- -> Definition schema (Alter table schema (AddConstraint constraint table0))
362−alterTableAddConstraint table constraint = UnsafeDefinition $
366+-- alterTableAddConstraint table constraint = UnsafeDefinition $
363− "ALTER TABLE" <+> renderAlias table
367+-- "ALTER TABLE" <+> renderAlias table
364− <+> "ADD" <+> renderTableConstraint constraint <> ";"
368+-- <+> "ADD" <+> renderTableConstraint constraint <> ";"
371+ :: ( table `In` schema
372+ , table ~ (tab ::: (constraints :=> columns)))
374+ -> TableConstraint schema columns constraint
375+ -> AlterTable table (tab ::: AddConstraint constraint constraints columns)
376+addConstraint = undefined
366−-- | An `AlterColumns` describes the alteration to perform on the columns
378+-- | An `AlterTable` describes the alteration to perform on the columns
367-- of a table.
379-- of a table.
368−newtype AlterColumns
380+newtype AlterTable
369− (columns0 :: ColumnsType)
381+ (schema :: SchemaType)
370− (columns1 :: ColumnsType) =
382+ (table0 :: TableType)
371− UnsafeAlterColumns {renderAlterColumns :: ByteString}
383+ (table1 :: TableType) =
384+ UnsafeAlterTable {renderAlterTable :: ByteString}
372 deriving (GHC.Generic,Show,Eq,Ord,NFData)
385 deriving (GHC.Generic,Show,Eq,Ord,NFData)
374-- | An `addColumnDefault` adds a new `Optional` column. The new column is
387-- | An `addColumnDefault` adds a new `Optional` column. The new column is
@@ -390,8 +403,8 @@ addColumnDefault
390 :: (KnownSymbol column, 'Default `In` constraints)
403 :: (KnownSymbol column, 'Default `In` constraints)
391 => Alias column -- ^ column to add
404 => Alias column -- ^ column to add
392 -> TypeExpression '(constraints, ty) -- ^ type of the new column
405 -> TypeExpression '(constraints, ty) -- ^ type of the new column
393− -> AlterColumns columns (Create column '(constraints, ty) columns)
406+ -> AlterTable schema columns (Create column '(constraints, ty) columns)
394−addColumnDefault column ty = UnsafeAlterColumns $
407+addColumnDefault column ty = UnsafeAlterTable $
395 "ADD COLUMN" <+> renderAlias column <+> renderTypeExpression ty
408 "ADD COLUMN" <+> renderAlias column <+> renderTypeExpression ty
397-- | An `addColumnNull` adds a new `Null` column. The new column is initially
410-- | An `addColumnNull` adds a new `Null` column. The new column is initially
@@ -412,8 +425,8 @@ addColumnNull
412 :: KnownSymbol column
425 :: KnownSymbol column
413 => Alias column -- ^ column to add
426 => Alias column -- ^ column to add
414 -> TypeExpression '( '[], ('Null ty)) -- ^ type of the new column
427 -> TypeExpression '( '[], ('Null ty)) -- ^ type of the new column
415− -> AlterColumns columns (Create column '( '[], ('Null ty)) columns)
428+ -> AlterTable schema columns (Create column '( '[], ('Null ty)) columns)
416−addColumnNull column ty = UnsafeAlterColumns $
429+addColumnNull column ty = UnsafeAlterTable $
417 "ADD COLUMN" <+> renderAlias column <+> renderTypeExpression ty
430 "ADD COLUMN" <+> renderAlias column <+> renderTypeExpression ty
419-- | A `dropColumn` removes a column. Whatever data was in the column
432-- | A `dropColumn` removes a column. Whatever data was in the column
@@ -435,8 +448,8 @@ addColumnNull column ty = UnsafeAlterColumns $
435dropColumn
448dropColumn
436 :: KnownSymbol column
449 :: KnownSymbol column
437 => Alias column -- ^ column to remove
450 => Alias column -- ^ column to remove
438− -> AlterColumns columns (Drop column columns)
451+ -> AlterTable schema columns (Drop column columns)
439−dropColumn column = UnsafeAlterColumns $
452+dropColumn column = UnsafeAlterTable $
440 "DROP COLUMN" <+> renderAlias column
453 "DROP COLUMN" <+> renderAlias column
442-- | Like `dropColumn` but authorizes dropping everything that depends
455-- | Like `dropColumn` but authorizes dropping everything that depends
@@ -456,8 +469,8 @@ dropColumn column = UnsafeAlterColumns $
456dropColumnCascade
469dropColumnCascade
457 :: KnownSymbol column
470 :: KnownSymbol column
458 => Alias column -- ^ column to remove
471 => Alias column -- ^ column to remove
459− -> AlterColumns columns (Drop column columns)
472+ -> AlterTable schema columns (Drop column columns)
460−dropColumnCascade column = UnsafeAlterColumns $
473+dropColumnCascade column = UnsafeAlterTable $
461 "DROP COLUMN" <+> renderAlias column <+> "CASCADE"
474 "DROP COLUMN" <+> renderAlias column <+> "CASCADE"
463-- | A `renameColumn` renames a column.
476-- | A `renameColumn` renames a column.
@@ -475,8 +488,8 @@ renameColumn
475 :: (KnownSymbol column0, KnownSymbol column1)
488 :: (KnownSymbol column0, KnownSymbol column1)
476 => Alias column0
489 => Alias column0
477 -> Alias column1
490 -> Alias column1
478− -> AlterColumns columns (Rename column0 column1 columns)
491+ -> AlterTable schema columns (Rename column0 column1 columns)
479−renameColumn column0 column1 = UnsafeAlterColumns $
492+renameColumn column0 column1 = UnsafeAlterTable $
480 "RENAME COLUMN" <+> renderAlias column0 <+> "TO" <+> renderAlias column1
493 "RENAME COLUMN" <+> renderAlias column0 <+> "TO" <+> renderAlias column1
482-- | An `alterColumn` alters a single column.
495-- | An `alterColumn` alters a single column.
@@ -484,8 +497,8 @@ alterColumn
484 :: (KnownSymbol column, HasColumn column columns ty0)
497 :: (KnownSymbol column, HasColumn column columns ty0)
485 => Alias column -- ^ column to alter
498 => Alias column -- ^ column to alter
486 -> AlterColumn ty0 ty1 -- ^ alteration to perform
499 -> AlterColumn ty0 ty1 -- ^ alteration to perform
487− -> AlterColumns columns (Alter column columns ty1)
500+ -> AlterTable schema columns (Alter column columns ty1)
488−alterColumn column alteration = UnsafeAlterColumns $
501+alterColumn column alteration = UnsafeAlterTable $
489 "ALTER COLUMN" <+> renderAlias column <+> renderAlterColumn alteration
502 "ALTER COLUMN" <+> renderAlias column <+> renderAlterColumn alteration
491-- | An `AlterColumn` describes the alteration to perform on a single column.
504-- | An `AlterColumn` describes the alteration to perform on a single column.
@@ -523,7 +536,7 @@ setDefault expression = UnsafeAlterColumn $
523-- in renderDefinition definition
536-- in renderDefinition definition
525-- "ALTER TABLE tab ALTER COLUMN col DROP DEFAULT;"
538-- "ALTER TABLE tab ALTER COLUMN col DROP DEFAULT;"
526−dropDefault :: AlterColumn '(constraints, ty) '(DropDefault constraints, ty)
539+dropDefault :: AlterColumn ty (DropConstraint 'Default ty)
527dropDefault = UnsafeAlterColumn $ "DROP DEFAULT"
540dropDefault = UnsafeAlterColumn $ "DROP DEFAULT"
529-- | A `setNotNull` adds a @NOT NULL@ constraint to a column.
542-- | A `setNotNull` adds a @NOT NULL@ constraint to a column.