duckdb 0.5.1.1 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5490148631798723186b5440e514abb7e4969b3364777cc3f065a0d1b0aba08e
4
- data.tar.gz: 18c3c6ec97ba3f72ce1dc9251c084ea56ad889734d759b0e73caee93a86a7390
3
+ metadata.gz: 9967f34d6c3a9f9d30fc9c406043230d86ffe98d0ca5cf55e74a547f6877b756
4
+ data.tar.gz: e28bce3d7b8410ceff6da630aaa54eab4d345bfab16748f9150dfef6e3836bfe
5
5
  SHA512:
6
- metadata.gz: 457636af582f3850bd46d145f59783df209c7a7c170ce4f721f4999df4e43d6e580f39f43a92836b179d230afeae05e2e73ca3bcbee8b709680bb6c7b2ffc2f0
7
- data.tar.gz: e62d2629728f47909118eaad24bd78032f4baa09f541464f5605c9309fb1cd71eb7a24ea8ca9ebb78a56d0081d9d2586b1a02ee4dcf50ba8b5ed3ca2eb92a2ad
6
+ metadata.gz: 834d11017be58ad60d8f8d8600e22f7e97dbac4ef2789921d2da8f76487e7df3c60a7458ece7e7d5f3fb7d1aca3bcf178557968131673055c2bf2d932bc982d6
7
+ data.tar.gz: f63d824d611095b857310f6f2f1c432d0129be7bbc3d03cb339baf938bd00c43e7911689b988494e4613f4199abf72a1b08c022d7adac26cc29f2e13ecd49883
@@ -15,11 +15,11 @@ jobs:
15
15
  runs-on: macos-latest
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['2.6.10', '2.7.6', '3.0.4', '3.1.2', '3.2.0-preview2', 'head']
19
- duckdb: ['0.5.1', '0.5.0']
18
+ ruby: ['2.6.10', '2.7.7', '3.0.5', '3.1.3', '3.2.0', 'head']
19
+ duckdb: ['0.5.1', '0.6.1']
20
20
 
21
21
  steps:
22
- - uses: actions/checkout@v2
22
+ - uses: actions/checkout@v3
23
23
 
24
24
  - name: Set up Ruby
25
25
  uses: ruby/setup-ruby@v1
@@ -28,7 +28,7 @@ jobs:
28
28
 
29
29
  - name: duckdb cache
30
30
  id: duckdb-cache
31
- uses: actions/cache@v2
31
+ uses: actions/cache@v3
32
32
  with:
33
33
  path: duckdb-v${{ matrix.duckdb }}
34
34
  key: ${{ runner.os }}-duckdb-v${{ matrix.duckdb }}
@@ -15,11 +15,11 @@ jobs:
15
15
  runs-on: ubuntu-latest
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['2.6.10', '2.7.6', '3.0.4', '3.1.2', '3.2.0-preview2', 'head']
19
- duckdb: ['0.5.1', '0.5.0']
18
+ ruby: ['2.6.10', '2.7.7', '3.0.5', '3.1.3', '3.2.0', 'head']
19
+ duckdb: ['0.5.1', '0.6.1']
20
20
 
21
21
  steps:
22
- - uses: actions/checkout@v2
22
+ - uses: actions/checkout@v3
23
23
 
24
24
  - name: Set up Ruby
25
25
  uses: ruby/setup-ruby@v1
@@ -28,7 +28,7 @@ jobs:
28
28
 
29
29
  - name: duckdb cache
30
30
  id: duckdb-cache
31
- uses: actions/cache@v2
31
+ uses: actions/cache@v3
32
32
  with:
33
33
  path: duckdb-v${{ matrix.duckdb }}
34
34
  key: ${{ runner.os }}-duckdb-v${{ matrix.duckdb }}
@@ -16,10 +16,10 @@ jobs:
16
16
  strategy:
17
17
  matrix:
18
18
  ruby: ['2.6.10', '2.7.6', '3.0.4', '3.1.2', 'ucrt', 'mingw', 'head']
19
- duckdb: ['0.5.1', '0.5.0']
19
+ duckdb: ['0.5.1', '0.6.1']
20
20
 
21
21
  steps:
22
- - uses: actions/checkout@v2
22
+ - uses: actions/checkout@v3
23
23
 
24
24
  - name: Set up Ruby
25
25
  uses: ruby/setup-ruby@v1
data/CHANGELOG.md CHANGED
@@ -1,16 +1,30 @@
1
1
  # ChangeLog
2
2
 
3
+ # 0.6.1
4
+ - bump Ruby to 3.2.0 on CI
5
+ - fix deprected warning (double_heap is deprecated in GC.verify_compaction_references) with Ruby 3.2.0 on CI
6
+ - bump duckdb to 0.6.1 on CI
7
+ - add DuckDB::PreparedStatement#bind_hugeint_internal
8
+ - fix gem install error on M1 MacOS
9
+ - implement DuckDB.library_version
10
+ - use duckdb_value_string instead of duckdb_value_varchar if duckdb_value_string is available.
11
+ - bump Ruby to 3.2.0rc1
12
+ - bump duckdb to 0.6.0
13
+
14
+ ## Breaking Change
15
+ - drop duckdb <= 0.4.x. ruby-duckdb supports duckdb >= 0.5.0
16
+
3
17
  # 0.5.1.1
4
18
  - bug fix: reading the boolean column
5
19
 
6
20
  # 0.5.1
7
- - bump duckdb 0.5.1
21
+ - bump duckdb to 0.5.1
8
22
 
9
23
  # 0.5.0
10
24
  - update bundle version of Gemfile.lock
11
25
  - add ruby ucrt test on Windows
12
26
  - use TypedData_Wrap_Struct, TypedData_Get_Struct
13
- - bump duckdb 0.5.0
27
+ - bump duckdb to 0.5.0
14
28
  - fix utf-8 encoding.
15
29
  - add DuckDB::Result#enum_dictionary_values
16
30
  - add DuckDB::Result#row_count, DuckDB::Result#row_size(alias of row_count).
@@ -20,19 +34,19 @@
20
34
  - bind_varchar does not raised DuckDB::Error when the binding column is date or datetime.
21
35
 
22
36
  # 0.3.4.0
23
- - bump duckdb 0.3.4
37
+ - bump duckdb to 0.3.4
24
38
 
25
39
  # 0.3.3.0
26
40
  - DuckDB::Column#type supports :decimal.
27
- - bump duckdb 0.3.3.
28
- - bump Ruby 2.6.10, 2.7.6, 3.0.4, 3.1.2.
41
+ - bump duckdb to 0.3.3.
42
+ - bump Ruby to 2.6.10, 2.7.6, 3.0.4, 3.1.2.
29
43
 
30
44
  # 0.3.2.0
31
45
 
32
46
  - bind_time, bind_timestamp, bind_date, bind_timeinterval to DuckDB::PreparedStatement
33
47
  - bump duckdb 0.3.2
34
- - bump Ruby 3.1.1, add Ruby mingw in CI.
35
- - bump Ruby 2.6.9, 2.7.5, 3.0.3 in CI.
48
+ - bump Ruby to 3.1.1, add Ruby mingw in CI.
49
+ - bump Ruby to 2.6.9, 2.7.5, 3.0.3 in CI.
36
50
 
37
51
  ## BREAKING CHANGE
38
52
  - drop duckdb <= 0.2.8
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- duckdb (0.5.1.1)
4
+ duckdb (0.6.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/ext/duckdb/duckdb.c CHANGED
@@ -2,10 +2,24 @@
2
2
 
3
3
  VALUE mDuckDB;
4
4
 
5
+ #ifdef HAVE_DUCKDB_H_GE_V060
6
+ static VALUE duckdb_s_library_version(VALUE self);
7
+ #endif
8
+
9
+ #ifdef HAVE_DUCKDB_H_GE_V060
10
+ static VALUE duckdb_s_library_version(VALUE self) {
11
+ return rb_str_new2(duckdb_library_version());
12
+ }
13
+ #endif
14
+
5
15
  void
6
16
  Init_duckdb_native(void) {
7
17
  mDuckDB = rb_define_module("DuckDB");
8
18
 
19
+ #ifdef HAVE_DUCKDB_H_GE_V060
20
+ rb_define_singleton_method(mDuckDB, "library_version", duckdb_s_library_version, 0);
21
+ #endif
22
+
9
23
  init_duckdb_error();
10
24
  init_duckdb_database();
11
25
  init_duckdb_connection();
@@ -1,15 +1,34 @@
1
1
  require 'mkmf'
2
2
 
3
- dir_config('duckdb')
3
+ def duckdb_library_available?(func)
4
+ header = find_header('duckdb.h') || find_header('duckdb.h', '/opt/homebrew/include')
5
+ library = have_func('duckdb', func) || find_library('duckdb', func, '/opt/homebrew/opt/duckdb/lib')
6
+ header && library
7
+ end
8
+
9
+ def check_duckdb_library(func, version)
10
+ return if duckdb_library_available?(func)
4
11
 
5
- raise 'duckdb library is not found. Install duckdb library file and header file.' unless have_library('duckdb')
12
+ msg = "duckdb >= #{version} is not found. Install duckdb >= #{version} library and header file."
13
+ puts ''
14
+ puts '*' * 80
15
+ puts msg
16
+ puts '*' * 80
17
+ puts ''
18
+ raise msg
19
+ end
6
20
 
7
- raise 'duckdb >= 0.2.9 is required. Install duckdb >= 0.2.9' unless have_func('duckdb_value_is_null', 'duckdb.h')
21
+ dir_config('duckdb')
22
+
23
+ check_duckdb_library('duckdb_pending_prepared', '0.5.0')
8
24
 
9
25
  # check duckdb >= 0.3.3
10
26
  # ducdb >= 0.3.3 if duckdb_append_data_chunk() is defined.
11
27
  have_func('duckdb_append_data_chunk', 'duckdb.h')
12
28
 
29
+ # check duckdb >= 0.6.0
30
+ have_func('duckdb_value_string', 'duckdb.h')
31
+
13
32
  have_func('duckdb_free', 'duckdb.h')
14
33
 
15
34
  create_makefile('duckdb/duckdb_native')
@@ -23,6 +23,7 @@ static VALUE duckdb_prepared_statement__bind_date(VALUE self, VALUE vidx, VALUE
23
23
  static VALUE duckdb_prepared_statement__bind_time(VALUE self, VALUE vidx, VALUE hour, VALUE min, VALUE sec, VALUE micros);
24
24
  static VALUE duckdb_prepared_statement__bind_timestamp(VALUE self, VALUE vidx, VALUE year, VALUE month, VALUE day, VALUE hour, VALUE min, VALUE sec, VALUE micros);
25
25
  static VALUE duckdb_prepared_statement__bind_interval(VALUE self, VALUE vidx, VALUE months, VALUE days, VALUE micros);
26
+ static VALUE duckdb_prepared_statement__bind_hugeint(VALUE self, VALUE vidx, VALUE lower, VALUE upper);
26
27
 
27
28
  static const rb_data_type_t prepared_statement_data_type = {
28
29
  "DuckDB/PreparedStatement",
@@ -283,6 +284,22 @@ static VALUE duckdb_prepared_statement__bind_interval(VALUE self, VALUE vidx, VA
283
284
  return self;
284
285
  }
285
286
 
287
+ static VALUE duckdb_prepared_statement__bind_hugeint(VALUE self, VALUE vidx, VALUE lower, VALUE upper) {
288
+ duckdb_hugeint hugeint;
289
+ rubyDuckDBPreparedStatement *ctx;
290
+ idx_t idx = check_index(vidx);
291
+
292
+ TypedData_Get_Struct(self, rubyDuckDBPreparedStatement, &prepared_statement_data_type, ctx);
293
+ hugeint.lower = NUM2ULL(lower);
294
+ hugeint.upper = NUM2LL(upper);
295
+
296
+ if (duckdb_bind_hugeint(ctx->prepared_statement, idx, hugeint) == DuckDBError) {
297
+ rb_raise(eDuckDBError, "fail to bind %llu parameter", (unsigned long long)idx);
298
+ }
299
+
300
+ return self;
301
+ }
302
+
286
303
  void init_duckdb_prepared_statement(void) {
287
304
  cDuckDBPreparedStatement = rb_define_class_under(mDuckDB, "PreparedStatement", rb_cObject);
288
305
 
@@ -305,4 +322,5 @@ void init_duckdb_prepared_statement(void) {
305
322
  rb_define_private_method(cDuckDBPreparedStatement, "_bind_time", duckdb_prepared_statement__bind_time, 5);
306
323
  rb_define_private_method(cDuckDBPreparedStatement, "_bind_timestamp", duckdb_prepared_statement__bind_timestamp, 8);
307
324
  rb_define_private_method(cDuckDBPreparedStatement, "_bind_interval", duckdb_prepared_statement__bind_interval, 4);
325
+ rb_define_private_method(cDuckDBPreparedStatement, "_bind_hugeint", duckdb_prepared_statement__bind_hugeint, 3);
308
326
  }
data/ext/duckdb/result.c CHANGED
@@ -271,14 +271,25 @@ static VALUE duckdb_result__to_double(VALUE oDuckDBResult, VALUE row_idx, VALUE
271
271
 
272
272
  static VALUE duckdb_result__to_string(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
273
273
  rubyDuckDBResult *ctx;
274
+ #ifdef HAVE_DUCKDB_H_GE_V060
275
+ duckdb_string p;
276
+ #else
274
277
  char *p;
278
+ #endif
275
279
  VALUE obj;
276
280
  TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
277
281
 
282
+ #ifdef HAVE_DUCKDB_H_GE_V060
283
+ p = duckdb_value_string(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
284
+ if (p.data) {
285
+ obj = rb_utf8_str_new(p.data, p.size);
286
+ duckdb_free(p.data);
287
+ #else
278
288
  p = duckdb_value_varchar(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
279
289
  if (p) {
280
290
  obj = rb_utf8_str_new_cstr(p);
281
291
  duckdb_free(p);
292
+ #endif
282
293
  return obj;
283
294
  }
284
295
  return Qnil;
@@ -8,6 +8,10 @@
8
8
  #define HAVE_DUCKDB_H_GE_V033 1
9
9
  #endif
10
10
 
11
+ #ifdef HAVE_DUCKDB_VALUE_STRING
12
+ #define HAVE_DUCKDB_H_GE_V060 1
13
+ #endif
14
+
11
15
  #include "./error.h"
12
16
  #include "./database.h"
13
17
  #include "./connection.h"
@@ -33,15 +33,8 @@ module DuckDB
33
33
  # .end_row
34
34
  #
35
35
  def append_hugeint(value)
36
- case value
37
- when Integer
38
- half = 1 << 64
39
- upper = value / half
40
- lower = value - upper * half
41
- _append_hugeint(lower, upper)
42
- else
43
- raise(ArgumentError, "2nd argument `#{value}` must be Integer.")
44
- end
36
+ lower, upper = integer_to_hugeint(value)
37
+ _append_hugeint(lower, upper)
45
38
  end
46
39
 
47
40
  #
@@ -1,7 +1,20 @@
1
1
  module DuckDB
2
2
  module Converter
3
+ HALF_HUGEINT = 1 << 64
4
+
3
5
  private
4
6
 
7
+ def integer_to_hugeint(value)
8
+ case value
9
+ when Integer
10
+ upper = value / HALF_HUGEINT
11
+ lower = value - upper * HALF_HUGEINT
12
+ [lower, upper]
13
+ else
14
+ raise(ArgumentError, "2nd argument `#{value}` must be Integer.")
15
+ end
16
+ end
17
+
5
18
  def iso8601_interval_to_hash(value)
6
19
  digit = ''
7
20
  time = false
@@ -15,10 +15,21 @@ module DuckDB
15
15
  class PreparedStatement
16
16
  include DuckDB::Converter
17
17
 
18
- RANGE_INT16 = -32768..32767
19
- RANGE_INT32 = -2147483648..2147483647
20
- RANGE_INT64 = -9223372036854775808..9223372036854775807
18
+ RANGE_INT16 = -32_768..32_767
19
+ RANGE_INT32 = -2_147_483_648..2_147_483_647
20
+ RANGE_INT64 = -9_223_372_036_854_775_808..9_223_372_036_854_775_807
21
21
 
22
+ # binds i-th parameter with SQL prepared statement.
23
+ # The first argument is index of parameter.
24
+ # The index of first parameter is 1 not 0.
25
+ # The second argument value is to expected Integer value.
26
+ # This method uses bind_varchar internally.
27
+ # require 'duckdb'
28
+ # db = DuckDB::Database.open('duckdb_database')
29
+ # con = db.connect
30
+ # sql ='SELECT name FROM users WHERE bigint_col = ?'
31
+ # stmt = PreparedStatement.new(con, sql)
32
+ # stmt.bind_hugeint(1, 1_234_567_890_123_456_789_012_345)
22
33
  def bind_hugeint(i, value)
23
34
  case value
24
35
  when Integer
@@ -28,6 +39,22 @@ module DuckDB
28
39
  end
29
40
  end
30
41
 
42
+ # binds i-th parameter with SQL prepared statement.
43
+ # The first argument is index of parameter.
44
+ # The index of first parameter is 1 not 0.
45
+ # The second argument value must be Integer value.
46
+ # This method uses duckdb_bind_hugeint internally.
47
+ # require 'duckdb'
48
+ # db = DuckDB::Database.open('duckdb_database')
49
+ # con = db.connect
50
+ # sql ='SELECT name FROM users WHERE bigint_col = ?'
51
+ # stmt = PreparedStatement.new(con, sql)
52
+ # stmt.bind_hugeint_internal(1, 1_234_567_890_123_456_789_012_345)
53
+ def bind_hugeint_internal(index, value)
54
+ lower, upper = integer_to_hugeint(value)
55
+ _bind_hugeint(index, lower, upper)
56
+ end
57
+
31
58
  # binds i-th parameter with SQL prepared statement.
32
59
  # The first argument is index of parameter.
33
60
  # The index of first parameter is 1 not 0.
@@ -1,5 +1,5 @@
1
1
  module DuckDB
2
2
  # The version string of ruby-duckdb.
3
3
  # Currently, ruby-duckdb is NOT semantic versioning.
4
- VERSION = '0.5.1.1'.freeze
4
+ VERSION = '0.6.1'.freeze
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: duckdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1.1
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaki Suketa
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-13 00:00:00.000000000 Z
11
+ date: 2022-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -129,7 +129,7 @@ metadata:
129
129
  homepage_uri: https://github.com/suketa/ruby-duckdb
130
130
  source_code_uri: https://github.com/suketa/ruby-duckdb
131
131
  changelog_uri: https://github.com/suketa/ruby-duckdb/blob/master/CHANGELOG.md
132
- post_install_message:
132
+ post_install_message:
133
133
  rdoc_options: []
134
134
  require_paths:
135
135
  - lib
@@ -144,8 +144,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
146
  requirements: []
147
- rubygems_version: 3.3.22
148
- signing_key:
147
+ rubygems_version: 3.4.1
148
+ signing_key:
149
149
  specification_version: 4
150
150
  summary: This module is Ruby binding for DuckDB database engine.
151
151
  test_files: []