on dev help sign in
null ordering
cfcf7d3Eitan Chatav
squeal-postgresql/src/Squeal/PostgreSQL/Statement.hs+47−28
@@ -381,16 +381,35 @@ infix 4 >*
381
381
382data SortExpression params tables grouping where
382data SortExpression params tables grouping where
383 Asc
383 Asc
384− :: Expression params tables grouping ty
384+ :: Expression params tables grouping ('Required ('NotNull ty))
385 -> SortExpression params tables grouping
385 -> SortExpression params tables grouping
386 Desc
386 Desc
387− :: Expression params tables grouping ty
387+ :: Expression params tables grouping ('Required ('NotNull ty))
388+ -> SortExpression params tables grouping
389+ AscNullsFirst
390+ :: Expression params tables grouping ('Required ('Null ty))
391+ -> SortExpression params tables grouping
392+ AscNullsLast
393+ :: Expression params tables grouping ('Required ('Null ty))
394+ -> SortExpression params tables grouping
395+ DescNullsFirst
396+ :: Expression params tables grouping ('Required ('Null ty))
397+ -> SortExpression params tables grouping
398+ DescNullsLast
399+ :: Expression params tables grouping ('Required ('Null ty))
388 -> SortExpression params tables grouping
400 -> SortExpression params tables grouping
389
401
390renderSortExpression :: SortExpression params tables grouping -> ByteString
402renderSortExpression :: SortExpression params tables grouping -> ByteString
391renderSortExpression = \case
403renderSortExpression = \case
392 Asc expression -> renderExpression expression <+> "ASC"
404 Asc expression -> renderExpression expression <+> "ASC"
393 Desc expression -> renderExpression expression <+> "DESC"
405 Desc expression -> renderExpression expression <+> "DESC"
406+ AscNullsFirst expression -> renderExpression expression
407+ <+> "ASC NULLS FIRST"
408+ DescNullsFirst expression -> renderExpression expression
409+ <+> "DESC NULLS FIRST"
410+ AscNullsLast expression -> renderExpression expression <+> "ASC NULLS LAST"
411+ DescNullsLast expression -> renderExpression expression <+> "DESC NULLS LAST"
412+
394
413
395{-----------------------------------------
414{-----------------------------------------
396aggregation
415aggregation
@@ -597,52 +616,52 @@ instance HasTable table schema columns
597 => IsLabel table (Table schema columns) where
616 => IsLabel table (Table schema columns) where
598 fromLabel = getTable (Alias @table)
617 fromLabel = getTable (Alias @table)
599
618
600−data TableReference params schema tables where
619+data FromClause params schema tables where
601 Table
620 Table
602 :: Aliased (Table schema) table
621 :: Aliased (Table schema) table
603− -> TableReference params schema '[table]
622+ -> FromClause params schema '[table]
604 Subquery
623 Subquery
605 :: Aliased (Query schema params) table
624 :: Aliased (Query schema params) table
606− -> TableReference params schema '[table]
625+ -> FromClause params schema '[table]
607 CrossJoin
626 CrossJoin
608− :: TableReference params schema right
627+ :: FromClause params schema right
609− -> TableReference params schema left
628+ -> FromClause params schema left
610− -> TableReference params schema (Join left right)
629+ -> FromClause params schema (Join left right)
611 InnerJoin
630 InnerJoin
612− :: TableReference params schema right
631+ :: FromClause params schema right
613 -> Condition params (Join left right) 'Ungrouped
632 -> Condition params (Join left right) 'Ungrouped
614− -> TableReference params schema left
633+ -> FromClause params schema left
615− -> TableReference params schema (Join left right)
634+ -> FromClause params schema (Join left right)
616 LeftOuterJoin
635 LeftOuterJoin
617− :: TableReference params schema right
636+ :: FromClause params schema right
618 -> Condition params (Join left right) 'Ungrouped
637 -> Condition params (Join left right) 'Ungrouped
619− -> TableReference params schema left
638+ -> FromClause params schema left
620− -> TableReference params schema (Join left (NullifyTables right))
639+ -> FromClause params schema (Join left (NullifyTables right))
621 RightOuterJoin
640 RightOuterJoin
622− :: TableReference params schema right
641+ :: FromClause params schema right
623 -> Condition params (Join left right) 'Ungrouped
642 -> Condition params (Join left right) 'Ungrouped
624− -> TableReference params schema left
643+ -> FromClause params schema left
625− -> TableReference params schema (Join (NullifyTables left) right)
644+ -> FromClause params schema (Join (NullifyTables left) right)
626 FullOuterJoin
645 FullOuterJoin
627− :: TableReference params schema right
646+ :: FromClause params schema right
628 -> Condition params (Join left right) 'Ungrouped
647 -> Condition params (Join left right) 'Ungrouped
629− -> TableReference params schema left
648+ -> FromClause params schema left
630− -> TableReference params schema
649+ -> FromClause params schema
631 (Join (NullifyTables left) (NullifyTables right))
650 (Join (NullifyTables left) (NullifyTables right))
632
651
633−renderTableReference :: TableReference params schema tables -> ByteString
652+renderFromClause :: FromClause params schema tables -> ByteString
634−renderTableReference = \case
653+renderFromClause = \case
635 Table table -> renderAliased renderTable table
654 Table table -> renderAliased renderTable table
636 Subquery selection -> renderAliased renderQuery selection
655 Subquery selection -> renderAliased renderQuery selection
637 CrossJoin right left ->
656 CrossJoin right left ->
638− renderTableReference left <+> "CROSS JOIN" <+> renderTableReference right
657+ renderFromClause left <+> "CROSS JOIN" <+> renderFromClause right
639 InnerJoin right on left -> renderJoin "INNER JOIN" right on left
658 InnerJoin right on left -> renderJoin "INNER JOIN" right on left
640 LeftOuterJoin right on left -> renderJoin "LEFT OUTER JOIN" right on left
659 LeftOuterJoin right on left -> renderJoin "LEFT OUTER JOIN" right on left
641 RightOuterJoin right on left -> renderJoin "RIGHT OUTER JOIN" right on left
660 RightOuterJoin right on left -> renderJoin "RIGHT OUTER JOIN" right on left
642 FullOuterJoin right on left -> renderJoin "FULL OUTER JOIN" right on left
661 FullOuterJoin right on left -> renderJoin "FULL OUTER JOIN" right on left
643 where
662 where
644 renderJoin op right on left =
663 renderJoin op right on left =
645− renderTableReference left <+> op <+> renderTableReference right
664+ renderFromClause left <+> op <+> renderFromClause right
646 <+> "ON" <+> renderExpression on
665 <+> "ON" <+> renderExpression on
647
666
648data TableExpression
667data TableExpression
@@ -651,7 +670,7 @@ data TableExpression
651 (tables :: [(Symbol,[(Symbol,ColumnType)])])
670 (tables :: [(Symbol,[(Symbol,ColumnType)])])
652 (grouping :: Grouping)
671 (grouping :: Grouping)
653 = TableExpression
672 = TableExpression
654− { fromClause :: TableReference params schema tables
673+ { fromClause :: FromClause params schema tables
655 , whereClause :: [Condition params tables 'Ungrouped]
674 , whereClause :: [Condition params tables 'Ungrouped]
656 , groupByClause :: GroupByClause tables grouping
675 , groupByClause :: GroupByClause tables grouping
657 , havingClause :: HavingClause params tables grouping
676 , havingClause :: HavingClause params tables grouping
@@ -665,7 +684,7 @@ renderTableExpression
665 -> ByteString
684 -> ByteString
666renderTableExpression
685renderTableExpression
667 (TableExpression tables whs' grps' hvs' srts' lims' offs') = mconcat
686 (TableExpression tables whs' grps' hvs' srts' lims' offs') = mconcat
668− [ "FROM ", renderTableReference tables
687+ [ "FROM ", renderFromClause tables
669 , renderWheres whs'
688 , renderWheres whs'
670 , renderGroupByClause grps'
689 , renderGroupByClause grps'
671 , renderHavingClause hvs'
690 , renderHavingClause hvs'
@@ -690,7 +709,7 @@ renderTableExpression
690 offs -> " OFFSET" <+> fromString (show (sum offs))
709 offs -> " OFFSET" <+> fromString (show (sum offs))
691
710
692from
711from
693− :: TableReference params schema tables
712+ :: FromClause params schema tables
694 -> TableExpression params schema tables 'Ungrouped
713 -> TableExpression params schema tables 'Ungrouped
695from tables = TableExpression tables [] NoGroups NoHaving [] [] []
714from tables = TableExpression tables [] NoGroups NoHaving [] [] []
696
715
@@ -990,7 +1009,7 @@ data TableConstraint
990 = UnsafeTableConstraint { renderTableConstraint :: ByteString }
1009 = UnsafeTableConstraint { renderTableConstraint :: ByteString }
991
1010
992check
1011check
993− :: Condition '[] '[table ::: columns] 'Ungrouped
1012+ :: (forall table. Condition '[] '[table ::: columns] 'Ungrouped)
994 -> TableConstraint schema columns
1013 -> TableConstraint schema columns
995check condition = UnsafeTableConstraint $
1014check condition = UnsafeTableConstraint $
996 "CHECK" <+> parenthesized (renderExpression condition)
1015 "CHECK" <+> parenthesized (renderExpression condition)
squeal-postgresql/test/Squeal/PostgreSQL/StatementSpec.hs+5−5
@@ -91,7 +91,7 @@ spec = do
91 select (sum_ #col2 `As` #sum :* #col1 `As` #col1 :* Nil)
91 select (sum_ #col2 `As` #sum :* #col1 `As` #col1 :* Nil)
92 ( from (Table (#table1 `As` #table1))
92 ( from (Table (#table1 `As` #table1))
93 & group (By #col1 :* Nil)
93 & group (By #col1 :* Nil)
94− & having ((#col1 + sum_ #col2) >* 1) )
94+ & having (#col1 + sum_ #col2 >* 1) )
95 statement `queryRenders`
95 statement `queryRenders`
96 "SELECT sum(col2) AS sum, col1 AS col1\
96 "SELECT sum(col2) AS sum, col1 AS col1\
97 \ FROM table1 AS table1\
97 \ FROM table1 AS table1\
@@ -181,12 +181,12 @@ spec = do
181 let
181 let
182 statement :: Query JoinTables '[] ValueColumns
182 statement :: Query JoinTables '[] ValueColumns
183 statement = select
183 statement = select
184− ( (#orders ! #orderVal) `As` #orderVal
184+ ( #orders ! #orderVal `As` #orderVal :*
185− :* (#customers ! #customerVal) `As` #customerVal
185+ #customers ! #customerVal `As` #customerVal :*
186− :* (#shippers ! #shipperVal) `As` #shipperVal :* Nil)
186+ #shippers ! #shipperVal `As` #shipperVal :* Nil )
187 ( from (Table (#orders `As` #orders)
187 ( from (Table (#orders `As` #orders)
188 & CrossJoin (Table (#customers `As` #customers))
188 & CrossJoin (Table (#customers `As` #customers))
189− & CrossJoin (Table (#shippers `As` #shippers))))
189+ & CrossJoin (Table (#shippers `As` #shippers))) )
190 statement `queryRenders`
190 statement `queryRenders`
191 "SELECT\
191 "SELECT\
192 \ orders.orderVal AS orderVal,\
192 \ orders.orderVal AS orderVal,\