@@ -74,10 +74,10 @@ ff :: PG.BuiltinType -> String -> (B.ByteString -> Either String a)
7474ff pgType hsType parse f mstr
7575 | typeOid f /= PG.builtin2oid pgType
7676 = left (Incompatible (B8.unpack (typename f)) hsType "")
77− | Nothing <- mstr
77+ | Nothing <- mstr
7878 = left (UnexpectedNull (B8.unpack (typename f)) hsType "")
79− | Just str <- mstr
80− = case parse str of
79+ | Just str <- mstr
80+ = case parse str of
8181 Left msg -> left (ConversionFailed (B8.unpack (typename f)) hsType msg)
8282 Right val -> pure val
8383{-# INLINE ff #-}
@@ -122,8 +122,9 @@ getDay = do
122122getDate :: A.Parser Date
123123getDate = getUnbounded getDay
124124
125−toPicos :: Num a => B.ByteString -> a
126−toPicos str = toNum str * 10^(12 - B.length str)
125+decimal :: Fractional a => B.ByteString -> a
126+decimal str = toNum str / 10^(B.length str)
127+{-# INLINE decimal #-}
127128
128129getTimeOfDay :: A.Parser TimeOfDay
129130getTimeOfDay = do
@@ -132,9 +133,9 @@ getTimeOfDay = do
132133 minute <- digits "minutes"
133134 _ <- A.char ':'
134135 second <- digits "seconds"
135− picos <- (A.char '.' *> (toPicos <$> A.takeWhile1 isDigit)) <|> return 0
136+ subsec <- (A.char '.' *> (decimal <$> A.takeWhile1 isDigit)) <|> return 0
136137
137− let !picos' = second * 1000000000000 + picos
138+ let !picos' = second + subsec
138139
139140 case makeTimeOfDayValid hour minute picos' of
140141 Nothing -> fail "invalid time of day"
@@ -165,7 +166,7 @@ getUTCTime = do
165166 _ <- A.char ' '
166167 time <- getTimeOfDay
167168 zone <- getTimeZone
168− let (!dayDelta,!time') = utcToLocalTimeOfDay zone time
169+ let (!dayDelta,!time') = localToUTCTimeOfDay zone time
169170 let !day' = addDays dayDelta day
170171 let !time'' = timeOfDayToTime time'
171172 return (UTCTime day' time'')