【详述】查询jdbc external catalog 具体表数据,类似jsonb类型的列不支持,直接查询报错.
【背景】对JDBCSchemaResolver做了特殊处理以及在jdbc-bridge#JdbcScanner#getNextChunked做了特殊处理. 目前已正常使用查询. 想咨询下这一块为什么对其他PrimitiveType不作支持?
【业务影响】
【StarRocks版本】3.0.0
【集群规模】1fe+2be
【机器信息】
【联系方式】bofa1exx@gmail.com
【附件】
JDBCSchemaResolver
public Type convertColumnType(int dataType, String typeName, int columnSize, int digits) {
PrimitiveType primitiveType;
switch (dataType) {
case Types.BOOLEAN:
primitiveType = PrimitiveType.BOOLEAN;
break;
case Types.TINYINT:
primitiveType = PrimitiveType.TINYINT;
break;
case Types.SMALLINT:
primitiveType = PrimitiveType.SMALLINT;
break;
case Types.INTEGER:
primitiveType = PrimitiveType.INT;
break;
case Types.BIGINT:
primitiveType = PrimitiveType.BIGINT;
break;
case Types.FLOAT:
primitiveType = PrimitiveType.FLOAT;
break;
case Types.DOUBLE:
primitiveType = PrimitiveType.DOUBLE;
break;
case Types.DECIMAL:
primitiveType = PrimitiveType.DECIMAL32;
break;
case Types.CHAR:
return ScalarType.createCharType(columnSize);
case Types.VARCHAR:
return ScalarType.createVarcharType(columnSize);
case Types.DATE:
primitiveType = PrimitiveType.DATE;
break;
case Types.TIMESTAMP:
primitiveType = PrimitiveType.DATETIME;
break;
default:
# return VARCHAR as default
return ScalarType.createVarcharType(columnSize);
}
if (primitiveType != PrimitiveType.DECIMAL32) {
return ScalarType.createType(primitiveType);
} else {
int precision = columnSize + max(-digits, 0);
return ScalarType.createUnifiedDecimalType(precision, max(digits, 0));
}
}
JDBCScanner
public List<Object[]> getNextChunk() throws Exception {
int chunkSize = scanContext.getStatementFetchSize();
int columnCount = resultSetMetaData.getColumnCount();
resultNumRows = 0;
do {
for (int i = 0; i < columnCount; i++) {
Object[] dataColumn = resultChunk.get(i);
Object resultObject = resultSet.getObject(i + 1);
// in some cases, the real java class type of result is not consistent with the type from
// resultSetMetadata,
// for example,FLOAT type in oracle gives java.lang.Double type in resultSetMetaData,
// but the result type is BigDecimal when we getObject from resultSet.
// So we choose to convert the value to the target type here.
if (resultObject == null) {
dataColumn[resultNumRows] = null;
} else if (dataColumn instanceof Short[]) {
dataColumn[resultNumRows] = ((Number) resultObject).shortValue();
} else if (dataColumn instanceof Integer[]) {
dataColumn[resultNumRows] = ((Number) resultObject).intValue();
} else if (dataColumn instanceof Long[]) {
dataColumn[resultNumRows] = ((Number) resultObject).longValue();
} else if (dataColumn instanceof Float[]) {
dataColumn[resultNumRows] = ((Number) resultObject).floatValue();
} else if (dataColumn instanceof Double[]) {
dataColumn[resultNumRows] = ((Number) resultObject).doubleValue();
} else if (dataColumn instanceof String[]){
dataColumn[resultNumRows] = resultObject.toString();
// resultObject#PGObject 对应的resultMetadata#getColumnClassName 是String
} else {
dataColumn[resultNumRows] = resultObject;
}
}
resultNumRows++;
} while (resultNumRows < chunkSize && resultSet.next());
return resultChunk;
}
目前还没有支持 JSON等特殊数据类型,之后会不断完善支持~
请教下大佬目前已经有支持在支持jsonb类型么?
请教下大佬目前已经有支持在支持jsonb类型么?