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 +4 -4
- data/.github/workflows/test_on_macos.yml +1 -1
- data/.github/workflows/test_on_ubuntu.yml +1 -1
- data/.github/workflows/test_on_windows.yml +1 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +3 -3
- data/ext/duckdb/appender.c +17 -0
- data/ext/duckdb/result.c +152 -15
- data/lib/duckdb/appender.rb +18 -0
- data/lib/duckdb/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ec35034af422ec8f64f8474e95321a72a635925227fa8b5c26b3a430a4283a6
|
4
|
+
data.tar.gz: 52fb59085c80865dd6c51a5f7cb93b0e3eb2940245b4df580040753d364bd989
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00d69fe6df1f7acdb1fac1e8bce26b17d9d7f06802fb8a8ddb287f25831858a69576c0d3558f6e5a48d0761226aae46a9f92d541b9e2547ae7f81f8b65a67441
|
7
|
+
data.tar.gz: dd8734f7a005a0007336faf58b6b032e6a2dbcf668859483cc9c713eef50ca585df9e564257b6890c9af3c394e82de8e0bd7a42790d3e1c033ffedeb41702e2c
|
@@ -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.
|
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.
|
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.
|
14
|
+
nokogiri (1.16.6)
|
15
15
|
mini_portile2 (~> 2.8.2)
|
16
16
|
racc (~> 1.4)
|
17
|
-
nokogiri (1.16.
|
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)
|
data/ext/duckdb/appender.c
CHANGED
@@ -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
|
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
|
725
|
-
|
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
|
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 *)
|
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
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
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);
|
data/lib/duckdb/appender.rb
CHANGED
@@ -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
|
#
|
data/lib/duckdb/version.rb
CHANGED
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.
|
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-
|
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.
|
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.
|