docs: public int findColumn(final String columnLabel) throws SQLException {
  
          checkClosed();
  
          if (columnLabel == null) {
              throw Util.nullArgument();
          }
  
          int columnIndex;
  
          // faster lookup for subsequent access
          if (columnMap != null) {
              columnIndex = columnMap.get(columnLabel, -1);
  
              if (columnIndex != -1) {
                  return columnIndex;
              }
          }
  
          final String[] colLabels = resultMetaData.columnLabels;
  
          columnIndex = -1;
  
          // column labels first, to preference column aliases
          for (int i = 0; i < columnCount; i++) {
              if (columnLabel.equalsIgnoreCase(colLabels[i])) {
                  columnIndex = i;
  
                  break;
              }
          }
  
          final ColumnBase[] columns = resultMetaData.columns;
  
          // then bare column names, to preference simple
          // quoted column idents that *may* contain "."
          if (columnIndex < 0) {
              for (int i = 0; i < columnCount; i++) {
                  if (columnLabel.equalsIgnoreCase(columns[i].getNameString())) {
                      columnIndex = i;
  
                      break;
                  }
              }
          }
  
          // then table-qualified column names (again, quoted
          // table idents *may* contain "."
          // As a last resort, "fully" qualified column names
          // (we don't yet bother with catalog qualification)
          if (columnIndex < 0) {
              int position = columnLabel.indexOf('.');
  
              if (position < 0) {
                  throw Util.sqlException(ErrorCode.JDBC_COLUMN_NOT_FOUND,
                                          columnLabel);
              }
  
              for (int i = 0; i < columnCount; i++) {
                  final String tabName = columns[i].getTableNameString();
  
                  if (tabName == null || tabName.length() == 0) {
                      continue;
                  }
  
                  final String colName = columns[i].getNameString();
  
                  if (columnLabel.equalsIgnoreCase(tabName + '.' + colName)) {
                      columnIndex = i;
  
                      break;
                  }
  
                  final String schemName = columns[i].getSchemaNameString();
  
                  if (schemName == null || schemName.length() == 0) {
                      continue;
                  }
  
                  String match = new StringBuffer(schemName).append('.').append(
                      tabName).append('.').append(colName).toString();
  
                  if (columnLabel.equalsIgnoreCase(match)) {
                      columnIndex = i;
  
                      break;
                  }
              }
          }
  
          if (columnIndex < 0) {
              throw Util.sqlException(ErrorCode.JDBC_COLUMN_NOT_FOUND,
                                      columnLabel);
          }
          columnIndex++;
  
          if (columnMap == null) {
              columnMap = new IntValueHashMap();
          }
          columnMap.put(columnLabel, columnIndex);
  
          return columnIndex;
      }