diff --git a/product/ZSQLCatalog/SQLCatalog.py b/product/ZSQLCatalog/SQLCatalog.py
index 3ae095a9491a7b61693e98f43f499357ec9cdc89..1489c1693769e48b80d5db68f063b5a368dd28a4 100755
--- a/product/ZSQLCatalog/SQLCatalog.py
+++ b/product/ZSQLCatalog/SQLCatalog.py
@@ -464,6 +464,9 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base):
         LOG('SQLCatalog Warning: could not clear catalog', 0, method_name, error=sys.exc_info())
         pass
 
+    # Remove the cache of catalog schema.
+    del self._v_catalog_schema_dict
+    
     self._clearSecurityCache()
 
   def clearReserved(self):
@@ -523,6 +526,26 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base):
 
     return self.sql_search_tables
 
+  def _getCatalogSchema(self, table=None):
+    catalog_schema_dict = getattr(aq_base(self), '_v_catalog_schema_dict', {})
+      
+    if table not in catalog_schema_dict:
+      result_list = []
+      try:
+        method_name = self.sql_catalog_schema
+        method = getattr(self, method_name)
+        #LOG('_getCatalogSchema', 0, 'method_name = %r, method = %r, table = %r' % (method_name, method, table))
+        search_result = method(table=table)
+        for c in search_result:
+          result_list.append(c.Field)
+      except:
+        LOG('WARNING SQLCatalog._getCatalogSchema failed with the method', 0, method_name, error=sys.exc_info())
+        pass
+      catalog_schema_dict[table] = tuple(result_list)
+      self._v_catalog_schema_dict= catalog_schema_dict
+      
+    return catalog_schema_dict[table]
+      
   def getColumnIds(self):
     """
     Calls the show column method and returns dictionnary of
@@ -530,18 +553,12 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base):
 
     XXX This should be cached
     """
-    method_name = self.sql_catalog_schema
     keys = {}
     for table in self.getCatalogSearchTableIds():
-      try:
-        method = getattr(self,  method_name)
-        search_result = method(table=table)
-        for c in search_result:
-          keys[c.Field] = 1
-          keys['%s.%s' % (table, c.Field)] = 1  # Is this inconsistent ?
-      except:
-        LOG('WARNING SQLCatalog.getColumnIds, exception with method',0,method)
-        pass
+      field_list = self._getCatalogSchema(table=table)
+      for field in field_list:
+        keys[field] = 1
+        keys['%s.%s' % (table, field)] = 1  # Is this inconsistent ?
     keys = keys.keys()
     keys.sort()
     return keys
@@ -553,21 +570,16 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base):
 
     XXX This should be cached
     """
-    method_name = self.sql_catalog_schema
     keys = {}
     for table in self.getCatalogSearchTableIds():
-      try:
-        method = getattr(self,  method_name)
-        search_result = method(table=table)
-        for c in search_result:
-          key = c.Field
-          if not keys.has_key(key): keys[c.Field] = []
-          keys[key].append(table)
-          key = '%s.%s' % (table, c.Field)
-          if not keys.has_key(key): keys[key] = []
-          keys[key].append(table) # Is this inconsistent ?
-      except:
-        pass
+      field_list = self._getCatalogSchema(table=table)
+      for field in field_list:
+        key = field
+        if not keys.has_key(key): keys[key] = []
+        keys[key].append(table)
+        key = '%s.%s' % (table, key)
+        if not keys.has_key(key): keys[key] = []
+        keys[key].append(table) # Is this inconsistent ?
     return keys
 
   def getResultColumnIds(self):
@@ -575,16 +587,11 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base):
     Calls the show column method and returns dictionnary of
     Field Ids
     """
-    method_name = self.sql_catalog_schema
     keys = {}
     for table in self.getCatalogSearchTableIds():
-      try:
-        method = getattr(self,  method_name)
-        search_result = method(table=table)
-        for c in search_result:
-          keys['%s.%s' % (table, c.Field)] = 1
-      except:
-        pass
+      field_list = self._getCatalogSchema(table=table)
+      for field in field_list:
+        keys['%s.%s' % (table, field)] = 1
     keys = keys.keys()
     keys.sort()
     return keys
@@ -753,6 +760,7 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base):
     'uid' is the unique Catalog identifier for this object
 
     """
+    #LOG('catalogObject', 0, 'object = %r, path = %r' % (object, path))
     if withCMF:
       zope_root = getToolByName(self, 'portal_url').getPortalObject().aq_parent
     else:
@@ -1495,7 +1503,7 @@ class Catalog(Folder, Persistent, Acquisition.Implicit, ExtensionClass.Base):
   def searchResults(self, REQUEST=None, used=None, **kw):
     """ Builds a complex SQL where_expression to simulate ZCalatog behaviour """
     """ Returns a list of brains from a set of constraints on variables """
-    # The used argument is deprecated and is ignored
+    # The used argument is deprecated and is ignored      
     try:
       # Get the search method
       method = getattr(self, self.sql_search_results)