/**
   * Determine whether thisType is storable in otherType due to otherType being a user type.
   *
   * @param thisType The TypeId of the value to be stored
   * @param otherType The TypeId of the value to be stored in
   * @return true if thisType is storable in otherType
   */
  protected boolean userTypeStorable(TypeId thisType, TypeId otherType, ClassFactory cf) {
    /*
     ** If the other type is user-defined, use the java types to determine
     ** assignability.
     */
    if (otherType.userType()) {
      return cf.getClassInspector()
          .assignableTo(
              thisType.getCorrespondingJavaTypeName(), otherType.getCorrespondingJavaTypeName());
    }

    return false;
  }
  /**
   * Tell whether this numeric type can be converted to the given type.
   *
   * @param otherType The TypeId of the other type.
   * @param forDataTypeFunction was this called from a scalarFunction like CHAR() or DOUBLE()
   */
  public boolean numberConvertible(TypeId otherType, boolean forDataTypeFunction) {

    // Can't convert numbers to long types
    if (otherType.isLongConcatableTypeId()) return false;

    // Numbers can only be converted to other numbers,
    // and CHAR, (not VARCHARS or LONGVARCHAR).
    // Only with the CHAR() or VARCHAR()function can they be converted.
    boolean retval =
        ((otherType.isNumericTypeId()) || (otherType.isBooleanTypeId()) || (otherType.userType()));

    // For CHAR  Conversions, function can convert
    // Floating types
    if (forDataTypeFunction)
      retval = retval || (otherType.isFixedStringTypeId() && (getTypeId().isFloatingPointTypeId()));

    retval = retval || (otherType.isFixedStringTypeId() && (!getTypeId().isFloatingPointTypeId()));

    return retval;
  }