@@ -89,6 +89,35 @@ module Squeal.PostgreSQL.Query
89 -- * Sorting
89 -- * Sorting
90 , SortExpression (..)
90 , SortExpression (..)
91 , renderSortExpression
91 , renderSortExpression
92+ -- * Subquery expressions
93+ , unsafeSubqueryExpression
94+ , unsafeRowSubqueryExpression
94import Control.DeepSeq
123import Control.DeepSeq
@@ -1072,3 +1101,189 @@ renderSortExpression = \case
1072 <+> "DESC NULLS FIRST"
1101 <+> "DESC NULLS FIRST"
1073 AscNullsLast expression -> renderExpression expression <+> "ASC NULLS LAST"
1102 AscNullsLast expression -> renderExpression expression <+> "ASC NULLS LAST"
1074 DescNullsLast expression -> renderExpression expression <+> "DESC NULLS LAST"
1103 DescNullsLast expression -> renderExpression expression <+> "DESC NULLS LAST"
1105+unsafeSubqueryExpression
1107+ -> Expression schema from grp params ty
1108+ -> Query schema params '[alias ::: ty]
1109+ -> Condition schema from grp params
1110+unsafeSubqueryExpression op x q = UnsafeExpression $
1111+ renderExpression x <+> op <+> parenthesized (renderQuery q)
1113+unsafeRowSubqueryExpression
1116+ -> NP (Aliased (Expression schema from grp params)) row
1117+ -> Query schema params row
1118+ -> Condition schema from grp params
1119+unsafeRowSubqueryExpression op xs q = UnsafeExpression $
1120+ renderExpression (row xs) <+> op <+> parenthesized (renderQuery q)
1123+ :: Expression schema from grp params ty
1124+ -> Query schema params '[alias ::: ty]
1125+ -> Condition schema from grp params
1126+in_ = unsafeSubqueryExpression "IN"
1130+ => NP (Aliased (Expression schema from grp params)) row
1131+ -> Query schema params row
1132+ -> Condition schema from grp params
1133+rowIn = unsafeRowSubqueryExpression "IN"
1136+ :: Expression schema from grp params ty
1137+ -> Query schema params '[alias ::: ty]
1138+ -> Condition schema from grp params
1139+allEq = unsafeSubqueryExpression "ALL ="
1143+ => NP (Aliased (Expression schema from grp params)) row
1144+ -> Query schema params row
1145+ -> Condition schema from grp params
1146+rowAllEq = unsafeRowSubqueryExpression "ALL ="
1149+ :: Expression schema from grp params ty
1150+ -> Query schema params '[alias ::: ty]
1151+ -> Condition schema from grp params
1152+anyEq = unsafeSubqueryExpression "ANY ="
1156+ => NP (Aliased (Expression schema from grp params)) row
1157+ -> Query schema params row
1158+ -> Condition schema from grp params
1159+rowAnyEq = unsafeRowSubqueryExpression "ANY ="
1162+ :: Expression schema from grp params ty
1163+ -> Query schema params '[alias ::: ty]
1164+ -> Condition schema from grp params
1165+allNeq = unsafeSubqueryExpression "ALL <>"
1169+ => NP (Aliased (Expression schema from grp params)) row
1170+ -> Query schema params row
1171+ -> Condition schema from grp params
1172+rowAllNeq = unsafeRowSubqueryExpression "ALL <>"
1175+ :: Expression schema from grp params ty
1176+ -> Query schema params '[alias ::: ty]
1177+ -> Condition schema from grp params
1178+anyNeq = unsafeSubqueryExpression "ANY <>"
1182+ => NP (Aliased (Expression schema from grp params)) row
1183+ -> Query schema params row
1184+ -> Condition schema from grp params
1185+rowAnyNeq = unsafeRowSubqueryExpression "ANY <>"
1188+ :: Expression schema from grp params ty
1189+ -> Query schema params '[alias ::: ty]
1190+ -> Condition schema from grp params
1191+allLt = unsafeSubqueryExpression "ALL <"
1195+ => NP (Aliased (Expression schema from grp params)) row
1196+ -> Query schema params row
1197+ -> Condition schema from grp params
1198+rowAllLt = unsafeRowSubqueryExpression "ALL <"
1201+ :: Expression schema from grp params ty
1202+ -> Query schema params '[alias ::: ty]
1203+ -> Condition schema from grp params
1204+anyLt = unsafeSubqueryExpression "ANY <"
1208+ => NP (Aliased (Expression schema from grp params)) row
1209+ -> Query schema params row
1210+ -> Condition schema from grp params
1211+rowAnyLt = unsafeRowSubqueryExpression "ANY <"
1214+ :: Expression schema from grp params ty
1215+ -> Query schema params '[alias ::: ty]
1216+ -> Condition schema from grp params
1217+allLte = unsafeSubqueryExpression "ALL <="
1221+ => NP (Aliased (Expression schema from grp params)) row
1222+ -> Query schema params row
1223+ -> Condition schema from grp params
1224+rowAllLte = unsafeRowSubqueryExpression "ALL <="
1227+ :: Expression schema from grp params ty
1228+ -> Query schema params '[alias ::: ty]
1229+ -> Condition schema from grp params
1230+anyLte = unsafeSubqueryExpression "ANY <="
1234+ => NP (Aliased (Expression schema from grp params)) row
1235+ -> Query schema params row
1236+ -> Condition schema from grp params
1237+rowAnyLte = unsafeRowSubqueryExpression "ANY <="
1240+ :: Expression schema from grp params ty
1241+ -> Query schema params '[alias ::: ty]
1242+ -> Condition schema from grp params
1243+allGt = unsafeSubqueryExpression "ALL >"
1247+ => NP (Aliased (Expression schema from grp params)) row
1248+ -> Query schema params row
1249+ -> Condition schema from grp params
1250+rowAllGt = unsafeRowSubqueryExpression "ALL >"
1253+ :: Expression schema from grp params ty
1254+ -> Query schema params '[alias ::: ty]
1255+ -> Condition schema from grp params
1256+anyGt = unsafeSubqueryExpression "ANY >"
1260+ => NP (Aliased (Expression schema from grp params)) row
1261+ -> Query schema params row
1262+ -> Condition schema from grp params
1263+rowAnyGt = unsafeRowSubqueryExpression "ANY >"
1266+ :: Expression schema from grp params ty
1267+ -> Query schema params '[alias ::: ty]
1268+ -> Condition schema from grp params
1269+allGte = unsafeSubqueryExpression "ALL >="
1273+ => NP (Aliased (Expression schema from grp params)) row
1274+ -> Query schema params row
1275+ -> Condition schema from grp params
1276+rowAllGte = unsafeRowSubqueryExpression "ALL >="
1279+ :: Expression schema from grp params ty
1280+ -> Query schema params '[alias ::: ty]
1281+ -> Condition schema from grp params
1282+anyGte = unsafeSubqueryExpression "ANY >="
1286+ => NP (Aliased (Expression schema from grp params)) row
1287+ -> Query schema params row
1288+ -> Condition schema from grp params
1289+rowAnyGte = unsafeRowSubqueryExpression "ANY >="