duckdb 1.0.0.0 → 1.0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ded07680dcaaa7309ed8578e6bd5d0a1e217b0c803f8527679e62e254aaea412
4
- data.tar.gz: d2ff3d9a66b1487d867a95129a5c4fff3b4c01ed90198772d2a62b299c88bfca
3
+ metadata.gz: 4ec35034af422ec8f64f8474e95321a72a635925227fa8b5c26b3a430a4283a6
4
+ data.tar.gz: 52fb59085c80865dd6c51a5f7cb93b0e3eb2940245b4df580040753d364bd989
5
5
  SHA512:
6
- metadata.gz: 253d068a5c17894a482346897f499e06a79ed9741250367e76d306d3828bfdce385379bd091528ae119fa5b1d0c7a83378cb84043477f1d6d21d86d09c00cd88
7
- data.tar.gz: 2c554bdd675fea28561ed291dc28e5b660ef85a7d737d6cd69450832aa3af6a84eb94ad6a55a922828841ee9c9f802a4f86734692afd35b3a2bde4c2d6edb7e7
6
+ metadata.gz: 00d69fe6df1f7acdb1fac1e8bce26b17d9d7f06802fb8a8ddb287f25831858a69576c0d3558f6e5a48d0761226aae46a9f92d541b9e2547ae7f81f8b65a67441
7
+ data.tar.gz: dd8734f7a005a0007336faf58b6b032e6a2dbcf668859483cc9c713eef50ca585df9e564257b6890c9af3c394e82de8e0bd7a42790d3e1c033ffedeb41702e2c
@@ -15,7 +15,7 @@ jobs:
15
15
  runs-on: macos-latest
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['3.0.7', '3.1.6', '3.2.4', '3.3.2', '3.4.0-preview1', 'head']
18
+ ruby: ['3.0.7', '3.1.6', '3.2.4', '3.3.3', '3.4.0-preview1', 'head']
19
19
  duckdb: ['1.0.0', '0.10.3']
20
20
 
21
21
  steps:
@@ -15,7 +15,7 @@ jobs:
15
15
  runs-on: ubuntu-latest
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['3.0.7', '3.1.6', '3.2.4', '3.3.2', '3.4.0-preview1', 'head']
18
+ ruby: ['3.0.7', '3.1.6', '3.2.4', '3.3.3', '3.4.0-preview1', 'head']
19
19
  duckdb: ['1.0.0', '0.10.3']
20
20
 
21
21
  steps:
@@ -15,7 +15,7 @@ jobs:
15
15
  runs-on: windows-latest
16
16
  strategy:
17
17
  matrix:
18
- ruby: ['3.0.7', '3.1.5', '3.2.4', '3.3.1', 'ucrt', 'mingw', 'mswin', 'head']
18
+ ruby: ['3.0.7', '3.1.5', '3.2.4', '3.3.2', 'ucrt', 'mingw', 'mswin', 'head']
19
19
  duckdb: ['1.0.0', '0.10.3']
20
20
 
21
21
  steps:
data/CHANGELOG.md CHANGED
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ # 1.0.0.1 - 2024-06-16
8
+ - support fetch the value from UHUGEINT type column.
9
+ - add `DuckDB::Appender#append_uhugeint`.
10
+ - DuckDB::Result supports ARRAY column type (only when DuckDB::Result.use_chunk_each is true).
11
+ - DuckDB::Result supports LIST column type (only when DuckDB::Result.use_chunk_each is true).
12
+ Thanks to stephenprater.
13
+
7
14
  # 1.0.0.0 - 2024-06-08
8
15
  - bump duckdb to 1.0.0.
9
16
  - add `DuckDB::ExtractedStatements` class.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- duckdb (1.0.0.0)
4
+ duckdb (1.0.0.1)
5
5
  bigdecimal (>= 3.1.4)
6
6
 
7
7
  GEM
@@ -11,10 +11,10 @@ GEM
11
11
  bigdecimal (3.1.8)
12
12
  mini_portile2 (2.8.7)
13
13
  minitest (5.23.1)
14
- nokogiri (1.16.5)
14
+ nokogiri (1.16.6)
15
15
  mini_portile2 (~> 2.8.2)
16
16
  racc (~> 1.4)
17
- nokogiri (1.16.5-x86_64-linux)
17
+ nokogiri (1.16.6-x86_64-linux)
18
18
  racc (~> 1.4)
19
19
  racc (1.8.0)
20
20
  rake (13.2.1)
@@ -28,6 +28,7 @@ static VALUE appender__append_interval(VALUE self, VALUE months, VALUE days, VAL
28
28
  static VALUE appender__append_time(VALUE self, VALUE hour, VALUE min, VALUE sec, VALUE micros);
29
29
  static VALUE appender__append_timestamp(VALUE self, VALUE year, VALUE month, VALUE day, VALUE hour, VALUE min, VALUE sec, VALUE micros);
30
30
  static VALUE appender__append_hugeint(VALUE self, VALUE lower, VALUE upper);
31
+ static VALUE appender__append_uhugeint(VALUE self, VALUE lower, VALUE upper);
31
32
  static VALUE appender_flush(VALUE self);
32
33
  static VALUE appender_close(VALUE self);
33
34
 
@@ -349,6 +350,21 @@ static VALUE appender__append_hugeint(VALUE self, VALUE lower, VALUE upper) {
349
350
  return self;
350
351
  }
351
352
 
353
+ static VALUE appender__append_uhugeint(VALUE self, VALUE lower, VALUE upper) {
354
+ duckdb_uhugeint uhugeint;
355
+
356
+ uhugeint.lower = NUM2ULL(lower);
357
+ uhugeint.upper = NUM2ULL(upper);
358
+
359
+ rubyDuckDBAppender *ctx;
360
+
361
+ TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
362
+ if (duckdb_append_uhugeint(ctx->appender, uhugeint) == DuckDBError) {
363
+ rb_raise(eDuckDBError, "failed to append uhugeint");
364
+ }
365
+ return self;
366
+ }
367
+
352
368
  static VALUE appender_flush(VALUE self) {
353
369
  rubyDuckDBAppender *ctx;
354
370
  TypedData_Get_Struct(self, rubyDuckDBAppender, &appender_data_type, ctx);
@@ -395,6 +411,7 @@ void rbduckdb_init_duckdb_appender(void) {
395
411
  rb_define_private_method(cDuckDBAppender, "_append_time", appender__append_time, 4);
396
412
  rb_define_private_method(cDuckDBAppender, "_append_timestamp", appender__append_timestamp, 7);
397
413
  rb_define_private_method(cDuckDBAppender, "_append_hugeint", appender__append_hugeint, 2);
414
+ rb_define_private_method(cDuckDBAppender, "_append_uhugeint", appender__append_uhugeint, 2);
398
415
  rb_define_method(cDuckDBAppender, "flush", appender_flush, 0);
399
416
  rb_define_method(cDuckDBAppender, "close", appender_close, 0);
400
417
  }
data/ext/duckdb/result.c CHANGED
@@ -62,9 +62,12 @@ static VALUE vector_interval(void* vector_data, idx_t row_idx);
62
62
  static VALUE vector_blob(void* vector_data, idx_t row_idx);
63
63
  static VALUE vector_varchar(void* vector_data, idx_t row_idx);
64
64
  static VALUE vector_hugeint(void* vector_data, idx_t row_idx);
65
+ static VALUE vector_uhugeint(void* vector_data, idx_t row_idx);
65
66
  static VALUE vector_decimal(duckdb_logical_type ty, void* vector_data, idx_t row_idx);
66
67
  static VALUE vector_enum(duckdb_logical_type ty, void* vector_data, idx_t row_idx);
67
- static VALUE vector_list(duckdb_logical_type ty, duckdb_vector vector, idx_t row_idx);
68
+ static VALUE vector_array(duckdb_logical_type ty, duckdb_vector vector, idx_t row_idx);
69
+ static VALUE vector_array_value_at(duckdb_vector array, duckdb_logical_type element_type, idx_t index);
70
+ static VALUE vector_list(duckdb_logical_type ty, duckdb_vector vector, void* vector_data, idx_t row_idx);
68
71
  static VALUE vector_map(duckdb_logical_type ty, duckdb_vector vector, idx_t row_idx);
69
72
  static VALUE vector_struct(duckdb_logical_type ty, duckdb_vector vector, idx_t row_idx);
70
73
  static VALUE vector_uuid(void* vector_data, idx_t row_idx);
@@ -662,6 +665,14 @@ static VALUE vector_hugeint(void* vector_data, idx_t row_idx) {
662
665
  );
663
666
  }
664
667
 
668
+ static VALUE vector_uhugeint(void* vector_data, idx_t row_idx) {
669
+ duckdb_uhugeint uhugeint = ((duckdb_uhugeint *)vector_data)[row_idx];
670
+ return rb_funcall(mDuckDBConverter, id__to_hugeint_from_vector, 2,
671
+ ULL2NUM(uhugeint.lower),
672
+ ULL2NUM(uhugeint.upper)
673
+ );
674
+ }
675
+
665
676
  static VALUE vector_decimal(duckdb_logical_type ty, void* vector_data, idx_t row_idx) {
666
677
  VALUE width = INT2FIX(duckdb_decimal_width(ty));
667
678
  VALUE scale = INT2FIX(duckdb_decimal_scale(ty));
@@ -721,27 +732,147 @@ static VALUE vector_enum(duckdb_logical_type ty, void* vector_data, idx_t row_id
721
732
  return value;
722
733
  }
723
734
 
724
- static VALUE vector_list(duckdb_logical_type ty, duckdb_vector vector, idx_t row_idx) {
725
- // Lists are stored as vectors within vectors
735
+ static VALUE vector_array(duckdb_logical_type ty, duckdb_vector vector, idx_t row_idx) {
736
+ VALUE ary = Qnil;
737
+ VALUE value = Qnil;
738
+
739
+ duckdb_logical_type child_logical_type = duckdb_array_type_child_type(ty);
740
+ idx_t size = duckdb_array_type_array_size(ty);
741
+ idx_t bgn = row_idx * size;
742
+ idx_t end = bgn + size;
743
+ duckdb_vector child = duckdb_array_vector_get_child(vector);
744
+
745
+ ary = rb_ary_new2(size);
746
+ for (idx_t i = bgn; i < end; ++i) {
747
+ value = vector_array_value_at(child, child_logical_type, i);
748
+ rb_ary_store(ary, i - bgn, value);
749
+ }
726
750
 
751
+ duckdb_destroy_logical_type(&child_logical_type);
752
+ return ary;
753
+ }
754
+
755
+ static VALUE vector_array_value_at(duckdb_vector array, duckdb_logical_type element_type, idx_t index) {
756
+ uint64_t *validity;
757
+ duckdb_type type_id;
758
+ void* vector_data;
759
+ VALUE obj = Qnil;
760
+
761
+ validity = duckdb_vector_get_validity(array);
762
+ if (!duckdb_validity_row_is_valid(validity, index)) {
763
+ return Qnil;
764
+ }
765
+
766
+ type_id = duckdb_get_type_id(element_type);
767
+ vector_data = duckdb_vector_get_data(array);
768
+
769
+ switch(type_id) {
770
+ case DUCKDB_TYPE_INVALID:
771
+ obj = Qnil;
772
+ break;
773
+ case DUCKDB_TYPE_BOOLEAN:
774
+ obj = (((bool*) vector_data)[index]) ? Qtrue : Qfalse;
775
+ break;
776
+ case DUCKDB_TYPE_TINYINT:
777
+ obj = INT2FIX(((int8_t *) vector_data)[index]);
778
+ break;
779
+ case DUCKDB_TYPE_SMALLINT:
780
+ obj = INT2FIX(((int16_t *) vector_data)[index]);
781
+ break;
782
+ case DUCKDB_TYPE_INTEGER:
783
+ obj = INT2NUM(((int32_t *) vector_data)[index]);
784
+ break;
785
+ case DUCKDB_TYPE_BIGINT:
786
+ obj = LL2NUM(((int64_t *) vector_data)[index]);
787
+ break;
788
+ case DUCKDB_TYPE_UTINYINT:
789
+ obj = INT2FIX(((uint8_t *) vector_data)[index]);
790
+ break;
791
+ case DUCKDB_TYPE_USMALLINT:
792
+ obj = INT2FIX(((uint16_t *) vector_data)[index]);
793
+ break;
794
+ case DUCKDB_TYPE_UINTEGER:
795
+ obj = UINT2NUM(((uint32_t *) vector_data)[index]);
796
+ break;
797
+ case DUCKDB_TYPE_UBIGINT:
798
+ obj = ULL2NUM(((uint64_t *) vector_data)[index]);
799
+ break;
800
+ case DUCKDB_TYPE_HUGEINT:
801
+ obj = vector_hugeint(vector_data, index);
802
+ break;
803
+ case DUCKDB_TYPE_UHUGEINT:
804
+ obj = vector_uhugeint(vector_data, index);
805
+ break;
806
+ case DUCKDB_TYPE_FLOAT:
807
+ obj = DBL2NUM((((float *) vector_data)[index]));
808
+ break;
809
+ case DUCKDB_TYPE_DOUBLE:
810
+ obj = DBL2NUM((((double *) vector_data)[index]));
811
+ break;
812
+ case DUCKDB_TYPE_DATE:
813
+ obj = vector_date(vector_data, index);
814
+ break;
815
+ case DUCKDB_TYPE_TIMESTAMP:
816
+ obj = vector_timestamp(vector_data, index);
817
+ break;
818
+ case DUCKDB_TYPE_TIME:
819
+ obj = vector_time(vector_data, index);
820
+ break;
821
+ case DUCKDB_TYPE_INTERVAL:
822
+ obj = vector_interval(vector_data, index);
823
+ break;
824
+ case DUCKDB_TYPE_VARCHAR:
825
+ obj = vector_varchar(vector_data, index);
826
+ break;
827
+ case DUCKDB_TYPE_BLOB:
828
+ obj = vector_blob(vector_data, index);
829
+ break;
830
+ case DUCKDB_TYPE_DECIMAL:
831
+ obj = vector_decimal(element_type, vector_data, index);
832
+ break;
833
+ case DUCKDB_TYPE_ENUM:
834
+ obj = vector_enum(element_type, vector_data, index);
835
+ break;
836
+ case DUCKDB_TYPE_ARRAY:
837
+ obj = vector_array(element_type, array, index);
838
+ break;
839
+ case DUCKDB_TYPE_LIST:
840
+ obj = vector_list(element_type, array, vector_data, index);
841
+ break;
842
+ case DUCKDB_TYPE_MAP:
843
+ obj = vector_map(element_type, vector_data, index);
844
+ break;
845
+ case DUCKDB_TYPE_STRUCT:
846
+ obj = vector_struct(element_type, vector_data, index);
847
+ break;
848
+ case DUCKDB_TYPE_UUID:
849
+ obj = vector_uuid(vector_data, index);
850
+ break;
851
+ default:
852
+ rb_warn("Unknown type %d", type_id);
853
+ obj = Qnil;
854
+ }
855
+
856
+ return obj;
857
+ }
858
+
859
+ static VALUE vector_list(duckdb_logical_type ty, duckdb_vector vector, void * vector_data, idx_t row_idx) {
727
860
  VALUE ary = Qnil;
728
- VALUE element = Qnil;
861
+ VALUE value = Qnil;
729
862
  idx_t i;
730
863
 
731
- // rb_warn("ruby-duckdb does not support List yet");
732
-
733
864
  duckdb_logical_type child_logical_type = duckdb_list_type_child_type(ty);
734
- // duckdb_type child_type = duckdb_get_type_id(child_logical_type);
735
865
 
736
- duckdb_list_entry list_entry = ((duckdb_list_entry *)vector)[row_idx];
866
+ duckdb_list_entry list_entry = ((duckdb_list_entry *)vector_data)[row_idx];
867
+ idx_t bgn = list_entry.offset;
868
+ idx_t end = bgn + list_entry.length;
737
869
  ary = rb_ary_new2(list_entry.length);
738
870
 
739
- for (i = list_entry.offset; i < list_entry.offset + list_entry.length; ++i) {
740
- /*
741
- * FIXME: How to get the child element?
742
- */
743
- // element = ???
744
- rb_ary_store(ary, i - list_entry.offset, element);
871
+ duckdb_vector child = duckdb_list_vector_get_child(vector);
872
+
873
+ for (i = bgn; i < end; ++i) {
874
+ value = vector_array_value_at(child, child_logical_type, i);
875
+ rb_ary_store(ary, i - bgn, value);
745
876
  }
746
877
  duckdb_destroy_logical_type(&child_logical_type);
747
878
  return ary;
@@ -848,6 +979,9 @@ static VALUE vector_value(duckdb_vector vector, idx_t row_idx) {
848
979
  case DUCKDB_TYPE_HUGEINT:
849
980
  obj = vector_hugeint(vector_data, row_idx);
850
981
  break;
982
+ case DUCKDB_TYPE_UHUGEINT:
983
+ obj = vector_uhugeint(vector_data, row_idx);
984
+ break;
851
985
  case DUCKDB_TYPE_FLOAT:
852
986
  obj = DBL2NUM((((float *) vector_data)[row_idx]));
853
987
  break;
@@ -878,8 +1012,11 @@ static VALUE vector_value(duckdb_vector vector, idx_t row_idx) {
878
1012
  case DUCKDB_TYPE_ENUM:
879
1013
  obj = vector_enum(ty, vector_data, row_idx);
880
1014
  break;
1015
+ case DUCKDB_TYPE_ARRAY:
1016
+ obj = vector_array(ty, vector, row_idx);
1017
+ break;
881
1018
  case DUCKDB_TYPE_LIST:
882
- obj = vector_list(ty, vector_data, row_idx);
1019
+ obj = vector_list(ty, vector, vector_data, row_idx);
883
1020
  break;
884
1021
  case DUCKDB_TYPE_MAP:
885
1022
  obj = vector_map(ty, vector_data, row_idx);
@@ -39,6 +39,24 @@ module DuckDB
39
39
  _append_hugeint(lower, upper)
40
40
  end
41
41
 
42
+ #
43
+ # appends unsigned huge int value.
44
+ #
45
+ # require 'duckdb'
46
+ # db = DuckDB::Database.open
47
+ # con = db.connect
48
+ # con.query('CREATE TABLE numbers (num UHUGEINT)')
49
+ # appender = con.appender('numbers')
50
+ # appender
51
+ # .begin_row
52
+ # .append_hugeint(340_282_366_920_938_463_463_374_607_431_768_211_455)
53
+ # .end_row
54
+ #
55
+ def append_uhugeint(value)
56
+ lower, upper = integer_to_hugeint(value)
57
+ _append_uhugeint(lower, upper)
58
+ end
59
+
42
60
  #
43
61
  # appends date value.
44
62
  #
@@ -3,5 +3,5 @@
3
3
  module DuckDB
4
4
  # The version string of ruby-duckdb.
5
5
  # Currently, ruby-duckdb is NOT semantic versioning.
6
- VERSION = '1.0.0.0'
6
+ VERSION = '1.0.0.1'
7
7
  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: 1.0.0.0
4
+ version: 1.0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaki Suketa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-08 00:00:00.000000000 Z
11
+ date: 2024-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bigdecimal
@@ -181,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
181
  - !ruby/object:Gem::Version
182
182
  version: '0'
183
183
  requirements: []
184
- rubygems_version: 3.5.9
184
+ rubygems_version: 3.5.11
185
185
  signing_key:
186
186
  specification_version: 4
187
187
  summary: This module is Ruby binding for DuckDB database engine.