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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +38 -0
  3. data/duckdb.gemspec +37 -0
  4. data/ext/duckdb/aggregate_function.c +62 -100
  5. data/ext/duckdb/aggregate_function.h +2 -2
  6. data/ext/duckdb/aggregate_function_set.c +86 -0
  7. data/ext/duckdb/aggregate_function_set.h +14 -0
  8. data/ext/duckdb/appender.c +121 -39
  9. data/ext/duckdb/appender.h +1 -1
  10. data/ext/duckdb/client_context.c +5 -5
  11. data/ext/duckdb/client_context.h +2 -2
  12. data/ext/duckdb/column.c +13 -13
  13. data/ext/duckdb/column.h +1 -1
  14. data/ext/duckdb/connection.c +63 -41
  15. data/ext/duckdb/connection.h +2 -2
  16. data/ext/duckdb/converter.h +1 -7
  17. data/ext/duckdb/conveter.c +6 -6
  18. data/ext/duckdb/data_chunk.c +22 -22
  19. data/ext/duckdb/data_chunk.h +2 -2
  20. data/ext/duckdb/database.c +10 -10
  21. data/ext/duckdb/database.h +1 -1
  22. data/ext/duckdb/duckdb.c +18 -17
  23. data/ext/duckdb/expression.c +8 -8
  24. data/ext/duckdb/expression.h +1 -1
  25. data/ext/duckdb/extconf.rb +32 -16
  26. data/ext/duckdb/extracted_statements.c +15 -15
  27. data/ext/duckdb/extracted_statements.h +1 -1
  28. data/ext/duckdb/instance_cache.c +10 -10
  29. data/ext/duckdb/instance_cache.h +1 -1
  30. data/ext/duckdb/logical_type.c +94 -133
  31. data/ext/duckdb/logical_type.h +2 -2
  32. data/ext/duckdb/memory_helper.c +28 -28
  33. data/ext/duckdb/pending_result.c +27 -27
  34. data/ext/duckdb/pending_result.h +2 -2
  35. data/ext/duckdb/prepared_statement.c +120 -103
  36. data/ext/duckdb/prepared_statement.h +2 -2
  37. data/ext/duckdb/result.c +24 -74
  38. data/ext/duckdb/result.h +2 -3
  39. data/ext/duckdb/ruby-duckdb.h +5 -0
  40. data/ext/duckdb/scalar_function.c +3 -3
  41. data/ext/duckdb/table_description.c +1 -1
  42. data/ext/duckdb/table_function.c +3 -3
  43. data/ext/duckdb/table_function_bind_info.c +1 -1
  44. data/ext/duckdb/value.c +62 -50
  45. data/ext/duckdb/value.h +2 -2
  46. data/ext/duckdb/vector.c +20 -20
  47. data/ext/duckdb/vector.h +2 -2
  48. data/lib/duckdb/aggregate_function.rb +208 -3
  49. data/lib/duckdb/aggregate_function_set.rb +29 -0
  50. data/lib/duckdb/appender.rb +148 -0
  51. data/lib/duckdb/connection.rb +86 -25
  52. data/lib/duckdb/converter.rb +5 -0
  53. data/lib/duckdb/logical_type.rb +1 -3
  54. data/lib/duckdb/prepared_statement.rb +19 -1
  55. data/lib/duckdb/result.rb +39 -2
  56. data/lib/duckdb/scalar_function.rb +9 -4
  57. data/lib/duckdb/scalar_function_set.rb +0 -1
  58. data/lib/duckdb/table_description.rb +7 -0
  59. data/lib/duckdb/table_function.rb +0 -1
  60. data/lib/duckdb/table_name_parser.rb +58 -0
  61. data/lib/duckdb/value.rb +19 -0
  62. data/lib/duckdb/version.rb +1 -1
  63. data/lib/duckdb.rb +2 -0
  64. metadata +7 -3
  65. data/lib/duckdb/duckdb_native.so +0 -0
@@ -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.4.0
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 duckdb_extracted_statements__initialize(VALUE self, VALUE con, VALUE query);
20
- static VALUE duckdb_extracted_statements_destroy(VALUE self);
21
- static VALUE duckdb_extracted_statements_size(VALUE self);
22
- static VALUE duckdb_extracted_statements_prepared_statement(VALUE self, VALUE con, VALUE index);
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 duckdb_extracted_statements__initialize(VALUE self, VALUE con, VALUE query) {
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 = get_struct_connection(con);
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 duckdb_extracted_statements_destroy(VALUE self) {
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 duckdb_extracted_statements_size(VALUE self) {
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 duckdb_extracted_statements_prepared_statement(VALUE self, VALUE con, VALUE index) {
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 = get_struct_connection(con);
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 rbduckdb_init_duckdb_extracted_statements(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", duckdb_extracted_statements__initialize, 2);
105
- rb_define_method(cDuckDBExtractedStatements, "destroy", duckdb_extracted_statements_destroy, 0);
106
- rb_define_method(cDuckDBExtractedStatements, "size", duckdb_extracted_statements_size, 0);
107
- rb_define_method(cDuckDBExtractedStatements, "prepared_statement", duckdb_extracted_statements_prepared_statement, 2);
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
  }
@@ -8,5 +8,5 @@ struct _rubyDuckDBExtractedStatements {
8
8
 
9
9
  typedef struct _rubyDuckDBExtractedStatements rubyDuckDBExtractedStatements;
10
10
 
11
- void rbduckdb_init_duckdb_extracted_statements(void);
11
+ void rbduckdb_init_extracted_statements(void);
12
12
  #endif
@@ -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 duckdb_instance_cache_initialize(VALUE self);
9
- static VALUE duckdb_instance_cache_get_or_create(int argc, VALUE *argv, VALUE self);
10
- static VALUE duckdb_instance_cache_destroy(VALUE self);
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 duckdb_instance_cache_initialize(VALUE self) {
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 duckdb_instance_cache_get_or_create(int argc, VALUE *argv, VALUE self) {
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 duckdb_instance_cache_destroy(VALUE self) {
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 rbduckdb_init_duckdb_instance_cache(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", duckdb_instance_cache_initialize, 0);
103
- rb_define_method(cDuckDBInstanceCache, "get_or_create", duckdb_instance_cache_get_or_create, -1);
104
- rb_define_method(cDuckDBInstanceCache, "destroy", duckdb_instance_cache_destroy, 0);
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
  }
@@ -7,6 +7,6 @@ struct _rubyDuckDBInstanceCache {
7
7
 
8
8
  typedef struct _rubyDuckDBInstanceCache rubyDuckDBInstanceCache;
9
9
 
10
- void rbduckdb_init_duckdb_instance_cache(void);
10
+ void rbduckdb_init_instance_cache(void);
11
11
 
12
12
  #endif