@@ -31,11 +31,9 @@ module Squeal.PostgreSQL.Query
31 Query (UnsafeQuery, renderQuery)
31 Query (UnsafeQuery, renderQuery)
32 -- ** Select
32 -- ** Select
34 , selectDistinct
35 , selectDistinct
35− , selectStar
36+ , selectDistinct_
38− , selectDistinctDotStar
39 -- ** Values
37 -- ** Values
@@ -394,80 +392,76 @@ q1 `exceptAll` q2 = UnsafeQuery $
394SELECT queries
392SELECT queries
395-----------------------------------------}
393-----------------------------------------}
395+data Selection db params grp from row where
398+ => NP (Aliased (Expression db params grp from)) row
399+ -> Selection db params grp from row
401+ :: HasUnique tab from row
402+ => Selection db params 'Ungrouped from row
406+ -> Selection db params 'Ungrouped from row
408+ :: Selection db params grp from right
409+ -> Selection db params grp from left
410+ -> Selection db params grp from (Join left right)
412+instance RenderSQL (Selection db params grp from row) where
414+ List list -> renderCommaSeparated (renderAliasedAs renderExpression) list
416+ DotStar tab -> renderAlias tab <> ".*"
417+ Also right left -> renderSQL left <> ", " <> renderSQL right
397-- | the `TableExpression` in the `select` command constructs an intermediate
419-- | the `TableExpression` in the `select` command constructs an intermediate
398-- virtual table by possibly combining tables, views, eliminating rows,
420-- virtual table by possibly combining tables, views, eliminating rows,
399-- grouping, etc. This table is finally passed on to processing by
421-- grouping, etc. This table is finally passed on to processing by
400-- the select list. The select list determines which columns of
422-- the select list. The select list determines which columns of
401-- the intermediate table are actually output.
423-- the intermediate table are actually output.
403− :: (SListI columns, columns ~ (col ': cols))
425+ :: (SListI row, row ~ (x ': xs))
404− => NP (Aliased (Expression db params grp from)) columns
426+ => Selection db params grp from row
405 -- ^ select list
427 -- ^ select list
406 -> TableExpression db params grp from
428 -> TableExpression db params grp from
407 -- ^ intermediate virtual table
429 -- ^ intermediate virtual table
408− -> Query db params columns
430+ -> Query db params row
409−select list rels = UnsafeQuery $
431+select selection tabexpr = UnsafeQuery $
411− <+> renderCommaSeparated (renderAliasedAs renderExpression) list
433+ <+> renderSQL selection
412− <+> renderTableExpression rels
434+ <+> renderTableExpression tabexpr
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)
414-- | After the select list has been processed, the result table can
443-- | After the select list has been processed, the result table can
415-- be subject to the elimination of duplicate rows using `selectDistinct`.
444-- be subject to the elimination of duplicate rows using `selectDistinct`.
416selectDistinct
445selectDistinct
417 :: (SListI columns, columns ~ (col ': cols))
446 :: (SListI columns, columns ~ (col ': cols))
418− => NP (Aliased (Expression db params 'Ungrouped from)) columns
447+ => Selection db params 'Ungrouped from columns
419 -- ^ select list
448 -- ^ select list
420 -> TableExpression db params 'Ungrouped from
449 -> TableExpression db params 'Ungrouped from
421 -- ^ intermediate virtual table
450 -- ^ intermediate virtual table
422 -> Query db params columns
451 -> Query db params columns
423−selectDistinct list rels = UnsafeQuery $
452+selectDistinct selection tabexpr = UnsafeQuery $
424 "SELECT DISTINCT"
453 "SELECT DISTINCT"
425− <+> renderCommaSeparated (renderAliasedAs renderExpression) list
454+ <+> renderSQL selection
426− <+> renderTableExpression rels
428−-- | The simplest kind of query is `selectStar` which emits all columns
429−-- that the table expression produces.
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
455+ <+> renderTableExpression tabexpr
437−-- | A `selectDistinctStar` emits all columns that the table expression
457+selectDistinct_
438−-- produces and eliminates duplicate rows.
458+ :: (SListI columns, columns ~ (col ': cols))
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
447−-- | When working with multiple tables, it can also be useful to ask
448−-- for all the columns of a particular table, using `selectDotStar`.
450− :: Has table from columns
452− -- ^ particular virtual subtable
453− -> TableExpression db params 'Ungrouped from
459+ => NP (Aliased (Expression db params 'Ungrouped from)) columns
454− -- ^ intermediate virtual table
460+ -- ^ select list
455− -> Query db params columns
456−selectDotStar rel tab = UnsafeQuery $
457− "SELECT" <+> renderAlias rel <> ".*" <+> renderTableExpression tab
459−-- | A `selectDistinctDotStar` asks for all the columns of a particular table,
460−-- and eliminates duplicate rows.
461−selectDistinctDotStar
462− :: Has table from columns
464− -- ^ particular virtual table
465 -> TableExpression db params 'Ungrouped from
461 -> TableExpression db params 'Ungrouped from
466 -- ^ intermediate virtual table
462 -- ^ intermediate virtual table
467 -> Query db params columns
463 -> Query db params columns
468−selectDistinctDotStar rel tab = UnsafeQuery $
464+selectDistinct_ list = select (List list)
469− "SELECT DISTINCT" <+> renderAlias rel <> ".*"
470− <+> renderTableExpression tab
472-- | `values` computes a row value or set of row values
466-- | `values` computes a row value or set of row values
473-- specified by value expressions. It is most commonly used
467-- specified by value expressions. It is most commonly used