@@ -1182,6 +1182,86 @@ TEST(ArrayTest, ArrayTestAppendToIntervalArrayMonthDayNano) {
1182
1182
EXPECT_TRUE (arrow_array.ValueUnsafe ()->Equals (expected_array.ValueUnsafe ()));
1183
1183
}
1184
1184
1185
+ TEST (ArrayTest, ArrayTestAppendToDecimal32Array) {
1186
+ struct ArrowArray array;
1187
+ struct ArrowDecimal decimal;
1188
+
1189
+ ArrowDecimalInit (&decimal, 32 , 8 , 3 );
1190
+ ASSERT_EQ (ArrowArrayInitFromType (&array, NANOARROW_TYPE_DECIMAL32), NANOARROW_OK);
1191
+ EXPECT_EQ (ArrowArrayStartAppending (&array), NANOARROW_OK);
1192
+
1193
+ ArrowDecimalSetInt (&decimal, 12345 );
1194
+ EXPECT_EQ (ArrowArrayAppendDecimal (&array, &decimal), NANOARROW_OK);
1195
+
1196
+ EXPECT_EQ (ArrowArrayAppendNull (&array, 2 ), NANOARROW_OK);
1197
+
1198
+ ArrowDecimalSetInt (&decimal, -67890 );
1199
+ EXPECT_EQ (ArrowArrayAppendDecimal (&array, &decimal), NANOARROW_OK);
1200
+
1201
+ EXPECT_EQ (ArrowArrayFinishBuildingDefault (&array, nullptr ), NANOARROW_OK);
1202
+ EXPECT_EQ (array.length , 4 );
1203
+ EXPECT_EQ (array.null_count , 2 );
1204
+ auto validity_buffer = reinterpret_cast <const uint8_t *>(array.buffers [0 ]);
1205
+ auto data_buffer = reinterpret_cast <const uint8_t *>(array.buffers [1 ]);
1206
+ EXPECT_EQ (validity_buffer[0 ], 0b00001001 );
1207
+
1208
+ ArrowDecimalSetInt (&decimal, 12345 );
1209
+ EXPECT_EQ (memcmp (data_buffer, decimal.words , 4 ), 0 );
1210
+ ArrowDecimalSetInt (&decimal, -67890 );
1211
+ EXPECT_EQ (memcmp (data_buffer + 3 * 4 , decimal.words , 4 ), 0 );
1212
+
1213
+ auto arrow_array = ImportArray (&array, decimal32 (8 , 3 ));
1214
+ ARROW_EXPECT_OK (arrow_array);
1215
+
1216
+ auto builder = Decimal32Builder (decimal32 (8 , 3 ));
1217
+ ARROW_EXPECT_OK (builder.Append (*Decimal32::FromString (" 12.345" )));
1218
+ ARROW_EXPECT_OK (builder.AppendNulls (2 ));
1219
+ ARROW_EXPECT_OK (builder.Append (*Decimal32::FromString (" -67.890" )));
1220
+ auto expected_array = builder.Finish ();
1221
+
1222
+ EXPECT_TRUE (arrow_array.ValueUnsafe ()->Equals (expected_array.ValueUnsafe ()));
1223
+ }
1224
+
1225
+ TEST (ArrayTest, ArrayTestAppendToDecimal64Array) {
1226
+ struct ArrowArray array;
1227
+ struct ArrowDecimal decimal;
1228
+
1229
+ ArrowDecimalInit (&decimal, 64 , 10 , 3 );
1230
+ ASSERT_EQ (ArrowArrayInitFromType (&array, NANOARROW_TYPE_DECIMAL64), NANOARROW_OK);
1231
+ EXPECT_EQ (ArrowArrayStartAppending (&array), NANOARROW_OK);
1232
+
1233
+ ArrowDecimalSetInt (&decimal, 12345 );
1234
+ EXPECT_EQ (ArrowArrayAppendDecimal (&array, &decimal), NANOARROW_OK);
1235
+
1236
+ EXPECT_EQ (ArrowArrayAppendNull (&array, 2 ), NANOARROW_OK);
1237
+
1238
+ ArrowDecimalSetInt (&decimal, -67890 );
1239
+ EXPECT_EQ (ArrowArrayAppendDecimal (&array, &decimal), NANOARROW_OK);
1240
+
1241
+ EXPECT_EQ (ArrowArrayFinishBuildingDefault (&array, nullptr ), NANOARROW_OK);
1242
+ EXPECT_EQ (array.length , 4 );
1243
+ EXPECT_EQ (array.null_count , 2 );
1244
+ auto validity_buffer = reinterpret_cast <const uint8_t *>(array.buffers [0 ]);
1245
+ auto data_buffer = reinterpret_cast <const uint8_t *>(array.buffers [1 ]);
1246
+ EXPECT_EQ (validity_buffer[0 ], 0b00001001 );
1247
+
1248
+ ArrowDecimalSetInt (&decimal, 12345 );
1249
+ EXPECT_EQ (memcmp (data_buffer, decimal.words , 8 ), 0 );
1250
+ ArrowDecimalSetInt (&decimal, -67890 );
1251
+ EXPECT_EQ (memcmp (data_buffer + 3 * 8 , decimal.words , 8 ), 0 );
1252
+
1253
+ auto arrow_array = ImportArray (&array, decimal64 (10 , 3 ));
1254
+ ARROW_EXPECT_OK (arrow_array);
1255
+
1256
+ auto builder = Decimal64Builder (decimal64 (10 , 3 ));
1257
+ ARROW_EXPECT_OK (builder.Append (*Decimal64::FromString (" 12.345" )));
1258
+ ARROW_EXPECT_OK (builder.AppendNulls (2 ));
1259
+ ARROW_EXPECT_OK (builder.Append (*Decimal64::FromString (" -67.890" )));
1260
+ auto expected_array = builder.Finish ();
1261
+
1262
+ EXPECT_TRUE (arrow_array.ValueUnsafe ()->Equals (expected_array.ValueUnsafe ()));
1263
+ }
1264
+
1185
1265
TEST (ArrayTest, ArrayTestAppendToDecimal128Array) {
1186
1266
struct ArrowArray array;
1187
1267
struct ArrowDecimal decimal;
@@ -3707,6 +3787,80 @@ TEST(ArrayViewTest, ArrayViewTestGetIntervalMonthDayNano) {
3707
3787
ArrowArrayRelease (&array);
3708
3788
}
3709
3789
3790
+ TEST (ArrayViewTest, ArrayViewTestGetDecimal32) {
3791
+ struct ArrowArray array;
3792
+ struct ArrowSchema schema;
3793
+ struct ArrowArrayView array_view;
3794
+ struct ArrowError error;
3795
+
3796
+ auto type = decimal32 (8 , 3 );
3797
+
3798
+ // Array with nulls
3799
+ auto builder = Decimal32Builder (type);
3800
+ ARROW_EXPECT_OK (builder.Append (*Decimal32::FromReal (1.234 , 8 , 3 )));
3801
+ ARROW_EXPECT_OK (builder.AppendNulls (2 ));
3802
+ ARROW_EXPECT_OK (builder.Append (*Decimal32::FromReal (-5.678 , 8 , 3 )));
3803
+ auto maybe_arrow_array = builder.Finish ();
3804
+ ARROW_EXPECT_OK (maybe_arrow_array);
3805
+ auto arrow_array = maybe_arrow_array.ValueUnsafe ();
3806
+
3807
+ ARROW_EXPECT_OK (ExportArray (*arrow_array, &array, &schema));
3808
+ ASSERT_EQ (ArrowArrayViewInitFromSchema (&array_view, &schema, &error), NANOARROW_OK);
3809
+ ASSERT_EQ (ArrowArrayViewSetArray (&array_view, &array, &error), NANOARROW_OK);
3810
+ EXPECT_EQ (ArrowArrayViewValidate (&array_view, NANOARROW_VALIDATION_LEVEL_FULL, &error),
3811
+ NANOARROW_OK);
3812
+
3813
+ ArrowDecimal decimal;
3814
+ ArrowDecimalInit (&decimal, 32 , 8 , 3 );
3815
+
3816
+ ArrowArrayViewGetDecimalUnsafe (&array_view, 0 , &decimal);
3817
+ EXPECT_EQ (ArrowDecimalGetIntUnsafe (&decimal), 1234 );
3818
+
3819
+ ArrowArrayViewGetDecimalUnsafe (&array_view, 3 , &decimal);
3820
+ EXPECT_EQ (ArrowDecimalGetIntUnsafe (&decimal), -5678 );
3821
+
3822
+ ArrowArrayViewReset (&array_view);
3823
+ ArrowSchemaRelease (&schema);
3824
+ ArrowArrayRelease (&array);
3825
+ }
3826
+
3827
+ TEST (ArrayViewTest, ArrayViewTestGetDecimal64) {
3828
+ struct ArrowArray array;
3829
+ struct ArrowSchema schema;
3830
+ struct ArrowArrayView array_view;
3831
+ struct ArrowError error;
3832
+
3833
+ auto type = decimal64 (10 , 3 );
3834
+
3835
+ // Array with nulls
3836
+ auto builder = Decimal64Builder (type);
3837
+ ARROW_EXPECT_OK (builder.Append (*Decimal64::FromReal (1.234 , 10 , 3 )));
3838
+ ARROW_EXPECT_OK (builder.AppendNulls (2 ));
3839
+ ARROW_EXPECT_OK (builder.Append (*Decimal64::FromReal (-5.678 , 10 , 3 )));
3840
+ auto maybe_arrow_array = builder.Finish ();
3841
+ ARROW_EXPECT_OK (maybe_arrow_array);
3842
+ auto arrow_array = maybe_arrow_array.ValueUnsafe ();
3843
+
3844
+ ARROW_EXPECT_OK (ExportArray (*arrow_array, &array, &schema));
3845
+ ASSERT_EQ (ArrowArrayViewInitFromSchema (&array_view, &schema, &error), NANOARROW_OK);
3846
+ ASSERT_EQ (ArrowArrayViewSetArray (&array_view, &array, &error), NANOARROW_OK);
3847
+ EXPECT_EQ (ArrowArrayViewValidate (&array_view, NANOARROW_VALIDATION_LEVEL_FULL, &error),
3848
+ NANOARROW_OK);
3849
+
3850
+ ArrowDecimal decimal;
3851
+ ArrowDecimalInit (&decimal, 64 , 10 , 3 );
3852
+
3853
+ ArrowArrayViewGetDecimalUnsafe (&array_view, 0 , &decimal);
3854
+ EXPECT_EQ (ArrowDecimalGetIntUnsafe (&decimal), 1234 );
3855
+
3856
+ ArrowArrayViewGetDecimalUnsafe (&array_view, 3 , &decimal);
3857
+ EXPECT_EQ (ArrowDecimalGetIntUnsafe (&decimal), -5678 );
3858
+
3859
+ ArrowArrayViewReset (&array_view);
3860
+ ArrowSchemaRelease (&schema);
3861
+ ArrowArrayRelease (&array);
3862
+ }
3863
+
3710
3864
TEST (ArrayViewTest, ArrayViewTestGetDecimal128) {
3711
3865
struct ArrowArray array;
3712
3866
struct ArrowSchema schema;
0 commit comments