duckdb 1.4.2.0 → 1.4.4.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/copilot-instructions.md +169 -0
  3. data/.github/workflows/linter.yml +30 -0
  4. data/.github/workflows/test_on_macos.yml +7 -2
  5. data/.github/workflows/test_on_ubuntu.yml +7 -2
  6. data/.github/workflows/test_on_windows.yml +8 -3
  7. data/.rubocop.yml +34 -0
  8. data/CHANGELOG.md +74 -0
  9. data/Dockerfile +2 -2
  10. data/Gemfile +12 -0
  11. data/Gemfile.lock +70 -7
  12. data/Rakefile +8 -6
  13. data/bin/console +4 -3
  14. data/duckdb.gemspec +2 -6
  15. data/ext/duckdb/bind_info.c +243 -0
  16. data/ext/duckdb/bind_info.h +13 -0
  17. data/ext/duckdb/connection.c +60 -2
  18. data/ext/duckdb/connection.h +1 -0
  19. data/ext/duckdb/data_chunk.c +137 -0
  20. data/ext/duckdb/data_chunk.h +13 -0
  21. data/ext/duckdb/duckdb.c +7 -0
  22. data/ext/duckdb/function_info.c +65 -0
  23. data/ext/duckdb/function_info.h +13 -0
  24. data/ext/duckdb/init_info.c +65 -0
  25. data/ext/duckdb/init_info.h +13 -0
  26. data/ext/duckdb/logical_type.c +42 -0
  27. data/ext/duckdb/memory_helper.c +339 -0
  28. data/ext/duckdb/memory_helper.h +8 -0
  29. data/ext/duckdb/result.c +8 -9
  30. data/ext/duckdb/result.h +1 -0
  31. data/ext/duckdb/ruby-duckdb.h +7 -0
  32. data/ext/duckdb/scalar_function.c +336 -1
  33. data/ext/duckdb/scalar_function.h +2 -0
  34. data/ext/duckdb/table_function.c +403 -0
  35. data/ext/duckdb/table_function.h +16 -0
  36. data/ext/duckdb/vector.c +201 -0
  37. data/ext/duckdb/vector.h +13 -0
  38. data/lib/duckdb/appender.rb +21 -11
  39. data/lib/duckdb/bind_info.rb +32 -0
  40. data/lib/duckdb/casting.rb +35 -0
  41. data/lib/duckdb/connection.rb +123 -2
  42. data/lib/duckdb/converter.rb +32 -47
  43. data/lib/duckdb/data_chunk.rb +114 -0
  44. data/lib/duckdb/extracted_statements.rb +1 -1
  45. data/lib/duckdb/function_info.rb +21 -0
  46. data/lib/duckdb/init_info.rb +22 -0
  47. data/lib/duckdb/instance_cache.rb +0 -4
  48. data/lib/duckdb/interval.rb +1 -1
  49. data/lib/duckdb/logical_type.rb +46 -5
  50. data/lib/duckdb/prepared_statement.rb +22 -8
  51. data/lib/duckdb/result.rb +1 -0
  52. data/lib/duckdb/scalar_function.rb +119 -0
  53. data/lib/duckdb/table_function.rb +191 -0
  54. data/lib/duckdb/vector.rb +20 -0
  55. data/lib/duckdb/version.rb +1 -1
  56. data/lib/duckdb.rb +8 -0
  57. data/sample/async_query.rb +2 -0
  58. data/sample/async_query_stream.rb +2 -0
  59. data/sample/issue922.rb +54 -0
  60. data/sample/issue922_benchmark.rb +169 -0
  61. data/sample/issue930.rb +49 -0
  62. data/sample/issue930_benchmark.rb +70 -0
  63. metadata +30 -57
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'duckdb'
4
+ require 'csv'
5
+ require 'stringio'
6
+
7
+ class CSVTableAdapter
8
+ def call(csv, name, columns: nil)
9
+ columns ||= infer_columns(csv)
10
+ DuckDB::TableFunction.create(name:, columns:) do |_func_info, output|
11
+ write_row(csv, output)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def write_row(csv, output)
18
+ line = csv.readline
19
+ if line
20
+ line.each_with_index { |cell, index| output.set_value(index, 0, cell[1]) }
21
+ 1
22
+ else
23
+ csv.rewind
24
+ 0
25
+ end
26
+ end
27
+
28
+ def infer_columns(csv)
29
+ headers = csv.first.headers
30
+ csv.rewind
31
+ headers.to_h { |header| [header, DuckDB::LogicalType::VARCHAR] }
32
+ end
33
+ end
34
+
35
+ def register_as_table_with_create_table(con, csv, name)
36
+ headers = csv.first.headers
37
+ csv.rewind
38
+ con.execute("CREATE OR REPLACE TABLE #{name} (#{headers.map { |h| "#{h} VARCHAR" }.join(', ')})")
39
+ csv.each do |row|
40
+ values = row.map { |cell| "'#{cell[1]}'" }.join(', ')
41
+ con.execute("INSERT INTO #{name} VALUES (#{values})")
42
+ end
43
+ end
44
+
45
+ DuckDB::TableFunction.add_table_adapter(CSV, CSVTableAdapter.new)
46
+
47
+ csv_data = 'id,name,age'
48
+ csv_data += 100_000.times.map { |i| "\n#{i + 1},Name#{i + 1},#{rand(0..100)}" }.join
49
+
50
+ db = DuckDB::Database.open
51
+ con = db.connect
52
+ con.query('SET threads=1')
53
+
54
+ csv = CSV.new(StringIO.new(csv_data), headers: true)
55
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
56
+ con.expose_as_table(csv, 'csv_tf')
57
+ con.query('SELECT * FROM csv_tf()').to_a
58
+ end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
59
+
60
+ csv2 = CSV.new(StringIO.new(csv_data), headers: true)
61
+ start_time2 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
62
+ register_as_table_with_create_table(con, csv2, 'csv_ct')
63
+ con.query('SELECT * FROM csv_ct').to_a
64
+ end_time2 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
65
+
66
+ con.close
67
+ db.close
68
+
69
+ puts "Time taken for table function approach: #{end_time - start_time} seconds"
70
+ puts "Time taken for CREATE TABLE approach: #{end_time2 - start_time2} seconds"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: duckdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2.0
4
+ version: 1.4.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaki Suketa
@@ -23,62 +23,6 @@ dependencies:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
25
  version: 3.1.4
26
- - !ruby/object:Gem::Dependency
27
- name: bundler
28
- requirement: !ruby/object:Gem::Requirement
29
- requirements:
30
- - - "~>"
31
- - !ruby/object:Gem::Version
32
- version: '2.3'
33
- type: :development
34
- prerelease: false
35
- version_requirements: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '2.3'
40
- - !ruby/object:Gem::Dependency
41
- name: minitest
42
- requirement: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '5.0'
47
- type: :development
48
- prerelease: false
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '5.0'
54
- - !ruby/object:Gem::Dependency
55
- name: rake
56
- requirement: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - "~>"
59
- - !ruby/object:Gem::Version
60
- version: '13.0'
61
- type: :development
62
- prerelease: false
63
- version_requirements: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '13.0'
68
- - !ruby/object:Gem::Dependency
69
- name: rake-compiler
70
- requirement: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: '0'
75
- type: :development
76
- prerelease: false
77
- version_requirements: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: '0'
82
26
  description: This module is Ruby binding for DuckDB database engine. You must have
83
27
  the DuckDB engine installed to build/use this module.
84
28
  email:
@@ -90,12 +34,15 @@ extra_rdoc_files: []
90
34
  files:
91
35
  - ".gitattributes"
92
36
  - ".github/FUNDING.yml"
37
+ - ".github/copilot-instructions.md"
38
+ - ".github/workflows/linter.yml"
93
39
  - ".github/workflows/make_documents.yml"
94
40
  - ".github/workflows/test_on_macos.yml"
95
41
  - ".github/workflows/test_on_ubuntu.yml"
96
42
  - ".github/workflows/test_on_windows.yml"
97
43
  - ".gitignore"
98
44
  - ".rdoc_options"
45
+ - ".rubocop.yml"
99
46
  - CHANGELOG.md
100
47
  - CONTRIBUTION.md
101
48
  - Dockerfile
@@ -114,6 +61,8 @@ files:
114
61
  - duckdb.gemspec
115
62
  - ext/duckdb/appender.c
116
63
  - ext/duckdb/appender.h
64
+ - ext/duckdb/bind_info.c
65
+ - ext/duckdb/bind_info.h
117
66
  - ext/duckdb/blob.c
118
67
  - ext/duckdb/blob.h
119
68
  - ext/duckdb/column.c
@@ -124,6 +73,8 @@ files:
124
73
  - ext/duckdb/connection.h
125
74
  - ext/duckdb/converter.h
126
75
  - ext/duckdb/conveter.c
76
+ - ext/duckdb/data_chunk.c
77
+ - ext/duckdb/data_chunk.h
127
78
  - ext/duckdb/database.c
128
79
  - ext/duckdb/database.h
129
80
  - ext/duckdb/duckdb.c
@@ -132,10 +83,16 @@ files:
132
83
  - ext/duckdb/extconf.rb
133
84
  - ext/duckdb/extracted_statements.c
134
85
  - ext/duckdb/extracted_statements.h
86
+ - ext/duckdb/function_info.c
87
+ - ext/duckdb/function_info.h
88
+ - ext/duckdb/init_info.c
89
+ - ext/duckdb/init_info.h
135
90
  - ext/duckdb/instance_cache.c
136
91
  - ext/duckdb/instance_cache.h
137
92
  - ext/duckdb/logical_type.c
138
93
  - ext/duckdb/logical_type.h
94
+ - ext/duckdb/memory_helper.c
95
+ - ext/duckdb/memory_helper.h
139
96
  - ext/duckdb/pending_result.c
140
97
  - ext/duckdb/pending_result.h
141
98
  - ext/duckdb/prepared_statement.c
@@ -145,21 +102,30 @@ files:
145
102
  - ext/duckdb/ruby-duckdb.h
146
103
  - ext/duckdb/scalar_function.c
147
104
  - ext/duckdb/scalar_function.h
105
+ - ext/duckdb/table_function.c
106
+ - ext/duckdb/table_function.h
148
107
  - ext/duckdb/util.c
149
108
  - ext/duckdb/util.h
150
109
  - ext/duckdb/value_impl.c
151
110
  - ext/duckdb/value_impl.h
111
+ - ext/duckdb/vector.c
112
+ - ext/duckdb/vector.h
152
113
  - getduckdb.sh
153
114
  - lib/duckdb.rb
154
115
  - lib/duckdb/appender.rb
116
+ - lib/duckdb/bind_info.rb
117
+ - lib/duckdb/casting.rb
155
118
  - lib/duckdb/column.rb
156
119
  - lib/duckdb/config.rb
157
120
  - lib/duckdb/connection.rb
158
121
  - lib/duckdb/converter.rb
159
122
  - lib/duckdb/converter/int_to_sym.rb
123
+ - lib/duckdb/data_chunk.rb
160
124
  - lib/duckdb/database.rb
161
125
  - lib/duckdb/extracted_statements.rb
126
+ - lib/duckdb/function_info.rb
162
127
  - lib/duckdb/infinity.rb
128
+ - lib/duckdb/init_info.rb
163
129
  - lib/duckdb/instance_cache.rb
164
130
  - lib/duckdb/interval.rb
165
131
  - lib/duckdb/library_version.rb
@@ -167,9 +133,16 @@ files:
167
133
  - lib/duckdb/pending_result.rb
168
134
  - lib/duckdb/prepared_statement.rb
169
135
  - lib/duckdb/result.rb
136
+ - lib/duckdb/scalar_function.rb
137
+ - lib/duckdb/table_function.rb
138
+ - lib/duckdb/vector.rb
170
139
  - lib/duckdb/version.rb
171
140
  - sample/async_query.rb
172
141
  - sample/async_query_stream.rb
142
+ - sample/issue922.rb
143
+ - sample/issue922_benchmark.rb
144
+ - sample/issue930.rb
145
+ - sample/issue930_benchmark.rb
173
146
  homepage: https://github.com/suketa/ruby-duckdb
174
147
  licenses:
175
148
  - MIT