@@ -96,8 +96,11 @@ instance (KnownSymbol label, AllAliased (x' ': xs))
9696 (x :& xs :: Rec (Aliased obj) ('(label, x) ': x' : xs)) =
9797 renderAliased render x <> ", " <> renderAllAliased render xs
9898
99−newtype Expression ps (xs :: [(Symbol,PGType)]) y =
100− UnsafeExpression { renderExpression :: ByteString }
99+newtype Expression
100+ (ps :: [PGType])
101+ (xs :: [(Symbol,PGType)])
102+ (y :: PGType) =
103+ UnsafeExpression { renderExpression :: ByteString }
101104
102105param1 :: Expression (p1:ps) cols p1
103106param1 = UnsafeExpression "$1"
@@ -170,8 +173,11 @@ instance OrdB (Expression ps xs y) where
170173 x <* y = UnsafeExpression $ renderExpression x <> "<" <> renderExpression y
171174 x <=* y = UnsafeExpression $ renderExpression x <> "<=" <> renderExpression y
172175
173−newtype Projection ps xs ys = UnsafeProjection
174− { renderProjection :: ByteString }
176+newtype Projection
177+ (ps :: [PGType])
178+ (xs :: [(Symbol,PGType)])
179+ (ys :: [(Symbol,PGType)]) =
180+ UnsafeProjection { renderProjection :: ByteString }
175181
176182star :: Projection ps xs xs
177183star = UnsafeProjection "*"
@@ -182,22 +188,18 @@ project
182188 -> Projection ps xs ys
183189project = UnsafeProjection . renderAllAliased renderExpression
184190
185−data Tabulation ps xss xs = UnsafeTabulation
186− { renderTabulation :: ByteString }
187−
188−data Relation ps xss xs = Relation
189− { tabulation :: Tabulation ps xss xs
191+data Relation ps xss xs = UnsafeRelation
192+ { relation :: ByteString
190193 , restriction :: Maybe (Expression ps xs 'PGBool)
191194 , limitation :: Maybe (Expression ps '[] 'PGInt8)
192195 , offsetting :: Maybe (Expression ps '[] 'PGInt8)
193196 }
194197
195198renderRelation :: Relation ps xss xs -> ByteString
196−renderRelation (Relation tab wh lim off) =
197− renderTabulation tab
198− <> maybe "" ((" WHERE " <>) . renderExpression) wh
199− <> maybe "" ((" LIMIT " <>) . renderExpression) lim
200− <> maybe "" ((" OFFSET " <>) . renderExpression) off
199+renderRelation (UnsafeRelation rel wh lim off) = rel
200+ <> maybe "" ((" WHERE " <>) . renderExpression) wh
201+ <> maybe "" ((" LIMIT " <>) . renderExpression) lim
202+ <> maybe "" ((" OFFSET " <>) . renderExpression) off
201203
202204where_
203205 :: Relation ps xss xs
@@ -231,9 +233,8 @@ ys `offset` n = ys
231233
232234instance HasField label xss xs
233235 => IsLabel label (Relation ps xss xs) where
234− fromLabel _ = Relation
235− { tabulation = UnsafeTabulation $
236− fieldName (Proxy @label) (Proxy @xss) (Proxy @xs)
236+ fromLabel _ = UnsafeRelation
237+ { relation = fieldName (Proxy @label) (Proxy @xss) (Proxy @xs)
237238 , restriction = Nothing
238239 , limitation = Nothing
239240 , offsetting = Nothing
@@ -247,40 +248,38 @@ ys `from` xs = UnsafeSelection $
247248 renderProjection ys <> " FROM " <> renderRelation xs
248249
249250subselect :: Selection ps xss ys -> Relation ps xss ys
250−subselect selection = Relation
251− { tabulation = UnsafeTabulation $ "SELECT " <> renderSelection selection
251+subselect selection = UnsafeRelation
252+ { relation = "SELECT " <> renderSelection selection
252253 , restriction = Nothing
253254 , limitation = Nothing
254255 , offsetting = Nothing
255256 }
256257
257−newtype Insertion ps xss xs = UnsafeInsertion
258− {renderInsertion :: ByteString }
258+newtype Query
259+ (ps :: [PGType])
260+ (xss :: [(Symbol,[(Symbol,PGType)])])
261+ (yss :: [(Symbol,[(Symbol,PGType)])])
262+ (zs :: [(Symbol,PGType)]) =
263+ UnsafeQuery { renderQuery :: ByteString }
264+newtype PreparedQuery ps xss yss zs =
265+ UnsafePreparedQuery { renderPreparedQuery :: ByteString }
266+
267+select :: Selection ps xss ys -> Query ps xss xss ys
268+select selection = UnsafeQuery $
269+ "SELECT " <> renderSelection selection <> ";"
259270
260−into
261− :: forall label xss xs ps
271+insertInto
272+ :: forall xss xs label ps
262273 . (HasField label xss xs, UnzipAliased xs)
263274 => Proxy label
264275 -> Rec (Aliased (Expression ps '[])) xs
265− -> Insertion ps xss xs
266−into table values = UnsafeInsertion $ "INTO "
276+ -> Query ps xss xss '[]
277+insertInto table values = UnsafeQuery $ "INSERT INTO "
267278 <> fieldName table (Proxy @xss) (Proxy @xs)
268279 <> " (" <> ByteString.intercalate ", " names
269280 <> ") VALUES ("
270281 <> ByteString.intercalate ", "
271282 (recordToList (rmap (Const . renderExpression) exprs))
272− <> ")"
283+ <> ");"
273284 where
274285 (names,exprs) = unzipAliased values
275−
276−newtype Query ps xss yss zs = UnsafeQuery { renderQuery :: ByteString }
277−newtype PreparedQuery ps xss yss zs =
278− UnsafePreparedQuery { renderPreparedQuery :: ByteString }
279−
280−select :: Selection ps xss ys -> Query ps xss xss ys
281−select selection = UnsafeQuery $
282− "SELECT " <> renderSelection selection <> ";"
283−
284−insert :: Insertion ps xss xs -> Query ps xss xss '[]
285−insert insertion = UnsafeQuery $
286− "INSERT " <> renderInsertion insertion <> ";"