You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ko...@apache.org on 2021/01/02 22:38:25 UTC

[arrow] branch master updated: ARROW-11109: [GLib] Add garrow_array_builder_append_empty_value() and values()

This is an automated email from the ASF dual-hosted git repository.

kou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new 848b173  ARROW-11109: [GLib] Add garrow_array_builder_append_empty_value() and values()
848b173 is described below

commit 848b1735aedfd201b6b7a58cd8509d94d6f8389a
Author: Sutou Kouhei <ko...@clear-code.com>
AuthorDate: Sun Jan 3 07:37:40 2021 +0900

    ARROW-11109: [GLib] Add garrow_array_builder_append_empty_value() and values()
    
    Closes #9078 from kou/glib-array-builder-empty-value
    
    Authored-by: Sutou Kouhei <ko...@clear-code.com>
    Signed-off-by: Sutou Kouhei <ko...@clear-code.com>
---
 c_glib/arrow-glib/array-builder.cpp          |  58 +++++
 c_glib/arrow-glib/array-builder.h            |  19 +-
 c_glib/test/test-array-builder.rb            | 334 +++++++++++++++++++++++++++
 c_glib/test/test-dictionary-array-builder.rb |  64 +++++
 c_glib/test/test-map-array-builder.rb        |  20 ++
 5 files changed, 483 insertions(+), 12 deletions(-)

diff --git a/c_glib/arrow-glib/array-builder.cpp b/c_glib/arrow-glib/array-builder.cpp
index d9f8d15..04b17c5 100644
--- a/c_glib/arrow-glib/array-builder.cpp
+++ b/c_glib/arrow-glib/array-builder.cpp
@@ -633,6 +633,64 @@ garrow_array_builder_append_nulls(GArrowArrayBuilder *builder,
   return garrow_error_check(error, status, context);
 }
 
+/**
+ * garrow_array_builder_append_empty_value:
+ * @builder: A #GArrowArrayBuilder.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: %TRUE on success, %FALSE if there was an error.
+ *
+ * Since: 3.0.0
+ */
+gboolean
+garrow_array_builder_append_empty_value(GArrowArrayBuilder *builder,
+                                        GError **error)
+{
+  auto arrow_builder = garrow_array_builder_get_raw(builder);
+  auto status = arrow_builder->AppendEmptyValue();
+  return garrow_error_check(error,
+                            status,
+                            "[array-builder][append-empty-value]");
+}
+
+/**
+ * garrow_array_builder_append_empty_values:
+ * @builder: A #GArrowArrayBuilder.
+ * @n: The number of null values to be appended.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Append multiple empty values at once. It's more efficient than multiple
+ * garrow_array_builder_append_empty_value() calls.
+ *
+ * Returns: %TRUE on success, %FALSE if there was an error.
+ *
+ * Since: 3.0.0
+ */
+gboolean
+garrow_array_builder_append_empty_values(GArrowArrayBuilder *builder,
+                                         gint64 n,
+                                         GError **error)
+{
+  const gchar *context = "[array-builder][append-empty-values]";
+  if (n < 0) {
+    g_set_error(error,
+                GARROW_ERROR,
+                GARROW_ERROR_INVALID,
+                "%s: the number of empty values must be 0 or larger: "
+                "<%" G_GINT64_FORMAT ">",
+                context,
+                n);
+    return FALSE;
+  }
+  if (n == 0) {
+    return TRUE;
+  }
+
+  auto arrow_builder = garrow_array_builder_get_raw(builder);
+  auto status = arrow_builder->AppendEmptyValues(n);
+  return garrow_error_check(error, status, context);
+}
+
 
 G_DEFINE_TYPE(GArrowNullArrayBuilder,
               garrow_null_array_builder,
diff --git a/c_glib/arrow-glib/array-builder.h b/c_glib/arrow-glib/array-builder.h
index f6e4830..3f6e7d7 100644
--- a/c_glib/arrow-glib/array-builder.h
+++ b/c_glib/arrow-glib/array-builder.h
@@ -70,6 +70,13 @@ GARROW_AVAILABLE_IN_3_0
 gboolean garrow_array_builder_append_nulls(GArrowArrayBuilder *builder,
                                            gint64 n,
                                            GError **error);
+GARROW_AVAILABLE_IN_3_0
+gboolean garrow_array_builder_append_empty_value(GArrowArrayBuilder *builder,
+                                                 GError **error);
+GARROW_AVAILABLE_IN_3_0
+gboolean garrow_array_builder_append_empty_values(GArrowArrayBuilder *builder,
+                                                  gint64 n,
+                                                  GError **error);
 
 #define GARROW_TYPE_NULL_ARRAY_BUILDER (garrow_null_array_builder_get_type())
 G_DECLARE_DERIVABLE_TYPE(GArrowNullArrayBuilder,
@@ -1017,12 +1024,6 @@ GARROW_AVAILABLE_IN_2_0
 gboolean
 garrow_binary_dictionary_array_builder_append_null(GArrowBinaryDictionaryArrayBuilder *builder,
                                                    GError **error);
-GARROW_DEPRECATED_IN_3_0_FOR(garrow_array_builder_append_nulls)
-GARROW_AVAILABLE_IN_2_0
-gboolean
-garrow_binary_dictionary_array_builder_append_nulls(GArrowBinaryDictionaryArrayBuilder *builder,
-                                                    gint64 n,
-                                                    GError **error);
 #endif
 GARROW_AVAILABLE_IN_2_0
 gboolean
@@ -1087,12 +1088,6 @@ GARROW_AVAILABLE_IN_2_0
 gboolean
 garrow_string_dictionary_array_builder_append_null(GArrowStringDictionaryArrayBuilder *builder,
                                                    GError **error);
-GARROW_DEPRECATED_IN_3_0_FOR(garrow_array_builder_append_nulls)
-GARROW_AVAILABLE_IN_2_0
-gboolean
-garrow_string_dictionary_array_builder_append_nulls(GArrowStringDictionaryArrayBuilder *builder,
-                                                    gint64 n,
-                                                    GError **error);
 #endif
 GARROW_AVAILABLE_IN_2_0
 gboolean
diff --git a/c_glib/test/test-array-builder.rb b/c_glib/test/test-array-builder.rb
index df78048..8cb7a93 100644
--- a/c_glib/test/test-array-builder.rb
+++ b/c_glib/test/test-array-builder.rb
@@ -144,6 +144,40 @@ module ArrayBuilderAppendNullsTests
   end
 end
 
+module ArrayBuilderAppendEmptyValueTests
+  def test_append
+    builder = create_builder
+    builder.append_empty_value
+    assert_equal(build_array([empty_value]),
+                 builder.finish)
+  end
+end
+
+module ArrayBuilderAppendEmptyValuesTests
+  def test_zero
+    builder = create_builder
+    builder.append_empty_values(0)
+    assert_equal(build_array([]),
+                 builder.finish)
+  end
+
+  def test_positive
+    builder = create_builder
+    builder.append_empty_values(3)
+    assert_equal(build_array([empty_value] * 3),
+                 builder.finish)
+  end
+
+  def test_negative
+    builder = create_builder
+    message = "[array-builder][append-empty-values]: " +
+      "the number of empty values must be 0 or larger: <-1>"
+    assert_raise(Arrow::Error::Invalid.new(message)) do
+      builder.append_empty_values(-1)
+    end
+  end
+end
+
 module ArrayBuilderValueTypeTests
   def test_value_data_type
     assert_equal(value_data_type,
@@ -249,6 +283,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [nil, nil, nil]
     end
 
+    def empty_value
+      nil
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -264,6 +302,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -304,6 +350,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [true, false, true]
     end
 
+    def empty_value
+      false
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -316,6 +366,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -346,6 +404,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1, -2, 3]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -358,6 +420,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -388,6 +458,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1, 2, 3]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -400,6 +474,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -430,6 +512,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1, -2, 3]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -442,6 +528,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -472,6 +566,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1, 2, 3]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -484,6 +582,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -514,6 +620,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1, -2, 3]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -526,6 +636,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -556,6 +674,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1, 2, 3]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -568,6 +690,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -598,6 +728,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1, -2, 3]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -610,6 +744,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -640,6 +782,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1, 2, 3]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -652,6 +798,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -682,6 +836,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1, -2, 3]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -694,6 +852,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -724,6 +890,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1, 2, 3]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -736,6 +906,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -766,6 +944,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1.1, -2.2, 3.3]
     end
 
+    def empty_value
+      0.0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -778,6 +960,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -808,6 +998,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       [1.1, -2.2, 3.3]
     end
 
+    def empty_value
+      0.0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -820,6 +1014,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -854,6 +1056,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       ]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -866,6 +1072,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -900,6 +1114,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       ]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -912,6 +1130,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -947,6 +1173,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       ]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -959,6 +1189,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -994,6 +1232,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       ]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -1006,6 +1248,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -1041,6 +1291,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       ]
     end
 
+    def empty_value
+      0
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -1053,6 +1307,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -1087,6 +1349,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       ]
     end
 
+    def empty_value
+      ""
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -1107,6 +1373,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -1141,6 +1415,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       ]
     end
 
+    def empty_value
+      ""
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -1161,6 +1439,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -1195,6 +1481,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       ]
     end
 
+    def empty_value
+      ""
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -1219,6 +1509,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -1253,6 +1551,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       ]
     end
 
+    def empty_value
+      ""
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -1277,6 +1579,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -1311,6 +1621,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       ]
     end
 
+    def empty_value
+      Arrow::Decimal128.new("0")
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -1324,6 +1638,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
@@ -1358,6 +1680,10 @@ class TestArrayBuilder < Test::Unit::TestCase
       ]
     end
 
+    def empty_value
+      Arrow::Decimal256.new("0")
+    end
+
     sub_test_case("value type") do
       include ArrayBuilderValueTypeTests
     end
@@ -1371,6 +1697,14 @@ class TestArrayBuilder < Test::Unit::TestCase
       include ArrayBuilderAppendNullsTests
     end
 
+    sub_test_case("#append_empty_value") do
+      include ArrayBuilderAppendEmptyValueTests
+    end
+
+    sub_test_case("#append_empty_values") do
+      include ArrayBuilderAppendEmptyValuesTests
+    end
+
     sub_test_case("capacity control") do
       include ArrayBuilderCapacityControlTests
     end
diff --git a/c_glib/test/test-dictionary-array-builder.rb b/c_glib/test/test-dictionary-array-builder.rb
index 2461e58..4531e44 100644
--- a/c_glib/test/test-dictionary-array-builder.rb
+++ b/c_glib/test/test-dictionary-array-builder.rb
@@ -98,6 +98,38 @@ class TestDictinaryArrayBuilder < Test::Unit::TestCase
         assert_equal(expected_array, @builder.finish)
       end
 
+      test("append_nulls") do
+        dictionary_array = build_binary_array([])
+        indices_array = build_int8_array([nil, nil, nil])
+        data_type = Arrow::DictionaryDataType.new(indices_array.value_data_type,
+                                                  dictionary_array.value_data_type,
+                                                  false)
+        expected_array = Arrow::DictionaryArray.new(data_type,
+                                                    indices_array,
+                                                    dictionary_array)
+        builder = Arrow::BinaryDictionaryArrayBuilder.new
+        builder.append_nulls(3)
+        assert_equal(expected_array,
+                     builder.finish)
+      end
+
+      test("append_empty_values") do
+        dictionary_array = build_binary_array(["hello"])
+        indices_array = build_int8_array([0, 0, 0, 0])
+        data_type = Arrow::DictionaryDataType.new(indices_array.value_data_type,
+                                                  dictionary_array.value_data_type,
+                                                  false)
+        expected_array = Arrow::DictionaryArray.new(data_type,
+                                                    indices_array,
+                                                    dictionary_array)
+        builder = Arrow::BinaryDictionaryArrayBuilder.new
+        builder.append_value("hello")
+        builder.append_empty_value
+        builder.append_empty_values(2)
+        assert_equal(expected_array,
+                     builder.finish)
+      end
+
       test("dictionary_length") do
         assert_equal(@dictionary.length, @builder.dictionary_length)
       end
@@ -244,6 +276,38 @@ class TestDictinaryArrayBuilder < Test::Unit::TestCase
         assert_equal(expected_array, @builder.finish)
       end
 
+      test("append_nulls") do
+        dictionary_array = build_string_array([])
+        indices_array = build_int8_array([nil, nil, nil])
+        data_type = Arrow::DictionaryDataType.new(indices_array.value_data_type,
+                                                  dictionary_array.value_data_type,
+                                                  false)
+        expected_array = Arrow::DictionaryArray.new(data_type,
+                                                    indices_array,
+                                                    dictionary_array)
+        builder = Arrow::StringDictionaryArrayBuilder.new
+        builder.append_nulls(3)
+        assert_equal(expected_array,
+                     builder.finish)
+      end
+
+      test("append_empty_values") do
+        dictionary_array = build_string_array(["hello"])
+        indices_array = build_int8_array([0, 0, 0, 0])
+        data_type = Arrow::DictionaryDataType.new(indices_array.value_data_type,
+                                                  dictionary_array.value_data_type,
+                                                  false)
+        expected_array = Arrow::DictionaryArray.new(data_type,
+                                                    indices_array,
+                                                    dictionary_array)
+        builder = Arrow::StringDictionaryArrayBuilder.new
+        builder.append_string("hello")
+        builder.append_empty_value
+        builder.append_empty_values(2)
+        assert_equal(expected_array,
+                     builder.finish)
+      end
+
       test("dictionary_length") do
         assert_equal(@dictionary.length, @builder.dictionary_length)
       end
diff --git a/c_glib/test/test-map-array-builder.rb b/c_glib/test/test-map-array-builder.rb
index 539694b..ce5023a 100644
--- a/c_glib/test/test-map-array-builder.rb
+++ b/c_glib/test/test-map-array-builder.rb
@@ -120,4 +120,24 @@ class TestMapArrayBuilder < Test::Unit::TestCase
     array = @builder.finish
     assert_equal(2, array.n_nulls)
   end
+
+  def test_append_empty_value
+    offsets = build_int32_array([0, 0])
+    keys = build_string_array([])
+    items = build_int16_array([])
+    expected_array = Arrow::MapArray.new(offsets, keys, items)
+    @builder.append_empty_value
+    assert_equal(expected_array,
+                 @builder.finish)
+  end
+
+  def test_append_empty_values
+    offsets = build_int32_array([0, 0, 0, 0])
+    keys = build_string_array([])
+    items = build_int16_array([])
+    expected_array = Arrow::MapArray.new(offsets, keys, items)
+    @builder.append_empty_values(3)
+    assert_equal(expected_array,
+                 @builder.finish)
+  end
 end