in holo-client/src/main/java/com/alibaba/hologres/client/impl/handler/ActionHandler.java [37:93]
public static void fillRecord(Record record, int recordIndex, ResultSet rs, int resultSetIndex, Column column) throws SQLException {
switch (column.getType()) {
case Types.SMALLINT:
// ResultSet getShort will make null to 0.
if (null != rs.getObject(resultSetIndex)) {
record.setObject(recordIndex, rs.getShort(resultSetIndex));
break;
}
record.setObject(recordIndex, rs.getObject(resultSetIndex));
break;
case Types.CHAR:
case Types.NCHAR:
case Types.CLOB:
case Types.NCLOB:
case Types.VARCHAR:
case Types.LONGVARCHAR:
case Types.NVARCHAR:
case Types.LONGNVARCHAR:
try {
record.setObject(recordIndex, rs.getObject(resultSetIndex));
} catch (PSQLException e) {
if (Objects.equals(e.getSQLState(), PSQLState.DATA_ERROR.getState()) &&
(e.getMessage().contains("Invalid character data was found") || e.getMessage().contains("发现不合法的字元"))) {
// 如果字符串有非utf8字符
byte[] bytes = rs.getBytes(resultSetIndex);
record.setObject(recordIndex, new String(bytes, StandardCharsets.UTF_8));
} else {
throw e;
}
}
break;
case Types.OTHER:
if ("roaringbitmap".equals(column.getTypeName())) {
Object obj = rs.getObject(resultSetIndex);
if (null != obj) {
if (obj instanceof PGobject) {
String value = ((PGobject) obj).getValue();
if (value.startsWith("\\x")) {
value = value.toLowerCase();
}
final byte[] bytes = new byte[(value.length() - 2) >> 1];
for (int i = 2; i < value.length(); i += 2) {
byte highDit = (byte) (Character.digit(value.charAt(i), 16) & 0xFF);
byte lowDit = (byte) (Character.digit(value.charAt(i + 1), 16) & 0xFF);
bytes[i / 2 - 1] = (byte) (highDit << 4 | lowDit);
}
record.setObject(recordIndex, bytes);
break;
}
}
}
record.setObject(recordIndex, rs.getObject(resultSetIndex));
break;
default:
record.setObject(recordIndex, rs.getObject(resultSetIndex));
}
}