duckdb 0.8.2-dev3458.0 → 0.8.2-dev3949.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 (180) hide show
  1. package/binding.gyp +2 -0
  2. package/package.json +1 -1
  3. package/src/duckdb/extension/icu/icu_extension.cpp +5 -5
  4. package/src/duckdb/extension/json/include/json_deserializer.hpp +7 -16
  5. package/src/duckdb/extension/json/include/json_serializer.hpp +9 -15
  6. package/src/duckdb/extension/json/json_deserializer.cpp +29 -67
  7. package/src/duckdb/extension/json/json_scan.cpp +1 -1
  8. package/src/duckdb/extension/json/json_serializer.cpp +26 -69
  9. package/src/duckdb/src/common/enum_util.cpp +119 -7
  10. package/src/duckdb/src/common/extra_type_info.cpp +7 -3
  11. package/src/duckdb/src/common/radix_partitioning.cpp +8 -31
  12. package/src/duckdb/src/common/row_operations/row_aggregate.cpp +18 -3
  13. package/src/duckdb/src/common/serializer/binary_deserializer.cpp +62 -77
  14. package/src/duckdb/src/common/serializer/binary_serializer.cpp +84 -84
  15. package/src/duckdb/src/common/serializer/format_serializer.cpp +1 -1
  16. package/src/duckdb/src/common/sort/partition_state.cpp +41 -33
  17. package/src/duckdb/src/common/types/data_chunk.cpp +44 -8
  18. package/src/duckdb/src/common/types/hyperloglog.cpp +21 -0
  19. package/src/duckdb/src/common/types/interval.cpp +3 -0
  20. package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +252 -126
  21. package/src/duckdb/src/common/types/row/row_layout.cpp +3 -31
  22. package/src/duckdb/src/common/types/row/tuple_data_allocator.cpp +40 -32
  23. package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +39 -26
  24. package/src/duckdb/src/common/types/row/tuple_data_layout.cpp +11 -1
  25. package/src/duckdb/src/common/types/row/tuple_data_segment.cpp +21 -16
  26. package/src/duckdb/src/common/types/value.cpp +63 -42
  27. package/src/duckdb/src/common/types/vector.cpp +33 -67
  28. package/src/duckdb/src/core_functions/scalar/list/list_lambdas.cpp +3 -2
  29. package/src/duckdb/src/execution/aggregate_hashtable.cpp +222 -364
  30. package/src/duckdb/src/execution/join_hashtable.cpp +5 -6
  31. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +240 -310
  32. package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +202 -173
  33. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +36 -2
  34. package/src/duckdb/src/execution/operator/{persistent → csv_scanner}/base_csv_reader.cpp +58 -162
  35. package/src/duckdb/src/execution/operator/csv_scanner/buffered_csv_reader.cpp +434 -0
  36. package/src/duckdb/src/execution/operator/csv_scanner/csv_buffer.cpp +80 -0
  37. package/src/duckdb/src/execution/operator/csv_scanner/csv_buffer_manager.cpp +90 -0
  38. package/src/duckdb/src/execution/operator/csv_scanner/csv_file_handle.cpp +95 -0
  39. package/src/duckdb/src/execution/operator/{persistent → csv_scanner}/csv_reader_options.cpp +47 -28
  40. package/src/duckdb/src/execution/operator/csv_scanner/csv_state_machine.cpp +35 -0
  41. package/src/duckdb/src/execution/operator/csv_scanner/csv_state_machine_cache.cpp +107 -0
  42. package/src/duckdb/src/execution/operator/{persistent → csv_scanner}/parallel_csv_reader.cpp +44 -44
  43. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/csv_sniffer.cpp +52 -0
  44. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/dialect_detection.cpp +336 -0
  45. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/header_detection.cpp +165 -0
  46. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_detection.cpp +398 -0
  47. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_refinement.cpp +175 -0
  48. package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_replacement.cpp +39 -0
  49. package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +1 -1
  50. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +1 -2
  51. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +614 -574
  52. package/src/duckdb/src/execution/window_executor.cpp +6 -5
  53. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -0
  54. package/src/duckdb/src/function/scalar/strftime_format.cpp +4 -4
  55. package/src/duckdb/src/function/table/copy_csv.cpp +94 -96
  56. package/src/duckdb/src/function/table/read_csv.cpp +150 -136
  57. package/src/duckdb/src/function/table/table_scan.cpp +0 -2
  58. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  59. package/src/duckdb/src/include/duckdb/common/enum_util.hpp +24 -0
  60. package/src/duckdb/src/include/duckdb/common/file_opener.hpp +9 -0
  61. package/src/duckdb/src/include/duckdb/common/fixed_size_map.hpp +208 -0
  62. package/src/duckdb/src/include/duckdb/common/optional_idx.hpp +3 -0
  63. package/src/duckdb/src/include/duckdb/common/perfect_map_set.hpp +2 -1
  64. package/src/duckdb/src/include/duckdb/common/printer.hpp +11 -0
  65. package/src/duckdb/src/include/duckdb/common/serializer/binary_deserializer.hpp +43 -30
  66. package/src/duckdb/src/include/duckdb/common/serializer/binary_serializer.hpp +36 -35
  67. package/src/duckdb/src/include/duckdb/common/serializer/deserialization_data.hpp +18 -0
  68. package/src/duckdb/src/include/duckdb/common/serializer/encoding_util.hpp +132 -0
  69. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +125 -150
  70. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +119 -107
  71. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +2 -1
  72. package/src/duckdb/src/include/duckdb/common/shared_ptr.hpp +8 -0
  73. package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +13 -7
  74. package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +5 -0
  75. package/src/duckdb/src/include/duckdb/common/types/hyperloglog.hpp +7 -1
  76. package/src/duckdb/src/include/duckdb/common/types/interval.hpp +7 -0
  77. package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +41 -9
  78. package/src/duckdb/src/include/duckdb/common/types/row/row_data_collection_scanner.hpp +5 -0
  79. package/src/duckdb/src/include/duckdb/common/types/row/row_layout.hpp +1 -23
  80. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_allocator.hpp +14 -8
  81. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +6 -3
  82. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_layout.hpp +7 -0
  83. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_segment.hpp +13 -8
  84. package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +3 -2
  85. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -3
  86. package/src/duckdb/src/include/duckdb/common/vector.hpp +2 -2
  87. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +125 -146
  88. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_hash_aggregate.hpp +5 -4
  89. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_window.hpp +4 -3
  90. package/src/duckdb/src/include/duckdb/execution/operator/{persistent → scan/csv}/base_csv_reader.hpp +17 -17
  91. package/src/duckdb/src/include/duckdb/execution/operator/scan/csv/buffered_csv_reader.hpp +72 -0
  92. package/src/duckdb/src/include/duckdb/execution/operator/scan/csv/csv_buffer.hpp +110 -0
  93. package/src/duckdb/src/include/duckdb/execution/operator/scan/csv/csv_buffer_manager.hpp +103 -0
  94. package/src/duckdb/src/include/duckdb/execution/operator/{persistent → scan/csv}/csv_file_handle.hpp +8 -15
  95. package/src/duckdb/src/include/duckdb/execution/operator/{persistent → scan/csv}/csv_line_info.hpp +1 -1
  96. package/src/duckdb/src/include/duckdb/execution/operator/{persistent → scan/csv}/csv_reader_options.hpp +52 -28
  97. package/src/duckdb/src/include/duckdb/execution/operator/scan/csv/csv_sniffer.hpp +127 -0
  98. package/src/duckdb/src/include/duckdb/execution/operator/scan/csv/csv_state_machine.hpp +75 -0
  99. package/src/duckdb/src/include/duckdb/execution/operator/scan/csv/csv_state_machine_cache.hpp +51 -0
  100. package/src/duckdb/src/include/duckdb/execution/operator/{persistent → scan/csv}/parallel_csv_reader.hpp +21 -27
  101. package/src/duckdb/src/include/duckdb/execution/operator/scan/csv/quote_rules.hpp +21 -0
  102. package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +18 -27
  103. package/src/duckdb/src/include/duckdb/function/function_serialization.hpp +5 -6
  104. package/src/duckdb/src/include/duckdb/function/scalar/strftime_format.hpp +4 -4
  105. package/src/duckdb/src/include/duckdb/function/table/read_csv.hpp +17 -12
  106. package/src/duckdb/src/include/duckdb/main/client_context_file_opener.hpp +1 -0
  107. package/src/duckdb/src/include/duckdb/main/client_data.hpp +2 -1
  108. package/src/duckdb/src/include/duckdb/main/config.hpp +1 -0
  109. package/src/duckdb/src/include/duckdb/main/connection.hpp +2 -2
  110. package/src/duckdb/src/include/duckdb/main/relation/read_csv_relation.hpp +6 -6
  111. package/src/duckdb/src/include/duckdb/parallel/event.hpp +12 -1
  112. package/src/duckdb/src/include/duckdb/storage/block.hpp +6 -0
  113. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +3 -0
  114. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +7 -3
  115. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +4 -0
  116. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +5 -0
  117. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +3 -0
  118. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +3 -0
  119. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +3 -0
  120. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +3 -0
  121. package/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +15 -3
  122. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +4 -0
  123. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  124. package/src/duckdb/src/include/duckdb/verification/deserialized_statement_verifier_v2.hpp +6 -0
  125. package/src/duckdb/src/include/duckdb/verification/statement_verifier.hpp +1 -0
  126. package/src/duckdb/src/include/duckdb.h +12 -0
  127. package/src/duckdb/src/main/capi/logical_types-c.cpp +22 -0
  128. package/src/duckdb/src/main/client_context_file_opener.cpp +17 -0
  129. package/src/duckdb/src/main/client_verify.cpp +1 -0
  130. package/src/duckdb/src/main/config.cpp +2 -2
  131. package/src/duckdb/src/main/connection.cpp +3 -3
  132. package/src/duckdb/src/main/relation/read_csv_relation.cpp +19 -13
  133. package/src/duckdb/src/parallel/pipeline_finish_event.cpp +1 -1
  134. package/src/duckdb/src/parser/tableref/pivotref.cpp +0 -16
  135. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +1 -1
  136. package/src/duckdb/src/planner/binder/statement/bind_export.cpp +41 -25
  137. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +4 -4
  138. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +10 -10
  139. package/src/duckdb/src/planner/logical_operator.cpp +1 -1
  140. package/src/duckdb/src/planner/planner.cpp +1 -1
  141. package/src/duckdb/src/storage/checkpoint_manager.cpp +4 -3
  142. package/src/duckdb/src/storage/serialization/serialize_constraint.cpp +1 -1
  143. package/src/duckdb/src/storage/serialization/serialize_create_info.cpp +5 -5
  144. package/src/duckdb/src/storage/serialization/serialize_expression.cpp +10 -10
  145. package/src/duckdb/src/storage/serialization/serialize_logical_operator.cpp +20 -20
  146. package/src/duckdb/src/storage/serialization/serialize_macro_function.cpp +2 -2
  147. package/src/duckdb/src/storage/serialization/serialize_nodes.cpp +118 -89
  148. package/src/duckdb/src/storage/serialization/serialize_parse_info.cpp +3 -3
  149. package/src/duckdb/src/storage/serialization/serialize_parsed_expression.cpp +27 -27
  150. package/src/duckdb/src/storage/serialization/serialize_query_node.cpp +16 -16
  151. package/src/duckdb/src/storage/serialization/serialize_result_modifier.cpp +8 -8
  152. package/src/duckdb/src/storage/serialization/serialize_statement.cpp +1 -1
  153. package/src/duckdb/src/storage/serialization/serialize_storage.cpp +39 -0
  154. package/src/duckdb/src/storage/serialization/serialize_tableref.cpp +9 -9
  155. package/src/duckdb/src/storage/statistics/base_statistics.cpp +67 -4
  156. package/src/duckdb/src/storage/statistics/column_statistics.cpp +16 -0
  157. package/src/duckdb/src/storage/statistics/list_stats.cpp +21 -0
  158. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +126 -1
  159. package/src/duckdb/src/storage/statistics/string_stats.cpp +23 -0
  160. package/src/duckdb/src/storage/statistics/struct_stats.cpp +27 -0
  161. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  162. package/src/duckdb/src/storage/table/chunk_info.cpp +82 -3
  163. package/src/duckdb/src/storage/table/row_group.cpp +68 -1
  164. package/src/duckdb/src/storage/table/table_statistics.cpp +21 -0
  165. package/src/duckdb/src/storage/wal_replay.cpp +2 -2
  166. package/src/duckdb/src/verification/deserialized_statement_verifier_v2.cpp +15 -1
  167. package/src/duckdb/src/verification/statement_verifier.cpp +2 -0
  168. package/src/duckdb/third_party/utf8proc/include/utf8proc_wrapper.hpp +8 -0
  169. package/src/duckdb/ub_src_execution.cpp +0 -2
  170. package/src/duckdb/ub_src_execution_operator_csv_scanner.cpp +18 -0
  171. package/src/duckdb/ub_src_execution_operator_csv_scanner_sniffer.cpp +12 -0
  172. package/src/duckdb/ub_src_execution_operator_persistent.cpp +0 -12
  173. package/src/duckdb/ub_src_storage_serialization.cpp +2 -0
  174. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +0 -1487
  175. package/src/duckdb/src/execution/operator/persistent/csv_buffer.cpp +0 -72
  176. package/src/duckdb/src/execution/operator/persistent/csv_file_handle.cpp +0 -158
  177. package/src/duckdb/src/execution/partitionable_hashtable.cpp +0 -207
  178. package/src/duckdb/src/include/duckdb/execution/operator/persistent/buffered_csv_reader.hpp +0 -133
  179. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_buffer.hpp +0 -74
  180. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +0 -73
@@ -13,7 +13,6 @@
13
13
  #include "duckdb/common/enum_util.hpp"
14
14
  #include "duckdb/common/serializer/serialization_traits.hpp"
15
15
  #include "duckdb/common/serializer/deserialization_data.hpp"
16
- #include "duckdb/common/types/interval.hpp"
17
16
  #include "duckdb/common/types/string_type.hpp"
18
17
  #include "duckdb/common/unordered_map.hpp"
19
18
  #include "duckdb/common/unordered_set.hpp"
@@ -21,92 +20,78 @@
21
20
  namespace duckdb {
22
21
 
23
22
  class FormatDeserializer {
24
- friend Vector;
25
-
26
23
  protected:
27
24
  bool deserialize_enum_from_string = false;
28
25
  DeserializationData data;
29
26
 
27
+ public:
28
+ class List {
29
+ friend FormatDeserializer;
30
+
31
+ private:
32
+ FormatDeserializer &deserializer;
33
+ explicit List(FormatDeserializer &deserializer) : deserializer(deserializer) {
34
+ }
35
+
36
+ public:
37
+ // Deserialize an element
38
+ template <class T>
39
+ T ReadElement();
40
+
41
+ // Deserialize an object
42
+ template <class FUNC>
43
+ void ReadObject(FUNC f);
44
+ };
45
+
30
46
  public:
31
47
  // Read into an existing value
32
48
  template <typename T>
33
49
  inline void ReadProperty(const field_id_t field_id, const char *tag, T &ret) {
34
- SetTag(field_id, tag);
50
+ OnPropertyBegin(field_id, tag);
35
51
  ret = Read<T>();
52
+ OnPropertyEnd();
36
53
  }
37
54
 
38
55
  // Read and return a value
39
56
  template <typename T>
40
57
  inline T ReadProperty(const field_id_t field_id, const char *tag) {
41
- SetTag(field_id, tag);
42
- return Read<T>();
58
+ OnPropertyBegin(field_id, tag);
59
+ auto ret = Read<T>();
60
+ OnPropertyEnd();
61
+ ;
62
+ return ret;
43
63
  }
44
64
 
45
- // Read optional property and return a value, or forward a default value
65
+ // Default Value return
46
66
  template <typename T>
47
- inline T ReadOptionalPropertyOrDefault(const field_id_t field_id, const char *tag, T &&default_value) {
48
- SetTag(field_id, tag);
49
- auto present = OnOptionalBegin();
50
- if (present) {
51
- auto item = Read<T>();
52
- OnOptionalEnd();
53
- return item;
54
- } else {
55
- OnOptionalEnd();
67
+ inline T ReadPropertyWithDefault(const field_id_t field_id, const char *tag, T &&default_value) {
68
+ if (!OnOptionalPropertyBegin(field_id, tag)) {
69
+ OnOptionalPropertyEnd(false);
56
70
  return std::forward<T>(default_value);
57
71
  }
72
+ auto ret = Read<T>();
73
+ OnOptionalPropertyEnd(true);
74
+ return ret;
58
75
  }
59
76
 
60
- // Read optional property into an existing value, or use a default value
77
+ // Default value in place
61
78
  template <typename T>
62
- inline void ReadOptionalPropertyOrDefault(const field_id_t field_id, const char *tag, T &ret, T &&default_value) {
63
- SetTag(field_id, tag);
64
- auto present = OnOptionalBegin();
65
- if (present) {
66
- ret = Read<T>();
67
- OnOptionalEnd();
68
- } else {
79
+ inline void ReadPropertyWithDefault(const field_id_t field_id, const char *tag, T &ret, T &&default_value) {
80
+ if (!OnOptionalPropertyBegin(field_id, tag)) {
69
81
  ret = std::forward<T>(default_value);
70
- OnOptionalEnd();
71
- }
72
- }
73
-
74
- // Read optional property and return a value, or default construct it
75
- template <typename T>
76
- inline typename std::enable_if<std::is_default_constructible<T>::value, T>::type
77
- ReadOptionalProperty(const field_id_t field_id, const char *tag) {
78
- SetTag(field_id, tag);
79
- auto present = OnOptionalBegin();
80
- if (present) {
81
- auto item = Read<T>();
82
- OnOptionalEnd();
83
- return item;
84
- } else {
85
- OnOptionalEnd();
86
- return T();
87
- }
88
- }
89
-
90
- // Read optional property into an existing value, or default construct it
91
- template <typename T>
92
- inline typename std::enable_if<std::is_default_constructible<T>::value, void>::type
93
- ReadOptionalProperty(const field_id_t field_id, const char *tag, T &ret) {
94
- SetTag(field_id, tag);
95
- auto present = OnOptionalBegin();
96
- if (present) {
97
- ret = Read<T>();
98
- OnOptionalEnd();
99
- } else {
100
- ret = T();
101
- OnOptionalEnd();
82
+ OnOptionalPropertyEnd(false);
83
+ return;
102
84
  }
85
+ ret = Read<T>();
86
+ OnOptionalPropertyEnd(true);
103
87
  }
104
88
 
105
89
  // Special case:
106
90
  // Read into an existing data_ptr_t
107
91
  inline void ReadProperty(const field_id_t field_id, const char *tag, data_ptr_t ret, idx_t count) {
108
- SetTag(field_id, tag);
92
+ OnPropertyBegin(field_id, tag);
109
93
  ReadDataPtr(ret, count);
94
+ OnPropertyEnd();
110
95
  }
111
96
 
112
97
  //! Set a serialization property
@@ -127,14 +112,25 @@ public:
127
112
  return data.Unset<T>();
128
113
  }
129
114
 
130
- // Manually begin an object - should be followed by EndObject
131
- void BeginObject(const field_id_t field_id, const char *tag) {
132
- SetTag(field_id, tag);
133
- OnObjectBegin();
115
+ template <class FUNC>
116
+ void ReadList(const field_id_t field_id, const char *tag, FUNC func) {
117
+ OnPropertyBegin(field_id, tag);
118
+ auto size = OnListBegin();
119
+ List list {*this};
120
+ for (idx_t i = 0; i < size; i++) {
121
+ func(list, i);
122
+ }
123
+ OnListEnd();
124
+ OnPropertyEnd();
134
125
  }
135
126
 
136
- void EndObject() {
127
+ template <class FUNC>
128
+ void ReadObject(const field_id_t field_id, const char *tag, FUNC func) {
129
+ OnPropertyBegin(field_id, tag);
130
+ OnObjectBegin();
131
+ func(*this);
137
132
  OnObjectEnd();
133
+ OnPropertyEnd();
138
134
  }
139
135
 
140
136
  private:
@@ -147,25 +143,33 @@ private:
147
143
  return val;
148
144
  }
149
145
 
150
- // Structural Types
151
- // Deserialize a unique_ptr
152
146
  template <class T = void>
153
147
  inline typename std::enable_if<is_unique_ptr<T>::value, T>::type Read() {
154
148
  using ELEMENT_TYPE = typename is_unique_ptr<T>::ELEMENT_TYPE;
155
- OnObjectBegin();
156
- auto val = ELEMENT_TYPE::FormatDeserialize(*this);
157
- OnObjectEnd();
158
- return val;
149
+ unique_ptr<ELEMENT_TYPE> ptr = nullptr;
150
+ auto is_present = OnNullableBegin();
151
+ if (is_present) {
152
+ OnObjectBegin();
153
+ ptr = ELEMENT_TYPE::FormatDeserialize(*this);
154
+ OnObjectEnd();
155
+ }
156
+ OnNullableEnd();
157
+ return ptr;
159
158
  }
160
159
 
161
160
  // Deserialize shared_ptr
162
161
  template <typename T = void>
163
162
  inline typename std::enable_if<is_shared_ptr<T>::value, T>::type Read() {
164
163
  using ELEMENT_TYPE = typename is_shared_ptr<T>::ELEMENT_TYPE;
165
- OnObjectBegin();
166
- auto val = ELEMENT_TYPE::FormatDeserialize(*this);
167
- OnObjectEnd();
168
- return val;
164
+ shared_ptr<ELEMENT_TYPE> ptr = nullptr;
165
+ auto is_present = OnNullableBegin();
166
+ if (is_present) {
167
+ OnObjectBegin();
168
+ ptr = ELEMENT_TYPE::FormatDeserialize(*this);
169
+ OnObjectEnd();
170
+ }
171
+ OnNullableEnd();
172
+ return ptr;
169
173
  }
170
174
 
171
175
  // Deserialize a vector
@@ -178,7 +182,6 @@ private:
178
182
  vec.push_back(Read<ELEMENT_TYPE>());
179
183
  }
180
184
  OnListEnd();
181
-
182
185
  return vec;
183
186
  }
184
187
 
@@ -202,19 +205,15 @@ private:
202
205
  using VALUE_TYPE = typename is_unordered_map<T>::VALUE_TYPE;
203
206
 
204
207
  T map;
205
- auto size = OnMapBegin();
208
+ auto size = OnListBegin();
206
209
  for (idx_t i = 0; i < size; i++) {
207
- OnMapEntryBegin();
208
- OnMapKeyBegin();
209
- auto key = Read<KEY_TYPE>();
210
- OnMapKeyEnd();
211
- OnMapValueBegin();
212
- auto value = Read<VALUE_TYPE>();
213
- OnMapValueEnd();
214
- OnMapEntryEnd();
210
+ OnObjectBegin();
211
+ auto key = ReadProperty<KEY_TYPE>(0, "key");
212
+ auto value = ReadProperty<VALUE_TYPE>(1, "value");
213
+ OnObjectEnd();
215
214
  map[std::move(key)] = std::move(value);
216
215
  }
217
- OnMapEnd();
216
+ OnListEnd();
218
217
  return map;
219
218
  }
220
219
 
@@ -224,19 +223,15 @@ private:
224
223
  using VALUE_TYPE = typename is_map<T>::VALUE_TYPE;
225
224
 
226
225
  T map;
227
- auto size = OnMapBegin();
226
+ auto size = OnListBegin();
228
227
  for (idx_t i = 0; i < size; i++) {
229
- OnMapEntryBegin();
230
- OnMapKeyBegin();
231
- auto key = Read<KEY_TYPE>();
232
- OnMapKeyEnd();
233
- OnMapValueBegin();
234
- auto value = Read<VALUE_TYPE>();
235
- OnMapValueEnd();
236
- OnMapEntryEnd();
228
+ OnObjectBegin();
229
+ auto key = ReadProperty<KEY_TYPE>(0, "key");
230
+ auto value = ReadProperty<VALUE_TYPE>(1, "value");
231
+ OnObjectEnd();
237
232
  map[std::move(key)] = std::move(value);
238
233
  }
239
- OnMapEnd();
234
+ OnListEnd();
240
235
  return map;
241
236
  }
242
237
 
@@ -271,15 +266,10 @@ private:
271
266
  inline typename std::enable_if<is_pair<T>::value, T>::type Read() {
272
267
  using FIRST_TYPE = typename is_pair<T>::FIRST_TYPE;
273
268
  using SECOND_TYPE = typename is_pair<T>::SECOND_TYPE;
274
-
275
- OnPairBegin();
276
- OnPairKeyBegin();
277
- FIRST_TYPE first = Read<FIRST_TYPE>();
278
- OnPairKeyEnd();
279
- OnPairValueBegin();
280
- SECOND_TYPE second = Read<SECOND_TYPE>();
281
- OnPairValueEnd();
282
- OnPairEnd();
269
+ OnObjectBegin();
270
+ auto first = ReadProperty<FIRST_TYPE>(0, "first");
271
+ auto second = ReadProperty<SECOND_TYPE>(1, "second");
272
+ OnObjectEnd();
283
273
  return std::make_pair(first, second);
284
274
  }
285
275
 
@@ -290,6 +280,12 @@ private:
290
280
  return ReadBool();
291
281
  }
292
282
 
283
+ // Deserialize a char
284
+ template <typename T = void>
285
+ inline typename std::enable_if<std::is_same<T, char>::value, T>::type Read() {
286
+ return ReadChar();
287
+ }
288
+
293
289
  // Deserialize a int8_t
294
290
  template <typename T = void>
295
291
  inline typename std::enable_if<std::is_same<T, int8_t>::value, T>::type Read() {
@@ -367,12 +363,6 @@ private:
367
363
  }
368
364
  }
369
365
 
370
- // Deserialize a interval_t
371
- template <typename T = void>
372
- inline typename std::enable_if<std::is_same<T, interval_t>::value, T>::type Read() {
373
- return ReadInterval();
374
- }
375
-
376
366
  // Deserialize a hugeint_t
377
367
  template <typename T = void>
378
368
  inline typename std::enable_if<std::is_same<T, hugeint_t>::value, T>::type Read() {
@@ -392,50 +382,24 @@ private:
392
382
  }
393
383
 
394
384
  protected:
395
- virtual void SetTag(const field_id_t field_id, const char *tag) {
396
- (void)field_id;
397
- (void)tag;
398
- }
399
-
385
+ // Hooks for subclasses to override to implement custom behavior
386
+ virtual void OnPropertyBegin(const field_id_t field_id, const char *tag) = 0;
387
+ virtual void OnPropertyEnd() = 0;
388
+ virtual bool OnOptionalPropertyBegin(const field_id_t field_id, const char *tag) = 0;
389
+ virtual void OnOptionalPropertyEnd(bool present) = 0;
390
+
391
+ virtual void OnObjectBegin() = 0;
392
+ virtual void OnObjectEnd() = 0;
400
393
  virtual idx_t OnListBegin() = 0;
401
- virtual void OnListEnd() {
402
- }
403
- virtual idx_t OnMapBegin() = 0;
404
- virtual void OnMapEnd() {
405
- }
406
- virtual void OnMapEntryBegin() {
407
- }
408
- virtual void OnMapEntryEnd() {
409
- }
410
- virtual void OnMapKeyBegin() {
411
- }
412
- virtual void OnMapKeyEnd() {
413
- }
414
- virtual void OnMapValueBegin() {
415
- }
416
- virtual void OnMapValueEnd() {
417
- }
418
- virtual bool OnOptionalBegin() = 0;
419
- virtual void OnOptionalEnd() {
420
- }
421
- virtual void OnObjectBegin() {
422
- }
423
- virtual void OnObjectEnd() {
424
- }
425
- virtual void OnPairBegin() {
426
- }
427
- virtual void OnPairKeyBegin() {
428
- }
429
- virtual void OnPairKeyEnd() {
430
- }
431
- virtual void OnPairValueBegin() {
432
- }
433
- virtual void OnPairValueEnd() {
434
- }
435
- virtual void OnPairEnd() {
436
- }
394
+ virtual void OnListEnd() = 0;
395
+ virtual bool OnNullableBegin() = 0;
396
+ virtual void OnNullableEnd() = 0;
437
397
 
398
+ // Handle primitive types, a serializer needs to implement these.
438
399
  virtual bool ReadBool() = 0;
400
+ virtual char ReadChar() {
401
+ throw NotImplementedException("ReadChar not implemented");
402
+ }
439
403
  virtual int8_t ReadSignedInt8() = 0;
440
404
  virtual uint8_t ReadUnsignedInt8() = 0;
441
405
  virtual int16_t ReadSignedInt16() = 0;
@@ -448,8 +412,19 @@ protected:
448
412
  virtual float ReadFloat() = 0;
449
413
  virtual double ReadDouble() = 0;
450
414
  virtual string ReadString() = 0;
451
- virtual interval_t ReadInterval() = 0;
452
415
  virtual void ReadDataPtr(data_ptr_t &ptr, idx_t count) = 0;
453
416
  };
454
417
 
418
+ template <class FUNC>
419
+ void FormatDeserializer::List::ReadObject(FUNC f) {
420
+ deserializer.OnObjectBegin();
421
+ f(deserializer);
422
+ deserializer.OnObjectEnd();
423
+ }
424
+
425
+ template <class T>
426
+ T FormatDeserializer::List::ReadElement() {
427
+ return deserializer.Read<T>();
428
+ }
429
+
455
430
  } // namespace duckdb