diff --git a/BUGS.md b/BUGS.md
index 93cc83f0ef55b9ed3178b8ee3c74d608a100ccc4..280ef042952c17c1d02255a2a5de712c80d5eaaf 100644
--- a/BUGS.md
+++ b/BUGS.md
@@ -1,7 +1,3 @@
 Known bugs
 ==========
 
-+ in `qb.sql.types`
-		+ autocompletion is not working
-		+ `_repr_pretty` is not working
-		+ `dir` is not working
diff --git a/querybuilder/dialect.py b/querybuilder/dialect.py
index 05bc184fc8fd01a8e3c99d2b485a4e787522d5ea..29d21924c20467fc3859ddd8cace6568afae0b27 100644
--- a/querybuilder/dialect.py
+++ b/querybuilder/dialect.py
@@ -255,7 +255,7 @@ class Dialect(qbtools.AttrDict):
     def __repr__(self):
         return f"{type(self).__name__}.dialects[{self.fullname}]"
     def _pretty_repr_(self):
-        return f"{type(self).__name__}({self.fullname})〈{', '.join(self)}〉"
+        return f"{type(self).__name__}({self.fullname})〈{', '.join(map(str, self))}〉"
     def _repr_pretty_(self, printer, cycle):
         printer.text(self._pretty_repr_())
     def __iter__(self):
diff --git a/querybuilder/tools.py b/querybuilder/tools.py
index 40ee15f3e2099362c43d2011553d1f2480d9d8d8..bf806022a30996c7bbc31509c9e77ebcd54f2cab 100644
--- a/querybuilder/tools.py
+++ b/querybuilder/tools.py
@@ -55,7 +55,9 @@ class AttrDict(collections.abc.MutableMapping):
         else:
             super().__setattr__(attr, v)
     def __dir__(self):
-        return self.proxy_dict.keys()
+        return frozenset(self._reserved_names).union(
+            k for k in self.proxy_dict.keys() if isinstance(k, str) and k.isidentifier()
+        )
 
     #MutableMapping method
     def __getitem__(self, k):