in flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/ArrowDatabaseMetadata.java [1042:1157]
private int setGetColumnsVectorSchemaRootFromFields(
final VectorSchemaRoot currentRoot,
int insertIndex,
final List<Field> tableColumns,
final Text catalogName,
final Text tableName,
final Text schemaName,
final Pattern columnNamePattern) {
int ordinalIndex = 1;
final int tableColumnsSize = tableColumns.size();
final VarCharVector tableCatVector = (VarCharVector) currentRoot.getVector("TABLE_CAT");
final VarCharVector tableSchemVector = (VarCharVector) currentRoot.getVector("TABLE_SCHEM");
final VarCharVector tableNameVector = (VarCharVector) currentRoot.getVector("TABLE_NAME");
final VarCharVector columnNameVector = (VarCharVector) currentRoot.getVector("COLUMN_NAME");
final IntVector dataTypeVector = (IntVector) currentRoot.getVector("DATA_TYPE");
final VarCharVector typeNameVector = (VarCharVector) currentRoot.getVector("TYPE_NAME");
final IntVector columnSizeVector = (IntVector) currentRoot.getVector("COLUMN_SIZE");
final IntVector decimalDigitsVector = (IntVector) currentRoot.getVector("DECIMAL_DIGITS");
final IntVector numPrecRadixVector = (IntVector) currentRoot.getVector("NUM_PREC_RADIX");
final IntVector nullableVector = (IntVector) currentRoot.getVector("NULLABLE");
final IntVector ordinalPositionVector = (IntVector) currentRoot.getVector("ORDINAL_POSITION");
final VarCharVector isNullableVector = (VarCharVector) currentRoot.getVector("IS_NULLABLE");
final VarCharVector isAutoincrementVector =
(VarCharVector) currentRoot.getVector("IS_AUTOINCREMENT");
final VarCharVector isGeneratedColumnVector =
(VarCharVector) currentRoot.getVector("IS_GENERATEDCOLUMN");
final VarCharVector remarksVector = (VarCharVector) currentRoot.getVector("REMARKS");
for (int i = 0; i < tableColumnsSize; i++, ordinalIndex++) {
final Field field = tableColumns.get(i);
final FlightSqlColumnMetadata columnMetadata =
new FlightSqlColumnMetadata(field.getMetadata());
final String columnName = field.getName();
if (columnNamePattern != null && !columnNamePattern.matcher(columnName).matches()) {
continue;
}
final ArrowType fieldType = field.getType();
if (catalogName != null) {
tableCatVector.setSafe(insertIndex, catalogName);
}
if (schemaName != null) {
tableSchemVector.setSafe(insertIndex, schemaName);
}
if (tableName != null) {
tableNameVector.setSafe(insertIndex, tableName);
}
if (columnName != null) {
columnNameVector.setSafe(insertIndex, columnName.getBytes(CHARSET));
}
dataTypeVector.setSafe(insertIndex, SqlTypes.getSqlTypeIdFromArrowType(fieldType));
byte[] typeName =
columnMetadata.getTypeName() != null
? columnMetadata.getTypeName().getBytes(CHARSET)
: SqlTypes.getSqlTypeNameFromArrowType(fieldType).getBytes(CHARSET);
typeNameVector.setSafe(insertIndex, typeName);
// We aren't setting COLUMN_SIZE for ROWID SQL Types, as there's no such Arrow type.
// We aren't setting COLUMN_SIZE nor DECIMAL_DIGITS for Float/Double as their precision and
// scale are variable.
if (fieldType instanceof ArrowType.Decimal) {
numPrecRadixVector.setSafe(insertIndex, BASE10_RADIX);
} else if (fieldType instanceof ArrowType.Int) {
numPrecRadixVector.setSafe(insertIndex, BASE10_RADIX);
} else if (fieldType instanceof ArrowType.FloatingPoint) {
numPrecRadixVector.setSafe(insertIndex, BASE10_RADIX);
}
Integer decimalDigits = columnMetadata.getScale();
if (decimalDigits == null) {
decimalDigits = getDecimalDigits(fieldType);
}
if (decimalDigits != null) {
decimalDigitsVector.setSafe(insertIndex, decimalDigits);
}
Integer columnSize = columnMetadata.getPrecision();
if (columnSize == null) {
columnSize = getColumnSize(fieldType);
}
if (columnSize != null) {
columnSizeVector.setSafe(insertIndex, columnSize);
}
nullableVector.setSafe(insertIndex, field.isNullable() ? 1 : 0);
isNullableVector.setSafe(insertIndex, booleanToYesOrNo(field.isNullable()));
Boolean autoIncrement = columnMetadata.isAutoIncrement();
if (autoIncrement != null) {
isAutoincrementVector.setSafe(insertIndex, booleanToYesOrNo(autoIncrement));
} else {
isAutoincrementVector.setSafe(insertIndex, EMPTY_BYTE_ARRAY);
}
String remarks = columnMetadata.getRemarks();
if (remarks != null) {
remarksVector.setSafe(insertIndex, remarks.getBytes(CHARSET));
}
// Fields also don't hold information about IS_AUTOINCREMENT and IS_GENERATEDCOLUMN,
// so we're setting an empty string (as bytes), which means it couldn't be determined.
isGeneratedColumnVector.setSafe(insertIndex, EMPTY_BYTE_ARRAY);
ordinalPositionVector.setSafe(insertIndex, ordinalIndex);
insertIndex++;
}
return insertIndex;
}