diff --git a/hedgehog-test/Main.hs b/hedgehog-test/Main.hs
--- a/hedgehog-test/Main.hs
+++ b/hedgehog-test/Main.hs
@@ -27,6 +27,8 @@
                   failure
                 Right ast' -> ast === ast'
       in [
+          p "typename" 10000 Gen.typename Parsing.typename Rendering.typename
+          ,
           p "tableRef" 10000 Gen.tableRef Parsing.tableRef Rendering.tableRef
           ,
           p "aExpr" 100000 Gen.aExpr Parsing.aExpr Rendering.aExpr
diff --git a/hedgehog-test/Main/Gen.hs b/hedgehog-test/Main/Gen.hs
--- a/hedgehog-test/Main/Gen.hs
+++ b/hedgehog-test/Main/Gen.hs
@@ -817,7 +817,7 @@
 -- ** Typename
 -------------------------
 
-typename = Typename <$> bool <*> simpleTypename <*> bool <*> maybe ((,) <$> typenameArrayDimensions <*> bool)
+typename = Typename <$> bool <*> simpleTypename <*> pure False <*> maybe ((,) <$> typenameArrayDimensions <*> pure False)
 
 typenameArrayDimensions = choice [
     BoundsTypenameArrayDimensions <$> arrayBounds,
diff --git a/library/PostgresqlSyntax/Parsing.hs b/library/PostgresqlSyntax/Parsing.hs
--- a/library/PostgresqlSyntax/Parsing.hs
+++ b/library/PostgresqlSyntax/Parsing.hs
@@ -125,8 +125,8 @@
     in collectChunks mempty
   return _tail
 
-quasiQuote :: Parser a -> Parser a
-quasiQuote p = space *> p <* endHead <* space <* eof
+atEnd :: Parser a -> Parser a
+atEnd p = space *> p <* endHead <* space <* eof
 
 
 -- * PreparableStmt
@@ -2081,7 +2081,7 @@
           return (Typename a b c (Just (ExplicitTypenameArrayDimensions d, e)))
         ,
         do
-          space1
+          space
           d <- arrayBounds
           endHead
           e <- trueIfPresent (space *> char '?')
diff --git a/library/PostgresqlSyntax/Rendering.hs b/library/PostgresqlSyntax/Rendering.hs
--- a/library/PostgresqlSyntax/Rendering.hs
+++ b/library/PostgresqlSyntax/Rendering.hs
@@ -895,14 +895,14 @@
 -------------------------
 
 typename (Typename a b c d) =
-  bool "" "SETOF " a <> simpleTypename b <> suffixMaybe typenameArrayDimensionsWithQuestionMark d
+  bool "" "SETOF " a <> simpleTypename b <> foldMap typenameArrayDimensionsWithQuestionMark d
 
 typenameArrayDimensionsWithQuestionMark (a, b) =
   typenameArrayDimensions a
 
 typenameArrayDimensions = \ case
   BoundsTypenameArrayDimensions a -> arrayBounds a
-  ExplicitTypenameArrayDimensions a -> "ARRAY" <> foldMap (inBrackets . iconst) a
+  ExplicitTypenameArrayDimensions a -> " ARRAY" <> foldMap (inBrackets . iconst) a
 
 arrayBounds = spaceNonEmpty (inBrackets . foldMap iconst)
 
diff --git a/postgresql-syntax.cabal b/postgresql-syntax.cabal
--- a/postgresql-syntax.cabal
+++ b/postgresql-syntax.cabal
@@ -1,5 +1,5 @@
 name: postgresql-syntax
-version: 0.2.0.1
+version: 0.3
 category: Database, PostgreSQL, Parsing
 synopsis: PostgreSQL AST parsing and rendering
 description:
diff --git a/tasty-test/Main.hs b/tasty-test/Main.hs
--- a/tasty-test/Main.hs
+++ b/tasty-test/Main.hs
@@ -33,6 +33,10 @@
               \on b.provider_fk = p.provider_id"
             ],
           testParserOnAllInputs "typename" Parsing.typename [
+              "int4[]",
+              "int4[][]",
+              "int4?[]",
+              "int4?[]?",
               "aa array",
               "DOUBLE PRECISION",
               "bool", "int2", "int4", "int8", "float4", "float8", "numeric", "char", "text", "bytea", "date", "timestamp", "timestamptz", "time", "timetz", "interval", "uuid", "inet", "json", "jsonb"
