lidavidm commented on code in PR #1288:
URL: https://github.com/apache/arrow-adbc/pull/1288#discussion_r1440453792
##########
c/driver/postgresql/postgresql_test.cc:
##########
@@ -1627,3 +1631,237 @@ INSTANTIATE_TEST_SUITE_P(TimeTypes, PostgresTypeTest,
testing::ValuesIn(kTimeTyp
INSTANTIATE_TEST_SUITE_P(TimestampTypes, PostgresTypeTest,
testing::ValuesIn(kTimestampTypeCases),
TypeTestCase::FormatName);
+
+struct DecimalTestCase {
+ const enum ArrowType type;
+ const int32_t precision;
+ const int32_t scale;
+ const std::vector<std::array<uint64_t, 4>> data;
+ const std::vector<std::optional<std::string>> expected;
+};
+
+class PostgresDecimalTest : public ::testing::TestWithParam<DecimalTestCase> {
+public:
+ void SetUp() override {
+ ASSERT_THAT(AdbcDatabaseNew(&database_, &error_), IsOkStatus(&error_));
+ ASSERT_THAT(quirks_.SetupDatabase(&database_, &error_),
IsOkStatus(&error_));
+ ASSERT_THAT(AdbcDatabaseInit(&database_, &error_), IsOkStatus(&error_));
+
+ ASSERT_THAT(AdbcConnectionNew(&connection_, &error_), IsOkStatus(&error_));
+ ASSERT_THAT(AdbcConnectionInit(&connection_, &database_, &error_),
+ IsOkStatus(&error_));
+
+ ASSERT_THAT(AdbcStatementNew(&connection_, &statement_, &error_),
+ IsOkStatus(&error_));
+
+ ASSERT_THAT(quirks_.DropTable(&connection_, "bulk_ingest", &error_),
+ IsOkStatus(&error_));
+ }
+
+ void TearDown() override {
+ if (statement_.private_data) {
+ ASSERT_THAT(AdbcStatementRelease(&statement_, &error_),
IsOkStatus(&error_));
+ }
+ if (connection_.private_data) {
+ ASSERT_THAT(AdbcConnectionRelease(&connection_, &error_),
IsOkStatus(&error_));
+ }
+ if (database_.private_data) {
+ ASSERT_THAT(AdbcDatabaseRelease(&database_, &error_),
IsOkStatus(&error_));
+ }
+
+ if (error_.release) error_.release(&error_);
+ }
+
+protected:
+ PostgresQuirks quirks_;
+ struct AdbcError error_ = {};
+ struct AdbcDatabase database_ = {};
+ struct AdbcConnection connection_ = {};
+ struct AdbcStatement statement_ = {};
+};
+
+TEST_P(PostgresDecimalTest, SelectValue) {
+ adbc_validation::Handle<struct ArrowSchema> schema;
+ adbc_validation::Handle<struct ArrowArray> array;
+ struct ArrowError na_error;
+
+ const enum ArrowType type = GetParam().type;
+ const int32_t precision = GetParam().precision;
+ const int32_t scale = GetParam().scale;
+ const auto data = GetParam().data;
+ const auto expected = GetParam().expected;
+ const size_t nrecords = expected.size();
+
+ int32_t bitwidth;
+ switch (type) {
+ case NANOARROW_TYPE_DECIMAL128:
+ bitwidth = 128;
+ break;
+ case NANOARROW_TYPE_DECIMAL256:
+ bitwidth = 256;
+ break;
+ default:
+ FAIL();
+ }
+
+ // this is a bit of a hack to make std::vector play nicely with
+ // a dynamic number of stack-allocated ArrowDecimal objects
+ constexpr size_t max_decimals = 10;
+ struct ArrowDecimal decimals[max_decimals];
+ if (nrecords > max_decimals) {
+ FAIL() <<
+ " max_decimals exceeded for test case - please change parametrization";
+ }
+
+ std::vector<std::optional<ArrowDecimal*>> values;
Review Comment:
Thanks. I need to think through things more but probably we will end up with
something that looks more like Arrow C++. And I'd like to take a look at driver
implementations and see if we can factor out a nanoarrow++ of sorts.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]