in c/driver/postgresql/postgres_type.h [216:325]
ArrowErrorCode SetSchema(ArrowSchema* schema,
const std::string& vendor_name = "PostgreSQL") 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;
case PostgresTypeId::kCash:
// PostgreSQL appears to send an int64, without decimal point information
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_INT64));
break;
// ---- Numeric/Decimal-------------------
case PostgresTypeId::kNumeric:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_STRING));
NANOARROW_RETURN_NOT_OK(AddPostgresTypeMetadata(schema, vendor_name));
break;
// ---- Binary/string --------------------
case PostgresTypeId::kChar:
case PostgresTypeId::kBpchar:
case PostgresTypeId::kVarchar:
case PostgresTypeId::kText:
case PostgresTypeId::kName:
case PostgresTypeId::kEnum:
case PostgresTypeId::kJson:
case PostgresTypeId::kJsonb:
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], vendor_name));
}
break;
case PostgresTypeId::kArray:
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetType(schema, NANOARROW_TYPE_LIST));
NANOARROW_RETURN_NOT_OK(children_[0].SetSchema(schema->children[0], vendor_name));
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_RETURN_NOT_OK(AddPostgresTypeMetadata(schema, vendor_name));
break;
}
NANOARROW_RETURN_NOT_OK(ArrowSchemaSetName(schema, field_name_.c_str()));
return NANOARROW_OK;
}