You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by li...@apache.org on 2023/06/15 23:29:59 UTC

[arrow-adbc] branch main updated: feat(c/driver/postgresql): Support float type (#807)

This is an automated email from the ASF dual-hosted git repository.

lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git


The following commit(s) were added to refs/heads/main by this push:
     new 7e3e08b9 feat(c/driver/postgresql): Support float type (#807)
7e3e08b9 is described below

commit 7e3e08b917dde8dad24e917624ee6e4a4a02eb3c
Author: William Ayd <wi...@icloud.com>
AuthorDate: Thu Jun 15 16:29:54 2023 -0700

    feat(c/driver/postgresql): Support float type (#807)
---
 c/driver/postgresql/postgres_util.h    |  6 ++++++
 c/driver/postgresql/postgresql_test.cc |  2 --
 c/driver/postgresql/statement.cc       | 13 +++++++++++++
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/c/driver/postgresql/postgres_util.h b/c/driver/postgresql/postgres_util.h
index d74e568a..0153c896 100644
--- a/c/driver/postgresql/postgres_util.h
+++ b/c/driver/postgresql/postgres_util.h
@@ -121,6 +121,12 @@ ADBC_REGISTER_TO_NETWORK_FUNC(16)
 ADBC_REGISTER_TO_NETWORK_FUNC(32)
 ADBC_REGISTER_TO_NETWORK_FUNC(64)
 
+static inline uint32_t ToNetworkFloat4(float v) {
+  uint32_t vint;
+  memcpy(&vint, &v, sizeof(uint32_t));
+  return SwapHostToNetwork(vint);
+}
+
 static inline uint64_t ToNetworkFloat8(double v) {
   uint64_t vint;
   memcpy(&vint, &v, sizeof(uint64_t));
diff --git a/c/driver/postgresql/postgresql_test.cc b/c/driver/postgresql/postgresql_test.cc
index 6c6d1f52..15403384 100644
--- a/c/driver/postgresql/postgresql_test.cc
+++ b/c/driver/postgresql/postgresql_test.cc
@@ -469,8 +469,6 @@ class PostgresStatementTest : public ::testing::Test,
   void TestSqlIngestUInt16() { GTEST_SKIP() << "Not implemented"; }
   void TestSqlIngestUInt32() { GTEST_SKIP() << "Not implemented"; }
   void TestSqlIngestUInt64() { GTEST_SKIP() << "Not implemented"; }
-  void TestSqlIngestFloat32() { GTEST_SKIP() << "Not implemented"; }
-  void TestSqlIngestFloat64() { GTEST_SKIP() << "Not implemented"; }
   void TestSqlIngestBinary() { GTEST_SKIP() << "Not implemented"; }
 
   void TestSqlPrepareErrorParamCountMismatch() { GTEST_SKIP() << "Not yet implemented"; }
diff --git a/c/driver/postgresql/statement.cc b/c/driver/postgresql/statement.cc
index bd26851c..d052a06c 100644
--- a/c/driver/postgresql/statement.cc
+++ b/c/driver/postgresql/statement.cc
@@ -199,6 +199,10 @@ struct BindStream {
           type_id = PostgresTypeId::kInt8;
           param_lengths[i] = 8;
           break;
+        case ArrowType::NANOARROW_TYPE_FLOAT:
+          type_id = PostgresTypeId::kFloat4;
+          param_lengths[i] = 4;
+          break;
         case ArrowType::NANOARROW_TYPE_DOUBLE:
           type_id = PostgresTypeId::kFloat8;
           param_lengths[i] = 8;
@@ -300,6 +304,12 @@ struct BindStream {
               std::memcpy(param_values[col], &value, sizeof(int64_t));
               break;
             }
+            case ArrowType::NANOARROW_TYPE_FLOAT: {
+              const uint32_t value = ToNetworkFloat4(
+                  array_view->children[col]->buffer_views[1].data.as_float[row]);
+              std::memcpy(param_values[col], &value, sizeof(uint32_t));
+              break;
+            }
             case ArrowType::NANOARROW_TYPE_DOUBLE: {
               const uint64_t value = ToNetworkFloat8(
                   array_view->children[col]->buffer_views[1].data.as_double[row]);
@@ -570,6 +580,9 @@ AdbcStatusCode PostgresStatement::CreateBulkTable(
       case ArrowType::NANOARROW_TYPE_INT64:
         create += " BIGINT";
         break;
+      case ArrowType::NANOARROW_TYPE_FLOAT:
+        create += " REAL";
+        break;
       case ArrowType::NANOARROW_TYPE_DOUBLE:
         create += " DOUBLE PRECISION";
         break;