duckdb 1.5.2.0 → 1.5.3.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/CHANGELOG.md +38 -0
- data/duckdb.gemspec +37 -0
- data/ext/duckdb/aggregate_function.c +62 -100
- data/ext/duckdb/aggregate_function.h +2 -2
- data/ext/duckdb/aggregate_function_set.c +86 -0
- data/ext/duckdb/aggregate_function_set.h +14 -0
- data/ext/duckdb/appender.c +121 -39
- data/ext/duckdb/appender.h +1 -1
- data/ext/duckdb/client_context.c +5 -5
- data/ext/duckdb/client_context.h +2 -2
- data/ext/duckdb/column.c +13 -13
- data/ext/duckdb/column.h +1 -1
- data/ext/duckdb/connection.c +63 -41
- data/ext/duckdb/connection.h +2 -2
- data/ext/duckdb/converter.h +1 -7
- data/ext/duckdb/conveter.c +6 -6
- data/ext/duckdb/data_chunk.c +22 -22
- data/ext/duckdb/data_chunk.h +2 -2
- data/ext/duckdb/database.c +10 -10
- data/ext/duckdb/database.h +1 -1
- data/ext/duckdb/duckdb.c +18 -17
- data/ext/duckdb/expression.c +8 -8
- data/ext/duckdb/expression.h +1 -1
- data/ext/duckdb/extconf.rb +32 -16
- data/ext/duckdb/extracted_statements.c +15 -15
- data/ext/duckdb/extracted_statements.h +1 -1
- data/ext/duckdb/instance_cache.c +10 -10
- data/ext/duckdb/instance_cache.h +1 -1
- data/ext/duckdb/logical_type.c +94 -133
- data/ext/duckdb/logical_type.h +2 -2
- data/ext/duckdb/memory_helper.c +28 -28
- data/ext/duckdb/pending_result.c +27 -27
- data/ext/duckdb/pending_result.h +2 -2
- data/ext/duckdb/prepared_statement.c +120 -103
- data/ext/duckdb/prepared_statement.h +2 -2
- data/ext/duckdb/result.c +24 -74
- data/ext/duckdb/result.h +2 -3
- data/ext/duckdb/ruby-duckdb.h +5 -0
- data/ext/duckdb/scalar_function.c +3 -3
- data/ext/duckdb/table_description.c +1 -1
- data/ext/duckdb/table_function.c +3 -3
- data/ext/duckdb/table_function_bind_info.c +1 -1
- data/ext/duckdb/value.c +62 -50
- data/ext/duckdb/value.h +2 -2
- data/ext/duckdb/vector.c +20 -20
- data/ext/duckdb/vector.h +2 -2
- data/lib/duckdb/aggregate_function.rb +208 -3
- data/lib/duckdb/aggregate_function_set.rb +29 -0
- data/lib/duckdb/appender.rb +148 -0
- data/lib/duckdb/connection.rb +86 -25
- data/lib/duckdb/converter.rb +5 -0
- data/lib/duckdb/logical_type.rb +1 -3
- data/lib/duckdb/prepared_statement.rb +19 -1
- data/lib/duckdb/result.rb +39 -2
- data/lib/duckdb/scalar_function.rb +9 -4
- data/lib/duckdb/scalar_function_set.rb +0 -1
- data/lib/duckdb/table_description.rb +7 -0
- data/lib/duckdb/table_function.rb +0 -1
- data/lib/duckdb/table_name_parser.rb +58 -0
- data/lib/duckdb/value.rb +19 -0
- data/lib/duckdb/version.rb +1 -1
- data/lib/duckdb.rb +2 -0
- metadata +7 -3
- data/lib/duckdb/duckdb_native.so +0 -0
data/ext/duckdb/extconf.rb
CHANGED
|
@@ -4,13 +4,34 @@ require 'mkmf'
|
|
|
4
4
|
|
|
5
5
|
DUCKDB_REQUIRED_VERSION = '1.4.0'
|
|
6
6
|
|
|
7
|
+
def brew_prefix(formula = nil)
|
|
8
|
+
cmd = formula ? "brew --prefix #{formula} 2>/dev/null" : 'brew --prefix 2>/dev/null'
|
|
9
|
+
prefix = `#{cmd}`.chomp
|
|
10
|
+
prefix.empty? ? nil : prefix
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
FALLBACK_PREFIXES = %w[/opt/homebrew /opt/homebrew/opt/duckdb /opt/local].freeze
|
|
14
|
+
|
|
15
|
+
def brew_dirs(subdir)
|
|
16
|
+
dirs = []
|
|
17
|
+
dirs << "#{brew_prefix('duckdb')}/#{subdir}" if brew_prefix('duckdb')
|
|
18
|
+
if (prefix = brew_prefix)
|
|
19
|
+
dirs << "#{prefix}/#{subdir}"
|
|
20
|
+
dirs << "#{prefix}/opt/duckdb/#{subdir}"
|
|
21
|
+
end
|
|
22
|
+
dirs
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def homebrew_include_dirs
|
|
26
|
+
(brew_dirs('include') + FALLBACK_PREFIXES.map { |p| "#{p}/include" }).uniq
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def homebrew_lib_dirs
|
|
30
|
+
(brew_dirs('lib') + FALLBACK_PREFIXES.map { |p| "#{p}/lib" }).uniq
|
|
31
|
+
end
|
|
32
|
+
|
|
7
33
|
def check_duckdb_header(header, version)
|
|
8
|
-
found = find_header(
|
|
9
|
-
header,
|
|
10
|
-
'/opt/homebrew/include',
|
|
11
|
-
'/opt/homebrew/opt/duckdb/include',
|
|
12
|
-
'/opt/local/include'
|
|
13
|
-
)
|
|
34
|
+
found = find_header(header, *homebrew_include_dirs)
|
|
14
35
|
return if found
|
|
15
36
|
|
|
16
37
|
msg = "#{header} is not found. Install #{header} of duckdb >= #{version}."
|
|
@@ -19,13 +40,7 @@ def check_duckdb_header(header, version)
|
|
|
19
40
|
end
|
|
20
41
|
|
|
21
42
|
def check_duckdb_library(library, func, version)
|
|
22
|
-
found = find_library(
|
|
23
|
-
library,
|
|
24
|
-
func,
|
|
25
|
-
'/opt/homebrew/lib',
|
|
26
|
-
'/opt/homebrew/opt/duckdb/lib',
|
|
27
|
-
'/opt/local/lib'
|
|
28
|
-
)
|
|
43
|
+
found = find_library(library, func, *homebrew_lib_dirs)
|
|
29
44
|
have_func(func, 'duckdb.h')
|
|
30
45
|
return if found
|
|
31
46
|
|
|
@@ -58,9 +73,10 @@ dir_config('duckdb')
|
|
|
58
73
|
check_duckdb_header('duckdb.h', DUCKDB_REQUIRED_VERSION)
|
|
59
74
|
check_duckdb_library('duckdb', 'duckdb_appender_create_query', DUCKDB_REQUIRED_VERSION)
|
|
60
75
|
|
|
61
|
-
# check duckdb >= 1.
|
|
62
|
-
have_func('duckdb_appender_create_query', 'duckdb.h')
|
|
63
|
-
|
|
76
|
+
# check duckdb >= 1.5.0
|
|
64
77
|
have_func('duckdb_unsafe_vector_assign_string_element_len', 'duckdb.h')
|
|
65
78
|
|
|
79
|
+
# check duckdb >= 1.5.2
|
|
80
|
+
have_func('duckdb_geometry_type_get_crs', 'duckdb.h')
|
|
81
|
+
|
|
66
82
|
create_makefile('duckdb/duckdb_native')
|
|
@@ -16,10 +16,10 @@ static void deallocate(void *ctx);
|
|
|
16
16
|
static VALUE allocate(VALUE klass);
|
|
17
17
|
static size_t memsize(const void *p);
|
|
18
18
|
|
|
19
|
-
static VALUE
|
|
20
|
-
static VALUE
|
|
21
|
-
static VALUE
|
|
22
|
-
static VALUE
|
|
19
|
+
static VALUE extracted_statements__initialize(VALUE self, VALUE con, VALUE query);
|
|
20
|
+
static VALUE extracted_statements_destroy(VALUE self);
|
|
21
|
+
static VALUE extracted_statements_size(VALUE self);
|
|
22
|
+
static VALUE extracted_statements_prepared_statement(VALUE self, VALUE con, VALUE index);
|
|
23
23
|
|
|
24
24
|
static void deallocate(void *ctx) {
|
|
25
25
|
rubyDuckDBExtractedStatements *p = (rubyDuckDBExtractedStatements *)ctx;
|
|
@@ -39,7 +39,7 @@ static size_t memsize(const void *p) {
|
|
|
39
39
|
return sizeof(rubyDuckDBExtractedStatements);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
static VALUE
|
|
42
|
+
static VALUE extracted_statements__initialize(VALUE self, VALUE con, VALUE query) {
|
|
43
43
|
rubyDuckDBConnection *pcon;
|
|
44
44
|
rubyDuckDBExtractedStatements *ctx;
|
|
45
45
|
char *pquery;
|
|
@@ -50,7 +50,7 @@ static VALUE duckdb_extracted_statements__initialize(VALUE self, VALUE con, VALU
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
pquery = StringValuePtr(query);
|
|
53
|
-
pcon =
|
|
53
|
+
pcon = rbduckdb_get_struct_connection(con);
|
|
54
54
|
TypedData_Get_Struct(self, rubyDuckDBExtractedStatements, &extract_statements_data_type, ctx);
|
|
55
55
|
|
|
56
56
|
ctx->num_statements = duckdb_extract_statements(pcon->con, pquery, &(ctx->extracted_statements));
|
|
@@ -63,7 +63,7 @@ static VALUE duckdb_extracted_statements__initialize(VALUE self, VALUE con, VALU
|
|
|
63
63
|
return self;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
static VALUE
|
|
66
|
+
static VALUE extracted_statements_destroy(VALUE self) {
|
|
67
67
|
rubyDuckDBExtractedStatements *ctx;
|
|
68
68
|
|
|
69
69
|
TypedData_Get_Struct(self, rubyDuckDBExtractedStatements, &extract_statements_data_type, ctx);
|
|
@@ -73,7 +73,7 @@ static VALUE duckdb_extracted_statements_destroy(VALUE self) {
|
|
|
73
73
|
return Qnil;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
static VALUE
|
|
76
|
+
static VALUE extracted_statements_size(VALUE self) {
|
|
77
77
|
rubyDuckDBExtractedStatements *ctx;
|
|
78
78
|
|
|
79
79
|
TypedData_Get_Struct(self, rubyDuckDBExtractedStatements, &extract_statements_data_type, ctx);
|
|
@@ -81,28 +81,28 @@ static VALUE duckdb_extracted_statements_size(VALUE self) {
|
|
|
81
81
|
return ULL2NUM(ctx->num_statements);
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
static VALUE
|
|
84
|
+
static VALUE extracted_statements_prepared_statement(VALUE self, VALUE con, VALUE index) {
|
|
85
85
|
rubyDuckDBConnection *pcon;
|
|
86
86
|
rubyDuckDBExtractedStatements *ctx;
|
|
87
87
|
|
|
88
88
|
if (rb_obj_is_kind_of(con, cDuckDBConnection) != Qtrue) {
|
|
89
89
|
rb_raise(rb_eTypeError, "1st argument must be DuckDB::Connection");
|
|
90
90
|
}
|
|
91
|
-
pcon =
|
|
91
|
+
pcon = rbduckdb_get_struct_connection(con);
|
|
92
92
|
TypedData_Get_Struct(self, rubyDuckDBExtractedStatements, &extract_statements_data_type, ctx);
|
|
93
93
|
|
|
94
94
|
return rbduckdb_prepared_statement_new(pcon->con, ctx->extracted_statements, NUM2ULL(index));
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
void
|
|
97
|
+
void rbduckdb_init_extracted_statements(void) {
|
|
98
98
|
#if 0
|
|
99
99
|
VALUE mDuckDB = rb_define_module("DuckDB");
|
|
100
100
|
#endif
|
|
101
101
|
cDuckDBExtractedStatements = rb_define_class_under(mDuckDB, "ExtractedStatements", rb_cObject);
|
|
102
102
|
|
|
103
103
|
rb_define_alloc_func(cDuckDBExtractedStatements, allocate);
|
|
104
|
-
rb_define_private_method(cDuckDBExtractedStatements, "_initialize",
|
|
105
|
-
rb_define_method(cDuckDBExtractedStatements, "destroy",
|
|
106
|
-
rb_define_method(cDuckDBExtractedStatements, "size",
|
|
107
|
-
rb_define_method(cDuckDBExtractedStatements, "prepared_statement",
|
|
104
|
+
rb_define_private_method(cDuckDBExtractedStatements, "_initialize", extracted_statements__initialize, 2);
|
|
105
|
+
rb_define_method(cDuckDBExtractedStatements, "destroy", extracted_statements_destroy, 0);
|
|
106
|
+
rb_define_method(cDuckDBExtractedStatements, "size", extracted_statements_size, 0);
|
|
107
|
+
rb_define_method(cDuckDBExtractedStatements, "prepared_statement", extracted_statements_prepared_statement, 2);
|
|
108
108
|
}
|
data/ext/duckdb/instance_cache.c
CHANGED
|
@@ -5,9 +5,9 @@ VALUE cDuckDBInstanceCache;
|
|
|
5
5
|
static void deallocate(void * ctx);
|
|
6
6
|
static VALUE allocate(VALUE klass);
|
|
7
7
|
static size_t memsize(const void *p);
|
|
8
|
-
static VALUE
|
|
9
|
-
static VALUE
|
|
10
|
-
static VALUE
|
|
8
|
+
static VALUE instance_cache_initialize(VALUE self);
|
|
9
|
+
static VALUE instance_cache_get_or_create(int argc, VALUE *argv, VALUE self);
|
|
10
|
+
static VALUE instance_cache_destroy(VALUE self);
|
|
11
11
|
|
|
12
12
|
static const rb_data_type_t instance_cache_data_type = {
|
|
13
13
|
"DuckDB/InstanceCache",
|
|
@@ -33,7 +33,7 @@ static VALUE allocate(VALUE klass) {
|
|
|
33
33
|
return TypedData_Wrap_Struct(klass, &instance_cache_data_type, ctx);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
static VALUE
|
|
36
|
+
static VALUE instance_cache_initialize(VALUE self) {
|
|
37
37
|
rubyDuckDBInstanceCache *ctx;
|
|
38
38
|
|
|
39
39
|
TypedData_Get_Struct(self, rubyDuckDBInstanceCache, &instance_cache_data_type, ctx);
|
|
@@ -47,7 +47,7 @@ static VALUE duckdb_instance_cache_initialize(VALUE self) {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
/* :nodoc: */
|
|
50
|
-
static VALUE
|
|
50
|
+
static VALUE instance_cache_get_or_create(int argc, VALUE *argv, VALUE self) {
|
|
51
51
|
VALUE vpath = Qnil;
|
|
52
52
|
VALUE vconfig = Qnil;
|
|
53
53
|
const char *path = NULL;
|
|
@@ -82,7 +82,7 @@ static VALUE duckdb_instance_cache_get_or_create(int argc, VALUE *argv, VALUE se
|
|
|
82
82
|
return rbduckdb_create_database_obj(db);
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
static VALUE
|
|
85
|
+
static VALUE instance_cache_destroy(VALUE self) {
|
|
86
86
|
rubyDuckDBInstanceCache *ctx;
|
|
87
87
|
TypedData_Get_Struct(self, rubyDuckDBInstanceCache, &instance_cache_data_type, ctx);
|
|
88
88
|
|
|
@@ -94,13 +94,13 @@ static VALUE duckdb_instance_cache_destroy(VALUE self) {
|
|
|
94
94
|
return Qnil;
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
void
|
|
97
|
+
void rbduckdb_init_instance_cache(void) {
|
|
98
98
|
#if 0
|
|
99
99
|
VALUE mDuckDB = rb_define_module("DuckDB");
|
|
100
100
|
#endif
|
|
101
101
|
cDuckDBInstanceCache = rb_define_class_under(mDuckDB, "InstanceCache", rb_cObject);
|
|
102
|
-
rb_define_method(cDuckDBInstanceCache, "initialize",
|
|
103
|
-
rb_define_method(cDuckDBInstanceCache, "get_or_create",
|
|
104
|
-
rb_define_method(cDuckDBInstanceCache, "destroy",
|
|
102
|
+
rb_define_method(cDuckDBInstanceCache, "initialize", instance_cache_initialize, 0);
|
|
103
|
+
rb_define_method(cDuckDBInstanceCache, "get_or_create", instance_cache_get_or_create, -1);
|
|
104
|
+
rb_define_method(cDuckDBInstanceCache, "destroy", instance_cache_destroy, 0);
|
|
105
105
|
rb_define_alloc_func(cDuckDBInstanceCache, allocate);
|
|
106
106
|
}
|