docs: public Type getCombinedType(Type other, int operation) {
  
          if (operation != OpTypes.CONCAT) {
              return getAggregateType(other);
          }
  
          Type newType;
          long newPrecision = this.precision + other.precision;
  
          switch (other.typeCode) {
  
              case Types.SQL_ALL_TYPES :
                  return this;
  
              case Types.SQL_CHAR :
                  newType = this;
                  break;
  
              case Types.SQL_VARCHAR :
                  newType =
                      (typeCode == Types.SQL_CLOB || typeCode == Types
                          .VARCHAR_IGNORECASE) ? this
                                               : other;
                  break;
  
              case Types.VARCHAR_IGNORECASE :
                  newType = typeCode == Types.SQL_CLOB ? this
                                                       : other;
                  break;
  
              case Types.SQL_CLOB :
                  newType = other;
                  break;
  
              default :
                  throw Error.error(ErrorCode.X_42562);
          }
  
          if (newPrecision > maxCharacterPrecision) {
              if (typeCode == Types.SQL_BINARY) {
  
                  // Standard disallows type length reduction
                  throw Error.error(ErrorCode.X_42570);
              } else if (typeCode == Types.SQL_CHAR) {
                  newPrecision = maxCharacterPrecision;
              }
          }
  
          return getCharacterType(newType.typeCode, precision + other.precision);
      }