duckdb 0.7.2-dev12.0 → 0.7.2-dev1244.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 (631) 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/icu/third_party/icu/stubdata/stubdata.cpp +1 -1
  13. package/src/duckdb/extension/json/include/json_common.hpp +1 -0
  14. package/src/duckdb/extension/json/include/json_functions.hpp +2 -0
  15. package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
  16. package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
  17. package/src/duckdb/extension/json/json_functions/read_json.cpp +6 -5
  18. package/src/duckdb/extension/json/json_functions.cpp +12 -4
  19. package/src/duckdb/extension/json/json_scan.cpp +2 -2
  20. package/src/duckdb/extension/json/json_serializer.cpp +217 -0
  21. package/src/duckdb/extension/parquet/column_reader.cpp +94 -15
  22. package/src/duckdb/extension/parquet/column_writer.cpp +0 -1
  23. package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -2
  24. package/src/duckdb/extension/parquet/include/decode_utils.hpp +5 -4
  25. package/src/duckdb/extension/parquet/include/generated_column_reader.hpp +1 -11
  26. package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -1
  27. package/src/duckdb/extension/parquet/parquet-extension.cpp +14 -3
  28. package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -1
  29. package/src/duckdb/extension/parquet/parquet_statistics.cpp +49 -36
  30. package/src/duckdb/extension/parquet/parquet_timestamp.cpp +16 -6
  31. package/src/duckdb/src/catalog/catalog.cpp +34 -5
  32. package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +4 -0
  33. package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +2 -21
  34. package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +7 -6
  35. package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +3 -3
  36. package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +20 -1
  37. package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +8 -2
  38. package/src/duckdb/src/catalog/catalog_set.cpp +1 -0
  39. package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
  40. package/src/duckdb/src/catalog/dependency_list.cpp +12 -0
  41. package/src/duckdb/src/catalog/duck_catalog.cpp +34 -7
  42. package/src/duckdb/src/common/arrow/arrow_appender.cpp +48 -4
  43. package/src/duckdb/src/common/arrow/arrow_converter.cpp +1 -1
  44. package/src/duckdb/src/common/box_renderer.cpp +109 -23
  45. package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
  46. package/src/duckdb/src/common/enums/join_type.cpp +3 -22
  47. package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
  48. package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
  49. package/src/duckdb/src/common/exception.cpp +15 -1
  50. package/src/duckdb/src/common/field_writer.cpp +1 -0
  51. package/src/duckdb/src/common/hive_partitioning.cpp +3 -1
  52. package/src/duckdb/src/common/local_file_system.cpp +64 -7
  53. package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
  54. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  55. package/src/duckdb/src/common/progress_bar/progress_bar.cpp +7 -0
  56. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  57. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  58. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  59. package/src/duckdb/src/common/sort/comparators.cpp +14 -5
  60. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  61. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  62. package/src/duckdb/src/common/string_util.cpp +18 -1
  63. package/src/duckdb/src/common/types/bit.cpp +166 -87
  64. package/src/duckdb/src/common/types/blob.cpp +1 -1
  65. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  66. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  67. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +12 -10
  68. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  69. package/src/duckdb/src/common/types/interval.cpp +0 -41
  70. package/src/duckdb/src/common/types/list_segment.cpp +658 -0
  71. package/src/duckdb/src/common/types/string_heap.cpp +1 -1
  72. package/src/duckdb/src/common/types/string_type.cpp +1 -1
  73. package/src/duckdb/src/common/types/time.cpp +13 -0
  74. package/src/duckdb/src/common/types/validity_mask.cpp +24 -7
  75. package/src/duckdb/src/common/types/value.cpp +320 -154
  76. package/src/duckdb/src/common/types/vector.cpp +158 -134
  77. package/src/duckdb/src/common/types.cpp +313 -153
  78. package/src/duckdb/src/common/value_operations/comparison_operations.cpp +14 -22
  79. package/src/duckdb/src/common/vector_operations/comparison_operators.cpp +10 -10
  80. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +11 -10
  81. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  82. package/src/duckdb/src/execution/aggregate_hashtable.cpp +98 -74
  83. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  84. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  85. package/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +2 -2
  86. package/src/duckdb/src/execution/index/art/art.cpp +19 -5
  87. package/src/duckdb/src/execution/join_hashtable.cpp +3 -1
  88. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +1 -1
  89. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  90. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  91. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  92. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  93. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  94. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +2 -0
  95. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  96. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +13 -4
  97. package/src/duckdb/src/execution/operator/join/physical_join.cpp +0 -3
  98. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  99. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  100. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +11 -4
  101. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +24 -19
  102. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +3 -0
  103. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +2 -1
  104. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  105. package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +1 -3
  106. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -0
  107. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  108. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  109. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  110. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +2 -5
  111. package/src/duckdb/src/execution/partitionable_hashtable.cpp +20 -5
  112. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +22 -16
  113. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  114. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  115. package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +2 -1
  116. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  117. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  118. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  119. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +23 -15
  120. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  121. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  122. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  123. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  124. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  125. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  126. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  127. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  128. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  129. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  130. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  131. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  132. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  133. package/src/duckdb/src/function/aggregate/nested/list.cpp +6 -712
  134. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +138 -45
  135. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  136. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  137. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  138. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  139. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  140. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  141. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  142. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  143. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  144. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  145. package/src/duckdb/src/function/cast_rules.cpp +9 -4
  146. package/src/duckdb/src/function/function_binder.cpp +1 -8
  147. package/src/duckdb/src/function/pragma/pragma_queries.cpp +24 -1
  148. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  149. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  150. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  151. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  152. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  153. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  154. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  155. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  156. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  157. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  158. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  159. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  160. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  161. package/src/duckdb/src/function/scalar/list/list_sort.cpp +25 -18
  162. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  163. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  164. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  165. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  166. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  167. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  168. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  169. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  170. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  171. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  172. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  173. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  174. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  175. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  176. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  177. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  178. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  179. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  180. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  181. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  182. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  183. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  184. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  185. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  186. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  187. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  188. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  189. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  190. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  191. package/src/duckdb/src/function/table/read_csv.cpp +60 -0
  192. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  193. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  194. package/src/duckdb/src/function/table/table_scan.cpp +9 -12
  195. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  196. package/src/duckdb/src/function/table_function.cpp +30 -11
  197. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  198. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  199. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  200. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  201. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  202. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  203. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  204. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  205. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  206. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  207. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  208. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  209. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  210. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  211. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  212. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  213. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  214. package/src/duckdb/src/include/duckdb/common/helper.hpp +1 -1
  215. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  216. package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +45 -149
  217. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  218. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  219. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  220. package/src/duckdb/src/include/duckdb/common/progress_bar/progress_bar.hpp +2 -0
  221. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  222. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  223. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  224. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  225. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  226. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  227. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  228. package/src/duckdb/src/include/duckdb/common/string_util.hpp +27 -0
  229. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  230. package/src/duckdb/src/include/duckdb/common/types/interval.hpp +39 -3
  231. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +70 -0
  232. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +73 -3
  233. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  234. package/src/duckdb/src/include/duckdb/common/types/validity_mask.hpp +4 -1
  235. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  236. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  237. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  238. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  239. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  240. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +35 -20
  241. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +3 -14
  242. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  243. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  244. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  245. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +10 -0
  246. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  247. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
  248. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  249. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  250. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  251. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  252. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  253. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  254. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  255. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  256. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  257. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  258. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  259. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  260. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  261. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  262. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  263. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  264. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  265. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  266. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  267. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  268. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  269. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  270. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  271. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  272. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  273. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  274. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  275. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  276. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  277. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  278. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  279. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  280. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  281. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  282. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  283. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  284. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  285. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  286. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  288. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  289. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  290. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  291. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  292. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  293. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  294. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  295. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  296. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  297. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  298. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  299. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  300. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  301. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  302. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  303. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  304. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  305. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  306. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  307. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  308. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  309. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  310. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  311. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  312. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  313. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  314. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  315. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  316. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  317. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  318. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  319. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  320. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  321. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  322. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  323. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  324. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  325. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  326. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  327. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  328. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  329. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  330. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  331. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  332. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  333. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  334. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  335. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  336. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  337. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  338. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  339. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  340. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  341. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  342. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  343. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  344. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  345. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  346. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -1
  347. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  348. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  349. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +2 -1
  350. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +4 -3
  351. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +4 -3
  352. package/src/duckdb/src/include/duckdb/storage/index.hpp +5 -4
  353. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  354. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  355. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  356. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  357. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  358. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  359. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  360. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  361. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  362. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  363. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  364. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  365. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  366. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +21 -7
  367. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  368. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +5 -6
  369. package/src/duckdb/src/include/duckdb/storage/table/column_segment_tree.hpp +18 -0
  370. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  371. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -3
  372. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +41 -45
  373. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +23 -7
  374. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +35 -0
  375. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +21 -29
  376. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +6 -6
  377. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +281 -26
  378. package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +0 -4
  379. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  380. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  381. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  382. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +6 -3
  383. package/src/duckdb/src/include/duckdb.h +71 -2
  384. package/src/duckdb/src/include/duckdb.hpp +0 -1
  385. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  386. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  387. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  388. package/src/duckdb/src/main/capi/table_function-c.cpp +23 -0
  389. package/src/duckdb/src/main/client_context.cpp +38 -34
  390. package/src/duckdb/src/main/client_data.cpp +7 -6
  391. package/src/duckdb/src/main/config.cpp +70 -1
  392. package/src/duckdb/src/main/database.cpp +19 -2
  393. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  394. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  395. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  396. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  397. package/src/duckdb/src/main/relation.cpp +3 -2
  398. package/src/duckdb/src/main/settings/settings.cpp +20 -8
  399. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  400. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  401. package/src/duckdb/src/optimizer/filter_combiner.cpp +3 -6
  402. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  403. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  404. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +107 -71
  405. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +32 -12
  406. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  407. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  408. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  409. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  410. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  411. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  412. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  413. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  414. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  415. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  416. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  417. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  418. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  419. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  420. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  421. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  422. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  423. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  424. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  425. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  426. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  427. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  428. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  429. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  430. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  431. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  432. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  433. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -7
  434. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  435. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  436. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  437. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  438. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  439. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  440. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  441. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  442. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  443. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  444. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  445. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  446. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  447. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  448. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  449. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  450. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  451. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  452. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  453. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  454. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  455. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  456. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  457. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  458. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  459. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  460. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  461. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  462. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  463. package/src/duckdb/src/parser/query_node.cpp +51 -1
  464. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  465. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  466. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  467. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  468. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  469. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  470. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  471. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  472. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  473. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  474. package/src/duckdb/src/parser/tableref.cpp +49 -0
  475. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  476. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  477. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  478. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +85 -42
  479. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  480. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  481. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  482. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  483. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  484. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  485. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  486. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  487. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  488. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  489. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  490. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  491. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  492. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  493. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  494. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  495. package/src/duckdb/src/parser/transformer.cpp +15 -3
  496. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  497. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  498. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  499. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  500. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  501. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  502. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  503. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  504. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  505. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  506. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  507. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  508. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  509. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  510. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +10 -1
  511. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  512. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  513. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  514. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  515. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  516. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  517. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  518. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  519. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  520. package/src/duckdb/src/planner/binder.cpp +19 -24
  521. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  522. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  523. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  524. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  525. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  526. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  527. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  528. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  529. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  530. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  531. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  532. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  533. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  534. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  535. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  536. package/src/duckdb/src/planner/planner.cpp +2 -1
  537. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  538. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  539. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  540. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  541. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  542. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  543. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  544. package/src/duckdb/src/storage/compression/bitpacking.cpp +29 -25
  545. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +45 -46
  546. package/src/duckdb/src/storage/compression/numeric_constant.cpp +10 -11
  547. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  548. package/src/duckdb/src/storage/compression/rle.cpp +20 -15
  549. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +6 -6
  550. package/src/duckdb/src/storage/data_table.cpp +23 -23
  551. package/src/duckdb/src/storage/index.cpp +12 -1
  552. package/src/duckdb/src/storage/local_storage.cpp +27 -23
  553. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  554. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  555. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  556. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  557. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  558. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  559. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  560. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  561. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  562. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  563. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  564. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  565. package/src/duckdb/src/storage/table/column_data.cpp +118 -62
  566. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +10 -9
  567. package/src/duckdb/src/storage/table/column_segment.cpp +30 -45
  568. package/src/duckdb/src/storage/table/list_column_data.cpp +50 -71
  569. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  570. package/src/duckdb/src/storage/table/row_group.cpp +213 -143
  571. package/src/duckdb/src/storage/table/row_group_collection.cpp +151 -105
  572. package/src/duckdb/src/storage/table/scan_state.cpp +45 -33
  573. package/src/duckdb/src/storage/table/standard_column_data.cpp +11 -12
  574. package/src/duckdb/src/storage/table/struct_column_data.cpp +27 -34
  575. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  576. package/src/duckdb/src/storage/table/update_segment.cpp +23 -18
  577. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  578. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  579. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  580. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  581. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  582. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  583. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  584. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  585. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  586. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  587. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  588. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  589. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  590. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  591. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  592. package/src/duckdb/ub_src_common_types.cpp +2 -0
  593. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  594. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  595. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  596. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  597. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  598. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  599. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  600. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  601. package/src/duckdb/ub_src_parser.cpp +2 -0
  602. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  603. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  604. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  605. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  606. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  607. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  608. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  609. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  610. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  611. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  612. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  613. package/src/duckdb_node.hpp +2 -1
  614. package/src/statement.cpp +5 -5
  615. package/src/utils.cpp +27 -2
  616. package/test/extension.test.ts +44 -26
  617. package/test/syntax_error.test.ts +3 -1
  618. package/filelist.cache +0 -0
  619. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  620. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  621. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  622. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  623. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  624. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  625. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  626. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  627. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  628. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  629. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  630. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  631. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -5,10 +5,11 @@
5
5
  #include "duckdb/storage/buffer_manager.hpp"
6
6
  #include "duckdb/storage/checkpoint/write_overflow_strings_to_disk.hpp"
7
7
  #include "duckdb/storage/segment/uncompressed.hpp"
8
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
8
+
9
9
  #include "duckdb/storage/table/append_state.hpp"
10
10
  #include "duckdb/storage/table/column_data_checkpointer.hpp"
11
11
  #include "duckdb/storage/table/column_segment.hpp"
12
+ #include "duckdb/storage/table/scan_state.hpp"
12
13
 
13
14
  namespace duckdb {
14
15
 
@@ -64,7 +65,7 @@ void UncompressedCompressState::CreateEmptySegment(idx_t row_start) {
64
65
  auto compressed_segment = ColumnSegment::CreateTransientSegment(db, type, row_start);
65
66
  if (type.InternalType() == PhysicalType::VARCHAR) {
66
67
  auto &state = (UncompressedStringSegmentState &)*compressed_segment->GetSegmentState();
67
- state.overflow_writer = make_unique<WriteOverflowStringsToDisk>(checkpointer.GetColumnData().block_manager);
68
+ state.overflow_writer = make_unique<WriteOverflowStringsToDisk>(checkpointer.GetColumnData().GetBlockManager());
68
69
  }
69
70
  current_segment = std::move(compressed_segment);
70
71
  current_segment->InitializeAppend(append_state);
@@ -153,13 +154,7 @@ void FixedSizeScan(ColumnSegment &segment, ColumnScanState &state, idx_t scan_co
153
154
  auto source_data = data + start * sizeof(T);
154
155
 
155
156
  result.SetVectorType(VectorType::FLAT_VECTOR);
156
- if (std::is_same<T, list_entry_t>()) {
157
- // list columns are modified in-place during the scans to correct the offsets
158
- // so we can't do a zero-copy there
159
- memcpy(FlatVector::GetData(result), source_data, scan_count * sizeof(T));
160
- } else {
161
- FlatVector::SetData(result, source_data);
162
- }
157
+ FlatVector::SetData(result, source_data);
163
158
  }
164
159
 
165
160
  //===--------------------------------------------------------------------===//
@@ -186,48 +181,52 @@ static unique_ptr<CompressionAppendState> FixedSizeInitAppend(ColumnSegment &seg
186
181
  return make_unique<CompressionAppendState>(std::move(handle));
187
182
  }
188
183
 
189
- template <class T>
190
- static void AppendLoop(SegmentStatistics &stats, data_ptr_t target, idx_t target_offset, UnifiedVectorFormat &adata,
191
- idx_t offset, idx_t count) {
192
- auto sdata = (T *)adata.data;
193
- auto tdata = (T *)target;
194
- if (!adata.validity.AllValid()) {
195
- for (idx_t i = 0; i < count; i++) {
196
- auto source_idx = adata.sel->get_index(offset + i);
197
- auto target_idx = target_offset + i;
198
- bool is_null = !adata.validity.RowIsValid(source_idx);
199
- if (!is_null) {
200
- NumericStatistics::Update<T>(stats, sdata[source_idx]);
184
+ struct StandardFixedSizeAppend {
185
+ template <class T>
186
+ static void Append(SegmentStatistics &stats, data_ptr_t target, idx_t target_offset, UnifiedVectorFormat &adata,
187
+ idx_t offset, idx_t count) {
188
+ auto sdata = (T *)adata.data;
189
+ auto tdata = (T *)target;
190
+ if (!adata.validity.AllValid()) {
191
+ for (idx_t i = 0; i < count; i++) {
192
+ auto source_idx = adata.sel->get_index(offset + i);
193
+ auto target_idx = target_offset + i;
194
+ bool is_null = !adata.validity.RowIsValid(source_idx);
195
+ if (!is_null) {
196
+ NumericStats::Update<T>(stats.statistics, sdata[source_idx]);
197
+ tdata[target_idx] = sdata[source_idx];
198
+ } else {
199
+ // we insert a NullValue<T> in the null gap for debuggability
200
+ // this value should never be used or read anywhere
201
+ tdata[target_idx] = NullValue<T>();
202
+ }
203
+ }
204
+ } else {
205
+ for (idx_t i = 0; i < count; i++) {
206
+ auto source_idx = adata.sel->get_index(offset + i);
207
+ auto target_idx = target_offset + i;
208
+ NumericStats::Update<T>(stats.statistics, sdata[source_idx]);
201
209
  tdata[target_idx] = sdata[source_idx];
202
- } else {
203
- // we insert a NullValue<T> in the null gap for debuggability
204
- // this value should never be used or read anywhere
205
- tdata[target_idx] = NullValue<T>();
206
210
  }
207
211
  }
208
- } else {
212
+ }
213
+ };
214
+
215
+ struct ListFixedSizeAppend {
216
+ template <class T>
217
+ static void Append(SegmentStatistics &stats, data_ptr_t target, idx_t target_offset, UnifiedVectorFormat &adata,
218
+ idx_t offset, idx_t count) {
219
+ auto sdata = (uint64_t *)adata.data;
220
+ auto tdata = (uint64_t *)target;
209
221
  for (idx_t i = 0; i < count; i++) {
210
222
  auto source_idx = adata.sel->get_index(offset + i);
211
223
  auto target_idx = target_offset + i;
212
- NumericStatistics::Update<T>(stats, sdata[source_idx]);
213
224
  tdata[target_idx] = sdata[source_idx];
214
225
  }
215
226
  }
216
- }
217
-
218
- template <>
219
- void AppendLoop<list_entry_t>(SegmentStatistics &stats, data_ptr_t target, idx_t target_offset,
220
- UnifiedVectorFormat &adata, idx_t offset, idx_t count) {
221
- auto sdata = (list_entry_t *)adata.data;
222
- auto tdata = (list_entry_t *)target;
223
- for (idx_t i = 0; i < count; i++) {
224
- auto source_idx = adata.sel->get_index(offset + i);
225
- auto target_idx = target_offset + i;
226
- tdata[target_idx] = sdata[source_idx];
227
- }
228
- }
227
+ };
229
228
 
230
- template <class T>
229
+ template <class T, class OP>
231
230
  idx_t FixedSizeAppend(CompressionAppendState &append_state, ColumnSegment &segment, SegmentStatistics &stats,
232
231
  UnifiedVectorFormat &data, idx_t offset, idx_t count) {
233
232
  D_ASSERT(segment.GetBlockOffset() == 0);
@@ -236,7 +235,7 @@ idx_t FixedSizeAppend(CompressionAppendState &append_state, ColumnSegment &segme
236
235
  idx_t max_tuple_count = segment.SegmentSize() / sizeof(T);
237
236
  idx_t copy_count = MinValue<idx_t>(count, max_tuple_count - segment.count);
238
237
 
239
- AppendLoop<T>(stats, target_ptr, segment.count, data, offset, copy_count);
238
+ OP::template Append<T>(stats, target_ptr, segment.count, data, offset, copy_count);
240
239
  segment.count += copy_count;
241
240
  return copy_count;
242
241
  }
@@ -249,14 +248,14 @@ idx_t FixedSizeFinalizeAppend(ColumnSegment &segment, SegmentStatistics &stats)
249
248
  //===--------------------------------------------------------------------===//
250
249
  // Get Function
251
250
  //===--------------------------------------------------------------------===//
252
- template <class T>
251
+ template <class T, class APPENDER = StandardFixedSizeAppend>
253
252
  CompressionFunction FixedSizeGetFunction(PhysicalType data_type) {
254
253
  return CompressionFunction(CompressionType::COMPRESSION_UNCOMPRESSED, data_type, FixedSizeInitAnalyze,
255
254
  FixedSizeAnalyze, FixedSizeFinalAnalyze<T>, UncompressedFunctions::InitCompression,
256
255
  UncompressedFunctions::Compress, UncompressedFunctions::FinalizeCompress,
257
256
  FixedSizeInitScan, FixedSizeScan<T>, FixedSizeScanPartial<T>, FixedSizeFetchRow<T>,
258
- UncompressedFunctions::EmptySkip, nullptr, FixedSizeInitAppend, FixedSizeAppend<T>,
259
- FixedSizeFinalizeAppend<T>, nullptr);
257
+ UncompressedFunctions::EmptySkip, nullptr, FixedSizeInitAppend,
258
+ FixedSizeAppend<T, APPENDER>, FixedSizeFinalizeAppend<T>, nullptr);
260
259
  }
261
260
 
262
261
  CompressionFunction FixedSizeUncompressed::GetFunction(PhysicalType data_type) {
@@ -287,7 +286,7 @@ CompressionFunction FixedSizeUncompressed::GetFunction(PhysicalType data_type) {
287
286
  case PhysicalType::INTERVAL:
288
287
  return FixedSizeGetFunction<interval_t>(data_type);
289
288
  case PhysicalType::LIST:
290
- return FixedSizeGetFunction<list_entry_t>(data_type);
289
+ return FixedSizeGetFunction<uint64_t, ListFixedSizeAppend>(data_type);
291
290
  default:
292
291
  throw InternalException("Unsupported type for FixedSizeUncompressed::GetFunction");
293
292
  }
@@ -1,11 +1,10 @@
1
1
  #include "duckdb/function/compression/compression.hpp"
2
- #include "duckdb/storage/buffer_manager.hpp"
3
2
  #include "duckdb/common/types/vector.hpp"
4
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
5
- #include "duckdb/storage/statistics/validity_statistics.hpp"
3
+
6
4
  #include "duckdb/storage/table/column_segment.hpp"
7
5
  #include "duckdb/function/compression_function.hpp"
8
6
  #include "duckdb/storage/segment/uncompressed.hpp"
7
+ #include "duckdb/storage/table/scan_state.hpp"
9
8
 
10
9
  namespace duckdb {
11
10
 
@@ -20,8 +19,8 @@ unique_ptr<SegmentScanState> ConstantInitScan(ColumnSegment &segment) {
20
19
  // Scan Partial
21
20
  //===--------------------------------------------------------------------===//
22
21
  void ConstantFillFunctionValidity(ColumnSegment &segment, Vector &result, idx_t start_idx, idx_t count) {
23
- auto &validity = (ValidityStatistics &)*segment.stats.statistics;
24
- if (validity.has_null) {
22
+ auto &stats = segment.stats.statistics;
23
+ if (stats.CanHaveNull()) {
25
24
  auto &mask = FlatVector::Validity(result);
26
25
  for (idx_t i = 0; i < count; i++) {
27
26
  mask.SetInvalid(start_idx + i);
@@ -31,10 +30,10 @@ void ConstantFillFunctionValidity(ColumnSegment &segment, Vector &result, idx_t
31
30
 
32
31
  template <class T>
33
32
  void ConstantFillFunction(ColumnSegment &segment, Vector &result, idx_t start_idx, idx_t count) {
34
- auto &nstats = (NumericStatistics &)*segment.stats.statistics;
33
+ auto &nstats = segment.stats.statistics;
35
34
 
36
35
  auto data = FlatVector::GetData<T>(result);
37
- auto constant_value = nstats.min.GetValueUnsafe<T>();
36
+ auto constant_value = NumericStats::GetMin<T>(nstats);
38
37
  for (idx_t i = 0; i < count; i++) {
39
38
  data[start_idx + i] = constant_value;
40
39
  }
@@ -55,8 +54,8 @@ void ConstantScanPartial(ColumnSegment &segment, ColumnScanState &state, idx_t s
55
54
  // Scan base data
56
55
  //===--------------------------------------------------------------------===//
57
56
  void ConstantScanFunctionValidity(ColumnSegment &segment, ColumnScanState &state, idx_t scan_count, Vector &result) {
58
- auto &validity = (ValidityStatistics &)*segment.stats.statistics;
59
- if (validity.has_null) {
57
+ auto &stats = segment.stats.statistics;
58
+ if (stats.CanHaveNull()) {
60
59
  if (result.GetVectorType() == VectorType::CONSTANT_VECTOR) {
61
60
  result.SetVectorType(VectorType::CONSTANT_VECTOR);
62
61
  ConstantVector::SetNull(result, true);
@@ -69,10 +68,10 @@ void ConstantScanFunctionValidity(ColumnSegment &segment, ColumnScanState &state
69
68
 
70
69
  template <class T>
71
70
  void ConstantScanFunction(ColumnSegment &segment, ColumnScanState &state, idx_t scan_count, Vector &result) {
72
- auto &nstats = (NumericStatistics &)*segment.stats.statistics;
71
+ auto &nstats = segment.stats.statistics;
73
72
 
74
73
  auto data = FlatVector::GetData<T>(result);
75
- data[0] = nstats.min.GetValueUnsafe<T>();
74
+ data[0] = NumericStats::GetMin<T>(nstats);
76
75
  result.SetVectorType(VectorType::CONSTANT_VECTOR);
77
76
  }
78
77
 
@@ -10,7 +10,7 @@
10
10
  #include "duckdb/function/compression_function.hpp"
11
11
  #include "duckdb/main/config.hpp"
12
12
  #include "duckdb/storage/buffer_manager.hpp"
13
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
13
+
14
14
  #include "duckdb/storage/table/column_data_checkpointer.hpp"
15
15
  #include "duckdb/storage/table/column_segment.hpp"
16
16
  #include "duckdb/common/operator/subtract.hpp"
@@ -1,11 +1,12 @@
1
1
  #include "duckdb/function/compression/compression.hpp"
2
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
2
+
3
3
  #include "duckdb/storage/table/column_segment.hpp"
4
4
  #include "duckdb/function/compression_function.hpp"
5
5
  #include "duckdb/main/config.hpp"
6
6
  #include "duckdb/storage/table/column_data_checkpointer.hpp"
7
7
  #include "duckdb/storage/buffer_manager.hpp"
8
8
  #include "duckdb/common/types/null_value.hpp"
9
+ #include "duckdb/storage/table/scan_state.hpp"
9
10
  #include <functional>
10
11
 
11
12
  namespace duckdb {
@@ -118,12 +119,12 @@ struct RLEConstants {
118
119
  static constexpr const idx_t RLE_HEADER_SIZE = sizeof(uint64_t);
119
120
  };
120
121
 
121
- template <class T>
122
+ template <class T, bool WRITE_STATISTICS>
122
123
  struct RLECompressState : public CompressionState {
123
124
  struct RLEWriter {
124
125
  template <class VALUE_TYPE>
125
126
  static void Operation(VALUE_TYPE value, rle_count_t count, void *dataptr, bool is_null) {
126
- auto state = (RLECompressState<T> *)dataptr;
127
+ auto state = (RLECompressState<T, WRITE_STATISTICS> *)dataptr;
127
128
  state->WriteValue(value, count, is_null);
128
129
  }
129
130
  };
@@ -160,7 +161,7 @@ struct RLECompressState : public CompressionState {
160
161
  auto data = (T *)vdata.data;
161
162
  for (idx_t i = 0; i < count; i++) {
162
163
  auto idx = vdata.sel->get_index(i);
163
- state.template Update<RLECompressState<T>::RLEWriter>(data, vdata.validity, idx);
164
+ state.template Update<RLECompressState<T, WRITE_STATISTICS>::RLEWriter>(data, vdata.validity, idx);
164
165
  }
165
166
  }
166
167
 
@@ -174,8 +175,8 @@ struct RLECompressState : public CompressionState {
174
175
  entry_count++;
175
176
 
176
177
  // update meta data
177
- if (!is_null) {
178
- NumericStatistics::Update<T>(current_segment->stats, value);
178
+ if (WRITE_STATISTICS && !is_null) {
179
+ NumericStats::Update<T>(current_segment->stats.statistics, value);
179
180
  }
180
181
  current_segment->count += count;
181
182
 
@@ -206,7 +207,7 @@ struct RLECompressState : public CompressionState {
206
207
  }
207
208
 
208
209
  void Finalize() {
209
- state.template Flush<RLECompressState<T>::RLEWriter>();
210
+ state.template Flush<RLECompressState<T, WRITE_STATISTICS>::RLEWriter>();
210
211
 
211
212
  FlushSegment();
212
213
  current_segment.reset();
@@ -222,23 +223,23 @@ struct RLECompressState : public CompressionState {
222
223
  idx_t max_rle_count;
223
224
  };
224
225
 
225
- template <class T>
226
+ template <class T, bool WRITE_STATISTICS>
226
227
  unique_ptr<CompressionState> RLEInitCompression(ColumnDataCheckpointer &checkpointer, unique_ptr<AnalyzeState> state) {
227
- return make_unique<RLECompressState<T>>(checkpointer);
228
+ return make_unique<RLECompressState<T, WRITE_STATISTICS>>(checkpointer);
228
229
  }
229
230
 
230
- template <class T>
231
+ template <class T, bool WRITE_STATISTICS>
231
232
  void RLECompress(CompressionState &state_p, Vector &scan_vector, idx_t count) {
232
- auto &state = (RLECompressState<T> &)state_p;
233
+ auto &state = (RLECompressState<T, WRITE_STATISTICS> &)state_p;
233
234
  UnifiedVectorFormat vdata;
234
235
  scan_vector.ToUnifiedFormat(count, vdata);
235
236
 
236
237
  state.Append(vdata, count);
237
238
  }
238
239
 
239
- template <class T>
240
+ template <class T, bool WRITE_STATISTICS>
240
241
  void RLEFinalizeCompress(CompressionState &state_p) {
241
- auto &state = (RLECompressState<T> &)state_p;
242
+ auto &state = (RLECompressState<T, WRITE_STATISTICS> &)state_p;
242
243
  state.Finalize();
243
244
  }
244
245
 
@@ -341,10 +342,11 @@ void RLEFetchRow(ColumnSegment &segment, ColumnFetchState &state, row_t row_id,
341
342
  //===--------------------------------------------------------------------===//
342
343
  // Get Function
343
344
  //===--------------------------------------------------------------------===//
344
- template <class T>
345
+ template <class T, bool WRITE_STATISTICS = true>
345
346
  CompressionFunction GetRLEFunction(PhysicalType data_type) {
346
347
  return CompressionFunction(CompressionType::COMPRESSION_RLE, data_type, RLEInitAnalyze<T>, RLEAnalyze<T>,
347
- RLEFinalAnalyze<T>, RLEInitCompression<T>, RLECompress<T>, RLEFinalizeCompress<T>,
348
+ RLEFinalAnalyze<T>, RLEInitCompression<T, WRITE_STATISTICS>,
349
+ RLECompress<T, WRITE_STATISTICS>, RLEFinalizeCompress<T, WRITE_STATISTICS>,
348
350
  RLEInitScan<T>, RLEScan<T>, RLEScanPartial<T>, RLEFetchRow<T>, RLESkip<T>);
349
351
  }
350
352
 
@@ -373,6 +375,8 @@ CompressionFunction RLEFun::GetFunction(PhysicalType type) {
373
375
  return GetRLEFunction<float>(type);
374
376
  case PhysicalType::DOUBLE:
375
377
  return GetRLEFunction<double>(type);
378
+ case PhysicalType::LIST:
379
+ return GetRLEFunction<uint64_t, false>(type);
376
380
  default:
377
381
  throw InternalException("Unsupported type for RLE");
378
382
  }
@@ -392,6 +396,7 @@ bool RLEFun::TypeIsSupported(PhysicalType type) {
392
396
  case PhysicalType::UINT64:
393
397
  case PhysicalType::FLOAT:
394
398
  case PhysicalType::DOUBLE:
399
+ case PhysicalType::LIST:
395
400
  return true;
396
401
  default:
397
402
  return false;
@@ -2,11 +2,11 @@
2
2
  #include "duckdb/storage/buffer_manager.hpp"
3
3
  #include "duckdb/common/types/vector.hpp"
4
4
  #include "duckdb/storage/table/append_state.hpp"
5
- #include "duckdb/storage/statistics/validity_statistics.hpp"
5
+
6
6
  #include "duckdb/common/types/null_value.hpp"
7
7
  #include "duckdb/storage/table/column_segment.hpp"
8
8
  #include "duckdb/function/compression_function.hpp"
9
- #include "duckdb/main/config.hpp"
9
+ #include "duckdb/storage/table/scan_state.hpp"
10
10
 
11
11
  namespace duckdb {
12
12
 
@@ -410,14 +410,14 @@ unique_ptr<CompressedSegmentState> ValidityInitSegment(ColumnSegment &segment, b
410
410
  idx_t ValidityAppend(CompressionAppendState &append_state, ColumnSegment &segment, SegmentStatistics &stats,
411
411
  UnifiedVectorFormat &data, idx_t offset, idx_t vcount) {
412
412
  D_ASSERT(segment.GetBlockOffset() == 0);
413
- auto &validity_stats = (ValidityStatistics &)*stats.statistics;
413
+ auto &validity_stats = stats.statistics;
414
414
 
415
415
  auto max_tuples = segment.SegmentSize() / ValidityMask::STANDARD_MASK_SIZE * STANDARD_VECTOR_SIZE;
416
416
  idx_t append_count = MinValue<idx_t>(vcount, max_tuples - segment.count);
417
417
  if (data.validity.AllValid()) {
418
418
  // no null values: skip append
419
419
  segment.count += append_count;
420
- validity_stats.has_no_null = true;
420
+ validity_stats.SetHasNoNull();
421
421
  return append_count;
422
422
  }
423
423
 
@@ -426,9 +426,9 @@ idx_t ValidityAppend(CompressionAppendState &append_state, ColumnSegment &segmen
426
426
  auto idx = data.sel->get_index(offset + i);
427
427
  if (!data.validity.RowIsValidUnsafe(idx)) {
428
428
  mask.SetInvalidUnsafe(segment.count + i);
429
- validity_stats.has_null = true;
429
+ validity_stats.SetHasNull();
430
430
  } else {
431
- validity_stats.has_no_null = true;
431
+ validity_stats.SetHasNoNull();
432
432
  }
433
433
  }
434
434
  segment.count += append_count;
@@ -5,7 +5,6 @@
5
5
  #include "duckdb/common/exception.hpp"
6
6
  #include "duckdb/common/helper.hpp"
7
7
  #include "duckdb/common/vector_operations/vector_operations.hpp"
8
- #include "duckdb/common/sort/sort.hpp"
9
8
  #include "duckdb/execution/expression_executor.hpp"
10
9
  #include "duckdb/main/client_context.hpp"
11
10
  #include "duckdb/parser/constraints/list.hpp"
@@ -23,6 +22,8 @@
23
22
  #include "duckdb/main/attached_database.hpp"
24
23
  #include "duckdb/common/types/conflict_manager.hpp"
25
24
  #include "duckdb/common/types/constraint_conflict_info.hpp"
25
+ #include "duckdb/storage/table/append_state.hpp"
26
+ #include "duckdb/storage/table/scan_state.hpp"
26
27
 
27
28
  namespace duckdb {
28
29
 
@@ -45,7 +46,7 @@ DataTable::DataTable(AttachedDatabase &db, shared_ptr<TableIOManager> table_io_m
45
46
  auto types = GetTypes();
46
47
  this->row_groups =
47
48
  make_shared<RowGroupCollection>(info, TableIOManager::Get(*this).GetBlockManagerForRowData(), types, 0);
48
- if (data && !data->row_groups.empty()) {
49
+ if (data && data->row_group_count > 0) {
49
50
  this->row_groups->Initialize(*data);
50
51
  } else {
51
52
  this->row_groups->InitializeEmpty();
@@ -728,8 +729,7 @@ void DataTable::ScanTableSegment(idx_t row_start, idx_t count, const std::functi
728
729
  CreateIndexScanState state;
729
730
 
730
731
  InitializeScanWithOffset(state, column_ids, row_start, row_start + count);
731
- auto row_start_aligned = state.table_state.row_group_state.row_group->start +
732
- state.table_state.row_group_state.vector_index * STANDARD_VECTOR_SIZE;
732
+ auto row_start_aligned = state.table_state.row_group->start + state.table_state.vector_index * STANDARD_VECTOR_SIZE;
733
733
 
734
734
  idx_t current_row = row_start_aligned;
735
735
  while (current_row < end) {
@@ -819,9 +819,10 @@ void DataTable::RevertAppend(idx_t start_row, idx_t count) {
819
819
  //===--------------------------------------------------------------------===//
820
820
  // Indexes
821
821
  //===--------------------------------------------------------------------===//
822
- bool DataTable::AppendToIndexes(TableIndexList &indexes, DataChunk &chunk, row_t row_start) {
822
+ PreservedError DataTable::AppendToIndexes(TableIndexList &indexes, DataChunk &chunk, row_t row_start) {
823
+ PreservedError error;
823
824
  if (indexes.Empty()) {
824
- return true;
825
+ return error;
825
826
  }
826
827
  // first generate the vector of row identifiers
827
828
  Vector row_identifiers(LogicalType::ROW_TYPE);
@@ -832,11 +833,13 @@ bool DataTable::AppendToIndexes(TableIndexList &indexes, DataChunk &chunk, row_t
832
833
  // now append the entries to the indices
833
834
  indexes.Scan([&](Index &index) {
834
835
  try {
835
- if (!index.Append(chunk, row_identifiers)) {
836
- append_failed = true;
837
- return true;
838
- }
839
- } catch (...) {
836
+ error = index.Append(chunk, row_identifiers);
837
+ } catch (Exception &ex) {
838
+ error = PreservedError(ex);
839
+ } catch (std::exception &ex) {
840
+ error = PreservedError(ex);
841
+ }
842
+ if (error) {
840
843
  append_failed = true;
841
844
  return true;
842
845
  }
@@ -850,12 +853,11 @@ bool DataTable::AppendToIndexes(TableIndexList &indexes, DataChunk &chunk, row_t
850
853
  for (auto *index : already_appended) {
851
854
  index->Delete(chunk, row_identifiers);
852
855
  }
853
- return false;
854
856
  }
855
- return true;
857
+ return error;
856
858
  }
857
859
 
858
- bool DataTable::AppendToIndexes(DataChunk &chunk, row_t row_start) {
860
+ PreservedError DataTable::AppendToIndexes(DataChunk &chunk, row_t row_start) {
859
861
  D_ASSERT(is_root);
860
862
  return AppendToIndexes(info->indexes, chunk, row_start);
861
863
  }
@@ -1204,9 +1206,9 @@ void DataTable::WALAddIndex(ClientContext &context, unique_ptr<Index> index,
1204
1206
  index->ExecuteExpressions(intermediate, result);
1205
1207
 
1206
1208
  // insert into the index
1207
- if (!index->Insert(lock, result, intermediate.data[intermediate.ColumnCount() - 1])) {
1208
- throw InternalException("Error during WAL replay. Can't create unique index, table contains "
1209
- "duplicate data on indexed column(s).");
1209
+ auto error = index->Insert(lock, result, intermediate.data[intermediate.ColumnCount() - 1]);
1210
+ if (error) {
1211
+ throw InternalException("Error during WAL replay: %s", error.Message());
1210
1212
  }
1211
1213
  }
1212
1214
  }
@@ -1223,9 +1225,9 @@ unique_ptr<BaseStatistics> DataTable::GetStatistics(ClientContext &context, colu
1223
1225
  return row_groups->CopyStats(column_id);
1224
1226
  }
1225
1227
 
1226
- void DataTable::SetStatistics(column_t column_id, const std::function<void(BaseStatistics &)> &set_fun) {
1228
+ void DataTable::SetDistinct(column_t column_id, unique_ptr<DistinctStatistics> distinct_stats) {
1227
1229
  D_ASSERT(column_id != COLUMN_IDENTIFIER_ROW_ID);
1228
- row_groups->SetStatistics(column_id, set_fun);
1230
+ row_groups->SetDistinct(column_id, std::move(distinct_stats));
1229
1231
  }
1230
1232
 
1231
1233
  //===--------------------------------------------------------------------===//
@@ -1234,10 +1236,8 @@ void DataTable::SetStatistics(column_t column_id, const std::function<void(BaseS
1234
1236
  void DataTable::Checkpoint(TableDataWriter &writer) {
1235
1237
  // checkpoint each individual row group
1236
1238
  // FIXME: we might want to combine adjacent row groups in case they have had deletions...
1237
- vector<unique_ptr<BaseStatistics>> global_stats;
1238
- for (idx_t i = 0; i < column_definitions.size(); i++) {
1239
- global_stats.push_back(row_groups->CopyStats(i));
1240
- }
1239
+ TableStatistics global_stats;
1240
+ row_groups->CopyStats(global_stats);
1241
1241
 
1242
1242
  row_groups->Checkpoint(writer, global_stats);
1243
1243
 
@@ -36,7 +36,7 @@ void Index::InitializeLock(IndexLock &state) {
36
36
  state.index_lock = unique_lock<mutex>(lock);
37
37
  }
38
38
 
39
- bool Index::Append(DataChunk &entries, Vector &row_identifiers) {
39
+ PreservedError Index::Append(DataChunk &entries, Vector &row_identifiers) {
40
40
  IndexLock state;
41
41
  InitializeLock(state);
42
42
  return Append(state, entries, row_identifiers);
@@ -90,4 +90,15 @@ BlockPointer Index::Serialize(MetaBlockWriter &writer) {
90
90
  throw NotImplementedException("The implementation of this index serialization does not exist.");
91
91
  }
92
92
 
93
+ string Index::AppendRowError(DataChunk &input, idx_t index) {
94
+ string error;
95
+ for (idx_t c = 0; c < input.ColumnCount(); c++) {
96
+ if (c > 0) {
97
+ error += ", ";
98
+ }
99
+ error += input.GetValue(c, index).ToString();
100
+ }
101
+ return error;
102
+ }
103
+
93
104
  } // namespace duckdb
@@ -11,6 +11,7 @@
11
11
  #include "duckdb/storage/table/column_checkpoint_state.hpp"
12
12
  #include "duckdb/storage/table/column_segment.hpp"
13
13
  #include "duckdb/storage/table_io_manager.hpp"
14
+ #include "duckdb/storage/table/scan_state.hpp"
14
15
 
15
16
  namespace duckdb {
16
17
 
@@ -197,16 +198,16 @@ void LocalTableStorage::FlushToDisk() {
197
198
  optimistic_writer.FinalFlush();
198
199
  }
199
200
 
200
- bool LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, RowGroupCollection &source,
201
- TableIndexList &index_list, const vector<LogicalType> &table_types,
202
- row_t &start_row) {
201
+ PreservedError LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, RowGroupCollection &source,
202
+ TableIndexList &index_list, const vector<LogicalType> &table_types,
203
+ row_t &start_row) {
203
204
  // only need to scan for index append
204
205
  // figure out which columns we need to scan for the set of indexes
205
206
  auto columns = index_list.GetRequiredColumns();
206
207
  // create an empty mock chunk that contains all the correct types for the table
207
208
  DataChunk mock_chunk;
208
209
  mock_chunk.InitializeEmpty(table_types);
209
- bool success = true;
210
+ PreservedError error;
210
211
  source.Scan(transaction, columns, [&](DataChunk &chunk) -> bool {
211
212
  // construct the mock chunk by referencing the required columns
212
213
  for (idx_t i = 0; i < columns.size(); i++) {
@@ -214,28 +215,28 @@ bool LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, RowGroupCo
214
215
  }
215
216
  mock_chunk.SetCardinality(chunk);
216
217
  // append this chunk to the indexes of the table
217
- if (!DataTable::AppendToIndexes(index_list, mock_chunk, start_row)) {
218
- success = false;
218
+ error = DataTable::AppendToIndexes(index_list, mock_chunk, start_row);
219
+ if (error) {
219
220
  return false;
220
221
  }
221
222
  start_row += chunk.size();
222
223
  return true;
223
224
  });
224
- return success;
225
+ return error;
225
226
  }
226
227
 
227
228
  void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppendState &append_state,
228
229
  idx_t append_count, bool append_to_table) {
229
- bool constraint_violated = false;
230
230
  if (append_to_table) {
231
231
  table->InitializeAppend(transaction, append_state, append_count);
232
232
  }
233
+ PreservedError error;
233
234
  if (append_to_table) {
234
235
  // appending: need to scan entire
235
236
  row_groups->Scan(transaction, [&](DataChunk &chunk) -> bool {
236
237
  // append this chunk to the indexes of the table
237
- if (!table->AppendToIndexes(chunk, append_state.current_row)) {
238
- constraint_violated = true;
238
+ error = table->AppendToIndexes(chunk, append_state.current_row);
239
+ if (error) {
239
240
  return false;
240
241
  }
241
242
  // append to base table
@@ -243,11 +244,10 @@ void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppen
243
244
  return true;
244
245
  });
245
246
  } else {
246
- constraint_violated = !AppendToIndexes(transaction, *row_groups, table->info->indexes, table->GetTypes(),
247
- append_state.current_row);
247
+ error = AppendToIndexes(transaction, *row_groups, table->info->indexes, table->GetTypes(),
248
+ append_state.current_row);
248
249
  }
249
- if (constraint_violated) {
250
- PreservedError error;
250
+ if (error) {
251
251
  // need to revert the append
252
252
  row_t current_row = append_state.row_start;
253
253
  // remove the data from the indexes, if there are any indexes
@@ -273,10 +273,7 @@ void LocalTableStorage::AppendToIndexes(DuckTransaction &transaction, TableAppen
273
273
  if (append_to_table) {
274
274
  table->RevertAppendInternal(append_state.row_start, append_count);
275
275
  }
276
- if (error) {
277
- error.Throw();
278
- }
279
- throw ConstraintException("PRIMARY KEY or UNIQUE constraint violated: duplicated key");
276
+ error.Throw();
280
277
  }
281
278
  }
282
279
 
@@ -359,6 +356,12 @@ LocalStorage::LocalStorage(ClientContext &context, DuckTransaction &transaction)
359
356
  : context(context), transaction(transaction) {
360
357
  }
361
358
 
359
+ LocalStorage::CommitState::CommitState() {
360
+ }
361
+
362
+ LocalStorage::CommitState::~CommitState() {
363
+ }
364
+
362
365
  LocalStorage &LocalStorage::Get(DuckTransaction &transaction) {
363
366
  return transaction.GetLocalStorage();
364
367
  }
@@ -412,8 +415,9 @@ void LocalStorage::Append(LocalAppendState &state, DataChunk &chunk) {
412
415
  // append to unique indices (if any)
413
416
  auto storage = state.storage;
414
417
  idx_t base_id = MAX_ROW_ID + storage->row_groups->GetTotalRows() + state.append_state.total_append_count;
415
- if (!DataTable::AppendToIndexes(storage->indexes, chunk, base_id)) {
416
- throw ConstraintException("PRIMARY KEY or UNIQUE constraint violated: duplicated key");
418
+ auto error = DataTable::AppendToIndexes(storage->indexes, chunk, base_id);
419
+ if (error) {
420
+ error.Throw();
417
421
  }
418
422
 
419
423
  //! Append the chunk to the local storage
@@ -434,9 +438,9 @@ void LocalStorage::LocalMerge(DataTable *table, RowGroupCollection &collection)
434
438
  if (!storage->indexes.Empty()) {
435
439
  // append data to indexes if required
436
440
  row_t base_id = MAX_ROW_ID + storage->row_groups->GetTotalRows();
437
- bool success = storage->AppendToIndexes(transaction, collection, storage->indexes, table->GetTypes(), base_id);
438
- if (!success) {
439
- throw ConstraintException("PRIMARY KEY or UNIQUE constraint violated: duplicated key");
441
+ auto error = storage->AppendToIndexes(transaction, collection, storage->indexes, table->GetTypes(), base_id);
442
+ if (error) {
443
+ error.Throw();
440
444
  }
441
445
  }
442
446
  storage->row_groups->MergeStorage(collection);