diff -Naur old/bord.cpp new/bord.cpp
--- old/bord.cpp	2012-07-04 23:02:48.000000000 +0530
+++ new/bord.cpp	2012-07-04 23:04:54.000000000 +0530
@@ -16903,97 +16903,8 @@
     if (buffer[j].cval == 0)
 	return -2;
 
-    int ierr;
     std::ostringstream oss;
-    switch (buffer[j].ctype) {
-    case ibis::BYTE: {
-	oss << static_cast<int>((* static_cast<const array_t<signed char>*>
-				 (buffer[j].cval))[curRow]);
-	val = oss.str();
-	ierr = 0;
-	break;}
-    case ibis::UBYTE: {
-	oss << static_cast<unsigned>
-	    ((* static_cast<const array_t<unsigned char>*>
-	      (buffer[j].cval))[curRow]);
-	val = oss.str();
-	ierr = 0;
-	break;}
-    case ibis::SHORT: {
-	oss << (* static_cast<const array_t<int16_t>*>
-		(buffer[j].cval))[curRow];
-	val = oss.str();
-	ierr = 0;
-	break;}
-    case ibis::USHORT: {
-	oss << (* static_cast<const array_t<uint16_t>*>
-		(buffer[j].cval))[curRow];
-	val = oss.str();
-	ierr = 0;
-	break;}
-    case ibis::INT: {
-	oss << (* static_cast<const array_t<int32_t>*>
-		(buffer[j].cval))[curRow];
-	val = oss.str();
-	ierr = 0;
-	break;}
-    case ibis::UINT: {
-	oss << (* static_cast<const array_t<uint32_t>*>
-		(buffer[j].cval))[curRow];
-	val = oss.str();
-	ierr = 0;
-	break;}
-    case ibis::LONG: {
-	oss << (* static_cast<const array_t<int64_t>*>
-		(buffer[j].cval))[curRow];
-	val = oss.str();
-	ierr = 0;
-	break;}
-    case ibis::ULONG: {
-	oss << (* static_cast<const array_t<uint64_t>*>
-		(buffer[j].cval))[curRow];
-	val = oss.str();
-	ierr = 0;
-	break;}
-    case ibis::FLOAT: {
-	oss << (* static_cast<const array_t<float>*>
-		(buffer[j].cval))[curRow];
-	val = oss.str();
-	ierr = 0;
-	break;}
-    case ibis::DOUBLE: {
-	oss << (* static_cast<const array_t<double>*>
-		(buffer[j].cval))[curRow];
-	val = oss.str();
-	ierr = 0;
-	break;}
-    case ibis::CATEGORY:{
-	const std::vector<std::string> *v =
-	    static_cast<const std::vector<std::string>*>(buffer[j].cval);
-	if (v->size() > (unsigned long)curRow) {
-	    val = (*v)[curRow];
-	    ierr = 0;
-	}
-	else {
-	    LOGGER(ibis::gVerbose > 1)
-		<< "Warning -- bord::cursor::getColumnAsString failed to "
-		"recover the value of column " << j;
-	    ierr = -4;
-	}
-	break;}
-    case ibis::TEXT: {
-	const ibis::column* col = tab.getColumn(buffer[j].cname);
-	if (col != 0) {
-	    col->getString(static_cast<uint32_t>(curRow), val);
-	    ierr = 0;
-	}
-	else {
-	    ierr = -1;
-	}
-	break;}
-    default: {
-	ierr = -1;
-	break;}
-    }
+    int ierr = extractCellFromColumn(j, buffer[j], oss);
+    val = oss.str();
     return ierr;
 } // ibis::bord::cursor::getColumnAsString
diff -Naur old/bord.h new/bord.h
--- old/bord.h	2012-07-04 23:02:48.000000000 +0530
+++ new/bord.h	2012-07-04 23:04:54.000000000 +0530
@@ -8,6 +8,7 @@
 #include "util.h"	// ibis::partList
 #include "part.h"	// ibis::part
 #include "selectClause.h"// ibis::selectClause
+#include "dictionary.h"
 
 ///@file
 /// Defines ibis::bord.  This is an in-memory data table, with a single
@@ -646,6 +647,7 @@
 
     void fillRow(ibis::table::row& res) const;
     int dumpIJ(std::ostream&, uint32_t, uint32_t) const;
+    int extractCellFromColumn(const uint32_t i, const bufferElement& column, std::ostream& out) const;
 
 private:
     cursor();
@@ -1237,69 +1239,81 @@
 ibis::bord::cursor::dumpIJ(std::ostream& out, uint32_t i,
 			   uint32_t j) const {
     if (buffer[j].cval == 0) return -1;
+    return extractCellFromColumn(i, buffer[j], out);
+} // ibis::bord::cursor::dumpIJ
 
-    switch (buffer[j].ctype) {
-    case ibis::BYTE: {
-	const array_t<const signed char>* vals =
-	    static_cast<const array_t<const signed char>*>(buffer[j].cval);
-	out << (int) ((*vals)[i]);
-	break;}
-    case ibis::UBYTE: {
-	const array_t<const unsigned char>* vals =
-	    static_cast<const array_t<const unsigned char>*>(buffer[j].cval);
-	out << (unsigned int) ((*vals)[i]);
-	break;}
-    case ibis::SHORT: {
-	const array_t<const int16_t>* vals =
-	    static_cast<const array_t<const int16_t>*>(buffer[j].cval);
-	out << (*vals)[i];
-	break;}
-    case ibis::USHORT: {
-	const array_t<const uint16_t>* vals =
-	    static_cast<const array_t<const uint16_t>*>(buffer[j].cval);
-	out << (*vals)[i];
-	break;}
-    case ibis::INT: {
-	const array_t<const int32_t>* vals =
-	    static_cast<const array_t<const int32_t>*>(buffer[j].cval);
-	out << (*vals)[i];
-	break;}
-    case ibis::UINT: {
-	const array_t<const uint32_t>* vals =
-	    static_cast<const array_t<const uint32_t>*>(buffer[j].cval);
-	out << (*vals)[i];
-	break;}
-    case ibis::LONG: {
-	const array_t<const int64_t>* vals =
-	    static_cast<const array_t<const int64_t>*>(buffer[j].cval);
-	out << (*vals)[i];
-	break;}
-    case ibis::ULONG: {
-	const array_t<const uint64_t>* vals =
-	    static_cast<const array_t<const uint64_t>*>(buffer[j].cval);
-	out << (*vals)[i];
-	break;}
-    case ibis::FLOAT: {
-	const array_t<const float>* vals =
-	    static_cast<const array_t<const float>*>(buffer[j].cval);
-	out << (*vals)[i];
-	break;}
-    case ibis::DOUBLE: {
-	const array_t<const double>* vals =
-	    static_cast<const array_t<const double>*>(buffer[j].cval);
-	out << (*vals)[i];
-	break;}
-    case ibis::TEXT:
-    case ibis::CATEGORY: {
-	const std::vector<std::string>* vals =
-	    static_cast<const std::vector<std::string>*>(buffer[j].cval);
-	out << '"' << (*vals)[i] << '"';
-	break;}
-    default: {
-	return -2;}
+inline int
+ibis::bord::cursor::extractCellFromColumn(const uint32_t i, const bufferElement& column, std::ostream& out) const {
+  switch (column.ctype) {
+  case ibis::BYTE: {
+    const array_t<const signed char>* vals =
+        static_cast<const array_t<const signed char>*>(column.cval);
+    out << (int) ((*vals)[i]);
+    break;}
+  case ibis::UBYTE: {
+    const array_t<const unsigned char>* vals =
+        static_cast<const array_t<const unsigned char>*>(column.cval);
+    out << (unsigned int) ((*vals)[i]);
+    break;}
+  case ibis::SHORT: {
+    const array_t<const int16_t>* vals =
+        static_cast<const array_t<const int16_t>*>(column.cval);
+    out << (*vals)[i];
+    break;}
+  case ibis::USHORT: {
+    const array_t<const uint16_t>* vals =
+        static_cast<const array_t<const uint16_t>*>(column.cval);
+    out << (*vals)[i];
+    break;}
+  case ibis::INT: {
+    const array_t<const int32_t>* vals =
+        static_cast<const array_t<const int32_t>*>(column.cval);
+    out << (*vals)[i];
+    break;}
+  case ibis::UINT: {
+    const array_t<const uint32_t>* vals =
+        static_cast<const array_t<const uint32_t>*>(column.cval);
+    if (column.dic == 0) {
+        out << (*vals)[i];
     }
-    return 0;
-} // ibis::bord::cursor::dumpIJ
+    else if ((*vals)[i] > column.dic->size()) {
+        out << (*vals)[i];
+    }
+    else if ((*vals)[i] > 0) {
+        out << '"' << (*column.dic)[(*vals)[i]] << '"';
+    }
+    break;}
+  case ibis::LONG: {
+    const array_t<const int64_t>* vals =
+        static_cast<const array_t<const int64_t>*>(column.cval);
+    out << (*vals)[i];
+    break;}
+  case ibis::ULONG: {
+    const array_t<const uint64_t>* vals =
+        static_cast<const array_t<const uint64_t>*>(column.cval);
+    out << (*vals)[i];
+    break;}
+  case ibis::FLOAT: {
+    const array_t<const float>* vals =
+        static_cast<const array_t<const float>*>(column.cval);
+    out << (*vals)[i];
+    break;}
+  case ibis::DOUBLE: {
+    const array_t<const double>* vals =
+        static_cast<const array_t<const double>*>(column.cval);
+    out << (*vals)[i];
+    break;}
+  case ibis::TEXT:
+  case ibis::CATEGORY: {
+    const std::vector<std::string>* vals =
+        static_cast<const std::vector<std::string>*>(column.cval);
+    out << '"' << (*vals)[i] << '"';
+    break;}
+  default: {
+    return -2;}
+  }
+  return 0;
+}
 
 inline int
 ibis::bord::cursor::getColumnAsByte(const char* cn, char& val) const {
