@@ -1245,6 +1245,94 @@ TEST(ArrayTest, ArrayTestAppendToIntervalArrayMonthDayNano) {
1245
1245
#endif
1246
1246
}
1247
1247
1248
+ TEST (ArrayTest, ArrayTestAppendToDecimal32Array) {
1249
+ struct ArrowArray array;
1250
+ struct ArrowDecimal decimal;
1251
+
1252
+ ArrowDecimalInit (&decimal, 32 , 8 , 3 );
1253
+ ASSERT_EQ (ArrowArrayInitFromType (&array, NANOARROW_TYPE_DECIMAL32), NANOARROW_OK);
1254
+ EXPECT_EQ (ArrowArrayStartAppending (&array), NANOARROW_OK);
1255
+
1256
+ ArrowDecimalSetInt (&decimal, 12345 );
1257
+ EXPECT_EQ (ArrowArrayAppendDecimal (&array, &decimal), NANOARROW_OK);
1258
+
1259
+ EXPECT_EQ (ArrowArrayAppendNull (&array, 2 ), NANOARROW_OK);
1260
+
1261
+ ArrowDecimalSetInt (&decimal, -67890 );
1262
+ EXPECT_EQ (ArrowArrayAppendDecimal (&array, &decimal), NANOARROW_OK);
1263
+
1264
+ EXPECT_EQ (ArrowArrayFinishBuildingDefault (&array, nullptr ), NANOARROW_OK);
1265
+ EXPECT_EQ (array.length , 4 );
1266
+ EXPECT_EQ (array.null_count , 2 );
1267
+ auto validity_buffer = reinterpret_cast <const uint8_t *>(array.buffers [0 ]);
1268
+ auto data_buffer = reinterpret_cast <const uint8_t *>(array.buffers [1 ]);
1269
+ EXPECT_EQ (validity_buffer[0 ], 0b00001001 );
1270
+
1271
+ ArrowDecimalSetInt (&decimal, 12345 );
1272
+ EXPECT_EQ (memcmp (data_buffer, decimal.words , 4 ), 0 );
1273
+ ArrowDecimalSetInt (&decimal, -67890 );
1274
+ EXPECT_EQ (memcmp (data_buffer + 3 * 4 , decimal.words , 4 ), 0 );
1275
+
1276
+ #if defined(NANOARROW_BUILD_TESTS_WITH_ARROW) && ARROW_VERSION_MAJOR >= 18
1277
+ auto arrow_array = ImportArray (&array, decimal32 (8 , 3 ));
1278
+ ARROW_EXPECT_OK (arrow_array);
1279
+
1280
+ auto builder = Decimal32Builder (decimal32 (8 , 3 ));
1281
+ ARROW_EXPECT_OK (builder.Append (*Decimal32::FromString (" 12.345" )));
1282
+ ARROW_EXPECT_OK (builder.AppendNulls (2 ));
1283
+ ARROW_EXPECT_OK (builder.Append (*Decimal32::FromString (" -67.890" )));
1284
+ auto expected_array = builder.Finish ();
1285
+
1286
+ EXPECT_TRUE (arrow_array.ValueUnsafe ()->Equals (expected_array.ValueUnsafe ()));
1287
+ #else
1288
+ ArrowArrayRelease (&array);
1289
+ #endif
1290
+ }
1291
+
1292
+ TEST (ArrayTest, ArrayTestAppendToDecimal64Array) {
1293
+ struct ArrowArray array;
1294
+ struct ArrowDecimal decimal;
1295
+
1296
+ ArrowDecimalInit (&decimal, 64 , 10 , 3 );
1297
+ ASSERT_EQ (ArrowArrayInitFromType (&array, NANOARROW_TYPE_DECIMAL64), NANOARROW_OK);
1298
+ EXPECT_EQ (ArrowArrayStartAppending (&array), NANOARROW_OK);
1299
+
1300
+ ArrowDecimalSetInt (&decimal, 12345 );
1301
+ EXPECT_EQ (ArrowArrayAppendDecimal (&array, &decimal), NANOARROW_OK);
1302
+
1303
+ EXPECT_EQ (ArrowArrayAppendNull (&array, 2 ), NANOARROW_OK);
1304
+
1305
+ ArrowDecimalSetInt (&decimal, -67890 );
1306
+ EXPECT_EQ (ArrowArrayAppendDecimal (&array, &decimal), NANOARROW_OK);
1307
+
1308
+ EXPECT_EQ (ArrowArrayFinishBuildingDefault (&array, nullptr ), NANOARROW_OK);
1309
+ EXPECT_EQ (array.length , 4 );
1310
+ EXPECT_EQ (array.null_count , 2 );
1311
+ auto validity_buffer = reinterpret_cast <const uint8_t *>(array.buffers [0 ]);
1312
+ auto data_buffer = reinterpret_cast <const uint8_t *>(array.buffers [1 ]);
1313
+ EXPECT_EQ (validity_buffer[0 ], 0b00001001 );
1314
+
1315
+ ArrowDecimalSetInt (&decimal, 12345 );
1316
+ EXPECT_EQ (memcmp (data_buffer, decimal.words , 8 ), 0 );
1317
+ ArrowDecimalSetInt (&decimal, -67890 );
1318
+ EXPECT_EQ (memcmp (data_buffer + 3 * 8 , decimal.words , 8 ), 0 );
1319
+
1320
+ #if defined(NANOARROW_BUILD_TESTS_WITH_ARROW) && ARROW_VERSION_MAJOR >= 18
1321
+ auto arrow_array = ImportArray (&array, decimal64 (10 , 3 ));
1322
+ ARROW_EXPECT_OK (arrow_array);
1323
+
1324
+ auto builder = Decimal64Builder (decimal64 (10 , 3 ));
1325
+ ARROW_EXPECT_OK (builder.Append (*Decimal64::FromString (" 12.345" )));
1326
+ ARROW_EXPECT_OK (builder.AppendNulls (2 ));
1327
+ ARROW_EXPECT_OK (builder.Append (*Decimal64::FromString (" -67.890" )));
1328
+ auto expected_array = builder.Finish ();
1329
+
1330
+ EXPECT_TRUE (arrow_array.ValueUnsafe ()->Equals (expected_array.ValueUnsafe ()));
1331
+ #else
1332
+ ArrowArrayRelease (&array);
1333
+ #endif
1334
+ }
1335
+
1248
1336
TEST (ArrayTest, ArrayTestAppendToDecimal128Array) {
1249
1337
struct ArrowArray array;
1250
1338
struct ArrowDecimal decimal;
@@ -3821,6 +3909,82 @@ TEST(ArrayViewTest, ArrayViewTestGetIntervalMonthDayNano) {
3821
3909
ArrowArrayRelease (&array);
3822
3910
}
3823
3911
3912
+ #if ARROW_VERSION_MAJOR >= 18
3913
+ TEST (ArrayViewTest, ArrayViewTestGetDecimal32) {
3914
+ struct ArrowArray array;
3915
+ struct ArrowSchema schema;
3916
+ struct ArrowArrayView array_view;
3917
+ struct ArrowError error;
3918
+
3919
+ auto type = decimal32 (8 , 3 );
3920
+
3921
+ // Array with nulls
3922
+ auto builder = Decimal32Builder (type);
3923
+ ARROW_EXPECT_OK (builder.Append (*Decimal32::FromReal (1.234 , 8 , 3 )));
3924
+ ARROW_EXPECT_OK (builder.AppendNulls (2 ));
3925
+ ARROW_EXPECT_OK (builder.Append (*Decimal32::FromReal (-5.678 , 8 , 3 )));
3926
+ auto maybe_arrow_array = builder.Finish ();
3927
+ ARROW_EXPECT_OK (maybe_arrow_array);
3928
+ auto arrow_array = maybe_arrow_array.ValueUnsafe ();
3929
+
3930
+ ARROW_EXPECT_OK (ExportArray (*arrow_array, &array, &schema));
3931
+ ASSERT_EQ (ArrowArrayViewInitFromSchema (&array_view, &schema, &error), NANOARROW_OK);
3932
+ ASSERT_EQ (ArrowArrayViewSetArray (&array_view, &array, &error), NANOARROW_OK);
3933
+ EXPECT_EQ (ArrowArrayViewValidate (&array_view, NANOARROW_VALIDATION_LEVEL_FULL, &error),
3934
+ NANOARROW_OK);
3935
+
3936
+ ArrowDecimal decimal;
3937
+ ArrowDecimalInit (&decimal, 32 , 8 , 3 );
3938
+
3939
+ ArrowArrayViewGetDecimalUnsafe (&array_view, 0 , &decimal);
3940
+ EXPECT_EQ (ArrowDecimalGetIntUnsafe (&decimal), 1234 );
3941
+
3942
+ ArrowArrayViewGetDecimalUnsafe (&array_view, 3 , &decimal);
3943
+ EXPECT_EQ (ArrowDecimalGetIntUnsafe (&decimal), -5678 );
3944
+
3945
+ ArrowArrayViewReset (&array_view);
3946
+ ArrowSchemaRelease (&schema);
3947
+ ArrowArrayRelease (&array);
3948
+ }
3949
+
3950
+ TEST (ArrayViewTest, ArrayViewTestGetDecimal64) {
3951
+ struct ArrowArray array;
3952
+ struct ArrowSchema schema;
3953
+ struct ArrowArrayView array_view;
3954
+ struct ArrowError error;
3955
+
3956
+ auto type = decimal64 (10 , 3 );
3957
+
3958
+ // Array with nulls
3959
+ auto builder = Decimal64Builder (type);
3960
+ ARROW_EXPECT_OK (builder.Append (*Decimal64::FromReal (1.234 , 10 , 3 )));
3961
+ ARROW_EXPECT_OK (builder.AppendNulls (2 ));
3962
+ ARROW_EXPECT_OK (builder.Append (*Decimal64::FromReal (-5.678 , 10 , 3 )));
3963
+ auto maybe_arrow_array = builder.Finish ();
3964
+ ARROW_EXPECT_OK (maybe_arrow_array);
3965
+ auto arrow_array = maybe_arrow_array.ValueUnsafe ();
3966
+
3967
+ ARROW_EXPECT_OK (ExportArray (*arrow_array, &array, &schema));
3968
+ ASSERT_EQ (ArrowArrayViewInitFromSchema (&array_view, &schema, &error), NANOARROW_OK);
3969
+ ASSERT_EQ (ArrowArrayViewSetArray (&array_view, &array, &error), NANOARROW_OK);
3970
+ EXPECT_EQ (ArrowArrayViewValidate (&array_view, NANOARROW_VALIDATION_LEVEL_FULL, &error),
3971
+ NANOARROW_OK);
3972
+
3973
+ ArrowDecimal decimal;
3974
+ ArrowDecimalInit (&decimal, 64 , 10 , 3 );
3975
+
3976
+ ArrowArrayViewGetDecimalUnsafe (&array_view, 0 , &decimal);
3977
+ EXPECT_EQ (ArrowDecimalGetIntUnsafe (&decimal), 1234 );
3978
+
3979
+ ArrowArrayViewGetDecimalUnsafe (&array_view, 3 , &decimal);
3980
+ EXPECT_EQ (ArrowDecimalGetIntUnsafe (&decimal), -5678 );
3981
+
3982
+ ArrowArrayViewReset (&array_view);
3983
+ ArrowSchemaRelease (&schema);
3984
+ ArrowArrayRelease (&array);
3985
+ }
3986
+ #endif
3987
+
3824
3988
TEST (ArrayViewTest, ArrayViewTestGetDecimal128) {
3825
3989
struct ArrowArray array;
3826
3990
struct ArrowSchema schema;
0 commit comments