duckdb 1.0.0.0 → 1.0.0.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: 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.