static String extractSqlClob(Object value) {
    if (value == null) return null;
    try {
      if (value instanceof Clob) {
        // we trim the Clob value to a max length an int can hold
        int maxLength = (((Clob)value).length() < Integer.MAX_VALUE - 2) ? (int)((Clob)value).length() : Integer.MAX_VALUE - 2;
        return ((Clob)value).getSubString(1L, maxLength);
      } else {
        return value.toString();
      }
    } catch (SQLException sqle) {
      return null;
    }
  }
Merges applies the result of a PM SQL query into a tree of object.
Essentially it's an object join. DN could do this for us, but it issues queries
separately for every object, which is suboptimal.
@param pm
@param tree The object tree, by ID.
@param queryText The query text.
@param keyIndex Index of the Long column corresponding to the map ID in query result rows.
@param func The function that is called on each (object,row) pair with the same id.
@return the count of results returned from the query.
standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/MetastoreDirectSqlUtils.java