feat: implement view-based vector types (#7600)

* feat: implement view-based vector types

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

* simplify

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

* support large binary array, simplify match

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

---------

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
This commit is contained in:
Ruihang Xia
2026-01-21 20:44:06 +08:00
committed by GitHub
parent 966ade7565
commit c34e9970e7
11 changed files with 559 additions and 205 deletions
+4 -28
View File
@@ -895,36 +895,12 @@ impl RowWriter {
let v = array.value(i);
self.insert(column, v);
}
DataType::Utf8 => {
let array = array.as_string::<i32>();
let v = array.value(i);
DataType::Utf8 | DataType::LargeUtf8 | DataType::Utf8View => {
let v = datatypes::arrow_array::string_array_value(array, i);
self.insert(column, v);
}
DataType::LargeUtf8 => {
let array = array.as_string::<i64>();
let v = array.value(i);
self.insert(column, v);
}
DataType::Utf8View => {
let array = array.as_string_view();
let v = array.value(i);
self.insert(column, v);
}
DataType::Binary => {
let array = array.as_binary::<i32>();
let v = array.value(i);
let column_schema = &schema.column_schemas()[j];
self.insert_bytes(column_schema, v)?;
}
DataType::LargeBinary => {
let array = array.as_binary::<i64>();
let v = array.value(i);
let column_schema = &schema.column_schemas()[j];
self.insert_bytes(column_schema, v)?;
}
DataType::BinaryView => {
let array = array.as_binary_view();
let v = array.value(i);
DataType::Binary | DataType::LargeBinary | DataType::BinaryView => {
let v = datatypes::arrow_array::binary_array_value(array, i);
let column_schema = &schema.column_schemas()[j];
self.insert_bytes(column_schema, v)?;
}
+4 -26
View File
@@ -175,34 +175,12 @@ impl HttpOutputWriter {
let v = array.value(i);
self.write_value(v)?;
}
DataType::Utf8 => {
let array = array.as_string::<i32>();
let v = array.value(i);
DataType::Utf8 | DataType::LargeUtf8 | DataType::Utf8View => {
let v = datatypes::arrow_array::string_array_value(array, i);
self.write_value(v)?;
}
DataType::LargeUtf8 => {
let array = array.as_string::<i64>();
let v = array.value(i);
self.write_value(v)?;
}
DataType::Utf8View => {
let array = array.as_string_view();
let v = array.value(i);
self.write_value(v)?;
}
DataType::Binary => {
let array = array.as_binary::<i32>();
let v = array.value(i);
self.write_bytes(v, &schema.data_type)?;
}
DataType::LargeBinary => {
let array = array.as_binary::<i64>();
let v = array.value(i);
self.write_bytes(v, &schema.data_type)?;
}
DataType::BinaryView => {
let array = array.as_binary_view();
let v = array.value(i);
DataType::Binary | DataType::LargeBinary | DataType::BinaryView => {
let v = datatypes::arrow_array::binary_array_value(array, i);
self.write_bytes(v, &schema.data_type)?;
}
DataType::Date32 => {
+5 -34
View File
@@ -280,41 +280,12 @@ impl<'a, W: AsyncWrite + Unpin> MysqlResultWriter<'a, W> {
let array = column.as_primitive::<Float64Type>();
row_writer.write_col(array.value(i))?;
}
DataType::Utf8 => {
let array = column.as_string::<i32>();
row_writer.write_col(array.value(i))?;
DataType::Utf8 | DataType::Utf8View | DataType::LargeUtf8 => {
let v = datatypes::arrow_array::string_array_value(column, i);
row_writer.write_col(v)?;
}
DataType::Utf8View => {
let array = column.as_string_view();
row_writer.write_col(array.value(i))?;
}
DataType::LargeUtf8 => {
let array = column.as_string::<i64>();
row_writer.write_col(array.value(i))?;
}
DataType::Binary => {
let array = column.as_binary::<i32>();
let v = array.value(i);
if let ConcreteDataType::Json(_) = &schema.column_schemas()[j].data_type {
let s = jsonb_to_string(v).context(ConvertSqlValueSnafu)?;
row_writer.write_col(s)?;
} else {
row_writer.write_col(v)?;
}
}
DataType::BinaryView => {
let array = column.as_binary_view();
let v = array.value(i);
if let ConcreteDataType::Json(_) = &schema.column_schemas()[j].data_type {
let s = jsonb_to_string(v).context(ConvertSqlValueSnafu)?;
row_writer.write_col(s)?;
} else {
row_writer.write_col(v)?;
}
}
DataType::LargeBinary => {
let array = column.as_binary::<i64>();
let v = array.value(i);
DataType::Binary | DataType::BinaryView | DataType::LargeBinary => {
let v = datatypes::arrow_array::binary_array_value(column, i);
if let ConcreteDataType::Json(_) = &schema.column_schemas()[j].data_type {
let s = jsonb_to_string(v).context(ConvertSqlValueSnafu)?;
row_writer.write_col(s)?;
+4 -36
View File
@@ -500,44 +500,12 @@ impl RecordBatchRowIterator {
let array = column.as_primitive::<Float64Type>();
encoder.encode_field(&array.value(i))?;
}
DataType::Utf8 => {
let array = column.as_string::<i32>();
let value = array.value(i);
DataType::Utf8 | DataType::LargeUtf8 | DataType::Utf8View => {
let value = datatypes::arrow_array::string_array_value(column, i);
encoder.encode_field(&value)?;
}
DataType::Utf8View => {
let array = column.as_string_view();
let value = array.value(i);
encoder.encode_field(&value)?;
}
DataType::LargeUtf8 => {
let array = column.as_string::<i64>();
let value = array.value(i);
encoder.encode_field(&value)?;
}
DataType::Binary => {
let array = column.as_binary::<i32>();
let v = array.value(i);
encode_bytes(
&self.schema.column_schemas()[j],
v,
encoder,
&self.query_ctx,
)?;
}
DataType::BinaryView => {
let array = column.as_binary_view();
let v = array.value(i);
encode_bytes(
&self.schema.column_schemas()[j],
v,
encoder,
&self.query_ctx,
)?;
}
DataType::LargeBinary => {
let array = column.as_binary::<i64>();
let v = array.value(i);
DataType::Binary | DataType::LargeBinary | DataType::BinaryView => {
let v = datatypes::arrow_array::binary_array_value(column, i);
encode_bytes(
&self.schema.column_schemas()[j],
v,