private Object convert(Object o) throws HiveException {
    Object input;
    switch (inputOI.getPrimitiveCategory()) {
    case STRING:
      input = ((StringObjectInspector) inputOI).getPrimitiveJavaObject(o);
      break;
    case CHAR:
      input = ((HiveCharObjectInspector) inputOI).getPrimitiveJavaObject(o).getStrippedValue();
      break;
    case VARCHAR:
      input = ((HiveVarcharObjectInspector) inputOI).getPrimitiveJavaObject(o).toString();
      break;
    case TIMESTAMP:
      input = ((TimestampObjectInspector) inputOI).getPrimitiveWritableObject(o).getTimestamp();
      break;
    case DATE:
      input = ((DateObjectInspector) inputOI).getPrimitiveWritableObject(o).get();
      break;
    default:
      throw new HiveException("Input type " + inputOI.getPrimitiveCategory() + " not valid");
    }

    // format here
    Object formattedOutput = null;
    if (inputOI.getPrimitiveCategory() == PrimitiveObjectInspector.PrimitiveCategory.DATE
        || inputOI.getPrimitiveCategory() == PrimitiveObjectInspector.PrimitiveCategory.TIMESTAMP) {
      if (inputOI.getPrimitiveCategory() == PrimitiveObjectInspector.PrimitiveCategory.DATE) {
        try {
          formattedOutput = formatter.format((Date) input);
        } catch (IllegalArgumentException e) {
          return null;
        }
      } else {
        try {
          formattedOutput = formatter.format((Timestamp) input);
        } catch (IllegalArgumentException e) {
          return null;
        }
      }
      if (formattedOutput == null) {
        return null;
      }
    }

    // parse and create Writables
    switch (outputOI.getPrimitiveCategory()) {
    case STRING:
      return new Text((String) formattedOutput);
    case CHAR:
      return ((SettableHiveCharObjectInspector) outputOI)
          .create(new HiveChar((String) formattedOutput, -1));
    case VARCHAR:
      return ((SettableHiveVarcharObjectInspector) outputOI)
          .create(new HiveVarchar((String) formattedOutput, -1));
    case TIMESTAMP:
      try {
        Timestamp t = formatter.parseTimestamp((String) input);
        if (t == null) {
          return null;
        }
        return ((SettableTimestampObjectInspector) outputOI).create(t);
      } catch (IllegalArgumentException e) {
        return null;
      }

    case DATE:
      try {
        Date d = formatter.parseDate((String) input);
        if (d == null) {
          return null;
        }
        return ((SettableDateObjectInspector) outputOI).create(d);
      } catch (IllegalArgumentException e) {
        return null;
      }
    default:
      throw new HiveException("Output type " + outputOI.getPrimitiveCategory() + " not valid");
    }
  }
@param arguments
 0. const int, value of a HiveParser_IdentifiersParser constant which represents a TOK_[TYPE]
 1. expression to convert
 2. constant string, format pattern
 3. (optional) constant int, output char/varchar length
ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFCastFormat.java