duckdb 1.0.0.2 → 1.1.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 +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
|