@@ -5,6 +5,7 @@ import Common
5import Database.PostgreSQL.Simple.FromField (FromField)
5import Database.PostgreSQL.Simple.FromField (FromField)
6import Database.PostgreSQL.Simple.Types(Query(..),Values(..))
6import Database.PostgreSQL.Simple.Types(Query(..),Values(..))
7import Database.PostgreSQL.Simple.HStore
7import Database.PostgreSQL.Simple.HStore
8+import Database.PostgreSQL.Simple.Copy
8import qualified Database.PostgreSQL.Simple.Transaction as ST
9import qualified Database.PostgreSQL.Simple.Transaction as ST
9import Control.Applicative
10import Control.Applicative
10import Control.Exception as E
11import Control.Exception as E
@@ -41,6 +42,7 @@ tests =
41 , TestLabel "Savepoint" . testSavepoint
42 , TestLabel "Savepoint" . testSavepoint
42 , TestLabel "Unicode" . testUnicode
43 , TestLabel "Unicode" . testUnicode
43 , TestLabel "Values" . testValues
44 , TestLabel "Values" . testValues
45+ , TestLabel "Copy" . testCopy
46testBytea :: TestEnv -> Test
48testBytea :: TestEnv -> Test
@@ -275,6 +277,31 @@ testValues TestEnv{..} = TestCase $ do
275 vals' <- query_ conn "DELETE FROM values_test RETURNING *"
277 vals' <- query_ conn "DELETE FROM values_test RETURNING *"
276 sort vals @?= sort vals'
278 sort vals @?= sort vals'
281+testCopy :: TestEnv -> Test
282+testCopy TestEnv{..} = TestCase $ do
283+ execute_ conn "CREATE TEMPORARY TABLE copy_test (x int, y text)"
284+ copy_ conn "COPY copy_test FROM STDIN (FORMAT CSV)"
285+ mapM_ (putCopyData conn) copyRows
287+ copy_ conn "COPY copy_test FROM STDIN (FORMAT CSV)"
288+ mapM_ (putCopyData conn) abortRows
289+ putCopyError conn "aborted"
290+ copy_ conn "COPY copy_test TO STDOUT (FORMAT CSV)"
292+ -- Hmm, does postgres always produce \n as an end-of-line here, or
293+ -- are there cases where it will use a \r\n as well?
294+ sort rows @?= sort copyRows
296+ copyRows = ["1,foo\n"
298+ abortRows = ["3,baz\n"]
300+ mrow <- getCopyData conn
302+ CopyOutDone _ -> return rows
303+ CopyOutRow row -> loop (row:rows)
278data TestException
305data TestException
279 = TestException
306 = TestException
280 deriving (Eq, Show, Typeable)
307 deriving (Eq, Show, Typeable)