duckdb 0.8.2-dev1791.0 → 0.8.2-dev1862.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 (48) hide show
  1. package/binding.gyp +1 -0
  2. package/package.json +1 -1
  3. package/src/duckdb/src/common/constants.cpp +2 -1
  4. package/src/duckdb/src/common/enum_util.cpp +5 -5
  5. package/src/duckdb/src/core_functions/function_list.cpp +2 -0
  6. package/src/duckdb/src/core_functions/scalar/debug/vector_type.cpp +23 -0
  7. package/src/duckdb/src/execution/index/art/art.cpp +49 -108
  8. package/src/duckdb/src/execution/index/art/art_key.cpp +0 -11
  9. package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +10 -14
  10. package/src/duckdb/src/execution/index/art/iterator.cpp +13 -19
  11. package/src/duckdb/src/execution/index/art/leaf.cpp +290 -241
  12. package/src/duckdb/src/execution/index/art/node.cpp +104 -95
  13. package/src/duckdb/src/execution/index/art/node16.cpp +6 -6
  14. package/src/duckdb/src/execution/index/art/node256.cpp +6 -6
  15. package/src/duckdb/src/execution/index/art/node4.cpp +6 -6
  16. package/src/duckdb/src/execution/index/art/node48.cpp +6 -6
  17. package/src/duckdb/src/execution/index/art/prefix.cpp +49 -39
  18. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +34 -1175
  19. package/src/duckdb/src/execution/operator/schema/physical_create_index.cpp +4 -14
  20. package/src/duckdb/src/execution/window_executor.cpp +1280 -0
  21. package/src/duckdb/src/execution/window_segment_tree.cpp +224 -117
  22. package/src/duckdb/src/function/table/read_csv.cpp +4 -3
  23. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  24. package/src/duckdb/src/include/duckdb/common/constants.hpp +2 -0
  25. package/src/duckdb/src/include/duckdb/common/type_util.hpp +8 -0
  26. package/src/duckdb/src/include/duckdb/common/typedefs.hpp +8 -0
  27. package/src/duckdb/src/include/duckdb/core_functions/scalar/debug_functions.hpp +27 -0
  28. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +1 -1
  29. package/src/duckdb/src/include/duckdb/execution/index/art/art_key.hpp +0 -1
  30. package/src/duckdb/src/include/duckdb/execution/index/art/fixed_size_allocator.hpp +22 -24
  31. package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +2 -2
  32. package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +43 -40
  33. package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +119 -40
  34. package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +1 -0
  35. package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +1 -0
  36. package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +1 -0
  37. package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +1 -0
  38. package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +4 -2
  39. package/src/duckdb/src/include/duckdb/execution/window_executor.hpp +313 -0
  40. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +60 -53
  41. package/src/duckdb/src/storage/compression/rle.cpp +52 -12
  42. package/src/duckdb/ub_src_core_functions_scalar_debug.cpp +2 -0
  43. package/src/duckdb/ub_src_execution.cpp +2 -0
  44. package/src/duckdb/ub_src_execution_index_art.cpp +0 -4
  45. package/src/duckdb/src/execution/index/art/leaf_segment.cpp +0 -52
  46. package/src/duckdb/src/execution/index/art/swizzleable_pointer.cpp +0 -22
  47. package/src/duckdb/src/include/duckdb/execution/index/art/leaf_segment.hpp +0 -38
  48. 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.SetPtr(Node::GetAllocator(art, NType::PREFIX).New());
15
- node.type = (uint8_t)NType::PREFIX;
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.SetPtr(Node::GetAllocator(art, NType::PREFIX).New());
25
- node.type = (uint8_t)NType::PREFIX;
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().SetPtr(Node::GetAllocator(art, NType::PREFIX).New());
43
- node.get().type = (uint8_t)NType::PREFIX;
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.IsSwizzled());
65
+ D_ASSERT(prefix_node.IsSet() && !prefix_node.IsSerialized());
68
66
  D_ASSERT(child_prefix_node.IsSet());
69
67
 
70
- if (child_prefix_node.IsSwizzled()) {
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.DecodeARTNodeType() == NType::PREFIX) {
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.IsSwizzled());
77
+ D_ASSERT(prefix.get().ptr.IsSet() && !prefix.get().ptr.IsSerialized());
80
78
 
81
- while (prefix.get().ptr.DecodeARTNodeType() == NType::PREFIX) {
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.IsSwizzled());
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.DecodeARTNodeType() == NType::PREFIX) {
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.DecodeARTNodeType() != NType::PREFIX && child_prefix_node.DecodeARTNodeType() == NType::PREFIX) {
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().IsSwizzled());
116
- D_ASSERT(prefix_node.get().DecodeARTNodeType() == NType::PREFIX);
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().DecodeARTNodeType() == NType::PREFIX) {
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().IsSwizzled()) {
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.DecodeARTNodeType() != NType::PREFIX && r_prefix.data[Node::PREFIX_SIZE] == max_count) {
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.IsSwizzled());
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().IsSwizzled());
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.IsSwizzled()) {
224
+ if (prefix.ptr.IsSerialized()) {
227
225
  prefix.ptr.Deserialize(art);
228
226
  }
229
227
 
230
- if (prefix.ptr.DecodeARTNodeType() == NType::PREFIX) {
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
- D_ASSERT(data[Node::PREFIX_SIZE] != 0);
261
- D_ASSERT(data[Node::PREFIX_SIZE] <= Node::PREFIX_SIZE);
258
+ // NOTE: we could do this recursively, but the function-call overhead can become kinda crazy
259
+ string str = "";
262
260
 
263
- string str = " prefix_bytes:[";
264
- for (idx_t i = 0; i < data[Node::PREFIX_SIZE]; i++) {
265
- str += to_string(data[i]) + "-";
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 = only_verify ? ptr.VerifyAndToString(art, only_verify) : str + ptr.VerifyAndToString(art, only_verify);
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.IsSwizzled());
335
+ D_ASSERT(other_prefix.IsSet() && !other_prefix.IsSerialized());
326
336
 
327
337
  reference<Prefix> prefix(*this);
328
- while (other_prefix.DecodeARTNodeType() == NType::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.IsSwizzled()) {
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.DecodeARTNodeType() != NType::PREFIX);
356
+ D_ASSERT(prefix.get().ptr.GetType() != NType::PREFIX);
347
357
  }
348
358
 
349
359
  } // namespace duckdb