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 e0bc951a test(c): Timestamp testing improvements (#900)
e0bc951a is described below

commit e0bc951a0796923180f5dab97a918077cdb87784
Author: William Ayd <[email protected]>
AuthorDate: Wed Jul 12 12:29:22 2023 -0700

    test(c): Timestamp testing improvements (#900)
---
 c/driver/postgresql/postgresql_test.cc | 22 ++++++++++++++++++++++
 c/driver/sqlite/sqlite_test.cc         | 28 ++++++++++++++++++++++++++++
 c/driver/sqlite/statement_reader.c     | 11 ++++++-----
 c/validation/adbc_validation.cc        | 15 ++++++++-------
 c/validation/adbc_validation.h         |  4 ++++
 5 files changed, 68 insertions(+), 12 deletions(-)

diff --git a/c/driver/postgresql/postgresql_test.cc 
b/c/driver/postgresql/postgresql_test.cc
index 1a30fd58..33115bcf 100644
--- a/c/driver/postgresql/postgresql_test.cc
+++ b/c/driver/postgresql/postgresql_test.cc
@@ -576,6 +576,28 @@ class PostgresStatementTest : public ::testing::Test,
   }
 
  protected:
+  void ValidateIngestedTemporalData(struct ArrowArrayView* values,
+                                    enum ArrowTimeUnit unit,
+                                    const char* timezone) override {
+    std::vector<std::optional<int64_t>> expected;
+    switch (unit) {
+      case (NANOARROW_TIME_UNIT_SECOND):
+        expected.insert(expected.end(), {std::nullopt, -42000000, 0, 
42000000});
+        break;
+      case (NANOARROW_TIME_UNIT_MILLI):
+        expected.insert(expected.end(), {std::nullopt, -42000, 0, 42000});
+        break;
+      case (NANOARROW_TIME_UNIT_MICRO):
+        expected.insert(expected.end(), {std::nullopt, -42, 0, 42});
+        break;
+      case (NANOARROW_TIME_UNIT_NANO):
+        expected.insert(expected.end(), {std::nullopt, 0, 0, 0});
+        break;
+    }
+    ASSERT_NO_FATAL_FAILURE(
+        adbc_validation::CompareArray<std::int64_t>(values, expected));
+  }
+
   PostgresQuirks quirks_;
 };
 ADBCV_TEST_STATEMENT(PostgresStatementTest)
diff --git a/c/driver/sqlite/sqlite_test.cc b/c/driver/sqlite/sqlite_test.cc
index 9ffd18df..f99697d9 100644
--- a/c/driver/sqlite/sqlite_test.cc
+++ b/c/driver/sqlite/sqlite_test.cc
@@ -196,6 +196,34 @@ class SqliteStatementTest : public ::testing::Test,
   }
 
  protected:
+  void ValidateIngestedTemporalData(struct ArrowArrayView* values,
+                                    enum ArrowTimeUnit unit,
+                                    const char* timezone) override {
+    std::vector<std::optional<std::string>> expected;
+    switch (unit) {
+      case (NANOARROW_TIME_UNIT_SECOND):
+        expected.insert(expected.end(), {std::nullopt, "1969-12-31T23:59:18",
+                                         "1970-01-01T00:00:00", 
"1970-01-01T00:00:42"});
+        break;
+      case (NANOARROW_TIME_UNIT_MILLI):
+        expected.insert(expected.end(),
+                        {std::nullopt, "1969-12-31T23:59:59.958",
+                         "1970-01-01T00:00:00.000", 
"1970-01-01T00:00:00.042"});
+        break;
+      case (NANOARROW_TIME_UNIT_MICRO):
+        expected.insert(expected.end(),
+                        {std::nullopt, "1969-12-31T23:59:59.999958",
+                         "1970-01-01T00:00:00.000000", 
"1970-01-01T00:00:00.000042"});
+        break;
+      case (NANOARROW_TIME_UNIT_NANO):
+        expected.insert(expected.end(), {std::nullopt, 
"1969-12-31T23:59:59.999999958",
+                                         "1970-01-01T00:00:00.000000000",
+                                         "1970-01-01T00:00:00.000000042"});
+        break;
+    }
+    ASSERT_NO_FATAL_FAILURE(adbc_validation::CompareArray<std::string>(values, 
expected));
+  }
+
   SqliteQuirks quirks_;
 };
 ADBCV_TEST_STATEMENT(SqliteStatementTest)
diff --git a/c/driver/sqlite/statement_reader.c 
b/c/driver/sqlite/statement_reader.c
index 10cb2f1c..b434dae9 100644
--- a/c/driver/sqlite/statement_reader.c
+++ b/c/driver/sqlite/statement_reader.c
@@ -120,6 +120,12 @@ static AdbcStatusCode ArrowTimestampToIsoString(int64_t 
value, enum ArrowTimeUni
       break;
   }
 
+  rem = value % scale;
+  if (rem < 0) {
+    value -= scale;
+    rem = scale + rem;
+  }
+
   const int64_t seconds = value / scale;
 
 #if SIZEOF_TIME_T < 8
@@ -134,11 +140,6 @@ static AdbcStatusCode ArrowTimestampToIsoString(int64_t 
value, enum ArrowTimeUni
   const time_t time = seconds;
 #endif
 
-  rem = value % scale;
-  if (rem < 0) {
-    rem = scale + rem;
-  }
-
   struct tm broken_down_time;
 
 #if defined(_WIN32)
diff --git a/c/validation/adbc_validation.cc b/c/validation/adbc_validation.cc
index 393d904e..bba51588 100644
--- a/c/validation/adbc_validation.cc
+++ b/c/validation/adbc_validation.cc
@@ -1155,13 +1155,8 @@ void StatementTest::TestSqlIngestTemporalType(const 
char* timezone) {
     ASSERT_EQ(values.size(), reader.array->length);
     ASSERT_EQ(1, reader.array->n_children);
 
-    if (round_trip_type == type) {
-      // XXX: for now we can't compare values; we would need casting
-      if (TU == NANOARROW_TIME_UNIT_MICRO) {
-        ASSERT_NO_FATAL_FAILURE(
-            CompareArray<int64_t>(reader.array_view->children[0], values));
-      }
-    }
+    ValidateIngestedTemporalData(reader.array_view->children[0], TU, timezone);
+
     ASSERT_NO_FATAL_FAILURE(reader.Next());
     ASSERT_EQ(nullptr, reader.array->release);
   }
@@ -1169,6 +1164,12 @@ void StatementTest::TestSqlIngestTemporalType(const 
char* timezone) {
   ASSERT_THAT(AdbcStatementRelease(&statement, &error), IsOkStatus(&error));
 }
 
+void StatementTest::ValidateIngestedTemporalData(struct ArrowArrayView* values,
+                                                 enum ArrowTimeUnit unit,
+                                                 const char* timezone) {
+  FAIL() << "ValidateIngestedTemporalData is not implemented in the base 
class";
+}
+
 void StatementTest::TestSqlIngestTimestamp() {
   
ASSERT_NO_FATAL_FAILURE(TestSqlIngestTemporalType<NANOARROW_TIME_UNIT_SECOND>(nullptr));
   
ASSERT_NO_FATAL_FAILURE(TestSqlIngestTemporalType<NANOARROW_TIME_UNIT_MICRO>(nullptr));
diff --git a/c/validation/adbc_validation.h b/c/validation/adbc_validation.h
index 2a5883c0..aeafa9c3 100644
--- a/c/validation/adbc_validation.h
+++ b/c/validation/adbc_validation.h
@@ -276,6 +276,10 @@ class StatementTest {
 
   template <enum ArrowTimeUnit TU>
   void TestSqlIngestTemporalType(const char* timezone);
+
+  virtual void ValidateIngestedTemporalData(struct ArrowArrayView* values,
+                                            enum ArrowTimeUnit unit,
+                                            const char* timezone);
 };
 
 #define ADBCV_TEST_STATEMENT(FIXTURE)                                          
         \

Reply via email to