duckdb 0.7.1 → 0.7.2-dev1034.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 (590) hide show
  1. package/binding.gyp +12 -7
  2. package/lib/duckdb.d.ts +55 -2
  3. package/lib/duckdb.js +20 -1
  4. package/package.json +1 -1
  5. package/src/connection.cpp +1 -2
  6. package/src/database.cpp +1 -1
  7. package/src/duckdb/extension/icu/icu-extension.cpp +4 -0
  8. package/src/duckdb/extension/icu/icu-list-range.cpp +207 -0
  9. package/src/duckdb/extension/icu/icu-table-range.cpp +194 -0
  10. package/src/duckdb/extension/icu/include/icu-list-range.hpp +17 -0
  11. package/src/duckdb/extension/icu/include/icu-table-range.hpp +17 -0
  12. package/src/duckdb/extension/json/include/json_common.hpp +1 -0
  13. package/src/duckdb/extension/json/include/json_functions.hpp +2 -0
  14. package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
  15. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
  16. package/src/duckdb/extension/json/json_functions/read_json.cpp +6 -5
  17. package/src/duckdb/extension/json/json_functions.cpp +12 -4
  18. package/src/duckdb/extension/json/json_scan.cpp +2 -2
  19. package/src/duckdb/extension/json/json_serializer.cpp +217 -0
  20. package/src/duckdb/extension/parquet/column_reader.cpp +94 -15
  21. package/src/duckdb/extension/parquet/column_writer.cpp +0 -1
  22. package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -2
  23. package/src/duckdb/extension/parquet/include/decode_utils.hpp +5 -4
  24. package/src/duckdb/extension/parquet/include/generated_column_reader.hpp +1 -11
  25. package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -1
  26. package/src/duckdb/extension/parquet/parquet-extension.cpp +12 -2
  27. package/src/duckdb/extension/parquet/parquet_reader.cpp +1 -1
  28. package/src/duckdb/extension/parquet/parquet_statistics.cpp +26 -32
  29. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +16 -6
  30. package/src/duckdb/src/catalog/catalog.cpp +34 -5
  31. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +4 -0
  32. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +2 -21
  33. package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +7 -6
  34. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +3 -3
  35. package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +20 -1
  36. package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +8 -2
  37. package/src/duckdb/src/catalog/catalog_set.cpp +1 -0
  38. package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
  39. package/src/duckdb/src/catalog/dependency_list.cpp +12 -0
  40. package/src/duckdb/src/catalog/duck_catalog.cpp +34 -7
  41. package/src/duckdb/src/common/arrow/arrow_appender.cpp +48 -4
  42. package/src/duckdb/src/common/arrow/arrow_converter.cpp +1 -1
  43. package/src/duckdb/src/common/box_renderer.cpp +109 -23
  44. package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
  45. package/src/duckdb/src/common/enums/join_type.cpp +3 -22
  46. package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
  47. package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
  48. package/src/duckdb/src/common/exception.cpp +15 -1
  49. package/src/duckdb/src/common/field_writer.cpp +1 -0
  50. package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
  51. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  52. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  53. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  54. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  55. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  56. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  57. package/src/duckdb/src/common/string_util.cpp +4 -1
  58. package/src/duckdb/src/common/types/bit.cpp +166 -87
  59. package/src/duckdb/src/common/types/blob.cpp +1 -1
  60. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  61. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  62. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +11 -6
  63. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  64. package/src/duckdb/src/common/types/time.cpp +13 -0
  65. package/src/duckdb/src/common/types/value.cpp +320 -154
  66. package/src/duckdb/src/common/types/vector.cpp +155 -127
  67. package/src/duckdb/src/common/types.cpp +313 -153
  68. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  69. package/src/duckdb/src/execution/aggregate_hashtable.cpp +10 -5
  70. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  71. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  72. package/src/duckdb/src/execution/index/art/art.cpp +6 -5
  73. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  74. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  75. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  76. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  77. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  78. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  79. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +12 -4
  80. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  81. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  82. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +6 -3
  83. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +6 -14
  84. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  85. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  86. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  87. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  88. package/src/duckdb/src/execution/partitionable_hashtable.cpp +14 -2
  89. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +21 -16
  90. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  91. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  92. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  93. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  94. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  95. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  96. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  97. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  98. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  99. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  100. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  101. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  102. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  103. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  104. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  105. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  106. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  107. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  108. package/src/duckdb/src/function/aggregate/nested/list.cpp +8 -8
  109. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +58 -16
  110. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  111. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  112. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  113. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  114. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  115. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  116. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  117. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  118. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  119. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  120. package/src/duckdb/src/function/function_binder.cpp +1 -8
  121. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  122. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  123. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  124. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  125. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  126. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  127. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  128. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  129. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  130. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  131. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  132. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  133. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  134. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  135. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  136. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  137. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  138. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  139. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  140. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  141. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  142. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  143. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  144. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  145. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  146. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  147. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  148. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  149. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  150. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  151. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  152. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  153. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  154. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  155. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  156. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  157. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  158. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  159. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  160. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  161. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  162. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  163. package/src/duckdb/src/function/table/read_csv.cpp +55 -0
  164. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  165. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  166. package/src/duckdb/src/function/table/table_scan.cpp +1 -1
  167. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  168. package/src/duckdb/src/function/table_function.cpp +30 -11
  169. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  170. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  171. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  172. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  173. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  174. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  175. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  176. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  177. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  178. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  179. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  180. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  181. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  182. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  183. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  184. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  185. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  186. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  187. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  188. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  189. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  190. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  191. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  192. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  193. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  194. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  195. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  196. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  197. package/src/duckdb/src/include/duckdb/common/string_util.hpp +25 -0
  198. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  199. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  200. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  201. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  202. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  203. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  204. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  205. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +1 -0
  206. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +2 -2
  207. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  208. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  209. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  210. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +6 -0
  211. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  212. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +3 -0
  213. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  214. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  215. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  216. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  217. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  218. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  219. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  220. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  221. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  222. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  223. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  224. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  225. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  226. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  227. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  228. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  229. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  230. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  231. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  232. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  233. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  234. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  235. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  236. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  237. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  238. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  239. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  240. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  241. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  242. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  243. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  244. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  245. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  246. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  247. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  248. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  249. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  250. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  251. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  252. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  253. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  254. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  255. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  256. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  257. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  258. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  259. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  260. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  261. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  262. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  263. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  264. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  265. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  266. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  267. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  268. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  269. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  270. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  271. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  272. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  273. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  274. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  275. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  276. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  277. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  278. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  279. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  280. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  281. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  282. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  283. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  284. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  285. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  286. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  288. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  289. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  290. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  291. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  292. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  293. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  294. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  295. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  296. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  297. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  298. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  299. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  300. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  301. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  302. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  303. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  304. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  305. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  306. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  307. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  308. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  309. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  310. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +1 -1
  311. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  312. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  313. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +1 -1
  314. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +5 -2
  315. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +3 -3
  316. package/src/duckdb/src/include/duckdb/storage/index.hpp +4 -3
  317. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  318. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  319. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  320. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  321. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  322. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  323. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  324. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  325. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  326. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  327. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  328. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  329. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  330. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +6 -3
  331. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  332. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +7 -5
  333. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  334. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -2
  335. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +10 -6
  336. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +8 -5
  337. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +37 -0
  338. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +10 -1
  339. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +4 -3
  340. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +271 -26
  341. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  342. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  343. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  344. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -2
  345. package/src/duckdb/src/include/duckdb.h +50 -2
  346. package/src/duckdb/src/include/duckdb.hpp +0 -1
  347. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  348. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  349. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  350. package/src/duckdb/src/main/client_context.cpp +38 -34
  351. package/src/duckdb/src/main/client_data.cpp +7 -6
  352. package/src/duckdb/src/main/config.cpp +70 -1
  353. package/src/duckdb/src/main/database.cpp +19 -2
  354. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  355. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  356. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  357. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  358. package/src/duckdb/src/main/relation.cpp +3 -2
  359. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  360. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  361. package/src/duckdb/src/optimizer/filter_combiner.cpp +1 -1
  362. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  363. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  364. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +105 -71
  365. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +31 -12
  366. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  367. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  368. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  369. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  370. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  371. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  372. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  373. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  374. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  375. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  376. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  377. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  378. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  379. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  380. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  381. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  382. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  383. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  384. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  385. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  386. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  387. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  388. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  389. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  390. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  391. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  392. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  393. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -4
  394. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  395. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  396. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  397. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  398. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  399. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  400. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  401. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  402. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  403. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  404. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  405. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  406. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  407. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  408. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  409. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  410. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  411. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  412. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  413. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  414. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  415. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  416. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  417. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  418. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  419. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  420. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  421. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  422. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  423. package/src/duckdb/src/parser/query_node.cpp +51 -1
  424. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  425. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  426. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  427. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  428. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  429. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  430. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  431. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  432. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  433. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  434. package/src/duckdb/src/parser/tableref.cpp +49 -0
  435. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  436. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  437. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  438. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +63 -42
  439. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  440. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  441. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  442. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  443. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  444. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  445. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  446. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  447. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  448. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  449. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  450. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  451. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  452. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  453. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  454. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  455. package/src/duckdb/src/parser/transformer.cpp +15 -3
  456. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  457. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  458. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  459. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  460. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  461. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  462. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  463. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  464. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  465. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  466. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  467. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  468. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  469. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  470. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +9 -1
  471. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  472. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  473. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  474. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  475. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  476. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  477. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  478. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  479. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  480. package/src/duckdb/src/planner/binder.cpp +19 -24
  481. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  482. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  483. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  484. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  485. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  486. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  487. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  488. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  489. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  490. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  491. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  492. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  493. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  494. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  495. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  496. package/src/duckdb/src/planner/planner.cpp +2 -1
  497. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  498. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  499. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  500. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  501. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  502. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  503. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  504. package/src/duckdb/src/storage/compression/bitpacking.cpp +28 -24
  505. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +43 -45
  506. package/src/duckdb/src/storage/compression/numeric_constant.cpp +9 -10
  507. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  508. package/src/duckdb/src/storage/compression/rle.cpp +19 -15
  509. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +5 -5
  510. package/src/duckdb/src/storage/data_table.cpp +20 -20
  511. package/src/duckdb/src/storage/index.cpp +12 -1
  512. package/src/duckdb/src/storage/local_storage.cpp +20 -23
  513. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  514. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  515. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  516. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  517. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  518. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  519. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  520. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  521. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  522. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  523. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  524. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  525. package/src/duckdb/src/storage/table/column_data.cpp +45 -46
  526. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +7 -8
  527. package/src/duckdb/src/storage/table/column_segment.cpp +13 -14
  528. package/src/duckdb/src/storage/table/list_column_data.cpp +41 -59
  529. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  530. package/src/duckdb/src/storage/table/row_group.cpp +38 -32
  531. package/src/duckdb/src/storage/table/row_group_collection.cpp +94 -78
  532. package/src/duckdb/src/storage/table/scan_state.cpp +22 -3
  533. package/src/duckdb/src/storage/table/standard_column_data.cpp +7 -6
  534. package/src/duckdb/src/storage/table/struct_column_data.cpp +16 -16
  535. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  536. package/src/duckdb/src/storage/table/update_segment.cpp +20 -18
  537. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  538. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  539. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  540. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  541. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  542. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  543. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  544. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  545. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  546. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  547. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  548. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  549. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  550. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  551. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  552. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  553. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  554. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  555. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  556. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  557. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  558. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  559. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  560. package/src/duckdb/ub_src_parser.cpp +2 -0
  561. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  562. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  563. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  564. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  565. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  566. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  567. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  568. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  569. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  570. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  571. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  572. package/src/duckdb_node.hpp +2 -1
  573. package/src/statement.cpp +5 -5
  574. package/src/utils.cpp +27 -2
  575. package/test/extension.test.ts +44 -26
  576. package/test/syntax_error.test.ts +3 -1
  577. package/filelist.cache +0 -0
  578. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  579. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  580. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  581. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  582. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  583. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  584. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  585. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  586. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  587. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  588. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  589. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  590. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -4,7 +4,7 @@
4
4
  #include "duckdb/common/exception.hpp"
5
5
  #include "duckdb/common/field_writer.hpp"
6
6
  #include "duckdb/storage/table/column_data.hpp"
7
- #include "duckdb/storage/table/standard_column_data.hpp"
7
+ #include "duckdb/storage/table/column_checkpoint_state.hpp"
8
8
  #include "duckdb/storage/table/update_segment.hpp"
9
9
  #include "duckdb/common/chrono.hpp"
10
10
  #include "duckdb/planner/table_filter.hpp"
@@ -23,14 +23,14 @@ constexpr const idx_t RowGroup::ROW_GROUP_SIZE;
23
23
 
24
24
  RowGroup::RowGroup(AttachedDatabase &db, BlockManager &block_manager, DataTableInfo &table_info, idx_t start,
25
25
  idx_t count)
26
- : SegmentBase(start, count), db(db), block_manager(block_manager), table_info(table_info) {
26
+ : SegmentBase<RowGroup>(start, count), db(db), block_manager(block_manager), table_info(table_info) {
27
27
 
28
28
  Verify();
29
29
  }
30
30
 
31
31
  RowGroup::RowGroup(AttachedDatabase &db, BlockManager &block_manager, DataTableInfo &table_info,
32
32
  const vector<LogicalType> &types, RowGroupPointer &&pointer)
33
- : SegmentBase(pointer.row_start, pointer.tuple_count), db(db), block_manager(block_manager),
33
+ : SegmentBase<RowGroup>(pointer.row_start, pointer.tuple_count), db(db), block_manager(block_manager),
34
34
  table_info(table_info) {
35
35
  // deserialize the columns
36
36
  if (pointer.data_pointers.size() != types.size()) {
@@ -46,8 +46,7 @@ RowGroup::RowGroup(AttachedDatabase &db, BlockManager &block_manager, DataTableI
46
46
 
47
47
  // set up the statistics
48
48
  for (auto &stats : pointer.statistics) {
49
- auto stats_type = stats->type;
50
- this->stats.push_back(make_shared<SegmentStatistics>(stats_type, std::move(stats)));
49
+ this->stats.emplace_back(std::move(stats));
51
50
  }
52
51
  this->version_info = std::move(pointer.versions);
53
52
 
@@ -55,7 +54,7 @@ RowGroup::RowGroup(AttachedDatabase &db, BlockManager &block_manager, DataTableI
55
54
  }
56
55
 
57
56
  RowGroup::RowGroup(RowGroup &row_group, idx_t start)
58
- : SegmentBase(start, row_group.count), db(row_group.db), block_manager(row_group.block_manager),
57
+ : SegmentBase<RowGroup>(start, row_group.count.load()), db(row_group.db), block_manager(row_group.block_manager),
59
58
  table_info(row_group.table_info), version_info(std::move(row_group.version_info)),
60
59
  stats(std::move(row_group.stats)) {
61
60
  for (auto &column : row_group.columns) {
@@ -88,7 +87,7 @@ void RowGroup::InitializeEmpty(const vector<LogicalType> &types) {
88
87
  // set up the segment trees for the column segments
89
88
  for (idx_t i = 0; i < types.size(); i++) {
90
89
  auto column_data = ColumnData::CreateColumn(block_manager, GetTableInfo(), i, start, types[i]);
91
- stats.push_back(make_shared<SegmentStatistics>(types[i]));
90
+ stats.emplace_back(types[i]);
92
91
  columns.push_back(std::move(column_data));
93
92
  }
94
93
  }
@@ -157,8 +156,12 @@ unique_ptr<RowGroup> RowGroup::AlterType(const LogicalType &target_type, idx_t c
157
156
  // scan the original table, and fill the new column with the transformed value
158
157
  InitializeScan(scan_state);
159
158
 
160
- Vector append_vector(target_type);
161
- auto altered_col_stats = make_shared<SegmentStatistics>(target_type);
159
+ DataChunk append_chunk;
160
+ vector<LogicalType> append_types;
161
+ append_types.push_back(target_type);
162
+ append_chunk.Initialize(Allocator::DefaultAllocator(), append_types);
163
+ auto &append_vector = append_chunk.data[0];
164
+ SegmentStatistics altered_col_stats(target_type);
162
165
  while (true) {
163
166
  // scan the table
164
167
  scan_chunk.Reset();
@@ -167,8 +170,9 @@ unique_ptr<RowGroup> RowGroup::AlterType(const LogicalType &target_type, idx_t c
167
170
  break;
168
171
  }
169
172
  // execute the expression
173
+ append_chunk.Reset();
170
174
  executor.ExecuteExpression(scan_chunk, append_vector);
171
- column_data->Append(*altered_col_stats->statistics, append_state, append_vector, scan_chunk.size());
175
+ column_data->Append(altered_col_stats.statistics, append_state, append_vector, scan_chunk.size());
172
176
  }
173
177
 
174
178
  // set up the row_group based on this row_group
@@ -178,11 +182,11 @@ unique_ptr<RowGroup> RowGroup::AlterType(const LogicalType &target_type, idx_t c
178
182
  if (i == changed_idx) {
179
183
  // this is the altered column: use the new column
180
184
  row_group->columns.push_back(std::move(column_data));
181
- row_group->stats.push_back(std::move(altered_col_stats));
185
+ row_group->stats.push_back(std::move(altered_col_stats)); // NOLINT: false positive
182
186
  } else {
183
187
  // this column was not altered: use the data directly
184
188
  row_group->columns.push_back(columns[i]);
185
- row_group->stats.push_back(stats[i]);
189
+ row_group->stats.emplace_back(stats[i].statistics.Copy());
186
190
  }
187
191
  }
188
192
  row_group->Verify();
@@ -196,8 +200,7 @@ unique_ptr<RowGroup> RowGroup::AddColumn(ColumnDefinition &new_column, Expressio
196
200
  // construct a new column data for the new column
197
201
  auto added_column =
198
202
  ColumnData::CreateColumn(block_manager, GetTableInfo(), columns.size(), start, new_column.Type());
199
- auto added_col_stats = make_shared<SegmentStatistics>(
200
- new_column.Type(), BaseStatistics::CreateEmpty(new_column.Type(), StatisticsType::LOCAL_STATS));
203
+ SegmentStatistics added_col_stats(new_column.Type());
201
204
 
202
205
  idx_t rows_to_write = this->count;
203
206
  if (rows_to_write > 0) {
@@ -211,7 +214,7 @@ unique_ptr<RowGroup> RowGroup::AddColumn(ColumnDefinition &new_column, Expressio
211
214
  dummy_chunk.SetCardinality(rows_in_this_vector);
212
215
  executor.ExecuteExpression(dummy_chunk, result);
213
216
  }
214
- added_column->Append(*added_col_stats->statistics, state, result, rows_in_this_vector);
217
+ added_column->Append(added_col_stats.statistics, state, result, rows_in_this_vector);
215
218
  }
216
219
  }
217
220
 
@@ -219,7 +222,9 @@ unique_ptr<RowGroup> RowGroup::AddColumn(ColumnDefinition &new_column, Expressio
219
222
  auto row_group = make_unique<RowGroup>(db, block_manager, table_info, this->start, this->count);
220
223
  row_group->version_info = version_info;
221
224
  row_group->columns = columns;
222
- row_group->stats = stats;
225
+ for (auto &stat : stats) {
226
+ row_group->stats.emplace_back(stat.statistics.Copy());
227
+ }
223
228
  // now add the new column
224
229
  row_group->columns.push_back(std::move(added_column));
225
230
  row_group->stats.push_back(std::move(added_col_stats));
@@ -236,7 +241,9 @@ unique_ptr<RowGroup> RowGroup::RemoveColumn(idx_t removed_column) {
236
241
  auto row_group = make_unique<RowGroup>(db, block_manager, table_info, this->start, this->count);
237
242
  row_group->version_info = version_info;
238
243
  row_group->columns = columns;
239
- row_group->stats = stats;
244
+ for (auto &stat : stats) {
245
+ row_group->stats.emplace_back(stat.statistics.Copy());
246
+ }
240
247
  // now remove the column
241
248
  row_group->columns.erase(row_group->columns.begin() + removed_column);
242
249
  row_group->stats.erase(row_group->stats.begin() + removed_column);
@@ -275,7 +282,7 @@ bool RowGroup::CheckZonemap(TableFilterSet &filters, const vector<column_t> &col
275
282
  auto &filter = entry.second;
276
283
  auto base_column_index = column_ids[column_index];
277
284
 
278
- auto propagate_result = filter->CheckStatistics(*stats[base_column_index]->statistics);
285
+ auto propagate_result = filter->CheckStatistics(stats[base_column_index].statistics);
279
286
  if (propagate_result == FilterPropagateResult::FILTER_ALWAYS_FALSE ||
280
287
  propagate_result == FilterPropagateResult::FILTER_FALSE_OR_NULL) {
281
288
  return false;
@@ -628,7 +635,7 @@ void RowGroup::InitializeAppend(RowGroupAppendState &append_state) {
628
635
  void RowGroup::Append(RowGroupAppendState &state, DataChunk &chunk, idx_t append_count) {
629
636
  // append to the current row_group
630
637
  for (idx_t i = 0; i < columns.size(); i++) {
631
- columns[i]->Append(*stats[i]->statistics, state.states[i], chunk.data[i], append_count);
638
+ columns[i]->Append(stats[i].statistics, state.states[i], chunk.data[i], append_count);
632
639
  }
633
640
  state.offset_in_row_group += append_count;
634
641
  }
@@ -671,21 +678,21 @@ unique_ptr<BaseStatistics> RowGroup::GetStatistics(idx_t column_idx) {
671
678
  D_ASSERT(column_idx < stats.size());
672
679
 
673
680
  lock_guard<mutex> slock(stats_lock);
674
- return stats[column_idx]->statistics->Copy();
681
+ return stats[column_idx].statistics.ToUnique();
675
682
  }
676
683
 
677
684
  void RowGroup::MergeStatistics(idx_t column_idx, const BaseStatistics &other) {
678
685
  D_ASSERT(column_idx < stats.size());
679
686
 
680
687
  lock_guard<mutex> slock(stats_lock);
681
- stats[column_idx]->statistics->Merge(other);
688
+ stats[column_idx].statistics.Merge(other);
682
689
  }
683
690
 
684
691
  void RowGroup::MergeIntoStatistics(idx_t column_idx, BaseStatistics &other) {
685
692
  D_ASSERT(column_idx < stats.size());
686
693
 
687
694
  lock_guard<mutex> slock(stats_lock);
688
- other.Merge(*stats[column_idx]->statistics);
695
+ other.Merge(stats[column_idx].statistics);
689
696
  }
690
697
 
691
698
  RowGroupWriteData RowGroup::WriteToDisk(PartialBlockManager &manager,
@@ -711,14 +718,14 @@ RowGroupWriteData RowGroup::WriteToDisk(PartialBlockManager &manager,
711
718
  auto stats = checkpoint_state->GetStatistics();
712
719
  D_ASSERT(stats);
713
720
 
714
- result.statistics.push_back(std::move(stats));
721
+ result.statistics.push_back(stats->Copy());
715
722
  result.states.push_back(std::move(checkpoint_state));
716
723
  }
717
724
  D_ASSERT(result.states.size() == result.statistics.size());
718
725
  return result;
719
726
  }
720
727
 
721
- RowGroupPointer RowGroup::Checkpoint(RowGroupWriter &writer, vector<unique_ptr<BaseStatistics>> &global_stats) {
728
+ RowGroupPointer RowGroup::Checkpoint(RowGroupWriter &writer, TableStatistics &global_stats) {
722
729
  RowGroupPointer row_group_pointer;
723
730
 
724
731
  vector<CompressionType> compression_types;
@@ -728,7 +735,7 @@ RowGroupPointer RowGroup::Checkpoint(RowGroupWriter &writer, vector<unique_ptr<B
728
735
  }
729
736
  auto result = WriteToDisk(writer.GetPartialBlockManager(), compression_types);
730
737
  for (idx_t column_idx = 0; column_idx < columns.size(); column_idx++) {
731
- global_stats[column_idx]->Merge(*result.statistics[column_idx]);
738
+ global_stats.GetStats(column_idx).Statistics().Merge(result.statistics[column_idx]);
732
739
  }
733
740
  row_group_pointer.statistics = std::move(result.statistics);
734
741
 
@@ -805,7 +812,7 @@ void RowGroup::Serialize(RowGroupPointer &pointer, Serializer &main_serializer)
805
812
  writer.WriteField<uint64_t>(pointer.tuple_count);
806
813
  auto &serializer = writer.GetSerializer();
807
814
  for (auto &stats : pointer.statistics) {
808
- stats->Serialize(serializer);
815
+ stats.Serialize(serializer);
809
816
  }
810
817
  for (auto &data_pointer : pointer.data_pointers) {
811
818
  serializer.Write<block_id_t>(data_pointer.block_id);
@@ -815,23 +822,22 @@ void RowGroup::Serialize(RowGroupPointer &pointer, Serializer &main_serializer)
815
822
  writer.Finalize();
816
823
  }
817
824
 
818
- RowGroupPointer RowGroup::Deserialize(Deserializer &main_source, const ColumnList &columns) {
825
+ RowGroupPointer RowGroup::Deserialize(Deserializer &main_source, const vector<LogicalType> &columns) {
819
826
  RowGroupPointer result;
820
827
 
821
828
  FieldReader reader(main_source);
822
829
  result.row_start = reader.ReadRequired<uint64_t>();
823
830
  result.tuple_count = reader.ReadRequired<uint64_t>();
824
831
 
825
- auto physical_columns = columns.PhysicalColumnCount();
832
+ auto physical_columns = columns.size();
826
833
  result.data_pointers.reserve(physical_columns);
827
834
  result.statistics.reserve(physical_columns);
828
835
 
829
836
  auto &source = reader.GetSource();
830
- for (auto &col : columns.Physical()) {
831
- auto stats = BaseStatistics::Deserialize(source, col.Type());
832
- result.statistics.push_back(std::move(stats));
837
+ for (auto &col_type : columns) {
838
+ result.statistics.push_back(BaseStatistics::Deserialize(source, col_type));
833
839
  }
834
- for (idx_t i = 0; i < columns.PhysicalColumnCount(); i++) {
840
+ for (idx_t i = 0; i < columns.size(); i++) {
835
841
  BlockPointer pointer;
836
842
  pointer.block_id = source.Read<block_id_t>();
837
843
  pointer.offset = source.Read<uint64_t>();
@@ -6,14 +6,48 @@
6
6
  #include "duckdb/transaction/transaction.hpp"
7
7
  #include "duckdb/planner/constraints/bound_not_null_constraint.hpp"
8
8
  #include "duckdb/storage/checkpoint/table_data_writer.hpp"
9
+ #include "duckdb/storage/table/row_group_segment_tree.hpp"
10
+ #include "duckdb/storage/meta_block_reader.hpp"
9
11
 
10
12
  namespace duckdb {
11
13
 
14
+ //===--------------------------------------------------------------------===//
15
+ // Row Group Segment Tree
16
+ //===--------------------------------------------------------------------===//
17
+ RowGroupSegmentTree::RowGroupSegmentTree(DataTableInfo &table_info_p, BlockManager &block_manager_p,
18
+ vector<LogicalType> column_types_p)
19
+ : SegmentTree<RowGroup, true>(), info(table_info_p), block_manager(block_manager_p),
20
+ column_types(std::move(column_types_p)), current_row_group(0), max_row_group(0) {
21
+ }
22
+ RowGroupSegmentTree::~RowGroupSegmentTree() {
23
+ }
24
+
25
+ void RowGroupSegmentTree::Initialize(PersistentTableData &data) {
26
+ D_ASSERT(data.row_group_count > 0);
27
+ current_row_group = 0;
28
+ max_row_group = data.row_group_count;
29
+ finished_loading = false;
30
+ reader = make_unique<MetaBlockReader>(block_manager, data.block_id);
31
+ reader->offset = data.offset;
32
+ }
33
+
34
+ unique_ptr<RowGroup> RowGroupSegmentTree::LoadSegment() {
35
+ if (current_row_group >= max_row_group) {
36
+ finished_loading = true;
37
+ return nullptr;
38
+ }
39
+ auto row_group_pointer = RowGroup::Deserialize(*reader, column_types);
40
+ current_row_group++;
41
+ return make_unique<RowGroup>(info.db, block_manager, info, column_types, std::move(row_group_pointer));
42
+ }
43
+ //===--------------------------------------------------------------------===//
44
+ // Row Group Collection
45
+ //===--------------------------------------------------------------------===//
12
46
  RowGroupCollection::RowGroupCollection(shared_ptr<DataTableInfo> info_p, BlockManager &block_manager,
13
47
  vector<LogicalType> types_p, idx_t row_start_p, idx_t total_rows_p)
14
48
  : block_manager(block_manager), total_rows(total_rows_p), info(std::move(info_p)), types(std::move(types_p)),
15
49
  row_start(row_start_p) {
16
- row_groups = make_shared<SegmentTree>();
50
+ row_groups = make_shared<RowGroupSegmentTree>(*info, block_manager, types);
17
51
  }
18
52
 
19
53
  idx_t RowGroupCollection::GetTotalRows() const {
@@ -34,14 +68,8 @@ Allocator &RowGroupCollection::GetAllocator() const {
34
68
  void RowGroupCollection::Initialize(PersistentTableData &data) {
35
69
  D_ASSERT(this->row_start == 0);
36
70
  auto l = row_groups->Lock();
37
- for (auto &row_group_pointer : data.row_groups) {
38
- auto new_row_group = make_unique<RowGroup>(info->db, block_manager, *info, types, std::move(row_group_pointer));
39
- auto row_group_count = new_row_group->start + new_row_group->count;
40
- if (row_group_count > this->total_rows) {
41
- this->total_rows = row_group_count;
42
- }
43
- row_groups->AppendSegment(l, std::move(new_row_group));
44
- }
71
+ this->total_rows = data.total_rows;
72
+ row_groups->Initialize(data);
45
73
  stats.Initialize(types, data);
46
74
  }
47
75
 
@@ -64,8 +92,7 @@ void RowGroupCollection::Verify() {
64
92
  #ifdef DEBUG
65
93
  idx_t current_total_rows = 0;
66
94
  row_groups->Verify();
67
- for (auto segment = row_groups->GetRootSegment(); segment; segment = segment->Next()) {
68
- auto &row_group = (RowGroup &)*segment;
95
+ for (auto &row_group : row_groups->Segments()) {
69
96
  row_group.Verify();
70
97
  D_ASSERT(row_group.start == this->row_start + current_total_rows);
71
98
  current_total_rows += row_group.count;
@@ -79,11 +106,12 @@ void RowGroupCollection::Verify() {
79
106
  //===--------------------------------------------------------------------===//
80
107
  void RowGroupCollection::InitializeScan(CollectionScanState &state, const vector<column_t> &column_ids,
81
108
  TableFilterSet *table_filters) {
82
- auto row_group = (RowGroup *)row_groups->GetRootSegment();
109
+ auto row_group = row_groups->GetRootSegment();
83
110
  D_ASSERT(row_group);
111
+ state.row_groups = row_groups.get();
84
112
  state.max_row = row_start + total_rows;
85
113
  while (row_group && !row_group->InitializeScan(state.row_group_state)) {
86
- row_group = (RowGroup *)row_group->Next();
114
+ row_group = row_groups->GetNextSegment(row_group);
87
115
  }
88
116
  }
89
117
 
@@ -93,8 +121,9 @@ void RowGroupCollection::InitializeCreateIndexScan(CreateIndexScanState &state)
93
121
 
94
122
  void RowGroupCollection::InitializeScanWithOffset(CollectionScanState &state, const vector<column_t> &column_ids,
95
123
  idx_t start_row, idx_t end_row) {
96
- auto row_group = (RowGroup *)row_groups->GetSegment(start_row);
124
+ auto row_group = row_groups->GetSegment(start_row);
97
125
  D_ASSERT(row_group);
126
+ state.row_groups = row_groups.get();
98
127
  state.max_row = end_row;
99
128
  idx_t start_vector = (start_row - row_group->start) / STANDARD_VECTOR_SIZE;
100
129
  if (!row_group->InitializeScanWithOffset(state.row_group_state, start_vector)) {
@@ -102,14 +131,17 @@ void RowGroupCollection::InitializeScanWithOffset(CollectionScanState &state, co
102
131
  }
103
132
  }
104
133
 
105
- bool RowGroupCollection::InitializeScanInRowGroup(CollectionScanState &state, RowGroup *row_group, idx_t vector_index,
134
+ bool RowGroupCollection::InitializeScanInRowGroup(CollectionScanState &state,
135
+ ParallelCollectionScanState &parallel_state, idx_t vector_index,
106
136
  idx_t max_row) {
107
137
  state.max_row = max_row;
108
- return row_group->InitializeScanWithOffset(state.row_group_state, vector_index);
138
+ state.row_groups = parallel_state.collection->row_groups.get();
139
+ return parallel_state.current_row_group->InitializeScanWithOffset(state.row_group_state, vector_index);
109
140
  }
110
141
 
111
142
  void RowGroupCollection::InitializeParallelScan(ParallelCollectionScanState &state) {
112
- state.current_row_group = (RowGroup *)row_groups->GetRootSegment();
143
+ state.collection = this;
144
+ state.current_row_group = row_groups->GetRootSegment();
113
145
  state.vector_index = 0;
114
146
  state.max_row = row_start + total_rows;
115
147
  state.batch_index = 0;
@@ -131,15 +163,15 @@ bool RowGroupCollection::NextParallelScan(ClientContext &context, ParallelCollec
131
163
  max_row = state.current_row_group->start + state.current_row_group->count;
132
164
  }
133
165
  max_row = MinValue<idx_t>(max_row, state.max_row);
134
- bool need_to_scan = InitializeScanInRowGroup(scan_state, state.current_row_group, vector_index, max_row);
166
+ bool need_to_scan = InitializeScanInRowGroup(scan_state, state, vector_index, max_row);
135
167
  if (ClientConfig::GetConfig(context).verify_parallelism) {
136
168
  state.vector_index++;
137
169
  if (state.vector_index * STANDARD_VECTOR_SIZE >= state.current_row_group->count) {
138
- state.current_row_group = (RowGroup *)state.current_row_group->Next();
170
+ state.current_row_group = row_groups->GetNextSegment(state.current_row_group);
139
171
  state.vector_index = 0;
140
172
  }
141
173
  } else {
142
- state.current_row_group = (RowGroup *)state.current_row_group->Next();
174
+ state.current_row_group = row_groups->GetNextSegment(state.current_row_group);
143
175
  }
144
176
  scan_state.batch_index = ++state.batch_index;
145
177
  if (!need_to_scan) {
@@ -204,7 +236,7 @@ void RowGroupCollection::Fetch(TransactionData transaction, DataChunk &result, c
204
236
  // in parallel append scenarios it is possible for the row_id
205
237
  continue;
206
238
  }
207
- row_group = (RowGroup *)row_groups->GetSegmentByIndex(l, segment_index);
239
+ row_group = row_groups->GetSegmentByIndex(l, segment_index);
208
240
  }
209
241
  if (!row_group->Fetch(transaction, row_id - row_group->start)) {
210
242
  continue;
@@ -246,7 +278,7 @@ void RowGroupCollection::InitializeAppend(TransactionData transaction, TableAppe
246
278
  // empty row group collection: empty first row group
247
279
  AppendRowGroup(l, row_start);
248
280
  }
249
- state.start_row_group = (RowGroup *)row_groups->GetLastSegment(l);
281
+ state.start_row_group = row_groups->GetLastSegment(l);
250
282
  D_ASSERT(this->row_start + total_rows == state.start_row_group->start + state.start_row_group->count);
251
283
  state.start_row_group->InitializeAppend(state.row_group_append_state);
252
284
  state.remaining = append_count;
@@ -280,7 +312,7 @@ bool RowGroupCollection::Append(DataChunk &chunk, TableAppendState &state) {
280
312
  // merge the stats
281
313
  auto stats_lock = stats.GetLock();
282
314
  for (idx_t i = 0; i < types.size(); i++) {
283
- current_row_group->MergeIntoStatistics(i, *stats.GetStats(i).stats);
315
+ current_row_group->MergeIntoStatistics(i, stats.GetStats(i).Statistics());
284
316
  }
285
317
  }
286
318
  remaining -= append_count;
@@ -306,7 +338,7 @@ bool RowGroupCollection::Append(DataChunk &chunk, TableAppendState &state) {
306
338
  auto l = row_groups->Lock();
307
339
  AppendRowGroup(l, next_start);
308
340
  // set up the append state for this row_group
309
- auto last_row_group = (RowGroup *)row_groups->GetLastSegment(l);
341
+ auto last_row_group = row_groups->GetLastSegment(l);
310
342
  last_row_group->InitializeAppend(state.row_group_append_state);
311
343
  if (state.remaining > 0) {
312
344
  last_row_group->AppendVersionInfo(state.transaction, state.remaining);
@@ -319,11 +351,7 @@ bool RowGroupCollection::Append(DataChunk &chunk, TableAppendState &state) {
319
351
  state.current_row += append_count;
320
352
  auto stats_lock = stats.GetLock();
321
353
  for (idx_t col_idx = 0; col_idx < types.size(); col_idx++) {
322
- auto type = types[col_idx].InternalType();
323
- if (type == PhysicalType::LIST || type == PhysicalType::STRUCT) {
324
- continue;
325
- }
326
- stats.GetStats(col_idx).stats->UpdateDistinctStatistics(chunk.data[col_idx], chunk.size());
354
+ stats.GetStats(col_idx).UpdateDistinctStatistics(chunk.data[col_idx], chunk.size());
327
355
  }
328
356
  return new_row_group;
329
357
  }
@@ -335,7 +363,7 @@ void RowGroupCollection::FinalizeAppend(TransactionData transaction, TableAppend
335
363
  auto append_count = MinValue<idx_t>(remaining, RowGroup::ROW_GROUP_SIZE - row_group->count);
336
364
  row_group->AppendVersionInfo(transaction, append_count);
337
365
  remaining -= append_count;
338
- row_group = (RowGroup *)row_group->Next();
366
+ row_group = row_groups->GetNextSegment(row_group);
339
367
  }
340
368
  total_rows += state.total_append_count;
341
369
 
@@ -346,7 +374,7 @@ void RowGroupCollection::FinalizeAppend(TransactionData transaction, TableAppend
346
374
  }
347
375
 
348
376
  void RowGroupCollection::CommitAppend(transaction_t commit_id, idx_t row_start, idx_t count) {
349
- auto row_group = (RowGroup *)row_groups->GetSegment(row_start);
377
+ auto row_group = row_groups->GetSegment(row_start);
350
378
  D_ASSERT(row_group);
351
379
  idx_t current_row = row_start;
352
380
  idx_t remaining = count;
@@ -361,7 +389,7 @@ void RowGroupCollection::CommitAppend(transaction_t commit_id, idx_t row_start,
361
389
  if (remaining == 0) {
362
390
  break;
363
391
  }
364
- row_group = (RowGroup *)row_group->Next();
392
+ row_group = row_groups->GetNextSegment(row_group);
365
393
  }
366
394
  }
367
395
 
@@ -375,7 +403,7 @@ void RowGroupCollection::RevertAppendInternal(idx_t start_row, idx_t count) {
375
403
  // find the segment index that the current row belongs to
376
404
  idx_t segment_index = row_groups->GetSegmentIndex(l, start_row);
377
405
  auto segment = row_groups->GetSegmentByIndex(l, segment_index);
378
- auto &info = (RowGroup &)*segment;
406
+ auto &info = *segment;
379
407
 
380
408
  // remove any segments AFTER this segment: they should be deleted entirely
381
409
  row_groups->EraseSegments(l, segment_index);
@@ -387,8 +415,7 @@ void RowGroupCollection::RevertAppendInternal(idx_t start_row, idx_t count) {
387
415
  void RowGroupCollection::MergeStorage(RowGroupCollection &data) {
388
416
  D_ASSERT(data.types == types);
389
417
  auto index = row_start + total_rows.load();
390
- for (auto segment = data.row_groups->GetRootSegment(); segment; segment = segment->Next()) {
391
- auto &row_group = (RowGroup &)*segment;
418
+ for (auto &row_group : data.row_groups->Segments()) {
392
419
  auto new_group = make_unique<RowGroup>(row_group, index);
393
420
  index += new_group->count;
394
421
  row_groups->AppendSegment(std::move(new_group));
@@ -409,7 +436,7 @@ idx_t RowGroupCollection::Delete(TransactionData transaction, DataTable *table,
409
436
  idx_t pos = 0;
410
437
  do {
411
438
  idx_t start = pos;
412
- auto row_group = (RowGroup *)row_groups->GetSegment(ids[start]);
439
+ auto row_group = row_groups->GetSegment(ids[start]);
413
440
  for (pos++; pos < count; pos++) {
414
441
  D_ASSERT(ids[pos] >= 0);
415
442
  // check if this id still belongs to this row group
@@ -435,7 +462,7 @@ void RowGroupCollection::Update(TransactionData transaction, row_t *ids, const v
435
462
  idx_t pos = 0;
436
463
  do {
437
464
  idx_t start = pos;
438
- auto row_group = (RowGroup *)row_groups->GetSegment(ids[pos]);
465
+ auto row_group = row_groups->GetSegment(ids[pos]);
439
466
  row_t base_id =
440
467
  row_group->start + ((ids[pos] - row_group->start) / STANDARD_VECTOR_SIZE * STANDARD_VECTOR_SIZE);
441
468
  row_t max_id = MinValue<row_t>(base_id + STANDARD_VECTOR_SIZE, row_group->start + row_group->count);
@@ -465,7 +492,7 @@ void RowGroupCollection::RemoveFromIndexes(TableIndexList &indexes, Vector &row_
465
492
  auto row_ids = FlatVector::GetData<row_t>(row_identifiers);
466
493
 
467
494
  // figure out which row_group to fetch from
468
- auto row_group = (RowGroup *)row_groups->GetSegment(row_ids[0]);
495
+ auto row_group = row_groups->GetSegment(row_ids[0]);
469
496
  auto row_group_vector_idx = (row_ids[0] - row_group->start) / STANDARD_VECTOR_SIZE;
470
497
  auto base_row_id = row_group_vector_idx * STANDARD_VECTOR_SIZE + row_group->start;
471
498
 
@@ -510,20 +537,19 @@ void RowGroupCollection::UpdateColumn(TransactionData transaction, Vector &row_i
510
537
  }
511
538
  // find the row_group this id belongs to
512
539
  auto primary_column_idx = column_path[0];
513
- auto row_group = (RowGroup *)row_groups->GetSegment(first_id);
540
+ auto row_group = row_groups->GetSegment(first_id);
514
541
  row_group->UpdateColumn(transaction, updates, row_ids, column_path);
515
542
 
516
- row_group->MergeIntoStatistics(primary_column_idx, *stats.GetStats(primary_column_idx).stats);
543
+ row_group->MergeIntoStatistics(primary_column_idx, stats.GetStats(primary_column_idx).Statistics());
517
544
  }
518
545
 
519
546
  //===--------------------------------------------------------------------===//
520
547
  // Checkpoint
521
548
  //===--------------------------------------------------------------------===//
522
- void RowGroupCollection::Checkpoint(TableDataWriter &writer, vector<unique_ptr<BaseStatistics>> &global_stats) {
523
- for (auto row_group = (RowGroup *)row_groups->GetRootSegment(); row_group;
524
- row_group = (RowGroup *)row_group->Next()) {
525
- auto rowg_writer = writer.GetRowGroupWriter(*row_group);
526
- auto pointer = row_group->Checkpoint(*rowg_writer, global_stats);
549
+ void RowGroupCollection::Checkpoint(TableDataWriter &writer, TableStatistics &global_stats) {
550
+ for (auto &row_group : row_groups->Segments()) {
551
+ auto rowg_writer = writer.GetRowGroupWriter(row_group);
552
+ auto pointer = row_group.Checkpoint(*rowg_writer, global_stats);
527
553
  writer.AddRowGroup(std::move(pointer), std::move(rowg_writer));
528
554
  }
529
555
  }
@@ -532,18 +558,14 @@ void RowGroupCollection::Checkpoint(TableDataWriter &writer, vector<unique_ptr<B
532
558
  // CommitDrop
533
559
  //===--------------------------------------------------------------------===//
534
560
  void RowGroupCollection::CommitDropColumn(idx_t index) {
535
- auto segment = (RowGroup *)row_groups->GetRootSegment();
536
- while (segment) {
537
- segment->CommitDropColumn(index);
538
- segment = (RowGroup *)segment->Next();
561
+ for (auto &row_group : row_groups->Segments()) {
562
+ row_group.CommitDropColumn(index);
539
563
  }
540
564
  }
541
565
 
542
566
  void RowGroupCollection::CommitDropTable() {
543
- auto segment = (RowGroup *)row_groups->GetRootSegment();
544
- while (segment) {
545
- segment->CommitDrop();
546
- segment = (RowGroup *)segment->Next();
567
+ for (auto &row_group : row_groups->Segments()) {
568
+ row_group.CommitDrop();
547
569
  }
548
570
  }
549
571
 
@@ -551,13 +573,8 @@ void RowGroupCollection::CommitDropTable() {
551
573
  // GetStorageInfo
552
574
  //===--------------------------------------------------------------------===//
553
575
  void RowGroupCollection::GetStorageInfo(TableStorageInfo &result) {
554
- auto row_group = (RowGroup *)row_groups->GetRootSegment();
555
- idx_t row_group_index = 0;
556
- while (row_group) {
557
- row_group->GetStorageInfo(row_group_index, result);
558
- row_group_index++;
559
-
560
- row_group = (RowGroup *)row_group->Next();
576
+ for (auto &row_group : row_groups->Segments()) {
577
+ row_group.GetStorageInfo(row_group.index, result);
561
578
  }
562
579
  }
563
580
 
@@ -586,14 +603,12 @@ shared_ptr<RowGroupCollection> RowGroupCollection::AddColumn(ClientContext &cont
586
603
 
587
604
  // fill the column with its DEFAULT value, or NULL if none is specified
588
605
  auto new_stats = make_unique<SegmentStatistics>(new_column.GetType());
589
- auto current_row_group = (RowGroup *)row_groups->GetRootSegment();
590
- while (current_row_group) {
591
- auto new_row_group = current_row_group->AddColumn(new_column, executor, default_value, default_vector);
606
+ for (auto &current_row_group : row_groups->Segments()) {
607
+ auto new_row_group = current_row_group.AddColumn(new_column, executor, default_value, default_vector);
592
608
  // merge in the statistics
593
- new_row_group->MergeIntoStatistics(new_column_idx, *new_column_stats.stats);
609
+ new_row_group->MergeIntoStatistics(new_column_idx, new_column_stats.Statistics());
594
610
 
595
611
  result->row_groups->AppendSegment(std::move(new_row_group));
596
- current_row_group = (RowGroup *)current_row_group->Next();
597
612
  }
598
613
  return result;
599
614
  }
@@ -607,11 +622,9 @@ shared_ptr<RowGroupCollection> RowGroupCollection::RemoveColumn(idx_t col_idx) {
607
622
  make_shared<RowGroupCollection>(info, block_manager, std::move(new_types), row_start, total_rows.load());
608
623
  result->stats.InitializeRemoveColumn(stats, col_idx);
609
624
 
610
- auto current_row_group = (RowGroup *)row_groups->GetRootSegment();
611
- while (current_row_group) {
612
- auto new_row_group = current_row_group->RemoveColumn(col_idx);
625
+ for (auto &current_row_group : row_groups->Segments()) {
626
+ auto new_row_group = current_row_group.RemoveColumn(col_idx);
613
627
  result->row_groups->AppendSegment(std::move(new_row_group));
614
- current_row_group = (RowGroup *)current_row_group->Next();
615
628
  }
616
629
  return result;
617
630
  }
@@ -646,14 +659,12 @@ shared_ptr<RowGroupCollection> RowGroupCollection::AlterType(ClientContext &cont
646
659
  scan_state.table_state.max_row = row_start + total_rows;
647
660
 
648
661
  // now alter the type of the column within all of the row_groups individually
649
- auto current_row_group = (RowGroup *)row_groups->GetRootSegment();
650
662
  auto &changed_stats = result->stats.GetStats(changed_idx);
651
- while (current_row_group) {
652
- auto new_row_group = current_row_group->AlterType(target_type, changed_idx, executor,
653
- scan_state.table_state.row_group_state, scan_chunk);
654
- new_row_group->MergeIntoStatistics(changed_idx, *changed_stats.stats);
663
+ for (auto &current_row_group : row_groups->Segments()) {
664
+ auto new_row_group = current_row_group.AlterType(target_type, changed_idx, executor,
665
+ scan_state.table_state.row_group_state, scan_chunk);
666
+ new_row_group->MergeIntoStatistics(changed_idx, changed_stats.Statistics());
655
667
  result->row_groups->AppendSegment(std::move(new_row_group));
656
- current_row_group = (RowGroup *)current_row_group->Next();
657
668
  }
658
669
 
659
670
  return result;
@@ -681,7 +692,8 @@ void RowGroupCollection::VerifyNewConstraint(DataTable &parent, const BoundConst
681
692
  InitializeCreateIndexScan(state);
682
693
  while (true) {
683
694
  scan_chunk.Reset();
684
- state.table_state.ScanCommitted(scan_chunk, TableScanType::TABLE_SCAN_COMMITTED_ROWS_OMIT_PERMANENTLY_DELETED);
695
+ state.table_state.ScanCommitted(scan_chunk, state.segment_lock,
696
+ TableScanType::TABLE_SCAN_COMMITTED_ROWS_OMIT_PERMANENTLY_DELETED);
685
697
  if (scan_chunk.size() == 0) {
686
698
  break;
687
699
  }
@@ -696,14 +708,18 @@ void RowGroupCollection::VerifyNewConstraint(DataTable &parent, const BoundConst
696
708
  //===--------------------------------------------------------------------===//
697
709
  // Statistics
698
710
  //===--------------------------------------------------------------------===//
711
+ void RowGroupCollection::CopyStats(TableStatistics &other_stats) {
712
+ stats.CopyStats(other_stats);
713
+ }
714
+
699
715
  unique_ptr<BaseStatistics> RowGroupCollection::CopyStats(column_t column_id) {
700
716
  return stats.CopyStats(column_id);
701
717
  }
702
718
 
703
- void RowGroupCollection::SetStatistics(column_t column_id, const std::function<void(BaseStatistics &)> &set_fun) {
719
+ void RowGroupCollection::SetDistinct(column_t column_id, unique_ptr<DistinctStatistics> distinct_stats) {
704
720
  D_ASSERT(column_id != COLUMN_IDENTIFIER_ROW_ID);
705
721
  auto stats_guard = stats.GetLock();
706
- set_fun(*stats.GetStats(column_id).stats);
722
+ stats.GetStats(column_id).SetDistinct(std::move(distinct_stats));
707
723
  }
708
724
 
709
725
  } // namespace duckdb