@@ -35,6 +35,7 @@ module Squeal.PostgreSQL.Manipulation
3535 , DefaultAliasable (..)
3636 , ColumnExpression (..)
3737 , ReturningClause (..)
38+ , pattern Returning_
3839 , ConflictClause (..)
3940 , ConflictTarget (..)
4041 , ConflictAction (..)
@@ -42,7 +43,6 @@ module Squeal.PostgreSQL.Manipulation
4243 -- * Insert
4344 , insertInto
4445 , insertInto_
45− , renderReturningClause
4646 , renderConflictClause
4747 , renderConflictTarget
4848 , renderConflictAction
@@ -231,19 +231,19 @@ insertInto
231231 , Has sch schemas schema
232232 , Has tab schema ('Table table)
233233 , columns ~ TableToColumns table
234− , row ~ TableToRow table
234+ , row0 ~ TableToRow table
235235 , SOP.SListI columns
236− , SOP.SListI result )
236+ , SOP.SListI row1 )
237237 => QualifiedAlias sch tab
238238 -> QueryClause db params columns
239239 -> ConflictClause tab db params table
240− -> ReturningClause db params row result
241− -> Manipulation db params result
240+ -> ReturningClause db params '[tab ::: row0] row1
241+ -> Manipulation db params row1
242242insertInto tab qry conflict ret = UnsafeManipulation $
243243 "INSERT" <+> "INTO" <+> renderQualifiedAlias tab
244244 <+> renderQueryClause qry
245245 <> renderConflictClause conflict
246− <> renderReturningClause ret
246+ <> renderSQL ret
247247
248248insertInto_
249249 :: ( db ~ (commons :=> schemas)
@@ -256,7 +256,7 @@ insertInto_
256256 -> QueryClause db params columns
257257 -> Manipulation db params '[]
258258insertInto_ tab qry =
259− insertInto tab qry OnConflictDoRaise (Returning Nil)
259+ insertInto tab qry OnConflictDoRaise (Returning_ Nil)
260260
261261data QueryClause db params columns where
262262 Values
@@ -408,28 +408,17 @@ renderColumnExpression = \case
408408-- the row will not be returned. `ReturningStar` will return all columns
409409-- in the row. Use @Returning Nil@ in the common case where no return
410410-- values are desired.
411−data ReturningClause
412− (db :: DBType)
413− (params :: [NullityType])
414− (row0 :: RowType)
415− (row1 :: RowType)
416− where
417− ReturningStar
418− :: ReturningClause db params row row
419− Returning
420− :: NP (Aliased (Expression db params 'Ungrouped '[tab ::: row0])) row1
421− -> ReturningClause db params row0 row1
422−
423−-- | Render a `ReturningClause`.
424−renderReturningClause
425− :: SOP.SListI results
426− => ReturningClause db params columns results
427− -> ByteString
428−renderReturningClause = \case
429− ReturningStar -> " RETURNING *"
430− Returning Nil -> ""
431− Returning results -> " RETURNING"
432− <+> renderCommaSeparated (renderAliasedAs renderExpression) results
411+newtype ReturningClause db params from row =
412+ Returning (Selection db params 'Ungrouped from row)
413+
414+instance RenderSQL (ReturningClause db params from row) where
415+ renderSQL (Returning selection) = "RETURNING" <+> renderSQL selection
416+
417+pattern Returning_
418+ :: SOP.SListI row
419+ => NP (Aliased (Expression db params 'Ungrouped from)) row
420+ -> ReturningClause db params from row
421+pattern Returning_ list = Returning (List list)
433422
434423-- | A `ConflictClause` specifies an action to perform upon a constraint
435424-- violation. `OnConflictDoRaise` will raise an error.
@@ -500,28 +489,28 @@ UPDATE statements
500489-- in all rows that satisfy the condition.
501490update
502491 :: ( SOP.SListI columns
503− , SOP.SListI results
492+ , SOP.SListI row1
504493 , db ~ (commons :=> schemas)
505494 , Has sch schemas schema
506495 , Has tab schema ('Table table)
507− , row ~ TableToRow table
496+ , row0 ~ TableToRow table
508497 , columns ~ TableToColumns table
509498 , SOP.All (HasIn columns) subcolumns
510499 , AllUnique subcolumns )
511500 => QualifiedAlias sch tab -- ^ table to update
512− -> NP (ColumnExpression db params 'Ungrouped '[tab ::: row]) subcolumns
501+ -> NP (ColumnExpression db params 'Ungrouped '[tab ::: row0]) subcolumns
513502 -- ^ modified values to replace old values
514− -> Condition db params 'Ungrouped '[tab ::: row]
503+ -> Condition db params 'Ungrouped '[tab ::: row0]
515504 -- ^ condition under which to perform update on a row
516− -> ReturningClause db params row results -- ^ results to return
517− -> Manipulation db params results
505+ -> ReturningClause db params '[tab ::: row0] row1 -- ^ results to return
506+ -> Manipulation db params row1
518507update tab columns wh returning = UnsafeManipulation $
519508 "UPDATE"
520509 <+> renderQualifiedAlias tab
521510 <+> "SET"
522511 <+> renderCommaSeparated renderColumnExpression columns
523512 <+> "WHERE" <+> renderExpression wh
524− <> renderReturningClause returning
513+ <> renderSQL returning
525514
526515-- | Update a row returning `Nil`.
527516update_
@@ -539,7 +528,7 @@ update_
539528 -> Condition db params 'Ungrouped '[tab ::: row]
540529 -- ^ condition under which to perform update on a row
541530 -> Manipulation db params '[]
542−update_ tab columns wh = update tab columns wh (Returning Nil)
531+update_ tab columns wh = update tab columns wh (Returning_ Nil)
543532
544533{-----------------------------------------
545534DELETE statements
@@ -553,18 +542,18 @@ data UsingClause db params from where
553542
554543-- | Delete rows from a table.
555544deleteFrom
556− :: ( SOP.SListI results
545+ :: ( SOP.SListI row1
557546 , db ~ (commons :=> schemas)
558547 , Has sch schemas schema
559548 , Has tab schema ('Table table)
560− , row ~ TableToRow table
549+ , row0 ~ TableToRow table
561550 , columns ~ TableToColumns table )
562551 => QualifiedAlias sch tab -- ^ table to delete from
563552 -> UsingClause db params from
564− -> Condition db params 'Ungrouped (tab ::: row ': from)
553+ -> Condition db params 'Ungrouped (tab ::: row0 ': from)
565554 -- ^ condition under which to delete a row
566− -> ReturningClause db params row results -- ^ results to return
567− -> Manipulation db params results
555+ -> ReturningClause db params '[tab ::: row0] row1 -- ^ results to return
556+ -> Manipulation db params row1
568557deleteFrom tab using wh returning = UnsafeManipulation $
569558 "DELETE FROM"
570559 <+> renderQualifiedAlias tab
@@ -572,7 +561,7 @@ deleteFrom tab using wh returning = UnsafeManipulation $
572561 NoUsing -> ""
573562 Using tables -> " USING" <+> renderFromClause tables
574563 <+> "WHERE" <+> renderExpression wh
575− <> renderReturningClause returning
564+ <> renderSQL returning
576565
577566-- | Delete rows returning `Nil`.
578567deleteFrom_
@@ -586,7 +575,7 @@ deleteFrom_
586575 -> Condition db params 'Ungrouped (tab ::: row ': from)
587576 -- ^ condition under which to delete a row
588577 -> Manipulation db params '[]
589−deleteFrom_ tab uses wh = deleteFrom tab uses wh (Returning Nil)
578+deleteFrom_ tab uses wh = deleteFrom tab uses wh (Returning_ Nil)
590579
591580-- | This has the behaviour of a cartesian product, taking all
592581-- possible combinations between @left@ and @right@ - exactly like a