duckdb 0.8.2-dev1764.0 → 0.8.2-dev1859.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.
- package/README.md +7 -0
- package/binding.gyp +1 -0
- package/package.json +1 -1
- package/src/duckdb/extension/parquet/include/parquet_reader.hpp +1 -0
- package/src/duckdb/extension/parquet/parquet_extension.cpp +38 -22
- package/src/duckdb/extension/parquet/parquet_reader.cpp +1 -4
- package/src/duckdb/src/common/constants.cpp +2 -1
- package/src/duckdb/src/common/enum_util.cpp +5 -5
- package/src/duckdb/src/common/sort/sort_state.cpp +1 -1
- package/src/duckdb/src/common/sort/sorted_block.cpp +1 -1
- package/src/duckdb/src/common/types/column/column_data_collection.cpp +8 -0
- package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +5 -0
- package/src/duckdb/src/common/types/string_heap.cpp +4 -0
- package/src/duckdb/src/core_functions/function_list.cpp +2 -0
- package/src/duckdb/src/core_functions/scalar/debug/vector_type.cpp +23 -0
- package/src/duckdb/src/execution/index/art/art.cpp +49 -108
- package/src/duckdb/src/execution/index/art/art_key.cpp +0 -11
- package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +10 -14
- package/src/duckdb/src/execution/index/art/iterator.cpp +13 -19
- package/src/duckdb/src/execution/index/art/leaf.cpp +290 -241
- package/src/duckdb/src/execution/index/art/node.cpp +104 -95
- package/src/duckdb/src/execution/index/art/node16.cpp +6 -6
- package/src/duckdb/src/execution/index/art/node256.cpp +6 -6
- package/src/duckdb/src/execution/index/art/node4.cpp +6 -6
- package/src/duckdb/src/execution/index/art/node48.cpp +6 -6
- package/src/duckdb/src/execution/index/art/prefix.cpp +49 -39
- package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +34 -1175
- package/src/duckdb/src/execution/operator/schema/physical_create_index.cpp +4 -14
- package/src/duckdb/src/execution/window_executor.cpp +1280 -0
- package/src/duckdb/src/execution/window_segment_tree.cpp +224 -117
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/include/duckdb/common/constants.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/type_util.hpp +8 -0
- package/src/duckdb/src/include/duckdb/common/typedefs.hpp +8 -0
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +10 -0
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/types/string_heap.hpp +3 -0
- package/src/duckdb/src/include/duckdb/core_functions/scalar/debug_functions.hpp +27 -0
- package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/index/art/art_key.hpp +0 -1
- package/src/duckdb/src/include/duckdb/execution/index/art/fixed_size_allocator.hpp +22 -24
- package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +43 -40
- package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +119 -40
- package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +1 -0
- package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +1 -0
- package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +1 -0
- package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +1 -0
- package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +4 -2
- package/src/duckdb/src/include/duckdb/execution/window_executor.hpp +313 -0
- package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +60 -53
- package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +1 -0
- package/src/duckdb/src/parser/parser.cpp +43 -38
- package/src/duckdb/src/storage/arena_allocator.cpp +12 -0
- package/src/duckdb/src/storage/compression/rle.cpp +52 -12
- package/src/duckdb/ub_src_core_functions_scalar_debug.cpp +2 -0
- package/src/duckdb/ub_src_execution.cpp +2 -0
- package/src/duckdb/ub_src_execution_index_art.cpp +0 -4
- package/src/duckdb/src/execution/index/art/leaf_segment.cpp +0 -52
- package/src/duckdb/src/execution/index/art/swizzleable_pointer.cpp +0 -22
- package/src/duckdb/src/include/duckdb/execution/index/art/leaf_segment.hpp +0 -38
- package/src/duckdb/src/include/duckdb/execution/index/art/swizzleable_pointer.hpp +0 -58
@@ -11,8 +11,8 @@ namespace duckdb {
|
|
11
11
|
|
12
12
|
Prefix &Prefix::New(ART &art, Node &node) {
|
13
13
|
|
14
|
-
node
|
15
|
-
node.
|
14
|
+
node = Node::GetAllocator(art, NType::PREFIX).New();
|
15
|
+
node.SetType((uint8_t)NType::PREFIX);
|
16
16
|
|
17
17
|
auto &prefix = Prefix::Get(art, node);
|
18
18
|
prefix.data[Node::PREFIX_SIZE] = 0;
|
@@ -21,8 +21,8 @@ Prefix &Prefix::New(ART &art, Node &node) {
|
|
21
21
|
|
22
22
|
Prefix &Prefix::New(ART &art, Node &node, uint8_t byte, Node next) {
|
23
23
|
|
24
|
-
node
|
25
|
-
node.
|
24
|
+
node = Node::GetAllocator(art, NType::PREFIX).New();
|
25
|
+
node.SetType((uint8_t)NType::PREFIX);
|
26
26
|
|
27
27
|
auto &prefix = Prefix::Get(art, node);
|
28
28
|
prefix.data[Node::PREFIX_SIZE] = 1;
|
@@ -39,8 +39,8 @@ void Prefix::New(ART &art, reference<Node> &node, const ARTKey &key, const uint3
|
|
39
39
|
idx_t copy_count = 0;
|
40
40
|
|
41
41
|
while (count) {
|
42
|
-
node.get()
|
43
|
-
node.get().
|
42
|
+
node.get() = Node::GetAllocator(art, NType::PREFIX).New();
|
43
|
+
node.get().SetType((uint8_t)NType::PREFIX);
|
44
44
|
auto &prefix = Prefix::Get(art, node);
|
45
45
|
|
46
46
|
auto this_count = MinValue((uint32_t)Node::PREFIX_SIZE, count);
|
@@ -55,38 +55,36 @@ void Prefix::New(ART &art, reference<Node> &node, const ARTKey &key, const uint3
|
|
55
55
|
|
56
56
|
void Prefix::Free(ART &art, Node &node) {
|
57
57
|
|
58
|
-
D_ASSERT(node.IsSet());
|
59
|
-
D_ASSERT(!node.IsSwizzled());
|
60
|
-
|
58
|
+
D_ASSERT(node.IsSet() && !node.IsSerialized());
|
61
59
|
auto &child = Prefix::Get(art, node).ptr;
|
62
60
|
Node::Free(art, child);
|
63
61
|
}
|
64
62
|
|
65
63
|
void Prefix::Concatenate(ART &art, Node &prefix_node, const uint8_t byte, Node &child_prefix_node) {
|
66
64
|
|
67
|
-
D_ASSERT(prefix_node.IsSet() && !prefix_node.
|
65
|
+
D_ASSERT(prefix_node.IsSet() && !prefix_node.IsSerialized());
|
68
66
|
D_ASSERT(child_prefix_node.IsSet());
|
69
67
|
|
70
|
-
if (child_prefix_node.
|
68
|
+
if (child_prefix_node.IsSerialized()) {
|
71
69
|
child_prefix_node.Deserialize(art);
|
72
70
|
}
|
73
71
|
|
74
72
|
// append a byte and a child_prefix to prefix
|
75
|
-
if (prefix_node.
|
73
|
+
if (prefix_node.GetType() == NType::PREFIX) {
|
76
74
|
|
77
75
|
// get the tail
|
78
76
|
reference<Prefix> prefix = Prefix::Get(art, prefix_node);
|
79
|
-
D_ASSERT(prefix.get().ptr.IsSet() && !prefix.get().ptr.
|
77
|
+
D_ASSERT(prefix.get().ptr.IsSet() && !prefix.get().ptr.IsSerialized());
|
80
78
|
|
81
|
-
while (prefix.get().ptr.
|
79
|
+
while (prefix.get().ptr.GetType() == NType::PREFIX) {
|
82
80
|
prefix = Prefix::Get(art, prefix.get().ptr);
|
83
|
-
D_ASSERT(prefix.get().ptr.IsSet() && !prefix.get().ptr.
|
81
|
+
D_ASSERT(prefix.get().ptr.IsSet() && !prefix.get().ptr.IsSerialized());
|
84
82
|
}
|
85
83
|
|
86
84
|
// append the byte
|
87
85
|
prefix = prefix.get().Append(art, byte);
|
88
86
|
|
89
|
-
if (child_prefix_node.
|
87
|
+
if (child_prefix_node.GetType() == NType::PREFIX) {
|
90
88
|
// append the child prefix
|
91
89
|
prefix.get().Append(art, child_prefix_node);
|
92
90
|
} else {
|
@@ -97,7 +95,7 @@ void Prefix::Concatenate(ART &art, Node &prefix_node, const uint8_t byte, Node &
|
|
97
95
|
}
|
98
96
|
|
99
97
|
// create a new prefix node containing the byte, then append the child_prefix to it
|
100
|
-
if (prefix_node.
|
98
|
+
if (prefix_node.GetType() != NType::PREFIX && child_prefix_node.GetType() == NType::PREFIX) {
|
101
99
|
|
102
100
|
auto child_prefix = child_prefix_node;
|
103
101
|
auto &prefix = Prefix::New(art, prefix_node, byte, Node());
|
@@ -112,11 +110,11 @@ void Prefix::Concatenate(ART &art, Node &prefix_node, const uint8_t byte, Node &
|
|
112
110
|
|
113
111
|
idx_t Prefix::Traverse(ART &art, reference<Node> &prefix_node, const ARTKey &key, idx_t &depth) {
|
114
112
|
|
115
|
-
D_ASSERT(prefix_node.get().IsSet() && !prefix_node.get().
|
116
|
-
D_ASSERT(prefix_node.get().
|
113
|
+
D_ASSERT(prefix_node.get().IsSet() && !prefix_node.get().IsSerialized());
|
114
|
+
D_ASSERT(prefix_node.get().GetType() == NType::PREFIX);
|
117
115
|
|
118
116
|
// compare prefix nodes to key bytes
|
119
|
-
while (prefix_node.get().
|
117
|
+
while (prefix_node.get().GetType() == NType::PREFIX) {
|
120
118
|
auto &prefix = Prefix::Get(art, prefix_node);
|
121
119
|
for (idx_t i = 0; i < prefix.data[Node::PREFIX_SIZE]; i++) {
|
122
120
|
if (prefix.data[i] != key[depth]) {
|
@@ -126,7 +124,7 @@ idx_t Prefix::Traverse(ART &art, reference<Node> &prefix_node, const ARTKey &key
|
|
126
124
|
}
|
127
125
|
prefix_node = prefix.ptr;
|
128
126
|
D_ASSERT(prefix_node.get().IsSet());
|
129
|
-
if (prefix_node.get().
|
127
|
+
if (prefix_node.get().IsSerialized()) {
|
130
128
|
prefix_node.get().Deserialize(art);
|
131
129
|
}
|
132
130
|
}
|
@@ -158,7 +156,7 @@ bool Prefix::Traverse(ART &art, reference<Node> &l_node, reference<Node> &r_node
|
|
158
156
|
mismatch_position = max_count;
|
159
157
|
|
160
158
|
// l_prefix contains r_prefix
|
161
|
-
if (r_prefix.ptr.
|
159
|
+
if (r_prefix.ptr.GetType() != NType::PREFIX && r_prefix.data[Node::PREFIX_SIZE] == max_count) {
|
162
160
|
swap(l_node.get(), r_node.get());
|
163
161
|
l_node = r_prefix.ptr;
|
164
162
|
|
@@ -173,7 +171,7 @@ bool Prefix::Traverse(ART &art, reference<Node> &l_node, reference<Node> &r_node
|
|
173
171
|
|
174
172
|
void Prefix::Reduce(ART &art, Node &prefix_node, const idx_t n) {
|
175
173
|
|
176
|
-
D_ASSERT(prefix_node.IsSet() && !prefix_node.
|
174
|
+
D_ASSERT(prefix_node.IsSet() && !prefix_node.IsSerialized());
|
177
175
|
D_ASSERT(n < Node::PREFIX_SIZE);
|
178
176
|
|
179
177
|
reference<Prefix> prefix = Prefix::Get(art, prefix_node);
|
@@ -201,7 +199,7 @@ void Prefix::Reduce(ART &art, Node &prefix_node, const idx_t n) {
|
|
201
199
|
|
202
200
|
void Prefix::Split(ART &art, reference<Node> &prefix_node, Node &child_node, idx_t position) {
|
203
201
|
|
204
|
-
D_ASSERT(prefix_node.get().IsSet() && !prefix_node.get().
|
202
|
+
D_ASSERT(prefix_node.get().IsSet() && !prefix_node.get().IsSerialized());
|
205
203
|
|
206
204
|
auto &prefix = Prefix::Get(art, prefix_node);
|
207
205
|
|
@@ -223,11 +221,11 @@ void Prefix::Split(ART &art, reference<Node> &prefix_node, Node &child_node, idx
|
|
223
221
|
}
|
224
222
|
|
225
223
|
D_ASSERT(prefix.ptr.IsSet());
|
226
|
-
if (prefix.ptr.
|
224
|
+
if (prefix.ptr.IsSerialized()) {
|
227
225
|
prefix.ptr.Deserialize(art);
|
228
226
|
}
|
229
227
|
|
230
|
-
if (prefix.ptr.
|
228
|
+
if (prefix.ptr.GetType() == NType::PREFIX) {
|
231
229
|
child_prefix.get().Append(art, prefix.ptr);
|
232
230
|
} else {
|
233
231
|
// this is the last prefix node of the prefix
|
@@ -255,19 +253,31 @@ void Prefix::Split(ART &art, reference<Node> &prefix_node, Node &child_node, idx
|
|
255
253
|
return;
|
256
254
|
}
|
257
255
|
|
258
|
-
string Prefix::VerifyAndToString(ART &art, const bool only_verify) {
|
256
|
+
string Prefix::VerifyAndToString(ART &art, Node &node, const bool only_verify) {
|
259
257
|
|
260
|
-
|
261
|
-
|
258
|
+
// NOTE: we could do this recursively, but the function-call overhead can become kinda crazy
|
259
|
+
string str = "";
|
262
260
|
|
263
|
-
|
264
|
-
|
265
|
-
|
261
|
+
reference<Node> node_ref(node);
|
262
|
+
while (node_ref.get().GetType() == NType::PREFIX) {
|
263
|
+
|
264
|
+
auto &prefix = Prefix::Get(art, node_ref);
|
265
|
+
D_ASSERT(prefix.data[Node::PREFIX_SIZE] != 0);
|
266
|
+
D_ASSERT(prefix.data[Node::PREFIX_SIZE] <= Node::PREFIX_SIZE);
|
267
|
+
|
268
|
+
str += " prefix_bytes:[";
|
269
|
+
for (idx_t i = 0; i < prefix.data[Node::PREFIX_SIZE]; i++) {
|
270
|
+
str += to_string(prefix.data[i]) + "-";
|
271
|
+
}
|
272
|
+
str += "] ";
|
273
|
+
|
274
|
+
if (prefix.ptr.IsSerialized()) {
|
275
|
+
return str + " serialized";
|
276
|
+
}
|
277
|
+
node_ref = prefix.ptr;
|
266
278
|
}
|
267
|
-
str += "] ";
|
268
279
|
|
269
|
-
str
|
270
|
-
return str;
|
280
|
+
return str + node_ref.get().VerifyAndToString(art, only_verify);
|
271
281
|
}
|
272
282
|
|
273
283
|
BlockPointer Prefix::Serialize(ART &art, MetaBlockWriter &writer) {
|
@@ -322,10 +332,10 @@ Prefix &Prefix::Append(ART &art, const uint8_t byte) {
|
|
322
332
|
void Prefix::Append(ART &art, Node other_prefix) {
|
323
333
|
|
324
334
|
// NOTE: all usages of this function already deserialize the other prefix
|
325
|
-
D_ASSERT(other_prefix.IsSet() && !other_prefix.
|
335
|
+
D_ASSERT(other_prefix.IsSet() && !other_prefix.IsSerialized());
|
326
336
|
|
327
337
|
reference<Prefix> prefix(*this);
|
328
|
-
while (other_prefix.
|
338
|
+
while (other_prefix.GetType() == NType::PREFIX) {
|
329
339
|
|
330
340
|
// copy prefix bytes
|
331
341
|
auto &other = Prefix::Get(art, other_prefix);
|
@@ -334,7 +344,7 @@ void Prefix::Append(ART &art, Node other_prefix) {
|
|
334
344
|
}
|
335
345
|
|
336
346
|
D_ASSERT(other.ptr.IsSet());
|
337
|
-
if (other.ptr.
|
347
|
+
if (other.ptr.IsSerialized()) {
|
338
348
|
other.ptr.Deserialize(art);
|
339
349
|
}
|
340
350
|
|
@@ -343,7 +353,7 @@ void Prefix::Append(ART &art, Node other_prefix) {
|
|
343
353
|
other_prefix = prefix.get().ptr;
|
344
354
|
}
|
345
355
|
|
346
|
-
D_ASSERT(prefix.get().ptr.
|
356
|
+
D_ASSERT(prefix.get().ptr.GetType() != NType::PREFIX);
|
347
357
|
}
|
348
358
|
|
349
359
|
} // namespace duckdb
|