duckdb 1.2.0.0 → 1.2.2.0
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 +2 -2
- data/.github/workflows/test_on_ubuntu.yml +2 -2
- data/.github/workflows/test_on_windows.yml +3 -2
- data/CHANGELOG.md +30 -0
- data/Dockerfile +1 -1
- data/Gemfile.lock +9 -9
- data/ext/duckdb/appender.c +58 -104
- data/ext/duckdb/database.c +8 -0
- data/ext/duckdb/database.h +1 -0
- data/ext/duckdb/duckdb.c +3 -0
- data/ext/duckdb/extconf.rb +5 -5
- data/ext/duckdb/instance_cache.c +108 -0
- data/ext/duckdb/instance_cache.h +17 -0
- data/ext/duckdb/logical_type.c +255 -0
- data/ext/duckdb/prepared_statement.c +89 -3
- data/ext/duckdb/result.c +1 -1
- data/ext/duckdb/ruby-duckdb.h +12 -8
- data/lib/duckdb/appender.rb +263 -24
- data/lib/duckdb/instance_cache.rb +26 -0
- data/lib/duckdb/logical_type.rb +131 -0
- data/lib/duckdb/prepared_statement.rb +58 -1
- data/lib/duckdb/version.rb +1 -1
- data/lib/duckdb.rb +1 -0
- metadata +6 -3
data/lib/duckdb/appender.rb
CHANGED
@@ -203,27 +203,235 @@ module DuckDB
|
|
203
203
|
end
|
204
204
|
|
205
205
|
# call-seq:
|
206
|
-
#
|
206
|
+
# appender.append_uint8(val) -> self
|
207
207
|
#
|
208
208
|
# Appends an uint8 value to the current row in the appender.
|
209
209
|
#
|
210
|
-
#
|
211
|
-
#
|
212
|
-
#
|
213
|
-
#
|
214
|
-
#
|
215
|
-
#
|
216
|
-
#
|
217
|
-
#
|
218
|
-
#
|
219
|
-
#
|
210
|
+
# require 'duckdb'
|
211
|
+
# db = DuckDB::Database.open
|
212
|
+
# con = db.connect
|
213
|
+
# con.query('CREATE TABLE users (id INTEGER, age UTINYINT)')
|
214
|
+
# appender = con.appender('users')
|
215
|
+
# appender
|
216
|
+
# .append_int32(1)
|
217
|
+
# .append_uint8(20)
|
218
|
+
# .end_row
|
219
|
+
# .flush
|
220
220
|
def append_uint8(value)
|
221
221
|
return self if _append_uint8(value)
|
222
222
|
|
223
223
|
raise_appender_error('failed to append_uint8')
|
224
224
|
end
|
225
225
|
|
226
|
-
#
|
226
|
+
# call-seq:
|
227
|
+
# appender.append_uint16(val) -> self
|
228
|
+
#
|
229
|
+
# Appends an uint16 value to the current row in the appender.
|
230
|
+
#
|
231
|
+
# require 'duckdb'
|
232
|
+
# db = DuckDB::Database.open
|
233
|
+
# con = db.connect
|
234
|
+
# con.query('CREATE TABLE users (id INTEGER, age USMALLINT)')
|
235
|
+
# appender = con.appender('users')
|
236
|
+
# appender
|
237
|
+
# .append_int32(1)
|
238
|
+
# .append_uint16(20)
|
239
|
+
# .end_row
|
240
|
+
# .flush
|
241
|
+
def append_uint16(value)
|
242
|
+
return self if _append_uint16(value)
|
243
|
+
|
244
|
+
raise_appender_error('failed to append_uint16')
|
245
|
+
end
|
246
|
+
|
247
|
+
# call-seq:
|
248
|
+
# appender.append_uint32(val) -> self
|
249
|
+
#
|
250
|
+
# Appends an uint32 value to the current row in the appender.
|
251
|
+
#
|
252
|
+
# require 'duckdb'
|
253
|
+
# db = DuckDB::Database.open
|
254
|
+
# con = db.connect
|
255
|
+
# con.query('CREATE TABLE users (id INTEGER, age UINTEGER)')
|
256
|
+
# appender = con.appender('users')
|
257
|
+
# appender
|
258
|
+
# .append_int32(1)
|
259
|
+
# .append_uint32(20)
|
260
|
+
# .end_row
|
261
|
+
# .flush
|
262
|
+
def append_uint32(value)
|
263
|
+
return self if _append_uint32(value)
|
264
|
+
|
265
|
+
raise_appender_error('failed to append_uint32')
|
266
|
+
end
|
267
|
+
|
268
|
+
# call-seq:
|
269
|
+
# appender.append_uint64(val) -> self
|
270
|
+
#
|
271
|
+
# Appends an uint64 value to the current row in the appender.
|
272
|
+
#
|
273
|
+
# require 'duckdb'
|
274
|
+
# db = DuckDB::Database.open
|
275
|
+
# con = db.connect
|
276
|
+
# con.query('CREATE TABLE users (id INTEGER, age UBIGINT)')
|
277
|
+
# appender = con.appender('users')
|
278
|
+
# Appender
|
279
|
+
# .append_int32(1)
|
280
|
+
# .append_uint64(20)
|
281
|
+
# .end_row
|
282
|
+
# .flush
|
283
|
+
def append_uint64(value)
|
284
|
+
return self if _append_uint64(value)
|
285
|
+
|
286
|
+
raise_appender_error('failed to append_uint64')
|
287
|
+
end
|
288
|
+
|
289
|
+
# call-seq:
|
290
|
+
# appender.append_float(val) -> self
|
291
|
+
#
|
292
|
+
# Appends a float value to the current row in the appender.
|
293
|
+
#
|
294
|
+
# require 'duckdb'
|
295
|
+
# db = DuckDB::Database.open
|
296
|
+
# con = db.connect
|
297
|
+
# con.query('CREATE TABLE numbers (num FLOAT)')
|
298
|
+
# appender = con.appender('numbers')
|
299
|
+
# appender
|
300
|
+
# .append_float(1.23)
|
301
|
+
# .end_row
|
302
|
+
# .flush
|
303
|
+
def append_float(value)
|
304
|
+
return self if _append_float(value)
|
305
|
+
|
306
|
+
raise_appender_error('failed to append_float')
|
307
|
+
end
|
308
|
+
|
309
|
+
# call-seq:
|
310
|
+
# appender.append_double(val) -> self
|
311
|
+
#
|
312
|
+
# Appends a double value to the current row in the appender.
|
313
|
+
#
|
314
|
+
# require 'duckdb'
|
315
|
+
# db = DuckDB::Database.open
|
316
|
+
# con = db.connect
|
317
|
+
# con.query('CREATE TABLE numbers (num DOUBLE)')
|
318
|
+
# appender = con.appender('numbers')
|
319
|
+
# appender
|
320
|
+
# .append_double(1.23)
|
321
|
+
# .end_row
|
322
|
+
# .flush
|
323
|
+
def append_double(value)
|
324
|
+
return self if _append_double(value)
|
325
|
+
|
326
|
+
raise_appender_error('failed to append_double')
|
327
|
+
end
|
328
|
+
|
329
|
+
# call-seq:
|
330
|
+
# appender.append_varchar(val) -> self
|
331
|
+
#
|
332
|
+
# Appends a varchar value to the current row in the appender.
|
333
|
+
#
|
334
|
+
# require 'duckdb'
|
335
|
+
# db = DuckDB::Database.open
|
336
|
+
# con = db.connect
|
337
|
+
# con.query('CREATE TABLE names (name VARCHAR)')
|
338
|
+
# appender = con.appender('names')
|
339
|
+
# appender
|
340
|
+
# .append_varchar('Alice')
|
341
|
+
# .end_row
|
342
|
+
# .flush
|
343
|
+
def append_varchar(value)
|
344
|
+
return self if _append_varchar(value)
|
345
|
+
|
346
|
+
raise_appender_error('failed to append_varchar')
|
347
|
+
end
|
348
|
+
|
349
|
+
# call-seq:
|
350
|
+
# appender.append_varchar_length(val, len) -> self
|
351
|
+
#
|
352
|
+
# Appends a varchar value to the current row in the appender.
|
353
|
+
#
|
354
|
+
# require 'duckdb'
|
355
|
+
# db = DuckDB::Database.open
|
356
|
+
# con = db.connect
|
357
|
+
# con.query('CREATE TABLE names (name VARCHAR)')
|
358
|
+
# appender = con.appender('names')
|
359
|
+
# appender
|
360
|
+
# .append_varchar_length('Alice', 5)
|
361
|
+
# .end_row
|
362
|
+
# .flush
|
363
|
+
def append_varchar_length(value, length)
|
364
|
+
return self if _append_varchar_length(value, length)
|
365
|
+
|
366
|
+
raise_appender_error('failed to append_varchar_length')
|
367
|
+
end
|
368
|
+
|
369
|
+
# call-seq:
|
370
|
+
# appender.append_blob(val) -> self
|
371
|
+
#
|
372
|
+
# Appends a varchar value to the current row in the appender.
|
373
|
+
#
|
374
|
+
# require 'duckdb'
|
375
|
+
# db = DuckDB::Database.open
|
376
|
+
# con = db.connect
|
377
|
+
# con.query('CREATE TABLE values (value BLOB)')
|
378
|
+
# appender = con.appender('values')
|
379
|
+
# appender
|
380
|
+
# .append('\0\1\2\3\4\5'.encode(Encoding::BINARY))
|
381
|
+
# .end_row
|
382
|
+
# .flush
|
383
|
+
def append_blob(value)
|
384
|
+
return self if _append_blob(value)
|
385
|
+
|
386
|
+
raise_appender_error('failed to append_blob')
|
387
|
+
end
|
388
|
+
|
389
|
+
# call-seq:
|
390
|
+
# appender.append_null -> self
|
391
|
+
#
|
392
|
+
# Appends a NULL value to the current row in the appender.
|
393
|
+
#
|
394
|
+
# require 'duckdb'
|
395
|
+
# db = DuckDB::Database.open
|
396
|
+
# con = db.connect
|
397
|
+
# con.query('CREATE TABLE values (value INTEGER)')
|
398
|
+
# appender = con.appender('values')
|
399
|
+
# appender
|
400
|
+
# .append_null
|
401
|
+
# .end_row
|
402
|
+
# .flush
|
403
|
+
def append_null
|
404
|
+
return self if _append_null
|
405
|
+
|
406
|
+
raise_appender_error('failed to append_null')
|
407
|
+
end
|
408
|
+
|
409
|
+
# call-seq:
|
410
|
+
# appender.append_default -> self
|
411
|
+
#
|
412
|
+
# Appends a default value to the current row in the appender.
|
413
|
+
# If the column does not have a default value, this method
|
414
|
+
# appends a NULL value.
|
415
|
+
#
|
416
|
+
# require 'duckdb'
|
417
|
+
# db = DuckDB::Database.open
|
418
|
+
# con = db.connect
|
419
|
+
# con.query('CREATE TABLE values (value INTEGER DEFAULT 1)')
|
420
|
+
# appender = con.appender('values')
|
421
|
+
# appender
|
422
|
+
# .append_default
|
423
|
+
# .end_row
|
424
|
+
# .flush
|
425
|
+
def append_default
|
426
|
+
return self if _append_default
|
427
|
+
|
428
|
+
raise_appender_error('failed to append_default')
|
429
|
+
end
|
430
|
+
|
431
|
+
# call-seq:
|
432
|
+
# appender.append_hugeint(val) -> self
|
433
|
+
#
|
434
|
+
# Appends a huge int value to the current row in the appender.
|
227
435
|
#
|
228
436
|
# require 'duckdb'
|
229
437
|
# db = DuckDB::Database.open
|
@@ -233,12 +441,19 @@ module DuckDB
|
|
233
441
|
# appender
|
234
442
|
# .append_hugeint(-170_141_183_460_469_231_731_687_303_715_884_105_727)
|
235
443
|
# .end_row
|
444
|
+
# .flush
|
236
445
|
def append_hugeint(value)
|
237
446
|
lower, upper = integer_to_hugeint(value)
|
238
|
-
|
447
|
+
|
448
|
+
return self if _append_hugeint(lower, upper)
|
449
|
+
|
450
|
+
raise_appender_error('failed to append_hugeint')
|
239
451
|
end
|
240
452
|
|
241
|
-
#
|
453
|
+
# call-seq:
|
454
|
+
# appender.append_uhugeint(val) -> self
|
455
|
+
#
|
456
|
+
# Appends an unsigned huge int value to the current row in the appender.
|
242
457
|
#
|
243
458
|
# require 'duckdb'
|
244
459
|
# db = DuckDB::Database.open
|
@@ -248,12 +463,19 @@ module DuckDB
|
|
248
463
|
# appender
|
249
464
|
# .append_hugeint(340_282_366_920_938_463_463_374_607_431_768_211_455)
|
250
465
|
# .end_row
|
466
|
+
# .flush
|
251
467
|
def append_uhugeint(value)
|
252
468
|
lower, upper = integer_to_hugeint(value)
|
253
|
-
|
469
|
+
|
470
|
+
return self if _append_uhugeint(lower, upper)
|
471
|
+
|
472
|
+
raise_appender_error('failed to append_uhugeint')
|
254
473
|
end
|
255
474
|
|
256
|
-
#
|
475
|
+
# call-seq:
|
476
|
+
# appender.append_date(val) -> self
|
477
|
+
#
|
478
|
+
# Appends a date value to the current row in the appender.
|
257
479
|
#
|
258
480
|
# require 'duckdb'
|
259
481
|
# db = DuckDB::Database.open
|
@@ -269,10 +491,15 @@ module DuckDB
|
|
269
491
|
def append_date(value)
|
270
492
|
date = _parse_date(value)
|
271
493
|
|
272
|
-
_append_date(date.year, date.month, date.day)
|
494
|
+
return self if _append_date(date.year, date.month, date.day)
|
495
|
+
|
496
|
+
raise_appender_error('failed to append_date')
|
273
497
|
end
|
274
498
|
|
275
|
-
#
|
499
|
+
# call-seq:
|
500
|
+
# appender.append_time(val) -> self
|
501
|
+
#
|
502
|
+
# Appends a time value to the current row in the appender.
|
276
503
|
#
|
277
504
|
# require 'duckdb'
|
278
505
|
# db = DuckDB::Database.open
|
@@ -287,10 +514,15 @@ module DuckDB
|
|
287
514
|
def append_time(value)
|
288
515
|
time = _parse_time(value)
|
289
516
|
|
290
|
-
_append_time(time.hour, time.min, time.sec, time.usec)
|
517
|
+
return self if _append_time(time.hour, time.min, time.sec, time.usec)
|
518
|
+
|
519
|
+
raise_appender_error('failed to append_time')
|
291
520
|
end
|
292
521
|
|
293
|
-
#
|
522
|
+
# call-seq:
|
523
|
+
# appender.append_timestamp(val) -> self
|
524
|
+
#
|
525
|
+
# Appends a timestamp value to the current row in the appender.
|
294
526
|
#
|
295
527
|
# require 'duckdb'
|
296
528
|
# db = DuckDB::Database.open
|
@@ -306,12 +538,16 @@ module DuckDB
|
|
306
538
|
def append_timestamp(value)
|
307
539
|
time = to_time(value)
|
308
540
|
|
309
|
-
_append_timestamp(time.year, time.month, time.day, time.hour, time.min, time.sec, time.nsec / 1000)
|
541
|
+
return self if _append_timestamp(time.year, time.month, time.day, time.hour, time.min, time.sec, time.nsec / 1000)
|
542
|
+
|
543
|
+
raise_appender_error('failed to append_timestamp')
|
310
544
|
end
|
311
545
|
|
312
|
-
#
|
546
|
+
# call-seq:
|
547
|
+
# appender.append_interval(val) -> self
|
548
|
+
#
|
549
|
+
# Appends an interval value to the current row in the appender.
|
313
550
|
# The argument must be ISO8601 duration format.
|
314
|
-
# WARNING: This method is expremental.
|
315
551
|
#
|
316
552
|
# require 'duckdb'
|
317
553
|
# db = DuckDB::Database.open
|
@@ -324,7 +560,10 @@ module DuckDB
|
|
324
560
|
# .flush
|
325
561
|
def append_interval(value)
|
326
562
|
value = Interval.to_interval(value)
|
327
|
-
|
563
|
+
|
564
|
+
return self if _append_interval(value.interval_months, value.interval_days, value.interval_micros)
|
565
|
+
|
566
|
+
raise_appender_error('failed to append_interval')
|
328
567
|
end
|
329
568
|
|
330
569
|
# appends value.
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
if defined?(DuckDB::InstanceCache)
|
4
|
+
|
5
|
+
module DuckDB
|
6
|
+
# The DuckDB::InstanceCache is necessary if a client/program (re)opens
|
7
|
+
# multiple databases to the same file within the same statement.
|
8
|
+
#
|
9
|
+
# require 'duckdb'
|
10
|
+
# cache = DuckDB::InstanceCache.new
|
11
|
+
# db1 = cache.get(path: 'db.duckdb')
|
12
|
+
# db2 = cache.get(path: 'db.duckdb')
|
13
|
+
class InstanceCache
|
14
|
+
# :call-seq:
|
15
|
+
# instance_cache.get(path:, config:) -> self
|
16
|
+
#
|
17
|
+
# Returns a DuckDB::Database object for the given path and config.
|
18
|
+
# db1 = cache.get(path: 'db.duckdb')
|
19
|
+
# db2 = cache.get(path: 'db.duckdb')
|
20
|
+
def get(path: nil, config: nil)
|
21
|
+
get_or_create(path, config)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/lib/duckdb/logical_type.rb
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
module DuckDB
|
4
4
|
class LogicalType
|
5
|
+
alias :alias get_alias
|
6
|
+
alias :alias= set_alias
|
7
|
+
|
5
8
|
# returns logical type's type symbol
|
6
9
|
# `:unknown` means that the logical type's type is unknown/unsupported by ruby-duckdb.
|
7
10
|
# `:invalid` means that the logical type's type is invalid in duckdb.
|
@@ -18,5 +21,133 @@ module DuckDB
|
|
18
21
|
type_id = _type
|
19
22
|
DuckDB::Converter::IntToSym.type_to_sym(type_id)
|
20
23
|
end
|
24
|
+
|
25
|
+
# returns logical type's internal type symbol for Decimal or Enum types
|
26
|
+
# `:unknown` means that the logical type's type is unknown/unsupported by ruby-duckdb.
|
27
|
+
# `:invalid` means that the logical type's type is invalid in duckdb.
|
28
|
+
#
|
29
|
+
# require 'duckdb'
|
30
|
+
# db = DuckDB::Database.open
|
31
|
+
# con = db.connect
|
32
|
+
# con.query("CREATE TYPE mood AS ENUM ('happy', 'sad')")
|
33
|
+
# con.query("CREATE TABLE emotions (id INTEGER, enum_col mood)")
|
34
|
+
#
|
35
|
+
# users = con.query('SELECT * FROM emotions')
|
36
|
+
# ernum_col = users.columns.find { |col| col.name == 'enum_col' }
|
37
|
+
# enum_col.logical_type.internal_type #=> :utinyint
|
38
|
+
def internal_type
|
39
|
+
type_id = _internal_type
|
40
|
+
DuckDB::Converter::IntToSym.type_to_sym(type_id)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Iterates over each union member name.
|
44
|
+
#
|
45
|
+
# When a block is provided, this method yields each union member name in
|
46
|
+
# order. It also returns the total number of members yielded.
|
47
|
+
#
|
48
|
+
# union_logical_type.each_member_name do |name|
|
49
|
+
# puts "Union member: #{name}"
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# If no block is given, an Enumerator is returned, which can be used to
|
53
|
+
# retrieve all member names.
|
54
|
+
#
|
55
|
+
# names = union_logical_type.each_member_name.to_a
|
56
|
+
# # => ["member1", "member2"]
|
57
|
+
def each_member_name
|
58
|
+
return to_enum(__method__) {member_count} unless block_given?
|
59
|
+
|
60
|
+
member_count.times do |i|
|
61
|
+
yield member_name_at(i)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Iterates over each union member type.
|
66
|
+
#
|
67
|
+
# When a block is provided, this method yields each union member logical
|
68
|
+
# type in order. It also returns the total number of members yielded.
|
69
|
+
#
|
70
|
+
# union_logical_type.each_member_type do |logical_type|
|
71
|
+
# puts "Union member: #{logical_type.type}"
|
72
|
+
# end
|
73
|
+
#
|
74
|
+
# If no block is given, an Enumerator is returned, which can be used to
|
75
|
+
# retrieve all member logical types.
|
76
|
+
#
|
77
|
+
# names = union_logical_type.each_member_type.map(&:type)
|
78
|
+
# # => [:varchar, :integer]
|
79
|
+
def each_member_type
|
80
|
+
return to_enum(__method__) {member_count} unless block_given?
|
81
|
+
|
82
|
+
member_count.times do |i|
|
83
|
+
yield member_type_at(i)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Iterates over each struct child name.
|
88
|
+
#
|
89
|
+
# When a block is provided, this method yields each struct child name in
|
90
|
+
# order. It also returns the total number of children yielded.
|
91
|
+
#
|
92
|
+
# struct_logical_type.each_child_name do |name|
|
93
|
+
# puts "Struct child: #{name}"
|
94
|
+
# end
|
95
|
+
#
|
96
|
+
# If no block is given, an Enumerator is returned, which can be used to
|
97
|
+
# retrieve all child names.
|
98
|
+
#
|
99
|
+
# names = struct_logical_type.each_child_name.to_a
|
100
|
+
# # => ["child1", "child2"]
|
101
|
+
def each_child_name
|
102
|
+
return to_enum(__method__) {child_count} unless block_given?
|
103
|
+
|
104
|
+
child_count.times do |i|
|
105
|
+
yield child_name_at(i)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Iterates over each struct child type.
|
110
|
+
#
|
111
|
+
# When a block is provided, this method yields each struct child type in
|
112
|
+
# order. It also returns the total number of children yielded.
|
113
|
+
#
|
114
|
+
# struct_logical_type.each_child_type do |logical_type|
|
115
|
+
# puts "Struct child type: #{logical_type.type}"
|
116
|
+
# end
|
117
|
+
#
|
118
|
+
# If no block is given, an Enumerator is returned, which can be used to
|
119
|
+
# retrieve all child logical types.
|
120
|
+
#
|
121
|
+
# types = struct_logical_type.each_child_type.map(&:type)
|
122
|
+
# # => [:integer, :varchar]
|
123
|
+
def each_child_type
|
124
|
+
return to_enum(__method__) {child_count} unless block_given?
|
125
|
+
|
126
|
+
child_count.times do |i|
|
127
|
+
yield child_type_at(i)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
# Iterates over each enum dictionary value.
|
132
|
+
#
|
133
|
+
# When a block is provided, this method yields each enum dictionary value
|
134
|
+
# in order. It also returns the total number of dictionary values yielded.
|
135
|
+
#
|
136
|
+
# enum_logical_type.each_value do |value|
|
137
|
+
# puts "Enum value: #{value}"
|
138
|
+
# end
|
139
|
+
#
|
140
|
+
# If no block is given, an Enumerator is returned, which can be used to
|
141
|
+
# retrieve all enum dictionary values.
|
142
|
+
#
|
143
|
+
# values = enum_logical_type.each_value.to_a
|
144
|
+
# # => ["happy", "sad"]
|
145
|
+
def each_dictionary_value
|
146
|
+
return to_enum(__method__) {dictionary_size} unless block_given?
|
147
|
+
|
148
|
+
dictionary_size.times do |i|
|
149
|
+
yield dictionary_value_at(i)
|
150
|
+
end
|
151
|
+
end
|
21
152
|
end
|
22
153
|
end
|
@@ -105,6 +105,46 @@ module DuckDB
|
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
|
+
# binds i-th parameter with SQL prepared statement.
|
109
|
+
# The first argument is index of parameter.
|
110
|
+
# The index of first parameter is 1 not 0.
|
111
|
+
# The second argument value is to expected Integer value between 0 to 255.
|
112
|
+
def bind_uint8(index, val)
|
113
|
+
return _bind_uint8(index, val) if val.between?(0, 255)
|
114
|
+
|
115
|
+
raise DuckDB::Error, "can't bind uint8(bind_uint8) to `#{val}`. The `#{val}` is out of range 0..255."
|
116
|
+
end
|
117
|
+
|
118
|
+
# binds i-th parameter with SQL prepared statement.
|
119
|
+
# The first argument is index of parameter.
|
120
|
+
# The index of first parameter is 1 not 0.
|
121
|
+
# The second argument value is to expected Integer value between 0 to 65535.
|
122
|
+
def bind_uint16(index, val)
|
123
|
+
return _bind_uint16(index, val) if val.between?(0, 65_535)
|
124
|
+
|
125
|
+
raise DuckDB::Error, "can't bind uint16(bind_uint16) to `#{val}`. The `#{val}` is out of range 0..65535."
|
126
|
+
end
|
127
|
+
|
128
|
+
# binds i-th parameter with SQL prepared statement.
|
129
|
+
# The first argument is index of parameter.
|
130
|
+
# The index of first parameter is 1 not 0.
|
131
|
+
# The second argument value is to expected Integer value between 0 to 4294967295.
|
132
|
+
def bind_uint32(index, val)
|
133
|
+
return _bind_uint32(index, val) if val.between?(0, 4_294_967_295)
|
134
|
+
|
135
|
+
raise DuckDB::Error, "can't bind uint32(bind_uint32) to `#{val}`. The `#{val}` is out of range 0..4294967295."
|
136
|
+
end
|
137
|
+
|
138
|
+
# binds i-th parameter with SQL prepared statement.
|
139
|
+
# The first argument is index of parameter.
|
140
|
+
# The index of first parameter is 1 not 0.
|
141
|
+
# The second argument value is to expected Integer value between 0 to 18446744073709551615.
|
142
|
+
def bind_uint64(index, val)
|
143
|
+
return _bind_uint64(index, val) if val.between?(0, 18_446_744_073_709_551_615)
|
144
|
+
|
145
|
+
raise DuckDB::Error, "can't bind uint64(bind_uint64) to `#{val}`. The `#{val}` is out of range 0..18446744073709551615."
|
146
|
+
end
|
147
|
+
|
108
148
|
# binds i-th parameter with SQL prepared statement.
|
109
149
|
# The first argument is index of parameter.
|
110
150
|
# The index of first parameter is 1 not 0.
|
@@ -135,7 +175,7 @@ module DuckDB
|
|
135
175
|
# require 'duckdb'
|
136
176
|
# db = DuckDB::Database.open('duckdb_database')
|
137
177
|
# con = db.connect
|
138
|
-
# sql ='SELECT name FROM users WHERE
|
178
|
+
# sql ='SELECT name FROM users WHERE hugeint_col = ?'
|
139
179
|
# stmt = PreparedStatement.new(con, sql)
|
140
180
|
# stmt.bind_hugeint_internal(1, 1_234_567_890_123_456_789_012_345)
|
141
181
|
def bind_hugeint_internal(index, value)
|
@@ -143,6 +183,23 @@ module DuckDB
|
|
143
183
|
_bind_hugeint(index, lower, upper)
|
144
184
|
end
|
145
185
|
|
186
|
+
# binds i-th parameter with SQL prepared statement.
|
187
|
+
# The first argument is index of parameter.
|
188
|
+
# The index of first parameter is 1 not 0.
|
189
|
+
# The second argument value must be Integer value.
|
190
|
+
# This method uses duckdb_bind_uhugeint internally.
|
191
|
+
#
|
192
|
+
# require 'duckdb'
|
193
|
+
# db = DuckDB::Database.open('duckdb_database')
|
194
|
+
# con = db.connect
|
195
|
+
# sql ='SELECT name FROM users WHERE uhugeint_col = ?'
|
196
|
+
# stmt = PreparedStatement.new(con, sql)
|
197
|
+
# stmt.bind_uhugeint(1, (2**128) - 1)
|
198
|
+
def bind_uhugeint(index, value)
|
199
|
+
lower, upper = integer_to_hugeint(value)
|
200
|
+
_bind_uhugeint(index, lower, upper)
|
201
|
+
end
|
202
|
+
|
146
203
|
# binds i-th parameter with SQL prepared statement.
|
147
204
|
# The first argument is index of parameter.
|
148
205
|
# The index of first parameter is 1 not 0.
|
data/lib/duckdb/version.rb
CHANGED
data/lib/duckdb.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: duckdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaki Suketa
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: bigdecimal
|
@@ -132,6 +132,8 @@ files:
|
|
132
132
|
- ext/duckdb/extconf.rb
|
133
133
|
- ext/duckdb/extracted_statements.c
|
134
134
|
- ext/duckdb/extracted_statements.h
|
135
|
+
- ext/duckdb/instance_cache.c
|
136
|
+
- ext/duckdb/instance_cache.h
|
135
137
|
- ext/duckdb/logical_type.c
|
136
138
|
- ext/duckdb/logical_type.h
|
137
139
|
- ext/duckdb/pending_result.c
|
@@ -154,6 +156,7 @@ files:
|
|
154
156
|
- lib/duckdb/database.rb
|
155
157
|
- lib/duckdb/extracted_statements.rb
|
156
158
|
- lib/duckdb/infinity.rb
|
159
|
+
- lib/duckdb/instance_cache.rb
|
157
160
|
- lib/duckdb/interval.rb
|
158
161
|
- lib/duckdb/library_version.rb
|
159
162
|
- lib/duckdb/logical_type.rb
|
@@ -185,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
185
188
|
- !ruby/object:Gem::Version
|
186
189
|
version: '0'
|
187
190
|
requirements: []
|
188
|
-
rubygems_version: 3.6.
|
191
|
+
rubygems_version: 3.6.7
|
189
192
|
specification_version: 4
|
190
193
|
summary: This module is Ruby binding for DuckDB database engine.
|
191
194
|
test_files: []
|