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 +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.
|