This is an automated email from the ASF dual-hosted git repository.
kou pushed a commit to branch main
in repository
https://gitbox.apache.org/repos/asf/arrow-flight-sql-postgresql.git
The following commit(s) were added to refs/heads/main by this push:
new 55cc890 Add support for Binary (#74)
55cc890 is described below
commit 55cc890339ad40b4e204cdd992b28f76441909cf
Author: Sutou Kouhei <[email protected]>
AuthorDate: Tue Aug 22 17:05:55 2023 +0900
Add support for Binary (#74)
Closes GH-59
---
src/afs.cc | 18 ++++++++++++++++++
test/test-flight-sql.rb | 30 ++++++++++++++++++++++++++++--
2 files changed, 46 insertions(+), 2 deletions(-)
diff --git a/src/afs.cc b/src/afs.cc
index 7f31adb..3727a59 100644
--- a/src/afs.cc
+++ b/src/afs.cc
@@ -798,6 +798,12 @@ class ArrowPGTypeConverter : public arrow::TypeVisitor {
return arrow::Status::OK();
}
+ arrow::Status Visit(const arrow::BinaryType& type)
+ {
+ oid_ = BYTEAOID;
+ return arrow::Status::OK();
+ }
+
private:
Oid oid_;
};
@@ -876,6 +882,13 @@ class ArrowPGValueConverter : public arrow::ArrayVisitor {
return arrow::Status::OK();
}
+ arrow::Status Visit(const arrow::BinaryArray& array)
+ {
+ auto value = array.GetView(i_row_);
+ datum_ = PointerGetDatum(cstring_to_text_with_len(value.data(),
value.length()));
+ return arrow::Status::OK();
+ }
+
private:
int64_t i_row_;
Datum& datum_;
@@ -902,6 +915,8 @@ class PGArrowValueConverter : public arrow::ArrayVisitor {
case VARCHAROID:
case TEXTOID:
return arrow::utf8();
+ case BYTEAOID:
+ return arrow::binary();
default:
return
arrow::Status::NotImplemented("Unsupported PostgreSQL type: ",
attribute_->atttypid);
@@ -931,6 +946,9 @@ class PGArrowValueConverter : public arrow::ArrayVisitor {
case TEXTOID:
return
static_cast<arrow::StringBuilder*>(builder)->Append(
VARDATA_ANY(datum),
VARSIZE_ANY_EXHDR(datum));
+ case BYTEAOID:
+ return
static_cast<arrow::BinaryBuilder*>(builder)->Append(
+ VARDATA_ANY(datum),
VARSIZE_ANY_EXHDR(datum));
default:
return
arrow::Status::NotImplemented("Unsupported PostgreSQL type: ",
attribute_->atttypid);
diff --git a/test/test-flight-sql.rb b/test/test-flight-sql.rb
index 205bb54..1a50d63 100644
--- a/test/test-flight-sql.rb
+++ b/test/test-flight-sql.rb
@@ -32,7 +32,23 @@ class FlightSQLTest < Test::Unit::TestCase
def to_sql(value)
case value
when String
- "'#{value.gsub(/'/, "''")}'"
+ sql_string = "'"
+ value.each_char do |char|
+ case char
+ when "'"
+ sql_string << "''"
+ when "\\"
+ sql_string << "\\\\"
+ else
+ if (0..31).cover?(char.ord) or (127..255).cover?(char.ord)
+ sql_string << ("\\%03d" % char.ord)
+ else
+ sql_string << char
+ end
+ end
+ end
+ sql_string << "'"
+ sql_string
else
value.to_s
end
@@ -45,6 +61,7 @@ class FlightSQLTest < Test::Unit::TestCase
data("double", ["double precision", Arrow::DoubleArray, -2.2])
data("string - text", ["text", Arrow::StringArray, "b"])
data("string - varchar", ["varchar(10)", Arrow::StringArray, "b"])
+ data("binary", ["bytea", Arrow::BinaryArray, "\x0".b])
def test_select_type
pg_type, array_class, value = data
values = array_class.new([value])
@@ -106,6 +123,7 @@ SELECT * FROM data
data("double", ["double precision", Arrow::DoubleArray, [1.1, -2.2, 3.3]])
data("string - text", ["text", Arrow::StringArray, ["a", "b",
"c"]])
data("string - varchar", ["varchar(10)", Arrow::StringArray, ["a", "b",
"c"]])
+ data("binary", ["bytea", Arrow::BinaryArray, ["\x0".b, "\x1".b, "\x2".b]])
def test_insert_type
unless flight_sql_client.respond_to?(:prepare)
omit("red-arrow-flight-sql 14.0.0 or later is required")
@@ -134,7 +152,15 @@ SELECT * FROM data
when Integer
output << (" %5d\n" % value)
else
- output << (" %s\n" % value)
+ if value.encoding == "".b.encoding
+ output << " "
+ value.each_byte do |byte|
+ output << ("\\x%02x" % byte)
+ end
+ output << "\n"
+ else
+ output << " #{value}\n"
+ end
end
end
output << "(#{values.size} rows)\n"