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 888cc5f  fix(ruby): Free an imported reader in Statement#execute 
explicitly (#665)
888cc5f is described below

commit 888cc5fcc826f8a37f06122b91aacd87a9d87ac1
Author: Sutou Kouhei <[email protected]>
AuthorDate: Tue May 9 03:18:37 2023 +0900

    fix(ruby): Free an imported reader in Statement#execute explicitly (#665)
    
    Fixes #664.
    
    The reader is invalid outside of the method. We must free the reader
    explicitly here to avoid a SEGV.
---
 ruby/lib/adbc/connection.rb | 18 +++++++++++-------
 ruby/lib/adbc/statement.rb  | 12 ++++++++----
 2 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/ruby/lib/adbc/connection.rb b/ruby/lib/adbc/connection.rb
index 739f611..186c5da 100644
--- a/ruby/lib/adbc/connection.rb
+++ b/ruby/lib/adbc/connection.rb
@@ -42,14 +42,18 @@ module ADBC
       c_abi_array_stream = get_info(codes)
       begin
         reader = Arrow::RecordBatchReader.import(c_abi_array_stream)
-        table = reader.read_all
-        values = {}
-        table.raw_records.each do |code, value|
-          value = value.values[0] if value.is_a?(Hash)
-          code = ADBC::Info.try_convert(code)
-          values[code.nick.gsub("-", "_").to_sym] = value
+        begin
+          table = reader.read_all
+          values = {}
+          table.raw_records.each do |code, value|
+            value = value.values[0] if value.is_a?(Hash)
+            code = ADBC::Info.try_convert(code)
+            values[code.nick.gsub("-", "_").to_sym] = value
+          end
+          values
+        ensure
+          reader.unref
         end
-        values
       ensure
         GLib.free(c_abi_array_stream)
       end
diff --git a/ruby/lib/adbc/statement.rb b/ruby/lib/adbc/statement.rb
index 383267e..d89ea0d 100644
--- a/ruby/lib/adbc/statement.rb
+++ b/ruby/lib/adbc/statement.rb
@@ -38,10 +38,14 @@ module ADBC
       if need_result
         begin
           reader = Arrow::RecordBatchReader.import(c_abi_array_stream)
-          if block_given?
-            yield(reader, n_rows_affected)
-          else
-            [reader.read_all, n_rows_affected]
+          begin
+            if block_given?
+              yield(reader, n_rows_affected)
+            else
+              [reader.read_all, n_rows_affected]
+            end
+          ensure
+            reader.unref
           end
         ensure
           GLib.free(c_abi_array_stream)

Reply via email to