Closed
Description
We seem to have different treatment for Bytestrings as handled by LibPQ:
-- Create a table some_table with a nullable binary_column bytea type
-- CREATE TABLE some_table (id SERIAL,binary_column BYTEA);
ghci> import Database.PostgreSQL.LibPQ
ghci> c <- connectdb "postgresql://use-your-connection-string"
ghci> Just res <- execParams c "INSERT INTO \"some_table\" (binary_column) values ($1), ($2)" [Just (Oid 17,"",Binary), Just (Oid 17,mempty,Binary)] Binary
Now if you look in the table, you’ll have one NULL column and one with an empty bytea content
This seem to come from the fact that mempty and "" have different internal representation in Haskell, in spite of being equal:
(requires OverloadedStrings)
ghci> import Data.ByteString
ghci> a = mempty :: ByteString
ghci> b = "" :: ByteString
ghci> a == b
True
ghci> :force a
a = bytestring-0.11.5.3:Data.ByteString.Internal.Type.BS
0x0000000000000000 GHC.ForeignPtr.FinalPtr 0
ghci> :force b
b = bytestring-0.11.5.3:Data.ByteString.Internal.Type.BS
0x0000004200647b40
(GHC.ForeignPtr.PlainPtr (ByteArray# <mutableByteArray>)) 0
This difference of treatment seem to be introduced by commit
89c7cb8
Reverting that commit indeed stores the two different values as an empty bytea.
Metadata
Metadata
Assignees
Labels
No labels