@@ -97,18 +97,56 @@ unNull
9797unNull = UnsafeExpression . renderExpression
9898
9999coalesce
100− :: [Expression params tables grouping ('Required ('Null x))]
101− -> Expression params tables grouping ('Required ('NotNull x))
102− -> Expression params tables grouping ('Required ('NotNull x))
103−coalesce nulls isn'tNull = UnsafeExpression $
100+ :: [Expression params tables grouping ('Required ('Null ty))]
101+ -> Expression params tables grouping ('Required ('NotNull ty))
102+ -> Expression params tables grouping ('Required ('NotNull ty))
103+coalesce nullxs notNullx = UnsafeExpression $
104104 "COALESCE" <> parenthesized (commaSeparated
105− ((renderExpression <$> nulls) <> [renderExpression isn'tNull]))
105+ ((renderExpression <$> nullxs) <> [renderExpression notNullx]))
106106
107107fromNull
108− :: Expression params tables grouping ('Required ('NotNull x))
109− -> Expression params tables grouping ('Required ('Null x))
110− -> Expression params tables grouping ('Required ('NotNull x))
111−fromNull isn'tNull isNull = coalesce [isNull] isn'tNull
108+ :: Expression params tables grouping ('Required ('NotNull ty))
109+ -> Expression params tables grouping ('Required ('Null ty))
110+ -> Expression params tables grouping ('Required ('NotNull ty))
111+fromNull notNullx nullx = coalesce [nullx] notNullx
112+
113+isNull
114+ :: Expression params tables grouping ('Required ('Null ty))
115+ -> Condition params tables grouping
116+isNull x = UnsafeExpression $ renderExpression x <+> "IS NULL"
117+
118+isn'tNull
119+ :: Expression params tables grouping ('Required ('Null ty))
120+ -> Condition params tables grouping
121+isn'tNull x = UnsafeExpression $ renderExpression x <+> "IS NOT NULL"
122+
123+matchNull
124+ :: Expression params tables grouping ('Required nullty)
125+ -> ( Expression params tables grouping ('Required ('NotNull ty))
126+ -> Expression params tables grouping ('Required nullty) )
127+ -> Expression params tables grouping ('Required ('Null ty))
128+ -> Expression params tables grouping ('Required nullty)
129+matchNull y f x = ifThenElse (isNull x) y
130+ (f (UnsafeExpression (renderExpression y)))
131+
132+nullIf
133+ :: Expression params tables grouping ('Required ('NotNull ty))
134+ -> Expression params tables grouping ('Required ('NotNull ty))
135+ -> Expression params tables grouping ('Required ('Null ty))
136+nullIf x y = UnsafeExpression $ parenthesized $
137+ renderExpression x <> ", " <> renderExpression y
138+
139+greatest
140+ :: [Expression params tables grouping ('Required nullty)]
141+ -> Expression params table grouping ('Required nullty)
142+greatest xs = UnsafeExpression $ "GREATEST("
143+ <> commaSeparated (renderExpression <$> xs) <> ")"
144+
145+least
146+ :: [Expression params tables grouping ('Required nullty)]
147+ -> Expression params table grouping ('Required nullty)
148+least xs = UnsafeExpression $ "LEAST("
149+ <> commaSeparated (renderExpression <$> xs) <> ")"
112150
113151unsafeBinaryOp
114152 :: ByteString
@@ -200,51 +238,36 @@ cast ty x = UnsafeExpression $ parenthesized $
200238 renderExpression x <+> "::" <+> renderTypeExpression ty
201239
202240div
203− :: PGIntegral ty
204− => Expression params tables grouping ('Required (nullity ty))
205− -> Expression params tables grouping ('Required (nullity ty))
206− -> Expression params tables grouping ('Required (nullity ty))
241+ :: PGIntegral int
242+ => Expression params tables grouping ('Required (nullity int))
243+ -> Expression params tables grouping ('Required (nullity int))
244+ -> Expression params tables grouping ('Required (nullity int))
207245div = unsafeBinaryOp "/"
208246
209247mod
210− :: PGIntegral ty
211− => Expression params tables grouping ('Required (nullity ty))
212− -> Expression params tables grouping ('Required (nullity ty))
213− -> Expression params tables grouping ('Required (nullity ty))
248+ :: PGIntegral int
249+ => Expression params tables grouping ('Required (nullity int))
250+ -> Expression params tables grouping ('Required (nullity int))
251+ -> Expression params tables grouping ('Required (nullity int))
214252mod = unsafeBinaryOp "%"
215253
216−truncate
217− :: (PGFloating frac, PGTyped int)
254+trunc
255+ :: PGFloating frac
218256 => Expression params tables grouping ('Required (nullity frac))
219− -> Expression params tables grouping ('Required (nullity int))
220−truncate = cast pgtype . truncate'
221− where
222− truncate'
223− :: Expression params tables grouping ('Required (nullity frac))
224− -> Expression params tables grouping ('Required (nullity frac))
225− truncate' = unsafeFunction "trunc"
257+ -> Expression params tables grouping ('Required (nullity frac))
258+trunc = unsafeFunction "trunc"
226259
227−round
228− :: (PGFloating frac, PGTyped int)
260+round_
261+ :: PGFloating frac
229262 => Expression params tables grouping ('Required (nullity frac))
230− -> Expression params tables grouping ('Required (nullity int))
231−round = cast pgtype . round'
232− where
233− round'
234− :: Expression params tables grouping ('Required (nullity frac))
235− -> Expression params tables grouping ('Required (nullity frac))
236− round' = unsafeFunction "round"
263+ -> Expression params tables grouping ('Required (nullity frac))
264+round_ = unsafeFunction "round"
237265
238−ceiling
239− :: (PGFloating frac, PGTyped int)
266+ceiling_
267+ :: PGFloating frac
240268 => Expression params tables grouping ('Required (nullity frac))
241− -> Expression params tables grouping ('Required (nullity int))
242−ceiling = cast pgtype . ceiling'
243− where
244− ceiling'
245− :: Expression params tables grouping ('Required (nullity frac))
246− -> Expression params tables grouping ('Required (nullity frac))
247− ceiling' = unsafeFunction "ceiling"
269+ -> Expression params tables grouping ('Required (nullity frac))
270+ceiling_ = unsafeFunction "ceiling"
248271
249272instance IsString
250273 (Expression params tables grouping ('Required (nullity 'PGtext))) where