duckdb 1.0.0.2 → 1.1.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 +8 -8
- data/.github/workflows/test_on_ubuntu.yml +2 -2
- data/.github/workflows/test_on_windows.yml +2 -2
- data/CHANGELOG.md +56 -1
- data/Dockerfile +2 -2
- data/Gemfile.lock +6 -6
- data/README.md +12 -3
- data/benchmark/async_query.rb +0 -2
- data/benchmark/to_intern_ips.rb +0 -1
- data/duckdb.gemspec +1 -1
- data/ext/duckdb/duckdb.c +4 -0
- data/ext/duckdb/extconf.rb +4 -7
- data/ext/duckdb/pending_result.c +7 -0
- data/ext/duckdb/prepared_statement.c +35 -9
- data/ext/duckdb/result.c +59 -278
- data/ext/duckdb/ruby-duckdb.h +6 -0
- data/lib/duckdb/column.rb +2 -38
- data/lib/duckdb/config.rb +47 -49
- data/lib/duckdb/connection.rb +9 -1
- data/lib/duckdb/converter/int_to_sym.rb +127 -0
- data/lib/duckdb/converter.rb +9 -0
- data/lib/duckdb/database.rb +2 -4
- data/lib/duckdb/infinity.rb +8 -0
- data/lib/duckdb/pending_result.rb +16 -5
- data/lib/duckdb/prepared_statement.rb +29 -2
- data/lib/duckdb/result.rb +39 -78
- data/lib/duckdb/version.rb +1 -1
- data/lib/duckdb.rb +1 -0
- data/sample/async_query.rb +0 -1
- data/sample/async_query_stream.rb +0 -1
- metadata +6 -7
- data/benchmark/to_bigdecimal_ips.rb +0 -16
- data/benchmark/to_hugeint_ips.rb +0 -16
- data/benchmark/to_hugeint_profile.rb +0 -26
data/ext/duckdb/result.c
CHANGED
@@ -18,20 +18,11 @@ static ID id__to_time_from_duckdb_timestamp_ms;
|
|
18
18
|
static ID id__to_time_from_duckdb_timestamp_ns;
|
19
19
|
static ID id__to_time_from_duckdb_time_tz;
|
20
20
|
static ID id__to_time_from_duckdb_timestamp_tz;
|
21
|
+
static ID id__to_infinity;
|
21
22
|
|
22
23
|
static void deallocate(void *ctx);
|
23
24
|
static VALUE allocate(VALUE klass);
|
24
25
|
static size_t memsize(const void *p);
|
25
|
-
static VALUE to_ruby_obj_boolean(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
26
|
-
static VALUE to_ruby_obj_smallint(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
27
|
-
static VALUE to_ruby_obj_utinyint(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
28
|
-
static VALUE to_ruby_obj_integer(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
29
|
-
static VALUE to_ruby_obj_bigint(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
30
|
-
static VALUE to_ruby_obj_hugeint(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
31
|
-
static VALUE to_ruby_obj_decimal(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
32
|
-
static VALUE to_ruby_obj_float(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
33
|
-
static VALUE to_ruby_obj_double(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
34
|
-
static VALUE to_ruby_obj_blob(duckdb_result *result, idx_t col_idx, idx_t row_idx);
|
35
26
|
static VALUE duckdb_result_column_count(VALUE oDuckDBResult);
|
36
27
|
static VALUE duckdb_result_row_count(VALUE oDuckDBResult);
|
37
28
|
static VALUE duckdb_result_rows_changed(VALUE oDuckDBResult);
|
@@ -43,23 +34,13 @@ static VALUE duckdb_result_chunk_each(VALUE oDuckDBResult);
|
|
43
34
|
static VALUE duckdb_result__chunk_stream(VALUE oDuckDBResult);
|
44
35
|
static VALUE yield_rows(VALUE arg);
|
45
36
|
static VALUE duckdb_result__column_type(VALUE oDuckDBResult, VALUE col_idx);
|
46
|
-
static VALUE
|
47
|
-
static VALUE
|
48
|
-
static VALUE duckdb_result__to_smallint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
49
|
-
static VALUE duckdb_result__to_utinyint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
50
|
-
static VALUE duckdb_result__to_integer(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
51
|
-
static VALUE duckdb_result__to_bigint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
52
|
-
static VALUE duckdb_result___to_hugeint_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
53
|
-
static VALUE duckdb_result___to_decimal_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
54
|
-
static VALUE duckdb_result__to_float(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
55
|
-
static VALUE duckdb_result__to_double(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
56
|
-
static VALUE duckdb_result__to_string(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
57
|
-
static VALUE duckdb_result__to_string_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
58
|
-
static VALUE duckdb_result__to_blob(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx);
|
37
|
+
static VALUE duckdb_result__return_type(VALUE oDuckDBResult);
|
38
|
+
static VALUE duckdb_result__statement_type(VALUE oDuckDBResult);
|
59
39
|
static VALUE duckdb_result__enum_internal_type(VALUE oDuckDBResult, VALUE col_idx);
|
60
40
|
static VALUE duckdb_result__enum_dictionary_size(VALUE oDuckDBResult, VALUE col_idx);
|
61
41
|
static VALUE duckdb_result__enum_dictionary_value(VALUE oDuckDBResult, VALUE col_idx, VALUE idx);
|
62
42
|
|
43
|
+
static VALUE infinite_date_value(duckdb_date date);
|
63
44
|
static VALUE vector_date(void *vector_data, idx_t row_idx);
|
64
45
|
static VALUE vector_timestamp(void* vector_data, idx_t row_idx);
|
65
46
|
static VALUE vector_time(void* vector_data, idx_t row_idx);
|
@@ -69,6 +50,7 @@ static VALUE vector_varchar(void* vector_data, idx_t row_idx);
|
|
69
50
|
static VALUE vector_hugeint(void* vector_data, idx_t row_idx);
|
70
51
|
static VALUE vector_uhugeint(void* vector_data, idx_t row_idx);
|
71
52
|
static VALUE vector_decimal(duckdb_logical_type ty, void* vector_data, idx_t row_idx);
|
53
|
+
static VALUE infinite_timestamp_value(duckdb_timestamp timestamp);
|
72
54
|
static VALUE vector_timestamp_s(void* vector_data, idx_t row_idx);
|
73
55
|
static VALUE vector_timestamp_ms(void* vector_data, idx_t row_idx);
|
74
56
|
static VALUE vector_timestamp_ns(void* vector_data, idx_t row_idx);
|
@@ -113,114 +95,6 @@ rubyDuckDBResult *get_struct_result(VALUE obj) {
|
|
113
95
|
return ctx;
|
114
96
|
}
|
115
97
|
|
116
|
-
static VALUE to_ruby_obj_boolean(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
117
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
118
|
-
return Qnil;
|
119
|
-
#else
|
120
|
-
rb_warn("private method `_to_boolean` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
121
|
-
bool bval = duckdb_value_boolean(result, col_idx, row_idx);
|
122
|
-
return bval ? Qtrue : Qfalse;
|
123
|
-
#endif
|
124
|
-
}
|
125
|
-
|
126
|
-
static VALUE to_ruby_obj_smallint(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
127
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
128
|
-
return Qnil;
|
129
|
-
#else
|
130
|
-
rb_warn("private method `_to_smallint` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
131
|
-
int16_t i16val = duckdb_value_int16(result, col_idx, row_idx);
|
132
|
-
return INT2FIX(i16val);
|
133
|
-
#endif
|
134
|
-
}
|
135
|
-
|
136
|
-
static VALUE to_ruby_obj_utinyint(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
137
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
138
|
-
return Qnil;
|
139
|
-
#else
|
140
|
-
rb_warn("private method `_to_utinyint` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
141
|
-
uint8_t ui8val = duckdb_value_uint8(result, col_idx, row_idx);
|
142
|
-
return UINT2NUM(ui8val);
|
143
|
-
#endif
|
144
|
-
}
|
145
|
-
|
146
|
-
static VALUE to_ruby_obj_integer(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
147
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
148
|
-
return Qnil;
|
149
|
-
#else
|
150
|
-
rb_warn("private method `_to_integer` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
151
|
-
int32_t i32val = duckdb_value_int32(result, col_idx, row_idx);
|
152
|
-
return INT2NUM(i32val);
|
153
|
-
#endif
|
154
|
-
}
|
155
|
-
|
156
|
-
static VALUE to_ruby_obj_bigint(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
157
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
158
|
-
return Qnil;
|
159
|
-
#else
|
160
|
-
rb_warn("private method `_to_bigint` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
161
|
-
int64_t i64val = duckdb_value_int64(result, col_idx, row_idx);
|
162
|
-
return LL2NUM(i64val);
|
163
|
-
#endif
|
164
|
-
}
|
165
|
-
|
166
|
-
static VALUE to_ruby_obj_hugeint(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
167
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
168
|
-
return Qnil;
|
169
|
-
#else
|
170
|
-
rb_warn("private method `__to_hugeint_internal` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
171
|
-
duckdb_hugeint hugeint = duckdb_value_hugeint(result, col_idx, row_idx);
|
172
|
-
return rb_ary_new3(2, ULL2NUM(hugeint.lower), LL2NUM(hugeint.upper));
|
173
|
-
#endif
|
174
|
-
}
|
175
|
-
|
176
|
-
static VALUE to_ruby_obj_decimal(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
177
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
178
|
-
return Qnil;
|
179
|
-
#else
|
180
|
-
rb_warn("private method `__to_decimal_internal` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
181
|
-
duckdb_decimal decimal = duckdb_value_decimal(result, col_idx, row_idx);
|
182
|
-
return rb_ary_new3(4, ULL2NUM(decimal.value.lower), LL2NUM(decimal.value.upper), UINT2NUM(decimal.width), UINT2NUM(decimal.scale));
|
183
|
-
#endif
|
184
|
-
}
|
185
|
-
|
186
|
-
static VALUE to_ruby_obj_float(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
187
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
188
|
-
return Qnil;
|
189
|
-
#else
|
190
|
-
rb_warn("private method `_to_float` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
191
|
-
float fval = duckdb_value_float(result, col_idx, row_idx);
|
192
|
-
return DBL2NUM(fval);
|
193
|
-
#endif
|
194
|
-
}
|
195
|
-
|
196
|
-
static VALUE to_ruby_obj_double(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
197
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
198
|
-
return Qnil;
|
199
|
-
#else
|
200
|
-
rb_warn("private method `_to_double` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
201
|
-
double dval = duckdb_value_double(result, col_idx, row_idx);
|
202
|
-
return DBL2NUM(dval);
|
203
|
-
#endif
|
204
|
-
}
|
205
|
-
|
206
|
-
static VALUE to_ruby_obj_blob(duckdb_result *result, idx_t col_idx, idx_t row_idx) {
|
207
|
-
|
208
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
209
|
-
return Qnil;
|
210
|
-
#else
|
211
|
-
VALUE str;
|
212
|
-
rb_warn("private method `_to_blob` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
213
|
-
duckdb_blob bval = duckdb_value_blob(result, col_idx, row_idx);
|
214
|
-
str = rb_str_new(bval.data, bval.size);
|
215
|
-
|
216
|
-
if (bval.data) {
|
217
|
-
duckdb_free(bval.data);
|
218
|
-
}
|
219
|
-
|
220
|
-
return str;
|
221
|
-
#endif
|
222
|
-
}
|
223
|
-
|
224
98
|
/*
|
225
99
|
* call-seq:
|
226
100
|
* result.rows_changed -> integer
|
@@ -433,128 +307,16 @@ static VALUE duckdb_result__column_type(VALUE oDuckDBResult, VALUE col_idx) {
|
|
433
307
|
return LL2NUM(duckdb_column_type(&(ctx->result), NUM2LL(col_idx)));
|
434
308
|
}
|
435
309
|
|
436
|
-
static VALUE
|
310
|
+
static VALUE duckdb_result__return_type(VALUE oDuckDBResult) {
|
437
311
|
rubyDuckDBResult *ctx;
|
438
|
-
bool is_null;
|
439
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
440
|
-
return Qfalse;
|
441
|
-
#else
|
442
|
-
rb_warn("private method `_null?` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
443
312
|
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
444
|
-
|
445
|
-
is_null = duckdb_value_is_null(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
446
|
-
return is_null ? Qtrue : Qfalse;
|
447
|
-
#endif
|
313
|
+
return INT2FIX(duckdb_result_return_type(ctx->result));
|
448
314
|
}
|
449
315
|
|
450
|
-
static VALUE
|
316
|
+
static VALUE duckdb_result__statement_type(VALUE oDuckDBResult) {
|
451
317
|
rubyDuckDBResult *ctx;
|
452
318
|
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
453
|
-
|
454
|
-
return to_ruby_obj_boolean(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx)) ? Qtrue : Qfalse;
|
455
|
-
}
|
456
|
-
|
457
|
-
static VALUE duckdb_result__to_smallint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
458
|
-
rubyDuckDBResult *ctx;
|
459
|
-
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
460
|
-
|
461
|
-
return to_ruby_obj_smallint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
462
|
-
}
|
463
|
-
|
464
|
-
static VALUE duckdb_result__to_utinyint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
465
|
-
rubyDuckDBResult *ctx;
|
466
|
-
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
467
|
-
|
468
|
-
return to_ruby_obj_utinyint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
469
|
-
}
|
470
|
-
|
471
|
-
static VALUE duckdb_result__to_integer(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
472
|
-
rubyDuckDBResult *ctx;
|
473
|
-
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
474
|
-
|
475
|
-
return to_ruby_obj_integer(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
476
|
-
}
|
477
|
-
|
478
|
-
static VALUE duckdb_result__to_bigint(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
479
|
-
rubyDuckDBResult *ctx;
|
480
|
-
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
481
|
-
|
482
|
-
return to_ruby_obj_bigint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
483
|
-
}
|
484
|
-
|
485
|
-
static VALUE duckdb_result___to_hugeint_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
486
|
-
rubyDuckDBResult *ctx;
|
487
|
-
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
488
|
-
|
489
|
-
return to_ruby_obj_hugeint(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
490
|
-
}
|
491
|
-
|
492
|
-
static VALUE duckdb_result___to_decimal_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
493
|
-
rubyDuckDBResult *ctx;
|
494
|
-
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
495
|
-
|
496
|
-
return to_ruby_obj_decimal(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
497
|
-
}
|
498
|
-
|
499
|
-
static VALUE duckdb_result__to_float(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
500
|
-
rubyDuckDBResult *ctx;
|
501
|
-
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
502
|
-
|
503
|
-
return to_ruby_obj_float(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
504
|
-
}
|
505
|
-
|
506
|
-
static VALUE duckdb_result__to_double(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
507
|
-
rubyDuckDBResult *ctx;
|
508
|
-
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
509
|
-
|
510
|
-
return to_ruby_obj_double(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
511
|
-
}
|
512
|
-
|
513
|
-
static VALUE duckdb_result__to_string(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
514
|
-
rubyDuckDBResult *ctx;
|
515
|
-
duckdb_string p;
|
516
|
-
VALUE obj;
|
517
|
-
|
518
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
519
|
-
return Qnil;
|
520
|
-
#else
|
521
|
-
rb_warn("private method `_to_string` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
522
|
-
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
523
|
-
|
524
|
-
p = duckdb_value_string(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
525
|
-
if (p.data) {
|
526
|
-
obj = rb_utf8_str_new(p.data, p.size);
|
527
|
-
duckdb_free(p.data);
|
528
|
-
return obj;
|
529
|
-
}
|
530
|
-
#endif
|
531
|
-
return Qnil;
|
532
|
-
}
|
533
|
-
|
534
|
-
static VALUE duckdb_result__to_string_internal(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
535
|
-
rubyDuckDBResult *ctx;
|
536
|
-
duckdb_string p;
|
537
|
-
VALUE obj;
|
538
|
-
#ifdef DUCKDB_API_NO_DEPRECATED
|
539
|
-
// duckdb_value_string_internal will be deprecated in the future.
|
540
|
-
#else
|
541
|
-
rb_warn("private method `_to_string_internal` will be deprecated in the future. Set DuckDB::Result#use_chunk_each to true.");
|
542
|
-
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
543
|
-
|
544
|
-
p = duckdb_value_string_internal(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
545
|
-
if (p.data) {
|
546
|
-
obj = rb_utf8_str_new(p.data, p.size);
|
547
|
-
return obj;
|
548
|
-
}
|
549
|
-
#endif
|
550
|
-
return Qnil;
|
551
|
-
}
|
552
|
-
|
553
|
-
static VALUE duckdb_result__to_blob(VALUE oDuckDBResult, VALUE row_idx, VALUE col_idx) {
|
554
|
-
rubyDuckDBResult *ctx;
|
555
|
-
TypedData_Get_Struct(oDuckDBResult, rubyDuckDBResult, &result_data_type, ctx);
|
556
|
-
|
557
|
-
return to_ruby_obj_blob(&(ctx->result), NUM2LL(col_idx), NUM2LL(row_idx));
|
319
|
+
return INT2FIX(duckdb_result_statement_type(ctx->result));
|
558
320
|
}
|
559
321
|
|
560
322
|
static VALUE duckdb_result__enum_internal_type(VALUE oDuckDBResult, VALUE col_idx) {
|
@@ -608,27 +370,47 @@ VALUE rbduckdb_create_result(void) {
|
|
608
370
|
return allocate(cDuckDBResult);
|
609
371
|
}
|
610
372
|
|
611
|
-
static VALUE
|
612
|
-
|
373
|
+
static VALUE infinite_date_value(duckdb_date date) {
|
374
|
+
if (duckdb_is_finite_date(date) == false) {
|
375
|
+
return rb_funcall(mDuckDBConverter, id__to_infinity, 1,
|
376
|
+
INT2NUM(date.days)
|
377
|
+
);
|
378
|
+
}
|
379
|
+
return Qnil;
|
380
|
+
}
|
613
381
|
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
382
|
+
static VALUE vector_date(void *vector_data, idx_t row_idx) {
|
383
|
+
duckdb_date date = ((duckdb_date *) vector_data)[row_idx];
|
384
|
+
VALUE obj = infinite_date_value(date);
|
385
|
+
|
386
|
+
if (obj == Qnil) {
|
387
|
+
duckdb_date_struct date_st = duckdb_from_date(date);
|
388
|
+
obj = rb_funcall(mDuckDBConverter, id__to_date, 3,
|
389
|
+
INT2FIX(date_st.year),
|
390
|
+
INT2FIX(date_st.month),
|
391
|
+
INT2FIX(date_st.day)
|
392
|
+
);
|
393
|
+
}
|
394
|
+
return obj;
|
619
395
|
}
|
620
396
|
|
621
397
|
static VALUE vector_timestamp(void* vector_data, idx_t row_idx) {
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
398
|
+
duckdb_timestamp data = ((duckdb_timestamp *)vector_data)[row_idx];
|
399
|
+
VALUE obj = infinite_timestamp_value(data);
|
400
|
+
|
401
|
+
if (obj == Qnil) {
|
402
|
+
duckdb_timestamp_struct data_st = duckdb_from_timestamp(data);
|
403
|
+
return rb_funcall(mDuckDBConverter, id__to_time, 7,
|
404
|
+
INT2FIX(data_st.date.year),
|
405
|
+
INT2FIX(data_st.date.month),
|
406
|
+
INT2FIX(data_st.date.day),
|
407
|
+
INT2FIX(data_st.time.hour),
|
408
|
+
INT2FIX(data_st.time.min),
|
409
|
+
INT2FIX(data_st.time.sec),
|
410
|
+
INT2NUM(data_st.time.micros)
|
411
|
+
);
|
412
|
+
}
|
413
|
+
return obj;
|
632
414
|
}
|
633
415
|
|
634
416
|
static VALUE vector_time(void* vector_data, idx_t row_idx) {
|
@@ -723,11 +505,20 @@ static VALUE vector_decimal(duckdb_logical_type ty, void* vector_data, idx_t row
|
|
723
505
|
);
|
724
506
|
}
|
725
507
|
|
508
|
+
static VALUE infinite_timestamp_value(duckdb_timestamp timestamp) {
|
509
|
+
if (duckdb_is_finite_timestamp(timestamp) == false) {
|
510
|
+
return rb_funcall(mDuckDBConverter, id__to_infinity, 1,
|
511
|
+
LL2NUM(timestamp.micros)
|
512
|
+
);
|
513
|
+
}
|
514
|
+
return Qnil;
|
515
|
+
}
|
516
|
+
|
726
517
|
static VALUE vector_timestamp_s(void* vector_data, idx_t row_idx) {
|
727
518
|
duckdb_timestamp data = ((duckdb_timestamp *)vector_data)[row_idx];
|
728
519
|
return rb_funcall(mDuckDBConverter, id__to_time_from_duckdb_timestamp_s, 1,
|
729
520
|
LL2NUM(data.micros)
|
730
|
-
|
521
|
+
);
|
731
522
|
}
|
732
523
|
|
733
524
|
static VALUE vector_timestamp_ms(void* vector_data, idx_t row_idx) {
|
@@ -1099,6 +890,7 @@ void rbduckdb_init_duckdb_result(void) {
|
|
1099
890
|
id__to_time_from_duckdb_timestamp_ns = rb_intern("_to_time_from_duckdb_timestamp_ns");
|
1100
891
|
id__to_time_from_duckdb_time_tz = rb_intern("_to_time_from_duckdb_time_tz");
|
1101
892
|
id__to_time_from_duckdb_timestamp_tz = rb_intern("_to_time_from_duckdb_timestamp_tz");
|
893
|
+
id__to_infinity = rb_intern("_to_infinity");
|
1102
894
|
|
1103
895
|
rb_define_alloc_func(cDuckDBResult, allocate);
|
1104
896
|
|
@@ -1110,20 +902,9 @@ void rbduckdb_init_duckdb_result(void) {
|
|
1110
902
|
rb_define_method(cDuckDBResult, "chunk_each", duckdb_result_chunk_each, 0);
|
1111
903
|
rb_define_private_method(cDuckDBResult, "_chunk_stream", duckdb_result__chunk_stream, 0);
|
1112
904
|
rb_define_private_method(cDuckDBResult, "_column_type", duckdb_result__column_type, 1);
|
905
|
+
rb_define_private_method(cDuckDBResult, "_return_type", duckdb_result__return_type, 0);
|
906
|
+
rb_define_private_method(cDuckDBResult, "_statement_type", duckdb_result__statement_type, 0);
|
1113
907
|
|
1114
|
-
rb_define_private_method(cDuckDBResult, "_null?", duckdb_result__is_null, 2); /* deprecated */
|
1115
|
-
rb_define_private_method(cDuckDBResult, "_to_boolean", duckdb_result__to_boolean, 2); /* deprecated */
|
1116
|
-
rb_define_private_method(cDuckDBResult, "_to_smallint", duckdb_result__to_smallint, 2); /* deprecated */
|
1117
|
-
rb_define_private_method(cDuckDBResult, "_to_utinyint", duckdb_result__to_utinyint, 2); /* deprecated */
|
1118
|
-
rb_define_private_method(cDuckDBResult, "_to_integer", duckdb_result__to_integer, 2); /* deprecated */
|
1119
|
-
rb_define_private_method(cDuckDBResult, "_to_bigint", duckdb_result__to_bigint, 2); /* deprecated */
|
1120
|
-
rb_define_private_method(cDuckDBResult, "__to_hugeint_internal", duckdb_result___to_hugeint_internal, 2); /* deprecated */
|
1121
|
-
rb_define_private_method(cDuckDBResult, "__to_decimal_internal", duckdb_result___to_decimal_internal, 2); /* deprecated */
|
1122
|
-
rb_define_private_method(cDuckDBResult, "_to_float", duckdb_result__to_float, 2); /* deprecated */
|
1123
|
-
rb_define_private_method(cDuckDBResult, "_to_double", duckdb_result__to_double, 2); /* deprecated */
|
1124
|
-
rb_define_private_method(cDuckDBResult, "_to_string", duckdb_result__to_string, 2); /* deprecated */
|
1125
|
-
rb_define_private_method(cDuckDBResult, "_to_string_internal", duckdb_result__to_string_internal, 2); /* deprecated */
|
1126
|
-
rb_define_private_method(cDuckDBResult, "_to_blob", duckdb_result__to_blob, 2); /* deprecated */
|
1127
908
|
rb_define_private_method(cDuckDBResult, "_enum_internal_type", duckdb_result__enum_internal_type, 1);
|
1128
909
|
rb_define_private_method(cDuckDBResult, "_enum_dictionary_size", duckdb_result__enum_dictionary_size, 1);
|
1129
910
|
rb_define_private_method(cDuckDBResult, "_enum_dictionary_value", duckdb_result__enum_dictionary_value, 2);
|
data/ext/duckdb/ruby-duckdb.h
CHANGED
@@ -15,6 +15,10 @@
|
|
15
15
|
#define HAVE_DUCKDB_H_GE_V1_0_0 1
|
16
16
|
#endif
|
17
17
|
|
18
|
+
#ifdef HAVE_DUCKDB_RESULT_ERROR_TYPE
|
19
|
+
#define HAVE_DUCKDB_H_GE_V1_1_0 1
|
20
|
+
#endif
|
21
|
+
|
18
22
|
#include "./error.h"
|
19
23
|
#include "./database.h"
|
20
24
|
#include "./connection.h"
|
@@ -38,5 +42,7 @@ extern VALUE cDuckDBConfig;
|
|
38
42
|
extern VALUE eDuckDBError;
|
39
43
|
extern VALUE mDuckDBConverter;
|
40
44
|
extern VALUE cDuckDBPreparedStatement;
|
45
|
+
extern VALUE PositiveInfinity;
|
46
|
+
extern VALUE NegativeInfinity;
|
41
47
|
|
42
48
|
#endif
|
data/lib/duckdb/column.rb
CHANGED
@@ -17,44 +17,8 @@ module DuckDB
|
|
17
17
|
# columns.first.type #=> :integer
|
18
18
|
#
|
19
19
|
def type
|
20
|
-
|
21
|
-
|
22
|
-
boolean
|
23
|
-
tinyint
|
24
|
-
smallint
|
25
|
-
integer
|
26
|
-
bigint
|
27
|
-
utinyint
|
28
|
-
usmallint
|
29
|
-
uinteger
|
30
|
-
ubigint
|
31
|
-
float
|
32
|
-
double
|
33
|
-
timestamp
|
34
|
-
date
|
35
|
-
time
|
36
|
-
interval
|
37
|
-
hugeint
|
38
|
-
varchar
|
39
|
-
blob
|
40
|
-
decimal
|
41
|
-
timestamp_s
|
42
|
-
timestamp_ms
|
43
|
-
timestamp_ns
|
44
|
-
enum
|
45
|
-
list
|
46
|
-
struct
|
47
|
-
map
|
48
|
-
uuid
|
49
|
-
json
|
50
|
-
]
|
51
|
-
if Gem::Version.new(DuckDB::LIBRARY_VERSION) == Gem::Version.new('0.10.0')
|
52
|
-
types[17, 0] = :uhugeint
|
53
|
-
end
|
54
|
-
index = _type
|
55
|
-
return :unknown if index >= types.size
|
56
|
-
|
57
|
-
types[index]
|
20
|
+
type_id = _type
|
21
|
+
DuckDB::Converter::IntToSym.type_to_sym(type_id)
|
58
22
|
end
|
59
23
|
end
|
60
24
|
end
|
data/lib/duckdb/config.rb
CHANGED
@@ -1,64 +1,62 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module DuckDB
|
4
|
-
|
5
|
-
|
4
|
+
# The DuckDB::Config encapsulates DuckDB Configuration.
|
5
|
+
#
|
6
|
+
# require 'duckdb'
|
7
|
+
# config = DuckDB::Config.new
|
8
|
+
# config['default_order'] = 'DESC'
|
9
|
+
# db = DuckDB::Database.open(nil, config)
|
10
|
+
# con = db.connect
|
11
|
+
# con.query('CREATE TABLE numbers (number INTEGER)')
|
12
|
+
# con.query('INSERT INTO numbers VALUES (2), (1), (4), (3)')
|
13
|
+
#
|
14
|
+
# # number is ordered by descending.
|
15
|
+
# r = con.query('SELECT number FROM numbers ORDER BY number)
|
16
|
+
# r.first.first # => 4
|
17
|
+
class Config
|
18
|
+
class << self
|
19
|
+
#
|
20
|
+
# returns available configuration name and the description.
|
21
|
+
# The return value is array object. The first element is the configuration
|
22
|
+
# name. The second is the description.
|
23
|
+
#
|
24
|
+
# key, desc = DuckDB::Config.key_description(0)
|
25
|
+
# key # => "access_mode"
|
26
|
+
# desc # => "Access mode of the database ([AUTOMATIC], READ_ONLY or READ_WRITE)"
|
27
|
+
#
|
28
|
+
alias key_description get_config_flag
|
29
|
+
|
30
|
+
#
|
31
|
+
# returns the Hash object of all available configuration names and
|
32
|
+
# the descriptions.
|
33
|
+
#
|
34
|
+
# configs = DuckDB::Config.key_descriptions
|
35
|
+
# configs['default_order'] # => "The order type used when none is specified ([ASC] or DESC)"
|
36
|
+
#
|
37
|
+
def key_descriptions
|
38
|
+
@key_descriptions ||= (0...size).each_with_object({}) do |i, hash|
|
39
|
+
key, description = key_description(i)
|
40
|
+
hash[key] = description
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# set configuration value
|
6
47
|
#
|
7
|
-
# require 'duckdb'
|
8
48
|
# config = DuckDB::Config.new
|
49
|
+
# # config.set_config('default_order', 'DESC')
|
9
50
|
# config['default_order'] = 'DESC'
|
51
|
+
#
|
10
52
|
# db = DuckDB::Database.open(nil, config)
|
11
53
|
# con = db.connect
|
12
54
|
# con.query('CREATE TABLE numbers (number INTEGER)')
|
13
55
|
# con.query('INSERT INTO numbers VALUES (2), (1), (4), (3)')
|
14
56
|
#
|
15
|
-
# #
|
57
|
+
# # numbers are ordered by descending.
|
16
58
|
# r = con.query('SELECT number FROM numbers ORDER BY number)
|
17
59
|
# r.first.first # => 4
|
18
|
-
|
19
|
-
class << self
|
20
|
-
#
|
21
|
-
# returns available configuration name and the description.
|
22
|
-
# The return value is array object. The first element is the configuration
|
23
|
-
# name. The second is the description.
|
24
|
-
#
|
25
|
-
# key, desc = DuckDB::Config.key_description(0)
|
26
|
-
# key # => "access_mode"
|
27
|
-
# desc # => "Access mode of the database ([AUTOMATIC], READ_ONLY or READ_WRITE)"
|
28
|
-
#
|
29
|
-
alias key_description get_config_flag
|
30
|
-
|
31
|
-
#
|
32
|
-
# returns the Hash object of all available configuration names and
|
33
|
-
# the descriptions.
|
34
|
-
#
|
35
|
-
# configs = DuckDB::Config.key_descriptions
|
36
|
-
# configs['default_order'] # => "The order type used when none is specified ([ASC] or DESC)"
|
37
|
-
#
|
38
|
-
def key_descriptions
|
39
|
-
@key_descriptions ||= (0...size).each_with_object({}) do |i, hash|
|
40
|
-
key, description = key_description(i)
|
41
|
-
hash[key] = description
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
#
|
47
|
-
# set configuration value
|
48
|
-
#
|
49
|
-
# config = DuckDB::Config.new
|
50
|
-
# # config.set_config('default_order', 'DESC')
|
51
|
-
# config['default_order'] = 'DESC'
|
52
|
-
#
|
53
|
-
# db = DuckDB::Database.open(nil, config)
|
54
|
-
# con = db.connect
|
55
|
-
# con.query('CREATE TABLE numbers (number INTEGER)')
|
56
|
-
# con.query('INSERT INTO numbers VALUES (2), (1), (4), (3)')
|
57
|
-
#
|
58
|
-
# # numbers are ordered by descending.
|
59
|
-
# r = con.query('SELECT number FROM numbers ORDER BY number)
|
60
|
-
# r.first.first # => 4
|
61
|
-
alias []= set_config
|
62
|
-
end
|
60
|
+
alias []= set_config
|
63
61
|
end
|
64
62
|
end
|
data/lib/duckdb/connection.rb
CHANGED
@@ -62,7 +62,6 @@ module DuckDB
|
|
62
62
|
# This method returns DuckDB::PendingResult object.
|
63
63
|
#
|
64
64
|
# require 'duckdb'
|
65
|
-
# DuckDB::Result.use_chunk_each = true # must be true
|
66
65
|
# db = DuckDB::Database.open('duckdb_file')
|
67
66
|
# con = db.connect
|
68
67
|
#
|
@@ -98,6 +97,14 @@ module DuckDB
|
|
98
97
|
# returns PreparedStatement object.
|
99
98
|
# The first argument is SQL string.
|
100
99
|
#
|
100
|
+
# require 'duckdb'
|
101
|
+
# db = DuckDB::Database.open('duckdb_file')
|
102
|
+
# con = db.connect
|
103
|
+
#
|
104
|
+
# sql = 'SELECT * FROM users WHERE name = $name AND email = $email'
|
105
|
+
# stmt = con.prepared_statement(sql)
|
106
|
+
# stmt.bind_args(name: 'Dave', email: 'dave@example.com')
|
107
|
+
# result = stmt.execute
|
101
108
|
def prepared_statement(str)
|
102
109
|
PreparedStatement.new(self, str)
|
103
110
|
end
|
@@ -127,5 +134,6 @@ module DuckDB
|
|
127
134
|
alias async_execute async_query
|
128
135
|
alias open connect
|
129
136
|
alias close disconnect
|
137
|
+
alias prepare prepared_statement
|
130
138
|
end
|
131
139
|
end
|