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
@@ -0,0 +1,127 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DuckDB
|
4
|
+
module Converter
|
5
|
+
module IntToSym
|
6
|
+
STATEMENT_TYPES = %i[
|
7
|
+
invalid
|
8
|
+
select
|
9
|
+
insert
|
10
|
+
update
|
11
|
+
explain
|
12
|
+
delete
|
13
|
+
prepare
|
14
|
+
create
|
15
|
+
execute
|
16
|
+
alter
|
17
|
+
transaction
|
18
|
+
copy
|
19
|
+
analyze
|
20
|
+
variable_set
|
21
|
+
create_func
|
22
|
+
drop
|
23
|
+
export
|
24
|
+
pragma
|
25
|
+
vacuum
|
26
|
+
call
|
27
|
+
set
|
28
|
+
load
|
29
|
+
relation
|
30
|
+
extension
|
31
|
+
logical_plan
|
32
|
+
attach
|
33
|
+
detach
|
34
|
+
multi
|
35
|
+
].freeze
|
36
|
+
|
37
|
+
HASH_TYPES = if Gem::Version.new(DuckDB::LIBRARY_VERSION) == Gem::Version.new('0.10.0')
|
38
|
+
{
|
39
|
+
0 => :invalid,
|
40
|
+
1 => :boolean,
|
41
|
+
2 => :tinyint,
|
42
|
+
3 => :smallint,
|
43
|
+
4 => :integer,
|
44
|
+
5 => :bigint,
|
45
|
+
6 => :utinyint,
|
46
|
+
7 => :usmallint,
|
47
|
+
8 => :uinteger,
|
48
|
+
9 => :ubigint,
|
49
|
+
10 => :float,
|
50
|
+
11 => :double,
|
51
|
+
12 => :timestamp,
|
52
|
+
13 => :date,
|
53
|
+
14 => :time,
|
54
|
+
15 => :interval,
|
55
|
+
16 => :hugeint,
|
56
|
+
17 => :uhugeint,
|
57
|
+
18 => :varchar,
|
58
|
+
19 => :blob,
|
59
|
+
20 => :decimal,
|
60
|
+
21 => :timestamp_s,
|
61
|
+
22 => :timestamp_ms,
|
62
|
+
23 => :timestamp_ns,
|
63
|
+
24 => :enum,
|
64
|
+
25 => :list,
|
65
|
+
26 => :struct,
|
66
|
+
27 => :map,
|
67
|
+
28 => :uuid,
|
68
|
+
29 => :union,
|
69
|
+
30 => :bit,
|
70
|
+
31 => :time_tz,
|
71
|
+
32 => :timestamp_tz
|
72
|
+
}.freeze
|
73
|
+
else
|
74
|
+
{
|
75
|
+
0 => :invalid,
|
76
|
+
1 => :boolean,
|
77
|
+
2 => :tinyint,
|
78
|
+
3 => :smallint,
|
79
|
+
4 => :integer,
|
80
|
+
5 => :bigint,
|
81
|
+
6 => :utinyint,
|
82
|
+
7 => :usmallint,
|
83
|
+
8 => :uinteger,
|
84
|
+
9 => :ubigint,
|
85
|
+
10 => :float,
|
86
|
+
11 => :double,
|
87
|
+
12 => :timestamp,
|
88
|
+
13 => :date,
|
89
|
+
14 => :time,
|
90
|
+
15 => :interval,
|
91
|
+
16 => :hugeint,
|
92
|
+
32 => :uhugeint,
|
93
|
+
17 => :varchar,
|
94
|
+
18 => :blob,
|
95
|
+
19 => :decimal,
|
96
|
+
20 => :timestamp_s,
|
97
|
+
21 => :timestamp_ms,
|
98
|
+
22 => :timestamp_ns,
|
99
|
+
23 => :enum,
|
100
|
+
24 => :list,
|
101
|
+
25 => :struct,
|
102
|
+
26 => :map,
|
103
|
+
33 => :array,
|
104
|
+
27 => :uuid,
|
105
|
+
28 => :union,
|
106
|
+
29 => :bit,
|
107
|
+
30 => :time_tz,
|
108
|
+
31 => :timestamp_tz
|
109
|
+
}.freeze
|
110
|
+
end
|
111
|
+
|
112
|
+
module_function
|
113
|
+
|
114
|
+
def statement_type_to_sym(val)
|
115
|
+
raise DuckDB::Error, "Unknown statement type: #{val}" if val >= STATEMENT_TYPES.size
|
116
|
+
|
117
|
+
STATEMENT_TYPES[val]
|
118
|
+
end
|
119
|
+
|
120
|
+
def type_to_sym(val)
|
121
|
+
raise DuckDB::Error, "Unknown type: #{val}" unless HASH_TYPES.key?(val)
|
122
|
+
|
123
|
+
HASH_TYPES[val]
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/lib/duckdb/converter.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'date'
|
4
4
|
require_relative 'interval'
|
5
|
+
require_relative 'converter/int_to_sym'
|
5
6
|
|
6
7
|
module DuckDB
|
7
8
|
QueryProgress = Struct.new(:percentage, :rows_processed, :total_rows_to_process)
|
@@ -15,6 +16,14 @@ module DuckDB
|
|
15
16
|
|
16
17
|
module_function
|
17
18
|
|
19
|
+
def _to_infinity(value)
|
20
|
+
if value.positive?
|
21
|
+
DuckDB::Infinity::POSITIVE
|
22
|
+
else
|
23
|
+
DuckDB::Infinity::NEGATIVE
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
18
27
|
def _to_date(year, month, day)
|
19
28
|
Date.new(year, month, day)
|
20
29
|
end
|
data/lib/duckdb/database.rb
CHANGED
@@ -23,7 +23,7 @@ module DuckDB
|
|
23
23
|
#
|
24
24
|
class Database
|
25
25
|
private_class_method :_open
|
26
|
-
private_class_method :_open_ext
|
26
|
+
private_class_method :_open_ext
|
27
27
|
|
28
28
|
class << self
|
29
29
|
##
|
@@ -55,10 +55,8 @@ module DuckDB
|
|
55
55
|
private
|
56
56
|
|
57
57
|
def _db_open(dbpath, config)
|
58
|
-
if
|
58
|
+
if config
|
59
59
|
_open_ext(dbpath, config)
|
60
|
-
elsif config
|
61
|
-
_open(dbpath, config)
|
62
60
|
else
|
63
61
|
_open(dbpath)
|
64
62
|
end
|
@@ -8,8 +8,6 @@ module DuckDB
|
|
8
8
|
#
|
9
9
|
# require 'duckdb'
|
10
10
|
#
|
11
|
-
# DuckDB::Result.use_chunk_each = true
|
12
|
-
#
|
13
11
|
# db = DuckDB::Database.open
|
14
12
|
# con = db.connect
|
15
13
|
# stmt = con.prepared_statement(VERY_SLOW_QUERY)
|
@@ -24,8 +22,7 @@ module DuckDB
|
|
24
22
|
STATES = %i[ready not_ready error no_tasks].freeze
|
25
23
|
|
26
24
|
# returns the state of the pending result.
|
27
|
-
#
|
28
|
-
# (:no_tasks is available only with duckdb 0.9.0 or later.)
|
25
|
+
# the result can be :ready, :not_ready, :error, :no_tasks.
|
29
26
|
#
|
30
27
|
# :ready means the result is ready to be fetched, and
|
31
28
|
# you can call `execute_pending` to get the result.
|
@@ -33,9 +30,23 @@ module DuckDB
|
|
33
30
|
# :not_ready means the result is not ready yet, so
|
34
31
|
# you need to call `execute_task`.
|
35
32
|
#
|
36
|
-
# @return [
|
33
|
+
# @return [symbol] :ready, :not_ready, :error, :no_tasks
|
37
34
|
def state
|
38
35
|
STATES[_state]
|
39
36
|
end
|
37
|
+
|
38
|
+
# returns the state of the pending result.
|
39
|
+
# the result can be :ready, :not_ready, :error, :no_tasks.
|
40
|
+
#
|
41
|
+
# :ready means the result is ready to be fetched, and
|
42
|
+
# you can call `execute_pending` to get the result.
|
43
|
+
#
|
44
|
+
# :not_ready or :no_tasks might mean the pending result
|
45
|
+
# is not executed yet, so you need to call `execute_task`.
|
46
|
+
#
|
47
|
+
# @return [symbol] :ready, :not_ready, :error, :no_tasks
|
48
|
+
def execute_check_state
|
49
|
+
STATES[_execute_check_state]
|
50
|
+
end
|
40
51
|
end
|
41
52
|
end
|
@@ -27,11 +27,38 @@ module DuckDB
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def pending_prepared_stream
|
30
|
-
raise DuckDB::Error, 'DuckDB::Result.use_chunk_each must be true.' unless DuckDB::Result.use_chunk_each?
|
31
|
-
|
32
30
|
PendingResult.new(self, true)
|
33
31
|
end
|
34
32
|
|
33
|
+
# returns statement type. The return value is one of the following symbols:
|
34
|
+
# :invalid, :select, :insert, :update, :explain, :delete, :prepare, :create,
|
35
|
+
# :execute, :alter, :transaction, :copy, :analyze, :variable_set, :create_func,
|
36
|
+
# :drop, :export, :pragma, :vacuum, :call, :set, :load, :relation, :extension,
|
37
|
+
# :logical_plan, :attach, :detach, :multi
|
38
|
+
#
|
39
|
+
# require 'duckdb'
|
40
|
+
# db = DuckDB::Database.open('duckdb_database')
|
41
|
+
# con = db.connect
|
42
|
+
# stmt = con.prepared_statement('SELECT * FROM users')
|
43
|
+
# stmt.statement_type # => :select
|
44
|
+
def statement_type
|
45
|
+
i = _statement_type
|
46
|
+
Converter::IntToSym.statement_type_to_sym(i)
|
47
|
+
end
|
48
|
+
|
49
|
+
# returns parameter type. The argument must be index of parameter.
|
50
|
+
#
|
51
|
+
# require 'duckdb'
|
52
|
+
# db = DuckDB::Database.open
|
53
|
+
# con = db.connect
|
54
|
+
# con.execute('CREATE TABLE users (id INTEGER, name VARCHAR(255))')
|
55
|
+
# stmt = con.prepared_statement('SELECT * FROM users WHERE id = ?')
|
56
|
+
# stmt.param_type(1) # => :integer
|
57
|
+
def param_type(index)
|
58
|
+
i = _param_type(index)
|
59
|
+
Converter::IntToSym.type_to_sym(i)
|
60
|
+
end
|
61
|
+
|
35
62
|
# binds all parameters with SQL prepared statement.
|
36
63
|
#
|
37
64
|
# require 'duckdb'
|
data/lib/duckdb/result.rb
CHANGED
@@ -24,86 +24,71 @@ module DuckDB
|
|
24
24
|
# end
|
25
25
|
class Result
|
26
26
|
include Enumerable
|
27
|
-
|
28
|
-
Hash.new(:_to_string).merge(
|
29
|
-
1 => :_to_boolean,
|
30
|
-
3 => :_to_smallint,
|
31
|
-
4 => :_to_integer,
|
32
|
-
5 => :_to_bigint,
|
33
|
-
10 => :_to_float,
|
34
|
-
11 => :_to_double,
|
35
|
-
16 => :_to_hugeint_internal,
|
36
|
-
19 => :_to_blob,
|
37
|
-
20 => :_to_decimal_internal
|
38
|
-
).freeze
|
39
|
-
else
|
40
|
-
Hash.new(:_to_string).merge(
|
41
|
-
1 => :_to_boolean,
|
42
|
-
3 => :_to_smallint,
|
43
|
-
4 => :_to_integer,
|
44
|
-
5 => :_to_bigint,
|
45
|
-
10 => :_to_float,
|
46
|
-
11 => :_to_double,
|
47
|
-
16 => :_to_hugeint_internal,
|
48
|
-
18 => :_to_blob,
|
49
|
-
19 => :_to_decimal_internal
|
50
|
-
).freeze
|
51
|
-
end
|
27
|
+
RETURN_TYPES = %i[invalid changed_rows nothing query_result].freeze
|
52
28
|
|
53
29
|
alias column_size column_count
|
54
30
|
alias row_size row_count
|
55
31
|
|
56
|
-
@use_chunk_each = true
|
57
|
-
|
58
32
|
class << self
|
59
33
|
def new
|
60
34
|
raise DuckDB::Error, 'DuckDB::Result cannot be instantiated directly.'
|
61
35
|
end
|
62
36
|
|
63
37
|
def use_chunk_each=(value)
|
64
|
-
|
38
|
+
raise('`changing DuckDB::Result.use_chunk_each to false` was deprecated.') unless value
|
39
|
+
|
40
|
+
warn('`DuckDB::Result.use_chunk_each=` will be deprecated.')
|
65
41
|
|
66
|
-
|
42
|
+
true
|
67
43
|
end
|
68
44
|
|
69
45
|
def use_chunk_each?
|
70
|
-
|
46
|
+
warn('`DuckDB::Result.use_chunk_each?` will be deprecated.')
|
47
|
+
true
|
71
48
|
end
|
72
49
|
end
|
73
50
|
|
74
51
|
def each
|
75
|
-
if
|
76
|
-
|
77
|
-
return _chunk_stream unless block_given?
|
52
|
+
if streaming?
|
53
|
+
return _chunk_stream unless block_given?
|
78
54
|
|
79
|
-
|
80
|
-
else
|
81
|
-
return chunk_each unless block_given?
|
82
|
-
|
83
|
-
chunk_each { |row| yield row }
|
84
|
-
end
|
55
|
+
_chunk_stream { |row| yield row }
|
85
56
|
else
|
86
|
-
|
87
|
-
return to_enum { row_size } unless block_given?
|
57
|
+
return chunk_each unless block_given?
|
88
58
|
|
89
|
-
|
90
|
-
yield row(row_index)
|
91
|
-
end
|
59
|
+
chunk_each { |row| yield row }
|
92
60
|
end
|
93
61
|
end
|
94
62
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
63
|
+
# returns return type. The return value is one of the following symbols:
|
64
|
+
# :invalid, :changed_rows, :nothing, :query_result
|
65
|
+
#
|
66
|
+
# require 'duckdb'
|
67
|
+
# db = DuckDB::Database.open('duckdb_database')
|
68
|
+
# con = db.connect
|
69
|
+
# result = con.execute('CREATE TABLE users (id INTEGER, name VARCHAR(30))')
|
70
|
+
# result.return_type # => :nothing
|
71
|
+
def return_type
|
72
|
+
i = _return_type
|
73
|
+
raise DuckDB::Error, "Unknown return type: #{i}" if i >= RETURN_TYPES.size
|
74
|
+
|
75
|
+
RETURN_TYPES[i]
|
102
76
|
end
|
103
77
|
|
104
|
-
|
105
|
-
|
106
|
-
|
78
|
+
# returns statement type. The return value is one of the following symbols:
|
79
|
+
# :invalid, :select, :insert, :update, :explain, :delete, :prepare, :create,
|
80
|
+
# :execute, :alter, :transaction, :copy, :analyze, :variable_set, :create_func,
|
81
|
+
# :drop, :export, :pragma, :vacuum, :call, :set, :load, :relation, :extension,
|
82
|
+
# :logical_plan, :attach, :detach, :multi
|
83
|
+
#
|
84
|
+
# require 'duckdb'
|
85
|
+
# db = DuckDB::Database.open('duckdb_database')
|
86
|
+
# con = db.connect
|
87
|
+
# result = con.execute('CREATE TABLE users (id INTEGER, name VARCHAR(30))')
|
88
|
+
# result.statement_type # => :create
|
89
|
+
def statement_type
|
90
|
+
i = _statement_type
|
91
|
+
Converter::IntToSym.statement_type_to_sym(i)
|
107
92
|
end
|
108
93
|
|
109
94
|
def enum_dictionary_values(col_index)
|
@@ -113,29 +98,5 @@ module DuckDB
|
|
113
98
|
end
|
114
99
|
values
|
115
100
|
end
|
116
|
-
|
117
|
-
private
|
118
|
-
|
119
|
-
def _to_hugeint(row, col)
|
120
|
-
warn("#{self.class}##{__method__} will be deprecated.")
|
121
|
-
_to_string(row, col).to_i
|
122
|
-
end
|
123
|
-
|
124
|
-
def _to_hugeint_internal(row, col)
|
125
|
-
warn("#{self.class}##{__method__} will be deprecated.")
|
126
|
-
lower, upper = __to_hugeint_internal(row, col)
|
127
|
-
Converter._to_hugeint_from_vector(lower, upper)
|
128
|
-
end
|
129
|
-
|
130
|
-
def _to_decimal(row, col)
|
131
|
-
warn("#{self.class}##{__method__} will be deprecated.")
|
132
|
-
BigDecimal(_to_string(row, col))
|
133
|
-
end
|
134
|
-
|
135
|
-
def _to_decimal_internal(row, col)
|
136
|
-
warn("#{self.class}##{__method__} will be deprecated.")
|
137
|
-
lower, upper, width, scale = __to_decimal_internal(row, col)
|
138
|
-
Converter._to_decimal_from_hugeint(width, scale, upper, lower)
|
139
|
-
end
|
140
101
|
end
|
141
102
|
end
|
data/lib/duckdb/version.rb
CHANGED
data/lib/duckdb.rb
CHANGED
data/sample/async_query.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: duckdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaki Suketa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bigdecimal
|
@@ -106,9 +106,6 @@ files:
|
|
106
106
|
- benchmark/async_query.rb
|
107
107
|
- benchmark/converter_hugeint_ips.rb
|
108
108
|
- benchmark/get_converter_module_ips.rb
|
109
|
-
- benchmark/to_bigdecimal_ips.rb
|
110
|
-
- benchmark/to_hugeint_ips.rb
|
111
|
-
- benchmark/to_hugeint_profile.rb
|
112
109
|
- benchmark/to_intern_ips.rb
|
113
110
|
- bin/console
|
114
111
|
- bin/setup
|
@@ -150,7 +147,9 @@ files:
|
|
150
147
|
- lib/duckdb/config.rb
|
151
148
|
- lib/duckdb/connection.rb
|
152
149
|
- lib/duckdb/converter.rb
|
150
|
+
- lib/duckdb/converter/int_to_sym.rb
|
153
151
|
- lib/duckdb/database.rb
|
152
|
+
- lib/duckdb/infinity.rb
|
154
153
|
- lib/duckdb/interval.rb
|
155
154
|
- lib/duckdb/library_version.rb
|
156
155
|
- lib/duckdb/pending_result.rb
|
@@ -174,14 +173,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
174
173
|
requirements:
|
175
174
|
- - ">="
|
176
175
|
- !ruby/object:Gem::Version
|
177
|
-
version: 3.
|
176
|
+
version: 3.1.0
|
178
177
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
178
|
requirements:
|
180
179
|
- - ">="
|
181
180
|
- !ruby/object:Gem::Version
|
182
181
|
version: '0'
|
183
182
|
requirements: []
|
184
|
-
rubygems_version: 3.5.
|
183
|
+
rubygems_version: 3.5.16
|
185
184
|
signing_key:
|
186
185
|
specification_version: 4
|
187
186
|
summary: This module is Ruby binding for DuckDB database engine.
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'duckdb'
|
5
|
-
require 'benchmark/ips'
|
6
|
-
|
7
|
-
db = DuckDB::Database.open
|
8
|
-
con = db.connect
|
9
|
-
con.query('CREATE TABLE decimals (decimal_value DECIMAL(38, 3))')
|
10
|
-
con.query('INSERT INTO decimals VALUES (1234567890123.456)')
|
11
|
-
result = con.query('SELECT decimal_value FROM decimals')
|
12
|
-
|
13
|
-
Benchmark.ips do |x|
|
14
|
-
x.report('_to_decimal') { result.send(:_to_decimal, 0, 0) }
|
15
|
-
x.report('_to_decimal_internal') { result.send(:_to_decimal_internal, 0, 0) }
|
16
|
-
end
|
data/benchmark/to_hugeint_ips.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'duckdb'
|
5
|
-
require 'benchmark/ips'
|
6
|
-
|
7
|
-
db = DuckDB::Database.open
|
8
|
-
con = db.connect
|
9
|
-
con.query('CREATE TABLE hugeints (hugeint_value HUGEINT)')
|
10
|
-
con.query('INSERT INTO hugeints VALUES (123456789012345678901234567890123456789)')
|
11
|
-
result = con.query('SELECT hugeint_value FROM hugeints')
|
12
|
-
|
13
|
-
Benchmark.ips do |x|
|
14
|
-
x.report('_to_hugeint') { result.send(:_to_hugeint, 0, 0) }
|
15
|
-
x.report('_to_hugeint_internal') { result.send(:_to_hugeint_internal, 0, 0) }
|
16
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'duckdb'
|
5
|
-
require 'stackprof'
|
6
|
-
|
7
|
-
db = DuckDB::Database.open
|
8
|
-
con = db.connect
|
9
|
-
con.query('CREATE TABLE hugeints (hugeint_value HUGEINT)')
|
10
|
-
con.query('INSERT INTO hugeints VALUES (123456789012345678901234567890123456789)')
|
11
|
-
result = con.query('SELECT hugeint_value FROM hugeints')
|
12
|
-
|
13
|
-
def profile(name, &block)
|
14
|
-
profile = StackProf.run(mode: :wall, interval: 1_000) do
|
15
|
-
2_000_000.times(&block)
|
16
|
-
end
|
17
|
-
|
18
|
-
result = StackProf::Report.new(profile)
|
19
|
-
puts
|
20
|
-
puts "=== #{name} ==="
|
21
|
-
result.print_text
|
22
|
-
puts
|
23
|
-
end
|
24
|
-
|
25
|
-
profile(:_to_hugeint) { result.send(:_to_hugeint, 0, 0) }
|
26
|
-
profile(:_to_hugeint_internal) { result.send(:_to_hugeint_internal, 0, 0) }
|