@@ -3,7 +3,7 @@
3{-# LANGUAGE ScopedTypeVariables #-}
3{-# LANGUAGE ScopedTypeVariables #-}
4import Common
4import Common
5import Database.PostgreSQL.Simple.FromField (FromField)
5import Database.PostgreSQL.Simple.FromField (FromField)
6−import Database.PostgreSQL.Simple.Types(Query(..))
6+import Database.PostgreSQL.Simple.Types(Query(..),Values(..))
7import Database.PostgreSQL.Simple.HStore
7import Database.PostgreSQL.Simple.HStore
8import qualified Database.PostgreSQL.Simple.Transaction as ST
8import qualified Database.PostgreSQL.Simple.Transaction as ST
9import Control.Applicative
9import Control.Applicative
@@ -40,6 +40,7 @@ tests =
40 , TestLabel "JSON" . testJSON
40 , TestLabel "JSON" . testJSON
41 , TestLabel "Savepoint" . testSavepoint
41 , TestLabel "Savepoint" . testSavepoint
42 , TestLabel "Unicode" . testUnicode
42 , TestLabel "Unicode" . testUnicode
43+ , TestLabel "Values" . testValues
45testBytea :: TestEnv -> Test
46testBytea :: TestEnv -> Test
@@ -249,13 +250,31 @@ testSavepoint TestEnv{..} = TestCase $ do
250testUnicode :: TestEnv -> Test
251testUnicode :: TestEnv -> Test
251testUnicode TestEnv{..} = TestCase $ do
252testUnicode TestEnv{..} = TestCase $ do
252− let q = Query . T.encodeUtf8
253+ let q = Query . T.encodeUtf8 -- Handle encoding ourselves to ensure
254+ -- the table gets created correctly.
253 let messages = map Only ["привет","мир"] :: [Only Text]
255 let messages = map Only ["привет","мир"] :: [Only Text]
254 execute_ conn (q "CREATE TEMPORARY TABLE ру́сский (сообщение TEXT)")
256 execute_ conn (q "CREATE TEMPORARY TABLE ру́сский (сообщение TEXT)")
255 executeMany conn "INSERT INTO ру́сский (сообщение) VALUES (?)" messages
257 executeMany conn "INSERT INTO ру́сский (сообщение) VALUES (?)" messages
256 messages' <- query_ conn "SELECT сообщение FROM ру́сский"
258 messages' <- query_ conn "SELECT сообщение FROM ру́сский"
257 sort messages @?= sort messages'
259 sort messages @?= sort messages'
261+testValues :: TestEnv -> Test
262+testValues TestEnv{..} = TestCase $ do
263+ execute_ conn "CREATE TEMPORARY TABLE values_test (x int, y text)"
264+ test (Values ["int4","text"] [])
265+ test (Values ["int4","text"] [(1,"hello")])
266+ test (Values ["int4","text"] [(1,"hello"),(2,"world")])
267+ test (Values ["int4","text"] [(1,"hello"),(2,"world"),(3,"goodbye")])
268+ test (Values [] [(1,"hello")])
269+ test (Values [] [(1,"hello"),(2,"world")])
270+ test (Values [] [(1,"hello"),(2,"world"),(3,"goodbye")])
272+ test :: Values (Int, Text) -> Assertion
273+ test table@(Values _ vals) = do
274+ execute conn "INSERT INTO values_test ?" (Only table)
275+ vals' <- query_ conn "DELETE FROM values_test RETURNING *"
276+ sort vals @?= sort vals'
259data TestException
278data TestException
260 = TestException
279 = TestException
261 deriving (Eq, Show, Typeable)
280 deriving (Eq, Show, Typeable)