docs: public ResultSet getFunctionColumns(String catalog, String schemaPattern,
        String functionNamePattern,
        String columnNamePattern) throws SQLException {
  
      String sql;
      if (haveInformationSchemaParameters()) {
  
        sql =
            "SELECT SPECIFIC_SCHEMA `FUNCTION_CAT`, NULL `FUNCTION_SCHEM`, SPECIFIC_NAME FUNCTION_NAME,"
                + " PARAMETER_NAME COLUMN_NAME, "
                + " CASE PARAMETER_MODE "
                + "  WHEN 'IN' THEN " + functionColumnIn
                + "  WHEN 'OUT' THEN " + functionColumnOut
                + "  WHEN 'INOUT' THEN " + functionColumnInOut
                + "  ELSE " + functionReturn
                + " END COLUMN_TYPE,"
                + dataTypeClause("DTD_IDENTIFIER") + " DATA_TYPE,"
                + "DATA_TYPE TYPE_NAME,NUMERIC_PRECISION `PRECISION`,CHARACTER_MAXIMUM_LENGTH LENGTH,NUMERIC_SCALE SCALE,10 RADIX,"
                + procedureNullableUnknown + " NULLABLE,NULL REMARKS,"
                + "CHARACTER_OCTET_LENGTH CHAR_OCTET_LENGTH ,ORDINAL_POSITION, '' IS_NULLABLE, SPECIFIC_NAME "
                + " FROM INFORMATION_SCHEMA.PARAMETERS "
                + " WHERE "
                + catalogCond("SPECIFIC_SCHEMA", catalog)
                + " AND " + patternCond("SPECIFIC_NAME", functionNamePattern)
                + " AND " + patternCond("PARAMETER_NAME", columnNamePattern)
                + " AND ROUTINE_TYPE='FUNCTION'"
                + " ORDER BY FUNCTION_CAT, SPECIFIC_NAME, ORDINAL_POSITION";
      } else {
        /*
         * No information_schema.parameters
         * TODO : figure out what to do with older versions (get info via mysql.proc)
         * For now, just a dummy result set is returned.
         */
        sql =
            "SELECT '' FUNCTION_CAT, NULL FUNCTION_SCHEM, '' FUNCTION_NAME,"
                + " '' COLUMN_NAME, 0  COLUMN_TYPE, 0 DATA_TYPE,"
                + " '' TYPE_NAME,0 `PRECISION`,0 LENGTH, 0 SCALE,0 RADIX,"
                + " 0 NULLABLE,NULL REMARKS, 0 CHAR_OCTET_LENGTH , 0 ORDINAL_POSITION, "
                + " '' IS_NULLABLE, '' SPECIFIC_NAME "
                + " FROM DUAL WHERE 1=0 ";
      }
      return executeQuery(sql);
    }