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)
\