From 83d2c07396cd3cd21462040ae34c94bf8477de6a Mon Sep 17 00:00:00 2001 From: Paul Brinkmeier Date: Sun, 17 Sep 2023 05:31:32 +0200 Subject: [PATCH] Add FromField Word --- lib/Database/PostgreSQL/Opium/FromField.hs | 5 +++++ test/Database/PostgreSQL/Opium/FromFieldSpec.hs | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/Database/PostgreSQL/Opium/FromField.hs b/lib/Database/PostgreSQL/Opium/FromField.hs index 338e43b..2fb6302 100644 --- a/lib/Database/PostgreSQL/Opium/FromField.hs +++ b/lib/Database/PostgreSQL/Opium/FromField.hs @@ -56,6 +56,7 @@ instance FromField Char where parseField = anyChar -- | See https://www.postgresql.org/docs/current/datatype-numeric.html. +-- We assume that 'Int' has 64 bits. This is not guaranteed but reasonable enough. instance FromField Int where validOid Proxy = Oid.smallint \/ Oid.integer \/ Oid.bigint parseField = signed decimal @@ -65,6 +66,10 @@ instance FromField Integer where validOid Proxy = Oid.smallint \/ Oid.integer \/ Oid.bigint parseField = signed decimal +instance FromField Word where + validOid Proxy = Oid.smallint \/ Oid.integer \/ Oid.bigint + parseField = decimal + doubleParser :: Parser Double doubleParser = choice [ string "NaN" $> nan diff --git a/test/Database/PostgreSQL/Opium/FromFieldSpec.hs b/test/Database/PostgreSQL/Opium/FromFieldSpec.hs index 966ef55..2d3db7a 100644 --- a/test/Database/PostgreSQL/Opium/FromFieldSpec.hs +++ b/test/Database/PostgreSQL/Opium/FromFieldSpec.hs @@ -24,6 +24,12 @@ newtype AnInteger = AnInteger instance FromRow AnInteger where +newtype AWord = AWord + { word :: Word + } deriving (Eq, Generic, Show) + +instance FromRow AWord where + newtype AText = AText { text :: Text } deriving (Eq, Generic, Show) @@ -90,6 +96,16 @@ spec = do it "Decodes bigint" $ \conn -> do shouldFetch conn "SELECT pow(2, 48)::BIGINT AS integer" [AnInteger $ (2 :: Integer) ^ (48 :: Integer)] + describe "FromField Word" $ do + it "Decodes smallint" $ \conn -> do + shouldFetch conn "SELECT 42::SMALLINT AS word" [AWord 42] + + it "Decodes integer" $ \conn -> do + shouldFetch conn "SELECT pow(2, 20)::INTEGER AS word" [AWord $ (2 :: Word) ^ (20 :: Word)] + + it "Decodes bigint" $ \conn -> do + shouldFetch conn "SELECT pow(2, 48)::BIGINT AS word" [AWord $ (2 :: Word) ^ (48 :: Word)] + describe "FromField Text" $ do it "Decodes text" $ \conn -> do shouldFetch conn "SELECT 'Hello, World!'::TEXT AS text" [AText "Hello, World!"]