@@ -31,11 +31,9 @@ module Squeal.PostgreSQL.Query
3131 Query (UnsafeQuery, renderQuery)
3232 -- ** Select
3333 , select
34+ , select_
3435 , selectDistinct
35− , selectStar
36− , selectDistinctStar
37− , selectDotStar
38− , selectDistinctDotStar
36+ , selectDistinct_
3937 -- ** Values
4038 , values
4139 , values_
@@ -394,80 +392,76 @@ q1 `exceptAll` q2 = UnsafeQuery $
394392SELECT queries
395393-----------------------------------------}
396394
395+data Selection db params grp from row where
396+ List
397+ :: SListI row
398+ => NP (Aliased (Expression db params grp from)) row
399+ -> Selection db params grp from row
400+ Star
401+ :: HasUnique tab from row
402+ => Selection db params 'Ungrouped from row
403+ DotStar
404+ :: Has tab from row
405+ => Alias tab
406+ -> Selection db params 'Ungrouped from row
407+ Also
408+ :: Selection db params grp from right
409+ -> Selection db params grp from left
410+ -> Selection db params grp from (Join left right)
411+
412+instance RenderSQL (Selection db params grp from row) where
413+ renderSQL = \case
414+ List list -> renderCommaSeparated (renderAliasedAs renderExpression) list
415+ Star -> "*"
416+ DotStar tab -> renderAlias tab <> ".*"
417+ Also right left -> renderSQL left <> ", " <> renderSQL right
418+
397419-- | the `TableExpression` in the `select` command constructs an intermediate
398420-- virtual table by possibly combining tables, views, eliminating rows,
399421-- grouping, etc. This table is finally passed on to processing by
400422-- the select list. The select list determines which columns of
401423-- the intermediate table are actually output.
402424select
403− :: (SListI columns, columns ~ (col ': cols))
404− => NP (Aliased (Expression db params grp from)) columns
425+ :: (SListI row, row ~ (x ': xs))
426+ => Selection db params grp from row
405427 -- ^ select list
406428 -> TableExpression db params grp from
407429 -- ^ intermediate virtual table
408− -> Query db params columns
409−select list rels = UnsafeQuery $
430+ -> Query db params row
431+select selection tabexpr = UnsafeQuery $
410432 "SELECT"
411− <+> renderCommaSeparated (renderAliasedAs renderExpression) list
412− <+> renderTableExpression rels
433+ <+> renderSQL selection
434+ <+> renderTableExpression tabexpr
435+
436+select_
437+ :: (SListI row, row ~ (x ': xs))
438+ => NP (Aliased (Expression db params grp from)) row
439+ -> TableExpression db params grp from
440+ -> Query db params row
441+select_ list = select (List list)
413442
414443-- | After the select list has been processed, the result table can
415444-- be subject to the elimination of duplicate rows using `selectDistinct`.
416445selectDistinct
417446 :: (SListI columns, columns ~ (col ': cols))
418− => NP (Aliased (Expression db params 'Ungrouped from)) columns
447+ => Selection db params 'Ungrouped from columns
419448 -- ^ select list
420449 -> TableExpression db params 'Ungrouped from
421450 -- ^ intermediate virtual table
422451 -> Query db params columns
423−selectDistinct list rels = UnsafeQuery $
452+selectDistinct selection tabexpr = UnsafeQuery $
424453 "SELECT DISTINCT"
425− <+> renderCommaSeparated (renderAliasedAs renderExpression) list
426− <+> renderTableExpression rels
427−
428−-- | The simplest kind of query is `selectStar` which emits all columns
429−-- that the table expression produces.
430−selectStar
431− :: HasUnique table from columns
432− => TableExpression db params 'Ungrouped from
433− -- ^ intermediate virtual table
434− -> Query db params columns
435−selectStar rels = UnsafeQuery $ "SELECT" <+> "*" <+> renderTableExpression rels
454+ <+> renderSQL selection
455+ <+> renderTableExpression tabexpr
436456
437−-- | A `selectDistinctStar` emits all columns that the table expression
438−-- produces and eliminates duplicate rows.
439−selectDistinctStar
440− :: HasUnique table from columns
441− => TableExpression db params 'Ungrouped from
442− -- ^ intermediate virtual table
443− -> Query db params columns
444−selectDistinctStar rels = UnsafeQuery $
445− "SELECT DISTINCT" <+> "*" <+> renderTableExpression rels
446−
447−-- | When working with multiple tables, it can also be useful to ask
448−-- for all the columns of a particular table, using `selectDotStar`.
449−selectDotStar
450− :: Has table from columns
451− => Alias table
452− -- ^ particular virtual subtable
453− -> TableExpression db params 'Ungrouped from
454− -- ^ intermediate virtual table
455− -> Query db params columns
456−selectDotStar rel tab = UnsafeQuery $
457− "SELECT" <+> renderAlias rel <> ".*" <+> renderTableExpression tab
458−
459−-- | A `selectDistinctDotStar` asks for all the columns of a particular table,
460−-- and eliminates duplicate rows.
461−selectDistinctDotStar
462− :: Has table from columns
463− => Alias table
464− -- ^ particular virtual table
457+selectDistinct_
458+ :: (SListI columns, columns ~ (col ': cols))
459+ => NP (Aliased (Expression db params 'Ungrouped from)) columns
460+ -- ^ select list
465461 -> TableExpression db params 'Ungrouped from
466462 -- ^ intermediate virtual table
467463 -> Query db params columns
468−selectDistinctDotStar rel tab = UnsafeQuery $
469− "SELECT DISTINCT" <+> renderAlias rel <> ".*"
470− <+> renderTableExpression tab
464+selectDistinct_ list = select (List list)
471465
472466-- | `values` computes a row value or set of row values
473467-- specified by value expressions. It is most commonly used