@@ -44,7 +44,7 @@ module Squeal.PostgreSQL.Definition
4444 , alterTable
4545 , alterTableRename
4646 , alterTableAddConstraint
47− , AlterColumns (UnsafeAlterColumns, renderAlterColumns)
47+ , AlterTable (UnsafeAlterTable, renderAlterTable)
4848 , addColumnDefault
4949 , addColumnNull
5050 , dropColumn
@@ -82,8 +82,8 @@ statements
8282-- database, like a `createTable`, `dropTable`, or `alterTable` command.
8383-- `Definition`s may be composed using the `>>>` operator.
8484newtype Definition
85− (schema0 :: TablesType)
86− (schema1 :: TablesType)
85+ (schema0 :: SchemaType)
86+ (schema1 :: SchemaType)
8787 = UnsafeDefinition { renderDefinition :: ByteString }
8888 deriving (GHC.Generic,Show,Eq,Ord,NFData)
8989
@@ -105,13 +105,15 @@ CREATE statements
105105-- :}
106106-- "CREATE TABLE tab (a int, b real);"
107107createTable
108− :: (KnownSymbol table, SOP.SListI columns)
109− => Alias table -- ^ the name of the table to add
108+ :: ( KnownSymbol tab
109+ , SOP.SListI columns
110+ , table ~ (constraints :=> (column ': columns)))
111+ => Alias tab -- ^ the name of the table to add
110112 -> NP (Aliased TypeExpression) (column ': columns)
111113 -- ^ the names and datatype of each column
112− -> [TableConstraint schema (column ': columns)]
114+ -> NP (TableConstraint schema (column ': columns)) constraints
113115 -- ^ constraints that must hold for the table
114− -> Definition schema (Create table (column ': columns) schema)
116+ -> Definition schema (Create tab table schema)
115117createTable table columns constraints = UnsafeDefinition $
116118 "CREATE TABLE" <+> renderAlias table
117119 <+> parenthesized
@@ -140,8 +142,9 @@ createTable table columns constraints = UnsafeDefinition $
140142-- violate a constraint, an error is raised. This applies
141143-- even if the value came from the default value definition.
142144newtype TableConstraint
143− (schema :: TablesType)
145+ (schema :: SchemaType)
144146 (columns :: ColumnsType)
147+ (tableConstraint :: TableConstraint')
145148 = UnsafeTableConstraint { renderTableConstraint :: ByteString }
146149 deriving (GHC.Generic,Show,Eq,Ord,NFData)
147150
@@ -160,7 +163,7 @@ newtype TableConstraint
160163check
161164 :: Condition '[table ::: columns] 'Ungrouped '[]
162165 -- ^ condition to check
163− -> TableConstraint schema columns
166+ -> TableConstraint schema columns 'Check
164167check condition = UnsafeTableConstraint $
165168 "CHECK" <+> parenthesized (renderExpression condition)
166169
@@ -179,7 +182,7 @@ unique
179182 :: SOP.SListI subcolumns
180183 => NP (Column columns) subcolumns
181184 -- ^ unique column or group of columns
182− -> TableConstraint schema columns
185+ -> TableConstraint schema columns ( 'Uniques subcolumns)
183186unique columns = UnsafeTableConstraint $
184187 "UNIQUE" <+> parenthesized (renderCommaSeparated renderColumn columns)
185188
@@ -199,7 +202,7 @@ primaryKey
199202 :: (SOP.SListI subcolumns, AllNotNull subcolumns)
200203 => NP (Column columns) subcolumns
201204 -- ^ identifying column or group of columns
202− -> TableConstraint schema columns
205+ -> TableConstraint schema columns ('Uniques subcolumns)
203206primaryKey columns = UnsafeTableConstraint $
204207 "PRIMARY KEY" <+> parenthesized (renderCommaSeparated renderColumn columns)
205208
@@ -237,8 +240,8 @@ primaryKey columns = UnsafeTableConstraint $
237240-- :}
238241-- "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);"
239242foreignKey
240− :: ( HasTable reftable schema refcolumns
241− , SameTypes subcolumns refsubcolumns
243+ :: ( {-(reftable ::: refcolumns) `In` schema
244+ , -}SameTypes subcolumns refsubcolumns
242245 , AllNotNull subcolumns
243246 , SOP.SListI subcolumns
244247 , SOP.SListI refsubcolumns)
@@ -253,6 +256,7 @@ foreignKey
253256 -> OnUpdateClause
254257 -- ^ what to do when reference is updated
255258 -> TableConstraint schema columns
259+ ('ForeignKey subcolumns reftable refsubcolumns)
256260foreignKey columns reftable refcolumns onDelete onUpdate =
257261 UnsafeTableConstraint $
258262 "FOREIGN KEY" <+> parenthesized (renderCommaSeparated renderColumn columns)
@@ -320,14 +324,14 @@ ALTER statements
320324
321325-- | `alterTable` changes the definition of a table from the schema.
322326alterTable
323− :: HasTable table schema columns0
324− => Alias table -- ^ table to alter
325− -> AlterColumns columns0 columns1 -- ^ alteration to perform
326− -> Definition schema (Alter table schema columns1)
327+ :: (tab ::: table0) `In` schema
328+ => Alias tab -- ^ table to alter
329+ -> AlterTable schema table0 table1 -- ^ alteration to perform
330+ -> Definition schema (Alter tab schema table1)
327331alterTable table alteration = UnsafeDefinition $
328332 "ALTER TABLE"
329333 <+> renderAlias table
330− <+> renderAlterColumns alteration
334+ <+> renderAlterTable alteration
331335 <> ";"
332336
333337-- | `alterTableRename` changes the name of a table from the schema.
@@ -354,21 +358,30 @@ alterTableRename table0 table1 = UnsafeDefinition $
354358-- in renderDefinition definition
355359-- :}
356360-- "ALTER TABLE tab ADD CHECK ((col > 0));"
357−alterTableAddConstraint
358− :: HasTable table schema columns
359− => Alias table -- ^ table to constrain
360− -> TableConstraint schema columns -- ^ what constraint to add
361− -> Definition schema schema
362−alterTableAddConstraint table constraint = UnsafeDefinition $
363− "ALTER TABLE" <+> renderAlias table
364− <+> "ADD" <+> renderTableConstraint constraint <> ";"
365−
366−-- | An `AlterColumns` describes the alteration to perform on the columns
361+-- alterTableAddConstraint
362+-- :: (HasTable table schema columns, (table ::: table0) `In` schema)
363+-- => Alias table -- ^ table to constrain
364+-- -> TableConstraint schema columns constraint -- ^ what constraint to add
365+-- -> Definition schema (Alter table schema (AddConstraint constraint table0))
366+-- alterTableAddConstraint table constraint = UnsafeDefinition $
367+-- "ALTER TABLE" <+> renderAlias table
368+-- <+> "ADD" <+> renderTableConstraint constraint <> ";"
369+
370+addConstraint
371+ :: ( table `In` schema
372+ , table ~ (tab ::: (constraints :=> columns)))
373+ => Alias tab
374+ -> TableConstraint schema columns constraint
375+ -> AlterTable table (tab ::: AddConstraint constraint constraints columns)
376+addConstraint = undefined
377+
378+-- | An `AlterTable` describes the alteration to perform on the columns
367379-- of a table.
368−newtype AlterColumns
369− (columns0 :: ColumnsType)
370− (columns1 :: ColumnsType) =
371− UnsafeAlterColumns {renderAlterColumns :: ByteString}
380+newtype AlterTable
381+ (schema :: SchemaType)
382+ (table0 :: TableType)
383+ (table1 :: TableType) =
384+ UnsafeAlterTable {renderAlterTable :: ByteString}
372385 deriving (GHC.Generic,Show,Eq,Ord,NFData)
373386
374387-- | An `addColumnDefault` adds a new `Optional` column. The new column is
@@ -390,8 +403,8 @@ addColumnDefault
390403 :: (KnownSymbol column, 'Default `In` constraints)
391404 => Alias column -- ^ column to add
392405 -> TypeExpression '(constraints, ty) -- ^ type of the new column
393− -> AlterColumns columns (Create column '(constraints, ty) columns)
394−addColumnDefault column ty = UnsafeAlterColumns $
406+ -> AlterTable schema columns (Create column '(constraints, ty) columns)
407+addColumnDefault column ty = UnsafeAlterTable $
395408 "ADD COLUMN" <+> renderAlias column <+> renderTypeExpression ty
396409
397410-- | An `addColumnNull` adds a new `Null` column. The new column is initially
@@ -412,8 +425,8 @@ addColumnNull
412425 :: KnownSymbol column
413426 => Alias column -- ^ column to add
414427 -> TypeExpression '( '[], ('Null ty)) -- ^ type of the new column
415− -> AlterColumns columns (Create column '( '[], ('Null ty)) columns)
416−addColumnNull column ty = UnsafeAlterColumns $
428+ -> AlterTable schema columns (Create column '( '[], ('Null ty)) columns)
429+addColumnNull column ty = UnsafeAlterTable $
417430 "ADD COLUMN" <+> renderAlias column <+> renderTypeExpression ty
418431
419432-- | A `dropColumn` removes a column. Whatever data was in the column
@@ -435,8 +448,8 @@ addColumnNull column ty = UnsafeAlterColumns $
435448dropColumn
436449 :: KnownSymbol column
437450 => Alias column -- ^ column to remove
438− -> AlterColumns columns (Drop column columns)
439−dropColumn column = UnsafeAlterColumns $
451+ -> AlterTable schema columns (Drop column columns)
452+dropColumn column = UnsafeAlterTable $
440453 "DROP COLUMN" <+> renderAlias column
441454
442455-- | Like `dropColumn` but authorizes dropping everything that depends
@@ -456,8 +469,8 @@ dropColumn column = UnsafeAlterColumns $
456469dropColumnCascade
457470 :: KnownSymbol column
458471 => Alias column -- ^ column to remove
459− -> AlterColumns columns (Drop column columns)
460−dropColumnCascade column = UnsafeAlterColumns $
472+ -> AlterTable schema columns (Drop column columns)
473+dropColumnCascade column = UnsafeAlterTable $
461474 "DROP COLUMN" <+> renderAlias column <+> "CASCADE"
462475
463476-- | A `renameColumn` renames a column.
@@ -475,8 +488,8 @@ renameColumn
475488 :: (KnownSymbol column0, KnownSymbol column1)
476489 => Alias column0
477490 -> Alias column1
478− -> AlterColumns columns (Rename column0 column1 columns)
479−renameColumn column0 column1 = UnsafeAlterColumns $
491+ -> AlterTable schema columns (Rename column0 column1 columns)
492+renameColumn column0 column1 = UnsafeAlterTable $
480493 "RENAME COLUMN" <+> renderAlias column0 <+> "TO" <+> renderAlias column1
481494
482495-- | An `alterColumn` alters a single column.
@@ -484,8 +497,8 @@ alterColumn
484497 :: (KnownSymbol column, HasColumn column columns ty0)
485498 => Alias column -- ^ column to alter
486499 -> AlterColumn ty0 ty1 -- ^ alteration to perform
487− -> AlterColumns columns (Alter column columns ty1)
488−alterColumn column alteration = UnsafeAlterColumns $
500+ -> AlterTable schema columns (Alter column columns ty1)
501+alterColumn column alteration = UnsafeAlterTable $
489502 "ALTER COLUMN" <+> renderAlias column <+> renderAlterColumn alteration
490503
491504-- | An `AlterColumn` describes the alteration to perform on a single column.
@@ -523,7 +536,7 @@ setDefault expression = UnsafeAlterColumn $
523536-- in renderDefinition definition
524537-- :}
525538-- "ALTER TABLE tab ALTER COLUMN col DROP DEFAULT;"
526−dropDefault :: AlterColumn '(constraints, ty) '(DropDefault constraints, ty)
539+dropDefault :: AlterColumn ty (DropConstraint 'Default ty)
527540dropDefault = UnsafeAlterColumn $ "DROP DEFAULT"
528541
529542-- | A `setNotNull` adds a @NOT NULL@ constraint to a column.