bool CharType::isSafelyCoercibleFrom(const Type &original_type) const {
  QUICKSTEP_NULL_COERCIBILITY_CHECK();

  switch (original_type.getTypeID()) {
    case kChar:
      return original_type.maximumByteLength() <= length_;
    case kVarChar:
      return original_type.maximumByteLength() - 1 <= length_;
    default:
      return false;
  }
}
bool LongType::isSafelyCoercibleFrom(const Type &original_type) const {
  QUICKSTEP_NULL_COERCIBILITY_CHECK();
  return QUICKSTEP_EQUALS_ANY_CONSTANT(original_type.getTypeID(),
                                       kInt, kLong);
}
bool IntType::isSafelyCoercibleFrom(const Type &original_type) const {
  QUICKSTEP_NULL_COERCIBILITY_CHECK();
  return original_type.getTypeID() == kInt;
}
 bool isCoercibleFrom(const Type &original_type) const override {
   QUICKSTEP_NULL_COERCIBILITY_CHECK();
   return (original_type.getSuperTypeID() == kNumeric);
 }