Skip to content

Commit 00088f9

Browse files
authored
feat: add support for binaryview type (#96)
1 parent 9e6ca4c commit 00088f9

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

arrow-pg/src/datatypes.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,15 @@ pub fn into_pg_type(arrow_type: &DataType) -> PgWireResult<Type> {
3535
DataType::Time32(_) | DataType::Time64(_) => Type::TIME,
3636
DataType::Date32 | DataType::Date64 => Type::DATE,
3737
DataType::Interval(_) => Type::INTERVAL,
38-
DataType::Binary | DataType::FixedSizeBinary(_) | DataType::LargeBinary => Type::BYTEA,
38+
DataType::Binary
39+
| DataType::FixedSizeBinary(_)
40+
| DataType::LargeBinary
41+
| DataType::BinaryView => Type::BYTEA,
3942
DataType::Float16 | DataType::Float32 => Type::FLOAT4,
4043
DataType::Float64 => Type::FLOAT8,
4144
DataType::Decimal128(_, _) => Type::NUMERIC,
4245
DataType::Utf8 => Type::VARCHAR,
43-
DataType::LargeUtf8 => Type::TEXT,
46+
DataType::LargeUtf8 | DataType::Utf8View => Type::TEXT,
4447
DataType::List(field) | DataType::FixedSizeList(field, _) | DataType::LargeList(field) => {
4548
match field.data_type() {
4649
DataType::Boolean => Type::BOOL_ARRAY,
@@ -58,11 +61,14 @@ pub fn into_pg_type(arrow_type: &DataType) -> PgWireResult<Type> {
5861
DataType::Time32(_) | DataType::Time64(_) => Type::TIME_ARRAY,
5962
DataType::Date32 | DataType::Date64 => Type::DATE_ARRAY,
6063
DataType::Interval(_) => Type::INTERVAL_ARRAY,
61-
DataType::FixedSizeBinary(_) | DataType::Binary => Type::BYTEA_ARRAY,
64+
DataType::FixedSizeBinary(_)
65+
| DataType::Binary
66+
| DataType::LargeBinary
67+
| DataType::BinaryView => Type::BYTEA_ARRAY,
6268
DataType::Float16 | DataType::Float32 => Type::FLOAT4_ARRAY,
6369
DataType::Float64 => Type::FLOAT8_ARRAY,
6470
DataType::Utf8 => Type::VARCHAR_ARRAY,
65-
DataType::LargeUtf8 => Type::TEXT_ARRAY,
71+
DataType::LargeUtf8 | DataType::Utf8View => Type::TEXT_ARRAY,
6672
struct_type @ DataType::Struct(_) => Type::new(
6773
Type::RECORD_ARRAY.name().into(),
6874
Type::RECORD_ARRAY.oid(),
@@ -78,7 +84,6 @@ pub fn into_pg_type(arrow_type: &DataType) -> PgWireResult<Type> {
7884
}
7985
}
8086
}
81-
DataType::Utf8View => Type::TEXT,
8287
DataType::Dictionary(_, value_type) => into_pg_type(value_type)?,
8388
DataType::Struct(fields) => {
8489
let name: String = fields

arrow-pg/src/encoder.rs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,15 @@ fn get_utf8_view_value(arr: &Arc<dyn Array>, idx: usize) -> Option<&str> {
143143
})
144144
}
145145

146+
fn get_binary_view_value(arr: &Arc<dyn Array>, idx: usize) -> Option<&[u8]> {
147+
(!arr.is_null(idx)).then(|| {
148+
arr.as_any()
149+
.downcast_ref::<BinaryViewArray>()
150+
.unwrap()
151+
.value(idx)
152+
})
153+
}
154+
146155
fn get_utf8_value(arr: &Arc<dyn Array>, idx: usize) -> Option<&str> {
147156
(!arr.is_null(idx)).then(|| {
148157
arr.as_any()
@@ -161,12 +170,15 @@ fn get_large_utf8_value(arr: &Arc<dyn Array>, idx: usize) -> Option<&str> {
161170
})
162171
}
163172

164-
fn get_binary_value(arr: &Arc<dyn Array>, idx: usize) -> Option<&[u8]> {
173+
fn get_binary_value(arr: &Arc<dyn Array>, idx: usize) -> Option<String> {
165174
(!arr.is_null(idx)).then(|| {
166-
arr.as_any()
167-
.downcast_ref::<BinaryArray>()
168-
.unwrap()
169-
.value(idx)
175+
String::from_utf8_lossy(
176+
arr.as_any()
177+
.downcast_ref::<BinaryArray>()
178+
.unwrap()
179+
.value(idx),
180+
)
181+
.to_string()
170182
})
171183
}
172184

@@ -330,6 +342,11 @@ pub fn encode_value<T: Encoder>(
330342
type_,
331343
format,
332344
)?,
345+
DataType::BinaryView => encoder.encode_field_with_type_and_format(
346+
&get_binary_view_value(arr, idx),
347+
type_,
348+
format,
349+
)?,
333350
DataType::LargeUtf8 => encoder.encode_field_with_type_and_format(
334351
&get_large_utf8_value(arr, idx),
335352
type_,

0 commit comments

Comments
 (0)