@@ -12,6 +12,7 @@ Squeal data definition language.
1212 DataKinds
1313 , DeriveDataTypeable
1414 , DeriveGeneric
15+ , FlexibleContexts
1516 , GADTs
1617 , GeneralizedNewtypeDeriving
1718 , KindSignatures
@@ -43,12 +44,12 @@ module Squeal.PostgreSQL.Definition
4344 -- * Alter
4445 , alterTable
4546 , alterTableRename
46− , alterTableAddConstraint
47+ , addConstraint
4748 , AlterTable (UnsafeAlterTable, renderAlterTable)
4849 , addColumnDefault
4950 , addColumnNull
5051 , dropColumn
51− , dropColumnCascade
52+ -- , dropColumnCascade
5253 , renameColumn
5354 , alterColumn
5455 , AlterColumn (UnsafeAlterColumn, renderAlterColumn)
@@ -107,6 +108,7 @@ CREATE statements
107108createTable
108109 :: ( KnownSymbol tab
109110 , SOP.SListI columns
111+ , SOP.SListI constraints
110112 , table ~ (constraints :=> (column ': columns)))
111113 => Alias tab -- ^ the name of the table to add
112114 -> NP (Aliased TypeExpression) (column ': columns)
@@ -118,16 +120,12 @@ createTable table columns constraints = UnsafeDefinition $
118120 "CREATE TABLE" <+> renderAlias table
119121 <+> parenthesized
120122 ( renderCommaSeparated renderColumnDef columns
121− <> renderConstraints constraints )
123+ <> renderCommaSeparated renderTableConstraint constraints )
122124 <> ";"
123125 where
124126 renderColumnDef :: Aliased TypeExpression x -> ByteString
125127 renderColumnDef (ty `As` column) =
126128 renderAlias column <+> renderTypeExpression ty
127− renderConstraints :: [TableConstraint schema columns] -> ByteString
128− renderConstraints = \case
129− [] -> ""
130− _ -> ", " <> commaSeparated (renderTableConstraint <$> constraints)
131129
132130-- | Data types are a way to limit the kind of data that can be stored in a
133131-- table. For many applications, however, the constraint they provide is
@@ -240,14 +238,14 @@ primaryKey columns = UnsafeTableConstraint $
240238-- :}
241239-- "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);"
242240foreignKey
243− :: ( {-(reftable ::: refcolumns) `In` schema
244− , -}SameTypes subcolumns refsubcolumns
241+ :: ( HasTable tab (UnconstrainOver schema) refcolumns
242+ , SameTypes subcolumns refsubcolumns
245243 , AllNotNull subcolumns
246244 , SOP.SListI subcolumns
247245 , SOP.SListI refsubcolumns)
248246 => NP (Column columns) subcolumns
249247 -- ^ column or columns in the table
250− -> Alias reftable
248+ -> Alias tab
251249 -- ^ reference table
252250 -> NP (Column refcolumns) refsubcolumns
253251 -- ^ reference column or columns in the reference table
@@ -256,7 +254,7 @@ foreignKey
256254 -> OnUpdateClause
257255 -- ^ what to do when reference is updated
258256 -> TableConstraint schema columns
259− ('ForeignKey subcolumns reftable refsubcolumns)
257+ ('ForeignKey subcolumns tab refsubcolumns)
260258foreignKey columns reftable refcolumns onDelete onUpdate =
261259 UnsafeTableConstraint $
262260 "FOREIGN KEY" <+> parenthesized (renderCommaSeparated renderColumn columns)
@@ -324,7 +322,7 @@ ALTER statements
324322
325323-- | `alterTable` changes the definition of a table from the schema.
326324alterTable
327− :: (tab ::: table0) `In` schema
325+ :: (KnownSymbol tab, (tab ::: table0) `In` schema)
328326 => Alias tab -- ^ table to alter
329327 -> AlterTable schema table0 table1 -- ^ alteration to perform
330328 -> Definition schema (Alter tab schema table1)
@@ -368,11 +366,10 @@ alterTableRename table0 table1 = UnsafeDefinition $
368366-- <+> "ADD" <+> renderTableConstraint constraint <> ";"
369367
370368addConstraint
371− :: ( table `In` schema
372− , table ~ (tab ::: (constraints :=> columns)))
369+ :: (tab ::: table) `In` schema
373370 => Alias tab
374371 -> TableConstraint schema columns constraint
375− -> AlterTable table (tab ::: AddConstraint constraint constraints columns)
372+ -> AlterTable schema table (AddConstraint constraint table)
376373addConstraint = undefined
377374
378375-- | An `AlterTable` describes the alteration to perform on the columns
@@ -402,8 +399,8 @@ newtype AlterTable
402399addColumnDefault
403400 :: (KnownSymbol column, 'Default `In` constraints)
404401 => Alias column -- ^ column to add
405− -> TypeExpression '(constraints, ty) -- ^ type of the new column
406− -> AlterTable schema columns (Create column '(constraints, ty) columns)
402+ -> TypeExpression (constraints :=> ty) -- ^ type of the new column
403+ -> AlterTable schema table (Add column (constraints :=> ty) table)
407404addColumnDefault column ty = UnsafeAlterTable $
408405 "ADD COLUMN" <+> renderAlias column <+> renderTypeExpression ty
409406
@@ -424,8 +421,8 @@ addColumnDefault column ty = UnsafeAlterTable $
424421addColumnNull
425422 :: KnownSymbol column
426423 => Alias column -- ^ column to add
427− -> TypeExpression '( '[], ('Null ty)) -- ^ type of the new column
428− -> AlterTable schema columns (Create column '( '[], ('Null ty)) columns)
424+ -> TypeExpression ( '[] :=> 'Null ty) -- ^ type of the new column
425+ -> AlterTable schema table (Add column ( '[] :=> 'Null ty) table)
429426addColumnNull column ty = UnsafeAlterTable $
430427 "ADD COLUMN" <+> renderAlias column <+> renderTypeExpression ty
431428
@@ -448,7 +445,7 @@ addColumnNull column ty = UnsafeAlterTable $
448445dropColumn
449446 :: KnownSymbol column
450447 => Alias column -- ^ column to remove
451− -> AlterTable schema columns (Drop column columns)
448+ -> AlterTable schema ('[] :=> columns) ('[] :=> Drop column columns)
452449dropColumn column = UnsafeAlterTable $
453450 "DROP COLUMN" <+> renderAlias column
454451
@@ -466,12 +463,12 @@ dropColumn column = UnsafeAlterTable $
466463-- in renderDefinition definition
467464-- :}
468465-- "ALTER TABLE tab DROP COLUMN col2 CASCADE;"
469−dropColumnCascade
470− :: KnownSymbol column
471− => Alias column -- ^ column to remove
472− -> AlterTable schema columns (Drop column columns)
473−dropColumnCascade column = UnsafeAlterTable $
474− "DROP COLUMN" <+> renderAlias column <+> "CASCADE"
466+-- dropColumnCascade
467+-- :: KnownSymbol column
468+-- => Alias column -- ^ column to remove
469+-- -> AlterTable schema columns (Drop column columns)
470+-- dropColumnCascade column = UnsafeAlterTable $
471+-- "DROP COLUMN" <+> renderAlias column <+> "CASCADE"
475472
476473-- | A `renameColumn` renames a column.
477474--
@@ -488,7 +485,8 @@ renameColumn
488485 :: (KnownSymbol column0, KnownSymbol column1)
489486 => Alias column0
490487 -> Alias column1
491− -> AlterTable schema columns (Rename column0 column1 columns)
488+ -> AlterTable schema ('[] :=> columns)
489+ ('[] :=> Rename column0 column1 columns)
492490renameColumn column0 column1 = UnsafeAlterTable $
493491 "RENAME COLUMN" <+> renderAlias column0 <+> "TO" <+> renderAlias column1
494492
@@ -497,7 +495,7 @@ alterColumn
497495 :: (KnownSymbol column, HasColumn column columns ty0)
498496 => Alias column -- ^ column to alter
499497 -> AlterColumn ty0 ty1 -- ^ alteration to perform
500− -> AlterTable schema columns (Alter column columns ty1)
498+ -> AlterTable schema ('[] :=> columns) ('[] :=> Alter column columns ty1)
501499alterColumn column alteration = UnsafeAlterTable $
502500 "ALTER COLUMN" <+> renderAlias column <+> renderAlterColumn alteration
503501