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)