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"

Reply via email to