duckdb 0.7.2-dev717.0 → 0.7.2-dev865.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 (179) hide show
  1. package/binding.gyp +2 -0
  2. package/lib/duckdb.d.ts +12 -1
  3. package/lib/duckdb.js +19 -0
  4. package/package.json +1 -1
  5. package/src/duckdb/extension/json/include/json_common.hpp +1 -0
  6. package/src/duckdb/extension/json/include/json_functions.hpp +1 -0
  7. package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
  8. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
  9. package/src/duckdb/extension/json/json_functions.cpp +1 -0
  10. package/src/duckdb/extension/json/json_scan.cpp +2 -2
  11. package/src/duckdb/extension/json/json_serializer.cpp +217 -0
  12. package/src/duckdb/src/catalog/catalog.cpp +21 -5
  13. package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
  14. package/src/duckdb/src/common/enums/join_type.cpp +3 -22
  15. package/src/duckdb/src/common/exception.cpp +2 -2
  16. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1172 -0
  17. package/src/duckdb/src/common/types/value.cpp +117 -93
  18. package/src/duckdb/src/common/types/vector.cpp +140 -1
  19. package/src/duckdb/src/common/types.cpp +166 -89
  20. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  21. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +5 -8
  22. package/src/duckdb/src/function/scalar/date/date_part.cpp +2 -2
  23. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +2 -2
  24. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  25. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +4 -0
  26. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +8 -8
  27. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  28. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  29. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  30. package/src/duckdb/src/function/table/arrow_conversion.cpp +7 -1
  31. package/src/duckdb/src/function/table/table_scan.cpp +1 -1
  32. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  33. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +3 -0
  34. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  35. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  36. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +2 -0
  37. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  38. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  39. package/src/duckdb/src/include/duckdb/common/exception.hpp +40 -9
  40. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +3 -0
  41. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  42. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  43. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  44. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  45. package/src/duckdb/src/include/duckdb/common/string_util.hpp +12 -0
  46. package/src/duckdb/src/include/duckdb/common/types/value.hpp +2 -31
  47. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -0
  48. package/src/duckdb/src/include/duckdb/common/types.hpp +8 -2
  49. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  50. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +1 -0
  51. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +2 -0
  52. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  53. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  54. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  55. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  56. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  57. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  58. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  59. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  60. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  61. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  62. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +2 -0
  63. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  64. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  65. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  66. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  67. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +2 -0
  68. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  69. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  70. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  71. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  72. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  73. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  74. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  75. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +11 -1
  76. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  77. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  78. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  79. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  80. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  81. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  82. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  83. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +9 -0
  84. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  85. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  86. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  87. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +9 -52
  88. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  89. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  90. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +6 -3
  91. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  92. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +5 -3
  93. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +4 -1
  94. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +6 -3
  95. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +5 -3
  96. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +37 -0
  97. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +8 -1
  98. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +4 -3
  99. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +271 -26
  100. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  101. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  102. package/src/duckdb/src/optimizer/filter_combiner.cpp +1 -1
  103. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +3 -3
  104. package/src/duckdb/src/optimizer/rule/move_constants.cpp +2 -2
  105. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +1 -1
  106. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  107. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  108. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  109. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  110. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  111. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  112. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  113. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +15 -0
  114. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  115. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  116. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  117. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  118. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  119. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  120. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  121. package/src/duckdb/src/parser/expression/star_expression.cpp +20 -0
  122. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  123. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  124. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  125. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  126. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  127. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  128. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  129. package/src/duckdb/src/parser/query_node.cpp +50 -0
  130. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  131. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  132. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  133. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  134. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  135. package/src/duckdb/src/parser/tableref/joinref.cpp +25 -0
  136. package/src/duckdb/src/parser/tableref/pivotref.cpp +53 -0
  137. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  138. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  139. package/src/duckdb/src/parser/tableref.cpp +46 -0
  140. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  141. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  142. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  143. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  144. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +22 -4
  145. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  146. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +1 -1
  147. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  148. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +3 -11
  149. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +6 -0
  150. package/src/duckdb/src/storage/checkpoint_manager.cpp +1 -0
  151. package/src/duckdb/src/storage/compression/numeric_constant.cpp +2 -2
  152. package/src/duckdb/src/storage/data_table.cpp +1 -1
  153. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +145 -83
  154. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  155. package/src/duckdb/src/storage/storage_info.cpp +1 -1
  156. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +1 -6
  157. package/src/duckdb/src/storage/table/column_data.cpp +29 -35
  158. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +5 -5
  159. package/src/duckdb/src/storage/table/column_segment.cpp +8 -7
  160. package/src/duckdb/src/storage/table/list_column_data.cpp +2 -1
  161. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  162. package/src/duckdb/src/storage/table/row_group.cpp +9 -9
  163. package/src/duckdb/src/storage/table/row_group_collection.cpp +82 -66
  164. package/src/duckdb/src/storage/table/scan_state.cpp +22 -3
  165. package/src/duckdb/src/storage/table/standard_column_data.cpp +1 -0
  166. package/src/duckdb/src/storage/table/struct_column_data.cpp +1 -0
  167. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  168. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +11780 -11512
  169. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  170. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  171. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  172. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  173. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  174. package/src/duckdb/ub_src_parser.cpp +2 -0
  175. package/src/duckdb/ub_src_storage_statistics.cpp +2 -0
  176. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  177. package/src/utils.cpp +12 -0
  178. package/test/extension.test.ts +44 -26
  179. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -30,6 +30,9 @@
30
30
  #include "duckdb/function/cast/cast_function_set.hpp"
31
31
  #include "duckdb/main/error_manager.hpp"
32
32
 
33
+ #include "duckdb/common/serializer/format_serializer.hpp"
34
+ #include "duckdb/common/serializer/format_deserializer.hpp"
35
+
33
36
  #include <utility>
34
37
  #include <cmath>
35
38
 
@@ -1230,99 +1233,6 @@ interval_t Value::GetValueUnsafe() const {
1230
1233
  return value_.interval;
1231
1234
  }
1232
1235
 
1233
- //===--------------------------------------------------------------------===//
1234
- // GetReferenceUnsafe
1235
- //===--------------------------------------------------------------------===//
1236
- template <>
1237
- int8_t &Value::GetReferenceUnsafe() {
1238
- D_ASSERT(type_.InternalType() == PhysicalType::INT8 || type_.InternalType() == PhysicalType::BOOL);
1239
- return value_.tinyint;
1240
- }
1241
-
1242
- template <>
1243
- int16_t &Value::GetReferenceUnsafe() {
1244
- D_ASSERT(type_.InternalType() == PhysicalType::INT16);
1245
- return value_.smallint;
1246
- }
1247
-
1248
- template <>
1249
- int32_t &Value::GetReferenceUnsafe() {
1250
- D_ASSERT(type_.InternalType() == PhysicalType::INT32);
1251
- return value_.integer;
1252
- }
1253
-
1254
- template <>
1255
- int64_t &Value::GetReferenceUnsafe() {
1256
- D_ASSERT(type_.InternalType() == PhysicalType::INT64);
1257
- return value_.bigint;
1258
- }
1259
-
1260
- template <>
1261
- hugeint_t &Value::GetReferenceUnsafe() {
1262
- D_ASSERT(type_.InternalType() == PhysicalType::INT128);
1263
- return value_.hugeint;
1264
- }
1265
-
1266
- template <>
1267
- uint8_t &Value::GetReferenceUnsafe() {
1268
- D_ASSERT(type_.InternalType() == PhysicalType::UINT8);
1269
- return value_.utinyint;
1270
- }
1271
-
1272
- template <>
1273
- uint16_t &Value::GetReferenceUnsafe() {
1274
- D_ASSERT(type_.InternalType() == PhysicalType::UINT16);
1275
- return value_.usmallint;
1276
- }
1277
-
1278
- template <>
1279
- uint32_t &Value::GetReferenceUnsafe() {
1280
- D_ASSERT(type_.InternalType() == PhysicalType::UINT32);
1281
- return value_.uinteger;
1282
- }
1283
-
1284
- template <>
1285
- uint64_t &Value::GetReferenceUnsafe() {
1286
- D_ASSERT(type_.InternalType() == PhysicalType::UINT64);
1287
- return value_.ubigint;
1288
- }
1289
-
1290
- template <>
1291
- float &Value::GetReferenceUnsafe() {
1292
- D_ASSERT(type_.InternalType() == PhysicalType::FLOAT);
1293
- return value_.float_;
1294
- }
1295
-
1296
- template <>
1297
- double &Value::GetReferenceUnsafe() {
1298
- D_ASSERT(type_.InternalType() == PhysicalType::DOUBLE);
1299
- return value_.double_;
1300
- }
1301
-
1302
- template <>
1303
- date_t &Value::GetReferenceUnsafe() {
1304
- D_ASSERT(type_.InternalType() == PhysicalType::INT32);
1305
- return value_.date;
1306
- }
1307
-
1308
- template <>
1309
- dtime_t &Value::GetReferenceUnsafe() {
1310
- D_ASSERT(type_.InternalType() == PhysicalType::INT64);
1311
- return value_.time;
1312
- }
1313
-
1314
- template <>
1315
- timestamp_t &Value::GetReferenceUnsafe() {
1316
- D_ASSERT(type_.InternalType() == PhysicalType::INT64);
1317
- return value_.timestamp;
1318
- }
1319
-
1320
- template <>
1321
- interval_t &Value::GetReferenceUnsafe() {
1322
- D_ASSERT(type_.InternalType() == PhysicalType::INTERVAL);
1323
- return value_.interval;
1324
- }
1325
-
1326
1236
  //===--------------------------------------------------------------------===//
1327
1237
  // Hash
1328
1238
  //===--------------------------------------------------------------------===//
@@ -1800,6 +1710,120 @@ Value Value::Deserialize(Deserializer &main_source) {
1800
1710
  return new_value;
1801
1711
  }
1802
1712
 
1713
+ void Value::FormatSerialize(FormatSerializer &serializer) const {
1714
+ serializer.WriteProperty("type", type_);
1715
+ serializer.WriteProperty("is_null", is_null);
1716
+ if (!IsNull()) {
1717
+ switch (type_.InternalType()) {
1718
+ case PhysicalType::BOOL:
1719
+ serializer.WriteProperty("value", value_.boolean);
1720
+ break;
1721
+ case PhysicalType::INT8:
1722
+ serializer.WriteProperty("value", value_.tinyint);
1723
+ break;
1724
+ case PhysicalType::INT16:
1725
+ serializer.WriteProperty("value", value_.smallint);
1726
+ break;
1727
+ case PhysicalType::INT32:
1728
+ serializer.WriteProperty("value", value_.integer);
1729
+ break;
1730
+ case PhysicalType::INT64:
1731
+ serializer.WriteProperty("value", value_.bigint);
1732
+ break;
1733
+ case PhysicalType::UINT8:
1734
+ serializer.WriteProperty("value", value_.utinyint);
1735
+ break;
1736
+ case PhysicalType::UINT16:
1737
+ serializer.WriteProperty("value", value_.usmallint);
1738
+ break;
1739
+ case PhysicalType::UINT32:
1740
+ serializer.WriteProperty("value", value_.uinteger);
1741
+ break;
1742
+ case PhysicalType::UINT64:
1743
+ serializer.WriteProperty("value", value_.ubigint);
1744
+ break;
1745
+ case PhysicalType::INT128:
1746
+ serializer.WriteProperty("value", value_.hugeint);
1747
+ break;
1748
+ case PhysicalType::FLOAT:
1749
+ serializer.WriteProperty("value", value_.float_);
1750
+ break;
1751
+ case PhysicalType::DOUBLE:
1752
+ serializer.WriteProperty("value", value_.double_);
1753
+ break;
1754
+ case PhysicalType::INTERVAL:
1755
+ serializer.WriteProperty("value", value_.interval);
1756
+ break;
1757
+ case PhysicalType::VARCHAR:
1758
+ serializer.WriteProperty("value", StringValue::Get(*this));
1759
+ break;
1760
+ default: {
1761
+ Vector v(*this);
1762
+ v.FormatSerialize(serializer, 1);
1763
+ break;
1764
+ }
1765
+ }
1766
+ }
1767
+ }
1768
+
1769
+ Value Value::FormatDeserialize(FormatDeserializer &deserializer) {
1770
+ auto type = deserializer.ReadProperty<LogicalType>("type");
1771
+ auto is_null = deserializer.ReadProperty<bool>("is_null");
1772
+ Value new_value = Value(type);
1773
+ if (is_null) {
1774
+ return new_value;
1775
+ }
1776
+ new_value.is_null = false;
1777
+ switch (type.InternalType()) {
1778
+ case PhysicalType::BOOL:
1779
+ new_value.value_.boolean = deserializer.ReadProperty<bool>("value");
1780
+ break;
1781
+ case PhysicalType::UINT8:
1782
+ new_value.value_.utinyint = deserializer.ReadProperty<uint8_t>("value");
1783
+ break;
1784
+ case PhysicalType::INT8:
1785
+ new_value.value_.tinyint = deserializer.ReadProperty<int8_t>("value");
1786
+ break;
1787
+ case PhysicalType::UINT16:
1788
+ new_value.value_.usmallint = deserializer.ReadProperty<uint16_t>("value");
1789
+ break;
1790
+ case PhysicalType::INT16:
1791
+ new_value.value_.smallint = deserializer.ReadProperty<int16_t>("value");
1792
+ break;
1793
+ case PhysicalType::UINT32:
1794
+ new_value.value_.uinteger = deserializer.ReadProperty<uint32_t>("value");
1795
+ break;
1796
+ case PhysicalType::INT32:
1797
+ new_value.value_.integer = deserializer.ReadProperty<int32_t>("value");
1798
+ break;
1799
+ case PhysicalType::UINT64:
1800
+ new_value.value_.ubigint = deserializer.ReadProperty<uint64_t>("value");
1801
+ break;
1802
+ case PhysicalType::INT64:
1803
+ new_value.value_.bigint = deserializer.ReadProperty<int64_t>("value");
1804
+ break;
1805
+ case PhysicalType::FLOAT:
1806
+ new_value.value_.float_ = deserializer.ReadProperty<float>("value");
1807
+ break;
1808
+ case PhysicalType::DOUBLE:
1809
+ new_value.value_.double_ = deserializer.ReadProperty<double>("value");
1810
+ break;
1811
+ case PhysicalType::INTERVAL:
1812
+ new_value.value_.interval = deserializer.ReadProperty<interval_t>("value");
1813
+ break;
1814
+ case PhysicalType::VARCHAR:
1815
+ new_value.value_info_ = make_shared<StringValueInfo>(deserializer.ReadProperty<string>("value"));
1816
+ break;
1817
+ default: {
1818
+ Vector v(type);
1819
+ v.FormatDeserialize(deserializer, 1);
1820
+ new_value = v.GetValue(0);
1821
+ break;
1822
+ }
1823
+ }
1824
+ return new_value;
1825
+ }
1826
+
1803
1827
  void Value::Print() const {
1804
1828
  Printer::Print(ToString());
1805
1829
  }
@@ -18,6 +18,9 @@
18
18
  #include "duckdb/common/fsst.hpp"
19
19
  #include "fsst.h"
20
20
 
21
+ #include "duckdb/common/serializer/format_serializer.hpp"
22
+ #include "duckdb/common/serializer/format_deserializer.hpp"
23
+
21
24
  #include <cstring> // strlen() on Solaris
22
25
 
23
26
  namespace duckdb {
@@ -241,7 +244,8 @@ struct DataArrays {
241
244
  idx_t type_size;
242
245
  bool is_nested;
243
246
  DataArrays(Vector &vec, data_ptr_t data, VectorBuffer *buffer, idx_t type_size, bool is_nested)
244
- : vec(vec), data(data), buffer(buffer), type_size(type_size), is_nested(is_nested) {};
247
+ : vec(vec), data(data), buffer(buffer), type_size(type_size), is_nested(is_nested) {
248
+ }
245
249
  };
246
250
 
247
251
  void FindChildren(std::vector<DataArrays> &to_resize, VectorBuffer &auxiliary) {
@@ -962,6 +966,141 @@ void Vector::Serialize(idx_t count, Serializer &serializer) {
962
966
  }
963
967
  }
964
968
 
969
+ void Vector::FormatSerialize(FormatSerializer &serializer, idx_t count) {
970
+ auto &type = GetType();
971
+
972
+ UnifiedVectorFormat vdata;
973
+ ToUnifiedFormat(count, vdata);
974
+
975
+ const auto write_validity = (count > 0) && !vdata.validity.AllValid();
976
+ serializer.WriteProperty("has_validity", write_validity);
977
+ if (write_validity) {
978
+ ValidityMask flat_mask(count);
979
+ for (idx_t i = 0; i < count; ++i) {
980
+ auto row_idx = vdata.sel->get_index(i);
981
+ flat_mask.Set(i, vdata.validity.RowIsValid(row_idx));
982
+ }
983
+ serializer.WriteProperty("validity_mask", (const_data_ptr_t)flat_mask.GetData(),
984
+ flat_mask.ValidityMaskSize(count));
985
+ }
986
+ if (TypeIsConstantSize(type.InternalType())) {
987
+ // constant size type: simple copy
988
+ idx_t write_size = GetTypeIdSize(type.InternalType()) * count;
989
+ auto ptr = unique_ptr<data_t[]>(new data_t[write_size]);
990
+ VectorOperations::WriteToStorage(*this, count, ptr.get());
991
+ serializer.WriteProperty("data", write_size);
992
+ } else {
993
+ switch (type.InternalType()) {
994
+ case PhysicalType::VARCHAR: {
995
+ auto strings = (string_t *)vdata.data;
996
+ for (idx_t i = 0; i < count; i++) {
997
+ auto idx = vdata.sel->get_index(i);
998
+ auto source = !vdata.validity.RowIsValid(idx) ? NullValue<string_t>() : strings[idx];
999
+ string_t str = string_t(source.GetDataUnsafe(), source.GetSize());
1000
+ serializer.WriteProperty("data", str);
1001
+ }
1002
+ break;
1003
+ }
1004
+ case PhysicalType::STRUCT: {
1005
+ Flatten(count);
1006
+ auto &entries = StructVector::GetEntries(*this);
1007
+ for (auto &entry : entries) {
1008
+ entry->FormatSerialize(serializer, count);
1009
+ }
1010
+ break;
1011
+ }
1012
+ case PhysicalType::LIST: {
1013
+ auto &child = ListVector::GetEntry(*this);
1014
+ auto list_size = ListVector::GetListSize(*this);
1015
+
1016
+ // serialize the list entries in a flat array
1017
+ auto data = unique_ptr<list_entry_t[]>(new list_entry_t[count]);
1018
+ auto source_array = (list_entry_t *)vdata.data;
1019
+ for (idx_t i = 0; i < count; i++) {
1020
+ auto idx = vdata.sel->get_index(i);
1021
+ auto source = source_array[idx];
1022
+ data[i].offset = source.offset;
1023
+ data[i].length = source.length;
1024
+ }
1025
+
1026
+ // write the list size
1027
+ serializer.WriteProperty("list_size", list_size);
1028
+ serializer.WriteProperty("data", (data_ptr_t)data.get(), count * sizeof(list_entry_t));
1029
+ child.FormatSerialize(serializer, list_size);
1030
+ break;
1031
+ }
1032
+ default:
1033
+ throw InternalException("Unimplemented variable width type for Vector::Serialize!");
1034
+ }
1035
+ }
1036
+ }
1037
+
1038
+ void Vector::FormatDeserialize(FormatDeserializer &deserializer, idx_t count) {
1039
+ /*
1040
+ auto &type = GetType();
1041
+
1042
+ auto &validity = FlatVector::Validity(*this);
1043
+ validity.Reset();
1044
+ const auto has_validity = deserializer.ReadProperty<bool>("has_validity");
1045
+ if (has_validity) {
1046
+ validity.Initialize(count);
1047
+ source.ReadData((data_ptr_t)validity.GetData(), validity.ValidityMaskSize(count));
1048
+ }
1049
+
1050
+ if (TypeIsConstantSize(type.InternalType())) {
1051
+ // constant size type: read fixed amount of data from
1052
+ auto column_size = GetTypeIdSize(type.InternalType()) * count;
1053
+ auto ptr = unique_ptr<data_t[]>(new data_t[column_size]);
1054
+ source.ReadData(ptr.get(), column_size);
1055
+
1056
+ VectorOperations::ReadFromStorage(ptr.get(), count, *this);
1057
+ } else {
1058
+ switch (type.InternalType()) {
1059
+ case PhysicalType::VARCHAR: {
1060
+ auto strings = FlatVector::GetData<string_t>(*this);
1061
+ for (idx_t i = 0; i < count; i++) {
1062
+ // read the strings
1063
+ auto str = source.Read<string>();
1064
+ // now add the string to the StringHeap of the vector
1065
+ // and write the pointer into the vector
1066
+ if (validity.RowIsValid(i)) {
1067
+ strings[i] = StringVector::AddStringOrBlob(*this, str);
1068
+ }
1069
+ }
1070
+ break;
1071
+ }
1072
+ case PhysicalType::STRUCT: {
1073
+ auto &entries = StructVector::GetEntries(*this);
1074
+ for (auto &entry : entries) {
1075
+ entry->FormatDeserialize(deserializer, count);
1076
+ }
1077
+ break;
1078
+ }
1079
+ case PhysicalType::LIST: {
1080
+ // read the list size
1081
+ auto list_size = deserializer.ReadProperty<idx_t>("list_size");
1082
+ ListVector::Reserve(*this, list_size);
1083
+ ListVector::SetListSize(*this, list_size);
1084
+
1085
+ // read the list entry
1086
+ auto list_entries = FlatVector::GetData(*this);
1087
+ source.ReadData(list_entries, count * sizeof(list_entry_t));
1088
+
1089
+ // deserialize the child vector
1090
+ auto &child = ListVector::GetEntry(*this);
1091
+ child.Deserialize(list_size, source);
1092
+
1093
+ break;
1094
+ }
1095
+ default:
1096
+ throw InternalException("Unimplemented variable width type for Vector::Deserialize!");
1097
+ }
1098
+ }
1099
+ */
1100
+
1101
+ throw NotImplementedException("TODO: Implement deserialization for DuckDB Vectors");
1102
+ }
1103
+
965
1104
  void Vector::Deserialize(idx_t count, Deserializer &source) {
966
1105
  auto &type = GetType();
967
1106