in c/driver/postgresql/postgres_type.h [193:298]
ArrowErrorCode SetSchema(ArrowSchema* schema) const {
switch (type_id_) {
// ---- Primitive types --------------------
case PostgresTypeId::kBool:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_BOOL));
break;
case PostgresTypeId::kInt2:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_INT16));
break;
case PostgresTypeId::kInt4:
case PostgresTypeId::kOid:
case PostgresTypeId::kRegproc:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_INT32));
break;
case PostgresTypeId::kInt8:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_INT64));
break;
case PostgresTypeId::kFloat4:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_FLOAT));
break;
case PostgresTypeId::kFloat8:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_DOUBLE));
break;
// ---- Numeric/Decimal-------------------
case PostgresTypeId::kNumeric:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_STRING));
break;
// ---- Binary/string --------------------
case PostgresTypeId::kChar:
case PostgresTypeId::kBpchar:
case PostgresTypeId::kVarchar:
case PostgresTypeId::kText:
case PostgresTypeId::kName:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_STRING));
break;
case PostgresTypeId::kBytea:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_BINARY));
break;
// ---- Temporal --------------------
case PostgresTypeId::kDate:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_DATE32));
break;
case PostgresTypeId::kTime:
// We always return microsecond precision even if the type
// specifies differently
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetTypeDateTime(schema, NANOARROW_TYPE_TIME64,
NANOARROW_TIME_UNIT_MICRO,
/*timezone=*/nullptr));
break;
case PostgresTypeId::kTimestamp:
// We always return microsecond precision even if the type
// specifies differently
NANOARROW_RETURN_NOT_OK(
ArrowSchemaSetTypeDateTime(schema, NANOARROW_TYPE_TIMESTAMP,
NANOARROW_TIME_UNIT_MICRO, /*timezone=*/nullptr));
break;
case PostgresTypeId::kTimestamptz:
NANOARROW_RETURN_NOT_OK(
ArrowSchemaSetTypeDateTime(schema, NANOARROW_TYPE_TIMESTAMP,
NANOARROW_TIME_UNIT_MICRO, /*timezone=*/"UTC"));
break;
case PostgresTypeId::kInterval:
NANOARROW_RETURN_NOT_OK(
ArrowSchemaSetType(schema, NANOARROW_TYPE_INTERVAL_MONTH_DAY_NANO));
break;
// ---- Nested --------------------
case PostgresTypeId::kRecord:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetTypeStruct(schema, n_children()));
for (int64_t i = 0; i < n_children(); i++) {
NANOARROW_RETURN_NOT_OK(children_[i].SetSchema(schema->children[i]));
}
break;
case PostgresTypeId::kArray:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_LIST));
NANOARROW_RETURN_NOT_OK(children_[0].SetSchema(schema->children[0]));
break;
case PostgresTypeId::kUserDefined:
default: {
// For user-defined types or types we don't explicitly know how to deal with, we
// can still return the bytes postgres gives us and attach the type name as
// metadata
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_BINARY));
nanoarrow::UniqueBuffer buffer;
ArrowMetadataBuilderInit(buffer.get(), nullptr);
NANOARROW_RETURN_NOT_OK(ArrowMetadataBuilderAppend(
buffer.get(), ArrowCharView("ADBC:postgresql:typname"),
ArrowCharView(typname_.c_str())));
NANOARROW_RETURN_NOT_OK(
ArrowSchemaSetMetadata(schema, reinterpret_cast<char*>(buffer->data)));
break;
}
}
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetName(schema, field_name_.c_str()));
return NANOARROW_OK;
}