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 3ac8151  Add support for String (#73)
3ac8151 is described below

commit 3ac8151825a0e5701b8d80d5f95ceaeea3aca4e1
Author: Sutou Kouhei <[email protected]>
AuthorDate: Tue Aug 22 16:22:33 2023 +0900

    Add support for String (#73)
    
    Closes GH-58
---
 src/afs.cc              | 21 +++++++++++++++++++++
 test/test-flight-sql.rb | 24 ++++++++++++++++++++----
 2 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/src/afs.cc b/src/afs.cc
index 60a94ce..7f31adb 100644
--- a/src/afs.cc
+++ b/src/afs.cc
@@ -35,6 +35,7 @@ extern "C"
 #include <storage/procsignal.h>
 #include <storage/shmem.h>
 #include <utils/backend_status.h>
+#include <utils/builtins.h>
 #include <utils/dsa.h>
 #include <utils/guc.h>
 #include <utils/memutils.h>
@@ -791,6 +792,12 @@ class ArrowPGTypeConverter : public arrow::TypeVisitor {
                return arrow::Status::OK();
        }
 
+       arrow::Status Visit(const arrow::StringType& type)
+       {
+               oid_ = TEXTOID;
+               return arrow::Status::OK();
+       }
+
    private:
        Oid oid_;
 };
@@ -862,6 +869,13 @@ class ArrowPGValueConverter : public arrow::ArrayVisitor {
                return arrow::Status::OK();
        }
 
+       arrow::Status Visit(const arrow::StringArray& 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_;
@@ -885,6 +899,9 @@ class PGArrowValueConverter : public arrow::ArrayVisitor {
                                return arrow::float32();
                        case FLOAT8OID:
                                return arrow::float64();
+                       case VARCHAROID:
+                       case TEXTOID:
+                               return arrow::utf8();
                        default:
                                return 
arrow::Status::NotImplemented("Unsupported PostgreSQL type: ",
                                                                     
attribute_->atttypid);
@@ -910,6 +927,10 @@ class PGArrowValueConverter : public arrow::ArrayVisitor {
                        case FLOAT8OID:
                                return 
static_cast<arrow::DoubleBuilder*>(builder)->Append(
                                        DatumGetFloat8(datum));
+                       case VARCHAROID:
+                       case TEXTOID:
+                               return 
static_cast<arrow::StringBuilder*>(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 d25ef51..205bb54 100644
--- a/test/test-flight-sql.rb
+++ b/test/test-flight-sql.rb
@@ -29,16 +29,27 @@ class FlightSQLTest < Test::Unit::TestCase
     flight_client.authenticate_basic(user, password, @options)
   end
 
+  def to_sql(value)
+    case value
+    when String
+      "'#{value.gsub(/'/, "''")}'"
+    else
+      value.to_s
+    end
+  end
+
   data("int16",  ["smallint",         Arrow::Int16Array, -2])
   data("int32",  ["integer",          Arrow::Int32Array, -2])
   data("int64",  ["bigint",           Arrow::Int64Array, -2])
   data("float",  ["real",             Arrow::FloatArray, -2.2])
   data("double", ["double precision", Arrow::DoubleArray, -2.2])
+  data("string - text",    ["text",        Arrow::StringArray, "b"])
+  data("string - varchar", ["varchar(10)", Arrow::StringArray, "b"])
   def test_select_type
     pg_type, array_class, value = data
     values = array_class.new([value])
-    info = flight_sql_client.execute("SELECT #{value}::#{pg_type} AS value",
-                                     @options)
+    sql = "SELECT #{to_sql(value)}::#{pg_type} AS value"
+    info = flight_sql_client.execute(sql, @options)
     assert_equal(Arrow::Schema.new(value: values.value_data_type),
                  info.get_schema)
     endpoint = info.endpoints.first
@@ -93,6 +104,8 @@ SELECT * FROM data
   data("uint64", ["bigint",   Arrow::UInt64Array, [1,  2, 3]])
   data("float",  ["real",             Arrow::FloatArray,  [1.1, -2.2, 3.3]])
   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"]])
   def test_insert_type
     unless flight_sql_client.respond_to?(:prepare)
       omit("red-arrow-flight-sql 14.0.0 or later is required")
@@ -115,10 +128,13 @@ SELECT * FROM data
 -------
     RESULT
     values.each do |value|
-      if value.is_a?(Float)
+      case value
+      when Float
         output << (" %5.1f\n" % value)
-      else
+      when Integer
         output << (" %5d\n" % value)
+      else
+        output << (" %s\n" % value)
       end
     end
     output << "(#{values.size} rows)\n"

Reply via email to