diff --git a/library/Ptr/List.hs b/library/Ptr/List.hs
new file mode 100644
--- /dev/null
+++ b/library/Ptr/List.hs
@@ -0,0 +1,13 @@
+module Ptr.List
+where
+
+import Ptr.Prelude
+
+
+{-# INLINE reverseDigits #-}
+reverseDigits :: Integral a => a {-^ Radix -} -> a {-^ Number -} -> [a]
+reverseDigits radix =
+  let
+    loop x = case divMod x radix of
+      (next, digit) -> digit : if next <= 0 then [] else loop next
+    in loop
diff --git a/library/Ptr/PokeIO.hs b/library/Ptr/PokeIO.hs
--- a/library/Ptr/PokeIO.hs
+++ b/library/Ptr/PokeIO.hs
@@ -38,3 +38,15 @@
         0 -> return ()
         _ -> loop (plusPtr ptr (-1)) quot
   in \ lastIndex x ptr -> loop (plusPtr ptr lastIndex) x
+
+{-# INLINE reverseAsciiDigits #-}
+reverseAsciiDigits :: (Integral a) => Int -> [a] -> PokeIO
+reverseAsciiDigits index elements ptr =
+  let
+    loop ptr =
+      \ case
+        digit : tail -> do
+          IO.pokeWord8 ptr (48 + fromIntegral digit)
+          loop (plusPtr ptr (-1)) tail
+        _ -> return ()
+    in loop (plusPtr ptr index) elements
diff --git a/library/Ptr/Poking.hs b/library/Ptr/Poking.hs
--- a/library/Ptr/Poking.hs
+++ b/library/Ptr/Poking.hs
@@ -6,6 +6,7 @@
 import qualified Ptr.Poke as C
 import qualified Ptr.PokeAndPeek as D
 import qualified Ptr.PokeIO as E
+import qualified Ptr.List as List
 import qualified Data.ByteString.Internal as B
 import qualified Data.Vector as F
 import qualified Data.Vector.Generic as GenericVector
@@ -118,9 +119,9 @@
 asciiIntegral = \ case
   0 -> word8 48
   x -> let
-    lastIndex = (floor . logBase 10 . fromIntegral) x
-    size = succ lastIndex
-    action = E.asciiUnsignedIntegral lastIndex x
+    reverseDigits = List.reverseDigits 10 x
+    size = List.length reverseDigits
+    action = E.reverseAsciiDigits (pred size) reverseDigits
     in Poking size action
 
 {-# INLINE asciiChar #-}
diff --git a/ptr.cabal b/ptr.cabal
--- a/ptr.cabal
+++ b/ptr.cabal
@@ -1,5 +1,5 @@
 name: ptr
-version: 0.16.7
+version: 0.16.7.1
 category: Ptr, Data
 synopsis: Abstractions for operations on pointers
 homepage: https://github.com/nikita-volkov/ptr
@@ -35,6 +35,7 @@
     Ptr.Prelude
     Ptr.Receive.Core
     Ptr.UncheckedShifting
+    Ptr.List
   build-depends:
     base >=4.9 && <5,
     bytestring >=0.10 && <0.11,
diff --git a/tests/Main.hs b/tests/Main.hs
--- a/tests/Main.hs
+++ b/tests/Main.hs
@@ -43,7 +43,7 @@
         assertEqual "" "000" (A.poking (F.asciiPaddedAndTrimmedIntegral 3 (-1)))
       ,
       testCase "asciiUtcTimeInIso8601" $ do
-        assertEqual "" "2017-02-01T05:03:58Z" (A.poking (F.asciiUtcTimeInIso8601 (read "2017-02-01 05:03:58")))
+        assertEqual "" "2017-02-01T05:03:58Z" (A.poking (F.asciiUtcTimeInIso8601 (read "2017-02-01 05:03:58Z")))
       ,
       testCase "fromString" $ do
         assertEqual "" "123" (A.poking "123")
@@ -53,6 +53,11 @@
     ]
     ,
     parsing
+    ,
+    testGroup "Regression" [
+        testCase "https://github.com/nikita-volkov/hasql-dynamic-statements/issues/2" $
+          assertEqual "" "$1000" (A.poking (F.word8 36 <> F.asciiIntegral 1000))
+      ]
   ]
 
 parsing :: TestTree
