duckdb 0.7.2-dev0.0 → 0.7.2-dev1138.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 (625) 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 +12 -2
  28. package/src/duckdb/extension/parquet/parquet_reader.cpp +1 -1
  29. package/src/duckdb/extension/parquet/parquet_statistics.cpp +26 -32
  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/operator/cast_operators.cpp +1 -1
  53. package/src/duckdb/src/common/preserved_error.cpp +7 -5
  54. package/src/duckdb/src/common/progress_bar/progress_bar.cpp +7 -0
  55. package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
  56. package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
  57. package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
  58. package/src/duckdb/src/common/sort/comparators.cpp +14 -5
  59. package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
  60. package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
  61. package/src/duckdb/src/common/string_util.cpp +4 -1
  62. package/src/duckdb/src/common/types/bit.cpp +166 -87
  63. package/src/duckdb/src/common/types/blob.cpp +1 -1
  64. package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
  65. package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
  66. package/src/duckdb/src/common/types/column_data_collection_segment.cpp +11 -6
  67. package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
  68. package/src/duckdb/src/common/types/interval.cpp +0 -41
  69. package/src/duckdb/src/common/types/list_segment.cpp +658 -0
  70. package/src/duckdb/src/common/types/string_heap.cpp +1 -1
  71. package/src/duckdb/src/common/types/string_type.cpp +1 -1
  72. package/src/duckdb/src/common/types/time.cpp +13 -0
  73. package/src/duckdb/src/common/types/value.cpp +320 -154
  74. package/src/duckdb/src/common/types/vector.cpp +156 -128
  75. package/src/duckdb/src/common/types.cpp +313 -153
  76. package/src/duckdb/src/common/value_operations/comparison_operations.cpp +14 -22
  77. package/src/duckdb/src/common/vector_operations/comparison_operators.cpp +10 -10
  78. package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +11 -10
  79. package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
  80. package/src/duckdb/src/execution/aggregate_hashtable.cpp +10 -5
  81. package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
  82. package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
  83. package/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +2 -2
  84. package/src/duckdb/src/execution/index/art/art.cpp +19 -5
  85. package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +1 -1
  86. package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
  87. package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
  88. package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
  89. package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
  90. package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
  91. package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +2 -0
  92. package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
  93. package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +13 -4
  94. package/src/duckdb/src/execution/operator/join/physical_join.cpp +0 -3
  95. package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
  96. package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
  97. package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +11 -4
  98. package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +24 -19
  99. package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +3 -0
  100. package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +2 -1
  101. package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
  102. package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +1 -3
  103. package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -0
  104. package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
  105. package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
  106. package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
  107. package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +0 -4
  108. package/src/duckdb/src/execution/partitionable_hashtable.cpp +14 -2
  109. package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +22 -16
  110. package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
  111. package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
  112. package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +2 -1
  113. package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
  114. package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
  115. package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
  116. package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +1 -0
  117. package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
  118. package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
  119. package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
  120. package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
  121. package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
  122. package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
  123. package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
  124. package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
  125. package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
  126. package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
  127. package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
  128. package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
  129. package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
  130. package/src/duckdb/src/function/aggregate/nested/list.cpp +6 -712
  131. package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +58 -16
  132. package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
  133. package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
  134. package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
  135. package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
  136. package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
  137. package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
  138. package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
  139. package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
  140. package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
  141. package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
  142. package/src/duckdb/src/function/function_binder.cpp +1 -8
  143. package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
  144. package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
  145. package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
  146. package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
  147. package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
  148. package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
  149. package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
  150. package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
  151. package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
  152. package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
  153. package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
  154. package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
  155. package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
  156. package/src/duckdb/src/function/scalar/list/list_sort.cpp +25 -18
  157. package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
  158. package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
  159. package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
  160. package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
  161. package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
  162. package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
  163. package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
  164. package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
  165. package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
  166. package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
  167. package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
  168. package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
  169. package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
  170. package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
  171. package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
  172. package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
  173. package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
  174. package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
  175. package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
  176. package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
  177. package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
  178. package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
  179. package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
  180. package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
  181. package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
  182. package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
  183. package/src/duckdb/src/function/table/arrow.cpp +5 -2
  184. package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
  185. package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
  186. package/src/duckdb/src/function/table/read_csv.cpp +60 -0
  187. package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
  188. package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
  189. package/src/duckdb/src/function/table/table_scan.cpp +9 -12
  190. package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
  191. package/src/duckdb/src/function/table_function.cpp +30 -11
  192. package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
  193. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
  194. package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
  195. package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
  196. package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
  197. package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
  198. package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
  199. package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
  200. package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
  201. package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
  202. package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
  203. package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
  204. package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
  205. package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
  206. package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
  207. package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
  208. package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
  209. package/src/duckdb/src/include/duckdb/common/helper.hpp +1 -1
  210. package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
  211. package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +45 -149
  212. package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
  213. package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
  214. package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
  215. package/src/duckdb/src/include/duckdb/common/progress_bar/progress_bar.hpp +2 -0
  216. package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
  217. package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
  218. package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
  219. package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
  220. package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
  221. package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
  222. package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
  223. package/src/duckdb/src/include/duckdb/common/string_util.hpp +25 -0
  224. package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
  225. package/src/duckdb/src/include/duckdb/common/types/interval.hpp +39 -3
  226. package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +70 -0
  227. package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +73 -3
  228. package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
  229. package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
  230. package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
  231. package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
  232. package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
  233. package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
  234. package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +1 -0
  235. package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +3 -14
  236. package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
  237. package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
  238. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
  239. package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +10 -0
  240. package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
  241. package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +3 -0
  242. package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
  243. package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
  244. package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
  245. package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
  246. package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
  247. package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
  248. package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
  249. package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
  250. package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
  251. package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
  252. package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
  253. package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
  254. package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
  255. package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
  256. package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
  257. package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
  258. package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
  259. package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
  260. package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
  261. package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
  262. package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
  263. package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
  264. package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
  265. package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
  266. package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
  267. package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
  268. package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
  269. package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
  270. package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
  271. package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
  272. package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
  273. package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
  274. package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
  275. package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
  276. package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
  277. package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
  278. package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
  279. package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
  280. package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
  281. package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
  282. package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
  283. package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
  284. package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -2
  285. package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
  286. package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
  287. package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
  288. package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
  289. package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
  290. package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
  291. package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
  292. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
  293. package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
  294. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
  295. package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
  296. package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
  297. package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
  298. package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
  299. package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
  300. package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
  301. package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
  302. package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
  303. package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
  304. package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
  305. package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
  306. package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
  307. package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
  308. package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
  309. package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
  310. package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
  311. package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
  312. package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
  313. package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
  314. package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
  315. package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
  316. package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
  317. package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
  318. package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
  319. package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
  320. package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
  321. package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
  322. package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
  323. package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
  324. package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
  325. package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
  326. package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
  327. package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
  328. package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
  329. package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
  330. package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
  331. package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
  332. package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
  333. package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
  334. package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
  335. package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
  336. package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
  337. package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
  338. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
  339. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
  340. package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -1
  341. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
  342. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
  343. package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +2 -1
  344. package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +4 -3
  345. package/src/duckdb/src/include/duckdb/storage/data_table.hpp +4 -3
  346. package/src/duckdb/src/include/duckdb/storage/index.hpp +5 -4
  347. package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
  348. package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
  349. package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
  350. package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
  351. package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
  352. package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
  353. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
  354. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
  355. package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
  356. package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
  357. package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
  358. package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
  359. package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
  360. package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +21 -7
  361. package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
  362. package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +5 -6
  363. package/src/duckdb/src/include/duckdb/storage/table/column_segment_tree.hpp +18 -0
  364. package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
  365. package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -3
  366. package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +41 -45
  367. package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +23 -7
  368. package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +35 -0
  369. package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +21 -29
  370. package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +6 -6
  371. package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +281 -26
  372. package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +0 -4
  373. package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
  374. package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
  375. package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
  376. package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +6 -3
  377. package/src/duckdb/src/include/duckdb.h +71 -2
  378. package/src/duckdb/src/include/duckdb.hpp +0 -1
  379. package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
  380. package/src/duckdb/src/main/capi/result-c.cpp +27 -1
  381. package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
  382. package/src/duckdb/src/main/capi/table_function-c.cpp +23 -0
  383. package/src/duckdb/src/main/client_context.cpp +38 -34
  384. package/src/duckdb/src/main/client_data.cpp +7 -6
  385. package/src/duckdb/src/main/config.cpp +70 -1
  386. package/src/duckdb/src/main/database.cpp +19 -2
  387. package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
  388. package/src/duckdb/src/main/prepared_statement.cpp +4 -0
  389. package/src/duckdb/src/main/query_profiler.cpp +17 -15
  390. package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
  391. package/src/duckdb/src/main/relation.cpp +3 -2
  392. package/src/duckdb/src/main/settings/settings.cpp +20 -8
  393. package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
  394. package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
  395. package/src/duckdb/src/optimizer/filter_combiner.cpp +3 -6
  396. package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
  397. package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
  398. package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +107 -71
  399. package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +32 -12
  400. package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
  401. package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
  402. package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
  403. package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
  404. package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
  405. package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
  406. package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
  407. package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
  408. package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
  409. package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
  410. package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
  411. package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
  412. package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
  413. package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
  414. package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
  415. package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
  416. package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
  417. package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
  418. package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
  419. package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
  420. package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
  421. package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
  422. package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
  423. package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
  424. package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
  425. package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
  426. package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
  427. package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -7
  428. package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
  429. package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
  430. package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
  431. package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
  432. package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
  433. package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
  434. package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
  435. package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
  436. package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
  437. package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
  438. package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
  439. package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
  440. package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
  441. package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
  442. package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
  443. package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
  444. package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
  445. package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
  446. package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
  447. package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
  448. package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
  449. package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
  450. package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
  451. package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
  452. package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
  453. package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
  454. package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
  455. package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
  456. package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
  457. package/src/duckdb/src/parser/query_node.cpp +51 -1
  458. package/src/duckdb/src/parser/result_modifier.cpp +78 -0
  459. package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
  460. package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
  461. package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
  462. package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
  463. package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
  464. package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
  465. package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
  466. package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
  467. package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
  468. package/src/duckdb/src/parser/tableref.cpp +49 -0
  469. package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
  470. package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
  471. package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
  472. package/src/duckdb/src/parser/transform/expression/transform_function.cpp +85 -42
  473. package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
  474. package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
  475. package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
  476. package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
  477. package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
  478. package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
  479. package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
  480. package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
  481. package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
  482. package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
  483. package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
  484. package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
  485. package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
  486. package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
  487. package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
  488. package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
  489. package/src/duckdb/src/parser/transformer.cpp +15 -3
  490. package/src/duckdb/src/planner/bind_context.cpp +18 -25
  491. package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
  492. package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
  493. package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
  494. package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
  495. package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
  496. package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
  497. package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
  498. package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
  499. package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
  500. package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
  501. package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
  502. package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
  503. package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
  504. package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +10 -1
  505. package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
  506. package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
  507. package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
  508. package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
  509. package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
  510. package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
  511. package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
  512. package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
  513. package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
  514. package/src/duckdb/src/planner/binder.cpp +19 -24
  515. package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
  516. package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
  517. package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
  518. package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
  519. package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
  520. package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
  521. package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
  522. package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
  523. package/src/duckdb/src/planner/expression_binder.cpp +10 -3
  524. package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
  525. package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
  526. package/src/duckdb/src/planner/logical_operator.cpp +7 -2
  527. package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
  528. package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
  529. package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
  530. package/src/duckdb/src/planner/planner.cpp +2 -1
  531. package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
  532. package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
  533. package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
  534. package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
  535. package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
  536. package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
  537. package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
  538. package/src/duckdb/src/storage/compression/bitpacking.cpp +29 -25
  539. package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +45 -46
  540. package/src/duckdb/src/storage/compression/numeric_constant.cpp +10 -11
  541. package/src/duckdb/src/storage/compression/patas.cpp +1 -1
  542. package/src/duckdb/src/storage/compression/rle.cpp +20 -15
  543. package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +6 -6
  544. package/src/duckdb/src/storage/data_table.cpp +23 -23
  545. package/src/duckdb/src/storage/index.cpp +12 -1
  546. package/src/duckdb/src/storage/local_storage.cpp +27 -23
  547. package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
  548. package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
  549. package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
  550. package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
  551. package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
  552. package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
  553. package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
  554. package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
  555. package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
  556. package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
  557. package/src/duckdb/src/storage/storage_info.cpp +2 -2
  558. package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
  559. package/src/duckdb/src/storage/table/column_data.cpp +118 -62
  560. package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +10 -9
  561. package/src/duckdb/src/storage/table/column_segment.cpp +30 -45
  562. package/src/duckdb/src/storage/table/list_column_data.cpp +50 -71
  563. package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
  564. package/src/duckdb/src/storage/table/row_group.cpp +213 -143
  565. package/src/duckdb/src/storage/table/row_group_collection.cpp +151 -105
  566. package/src/duckdb/src/storage/table/scan_state.cpp +45 -33
  567. package/src/duckdb/src/storage/table/standard_column_data.cpp +11 -12
  568. package/src/duckdb/src/storage/table/struct_column_data.cpp +27 -34
  569. package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
  570. package/src/duckdb/src/storage/table/update_segment.cpp +23 -18
  571. package/src/duckdb/src/storage/wal_replay.cpp +8 -5
  572. package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
  573. package/src/duckdb/src/transaction/commit_state.cpp +11 -7
  574. package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
  575. package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
  576. package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
  577. package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
  578. package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
  579. package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
  580. package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
  581. package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
  582. package/src/duckdb/third_party/re2/re2/re2.h +2 -0
  583. package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
  584. package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
  585. package/src/duckdb/ub_src_common_serializer.cpp +2 -0
  586. package/src/duckdb/ub_src_common_types.cpp +2 -0
  587. package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
  588. package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
  589. package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
  590. package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
  591. package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
  592. package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
  593. package/src/duckdb/ub_src_main_capi.cpp +2 -0
  594. package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
  595. package/src/duckdb/ub_src_parser.cpp +2 -0
  596. package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
  597. package/src/duckdb/ub_src_parser_statement.cpp +2 -0
  598. package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
  599. package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
  600. package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
  601. package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
  602. package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
  603. package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
  604. package/src/duckdb/ub_src_planner_operator.cpp +2 -0
  605. package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
  606. package/src/duckdb/ub_src_storage_table.cpp +0 -2
  607. package/src/duckdb_node.hpp +2 -1
  608. package/src/statement.cpp +5 -5
  609. package/src/utils.cpp +27 -2
  610. package/test/extension.test.ts +44 -26
  611. package/test/syntax_error.test.ts +3 -1
  612. package/filelist.cache +0 -0
  613. package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
  614. package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
  615. package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
  616. package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
  617. package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
  618. package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
  619. package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
  620. package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
  621. package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
  622. package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
  623. package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
  624. package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
  625. package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
@@ -1,21 +1,23 @@
1
1
  #include "duckdb/main/query_profiler.hpp"
2
- #include "duckdb/common/to_string.hpp"
2
+
3
3
  #include "duckdb/common/fstream.hpp"
4
+ #include "duckdb/common/http_state.hpp"
5
+ #include "duckdb/common/limits.hpp"
4
6
  #include "duckdb/common/printer.hpp"
5
7
  #include "duckdb/common/string_util.hpp"
6
- #include "duckdb/execution/physical_operator.hpp"
7
- #include "duckdb/execution/operator/join/physical_delim_join.hpp"
8
- #include "duckdb/execution/operator/helper/physical_execute.hpp"
9
- #include "duckdb/common/http_stats.hpp"
8
+ #include "duckdb/common/to_string.hpp"
10
9
  #include "duckdb/common/tree_renderer.hpp"
11
- #include "duckdb/common/limits.hpp"
12
10
  #include "duckdb/execution/expression_executor.hpp"
13
- #include "duckdb/planner/expression/bound_function_expression.hpp"
11
+ #include "duckdb/execution/operator/helper/physical_execute.hpp"
12
+ #include "duckdb/execution/operator/join/physical_delim_join.hpp"
13
+ #include "duckdb/execution/physical_operator.hpp"
14
14
  #include "duckdb/main/client_config.hpp"
15
15
  #include "duckdb/main/client_context.hpp"
16
16
  #include "duckdb/main/client_data.hpp"
17
- #include <utility>
17
+ #include "duckdb/planner/expression/bound_function_expression.hpp"
18
+
18
19
  #include <algorithm>
20
+ #include <utility>
19
21
 
20
22
  namespace duckdb {
21
23
 
@@ -377,15 +379,15 @@ void QueryProfiler::QueryTreeToStream(std::ostream &ss) const {
377
379
  return;
378
380
  }
379
381
 
380
- if (context.client_data->http_stats && !context.client_data->http_stats->IsEmpty()) {
382
+ if (context.client_data->http_state && !context.client_data->http_state->IsEmpty()) {
381
383
  string read =
382
- "in: " + StringUtil::BytesToHumanReadableString(context.client_data->http_stats->total_bytes_received);
384
+ "in: " + StringUtil::BytesToHumanReadableString(context.client_data->http_state->total_bytes_received);
383
385
  string written =
384
- "out: " + StringUtil::BytesToHumanReadableString(context.client_data->http_stats->total_bytes_sent);
385
- string head = "#HEAD: " + to_string(context.client_data->http_stats->head_count);
386
- string get = "#GET: " + to_string(context.client_data->http_stats->get_count);
387
- string put = "#PUT: " + to_string(context.client_data->http_stats->put_count);
388
- string post = "#POST: " + to_string(context.client_data->http_stats->post_count);
386
+ "out: " + StringUtil::BytesToHumanReadableString(context.client_data->http_state->total_bytes_sent);
387
+ string head = "#HEAD: " + to_string(context.client_data->http_state->head_count);
388
+ string get = "#GET: " + to_string(context.client_data->http_state->get_count);
389
+ string put = "#PUT: " + to_string(context.client_data->http_state->put_count);
390
+ string post = "#POST: " + to_string(context.client_data->http_state->post_count);
389
391
 
390
392
  constexpr idx_t TOTAL_BOX_WIDTH = 39;
391
393
  ss << "┌─────────────────────────────────────┐\n";
@@ -7,15 +7,15 @@
7
7
 
8
8
  namespace duckdb {
9
9
 
10
- ExplainRelation::ExplainRelation(shared_ptr<Relation> child_p)
11
- : Relation(child_p->context, RelationType::EXPLAIN_RELATION), child(std::move(child_p)) {
10
+ ExplainRelation::ExplainRelation(shared_ptr<Relation> child_p, ExplainType type)
11
+ : Relation(child_p->context, RelationType::EXPLAIN_RELATION), child(std::move(child_p)), type(type) {
12
12
  context.GetContext()->TryBindRelation(*this, this->columns);
13
13
  }
14
14
 
15
15
  BoundStatement ExplainRelation::Bind(Binder &binder) {
16
16
  auto select = make_unique<SelectStatement>();
17
17
  select->node = child->GetQueryNode();
18
- ExplainStatement explain(std::move(select));
18
+ ExplainStatement explain(std::move(select), type);
19
19
  return binder.Bind((SQLStatement &)explain);
20
20
  }
21
21
 
@@ -25,6 +25,7 @@
25
25
  #include "duckdb/parser/expression/columnref_expression.hpp"
26
26
  #include "duckdb/main/relation/join_relation.hpp"
27
27
  #include "duckdb/main/relation/value_relation.hpp"
28
+ #include "duckdb/parser/statement/explain_statement.hpp"
28
29
 
29
30
  namespace duckdb {
30
31
 
@@ -303,8 +304,8 @@ unique_ptr<QueryResult> Relation::Query(const string &name, const string &sql) {
303
304
  return Query(sql);
304
305
  }
305
306
 
306
- unique_ptr<QueryResult> Relation::Explain() {
307
- auto explain = make_shared<ExplainRelation>(shared_from_this());
307
+ unique_ptr<QueryResult> Relation::Explain(ExplainType type) {
308
+ auto explain = make_shared<ExplainRelation>(shared_from_this(), type);
308
309
  return explain->Execute();
309
310
  }
310
311
 
@@ -454,11 +454,15 @@ Value CustomExtensionRepository::GetSetting(ClientContext &context) {
454
454
  //===--------------------------------------------------------------------===//
455
455
 
456
456
  void EnableProgressBarSetting::ResetLocal(ClientContext &context) {
457
- ClientConfig::GetConfig(context).enable_progress_bar = ClientConfig().enable_progress_bar;
457
+ auto &config = ClientConfig::GetConfig(context);
458
+ ProgressBar::SystemOverrideCheck(config);
459
+ config.enable_progress_bar = ClientConfig().enable_progress_bar;
458
460
  }
459
461
 
460
462
  void EnableProgressBarSetting::SetLocal(ClientContext &context, const Value &input) {
461
- ClientConfig::GetConfig(context).enable_progress_bar = input.GetValue<bool>();
463
+ auto &config = ClientConfig::GetConfig(context);
464
+ ProgressBar::SystemOverrideCheck(config);
465
+ config.enable_progress_bar = input.GetValue<bool>();
462
466
  }
463
467
 
464
468
  Value EnableProgressBarSetting::GetSetting(ClientContext &context) {
@@ -469,11 +473,15 @@ Value EnableProgressBarSetting::GetSetting(ClientContext &context) {
469
473
  // Enable Progress Bar Print
470
474
  //===--------------------------------------------------------------------===//
471
475
  void EnableProgressBarPrintSetting::SetLocal(ClientContext &context, const Value &input) {
472
- ClientConfig::GetConfig(context).print_progress_bar = input.GetValue<bool>();
476
+ auto &config = ClientConfig::GetConfig(context);
477
+ ProgressBar::SystemOverrideCheck(config);
478
+ config.print_progress_bar = input.GetValue<bool>();
473
479
  }
474
480
 
475
481
  void EnableProgressBarPrintSetting::ResetLocal(ClientContext &context) {
476
- ClientConfig::GetConfig(context).print_progress_bar = ClientConfig().print_progress_bar;
482
+ auto &config = ClientConfig::GetConfig(context);
483
+ ProgressBar::SystemOverrideCheck(config);
484
+ config.print_progress_bar = ClientConfig().print_progress_bar;
477
485
  }
478
486
 
479
487
  Value EnableProgressBarPrintSetting::GetSetting(ClientContext &context) {
@@ -878,13 +886,17 @@ Value ProfilingModeSetting::GetSetting(ClientContext &context) {
878
886
  //===--------------------------------------------------------------------===//
879
887
 
880
888
  void ProgressBarTimeSetting::ResetLocal(ClientContext &context) {
881
- ClientConfig::GetConfig(context).wait_time = ClientConfig().wait_time;
882
- ClientConfig::GetConfig(context).enable_progress_bar = ClientConfig().enable_progress_bar;
889
+ auto &config = ClientConfig::GetConfig(context);
890
+ ProgressBar::SystemOverrideCheck(config);
891
+ config.wait_time = ClientConfig().wait_time;
892
+ config.enable_progress_bar = ClientConfig().enable_progress_bar;
883
893
  }
884
894
 
885
895
  void ProgressBarTimeSetting::SetLocal(ClientContext &context, const Value &input) {
886
- ClientConfig::GetConfig(context).wait_time = input.GetValue<int32_t>();
887
- ClientConfig::GetConfig(context).enable_progress_bar = true;
896
+ auto &config = ClientConfig::GetConfig(context);
897
+ ProgressBar::SystemOverrideCheck(config);
898
+ config.wait_time = input.GetValue<int32_t>();
899
+ config.enable_progress_bar = true;
888
900
  }
889
901
 
890
902
  Value ProgressBarTimeSetting::GetSetting(ClientContext &context) {
@@ -57,6 +57,7 @@ void ColumnLifetimeAnalyzer::VisitOperator(LogicalOperator &op) {
57
57
  analyzer.VisitOperator(*op.children[0]);
58
58
  return;
59
59
  }
60
+ case LogicalOperatorType::LOGICAL_ASOF_JOIN:
60
61
  case LogicalOperatorType::LOGICAL_DELIM_JOIN:
61
62
  case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: {
62
63
  if (everything_referenced) {
@@ -424,7 +424,7 @@ bool Deliminator::RemoveInequalityCandidate(unique_ptr<LogicalOperator> *plan, u
424
424
  parent_expr =
425
425
  make_unique<BoundColumnRefExpression>(parent_expr->alias, parent_expr->return_type, it->first);
426
426
  parent_cond.comparison =
427
- parent_delim_get_side == 0 ? child_cond.comparison : FlipComparisionExpression(child_cond.comparison);
427
+ parent_delim_get_side == 0 ? child_cond.comparison : FlipComparisonExpression(child_cond.comparison);
428
428
  break;
429
429
  }
430
430
  }
@@ -2,21 +2,18 @@
2
2
 
3
3
  #include "duckdb/execution/expression_executor.hpp"
4
4
  #include "duckdb/planner/expression.hpp"
5
- #include "duckdb/planner/expression_iterator.hpp"
6
5
  #include "duckdb/planner/expression/bound_between_expression.hpp"
6
+ #include "duckdb/planner/expression/bound_cast_expression.hpp"
7
7
  #include "duckdb/planner/expression/bound_columnref_expression.hpp"
8
8
  #include "duckdb/planner/expression/bound_comparison_expression.hpp"
9
9
  #include "duckdb/planner/expression/bound_conjunction_expression.hpp"
10
10
  #include "duckdb/planner/expression/bound_constant_expression.hpp"
11
11
  #include "duckdb/planner/expression/bound_function_expression.hpp"
12
- #include "duckdb/planner/operator/logical_empty_result.hpp"
13
- #include "duckdb/planner/operator/logical_filter.hpp"
12
+ #include "duckdb/planner/expression/bound_operator_expression.hpp"
14
13
  #include "duckdb/planner/table_filter.hpp"
15
14
  #include "duckdb/planner/filter/constant_filter.hpp"
16
15
  #include "duckdb/planner/filter/null_filter.hpp"
17
16
  #include "duckdb/optimizer/optimizer.hpp"
18
- #include "duckdb/common/operator/cast_operators.hpp"
19
- #include "duckdb/planner/filter/conjunction_filter.hpp"
20
17
 
21
18
  namespace duckdb {
22
19
 
@@ -604,7 +601,7 @@ FilterResult FilterCombiner::AddBoundComparisonFilter(Expression *expr) {
604
601
 
605
602
  // create the ExpressionValueInformation
606
603
  ExpressionValueInformation info;
607
- info.comparison_type = left_is_scalar ? FlipComparisionExpression(comparison.type) : comparison.type;
604
+ info.comparison_type = left_is_scalar ? FlipComparisonExpression(comparison.type) : comparison.type;
608
605
  info.constant = constant_value;
609
606
 
610
607
  // get the current bucket of constant values
@@ -14,6 +14,7 @@ unique_ptr<LogicalOperator> FilterPullup::Rewrite(unique_ptr<LogicalOperator> op
14
14
  case LogicalOperatorType::LOGICAL_COMPARISON_JOIN:
15
15
  case LogicalOperatorType::LOGICAL_ANY_JOIN:
16
16
  case LogicalOperatorType::LOGICAL_DELIM_JOIN:
17
+ case LogicalOperatorType::LOGICAL_ASOF_JOIN:
17
18
  return PullupJoin(std::move(op));
18
19
  case LogicalOperatorType::LOGICAL_INTERSECT:
19
20
  case LogicalOperatorType::LOGICAL_EXCEPT:
@@ -31,7 +32,8 @@ unique_ptr<LogicalOperator> FilterPullup::Rewrite(unique_ptr<LogicalOperator> op
31
32
 
32
33
  unique_ptr<LogicalOperator> FilterPullup::PullupJoin(unique_ptr<LogicalOperator> op) {
33
34
  D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
34
- op->type == LogicalOperatorType::LOGICAL_ANY_JOIN || op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN);
35
+ op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN || op->type == LogicalOperatorType::LOGICAL_ANY_JOIN ||
36
+ op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN);
35
37
  auto &join = (LogicalJoin &)*op;
36
38
 
37
39
  switch (join.join_type) {
@@ -23,6 +23,7 @@ unique_ptr<LogicalOperator> FilterPushdown::Rewrite(unique_ptr<LogicalOperator>
23
23
  return PushdownCrossProduct(std::move(op));
24
24
  case LogicalOperatorType::LOGICAL_COMPARISON_JOIN:
25
25
  case LogicalOperatorType::LOGICAL_ANY_JOIN:
26
+ case LogicalOperatorType::LOGICAL_ASOF_JOIN:
26
27
  case LogicalOperatorType::LOGICAL_DELIM_JOIN:
27
28
  return PushdownJoin(std::move(op));
28
29
  case LogicalOperatorType::LOGICAL_PROJECTION:
@@ -48,7 +49,8 @@ unique_ptr<LogicalOperator> FilterPushdown::Rewrite(unique_ptr<LogicalOperator>
48
49
 
49
50
  unique_ptr<LogicalOperator> FilterPushdown::PushdownJoin(unique_ptr<LogicalOperator> op) {
50
51
  D_ASSERT(op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN ||
51
- op->type == LogicalOperatorType::LOGICAL_ANY_JOIN || op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN);
52
+ op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN || op->type == LogicalOperatorType::LOGICAL_ANY_JOIN ||
53
+ op->type == LogicalOperatorType::LOGICAL_DELIM_JOIN);
52
54
  auto &join = (LogicalJoin &)*op;
53
55
  unordered_set<idx_t> left_bindings, right_bindings;
54
56
  LogicalJoin::GetTableReferences(*op->children[0], left_bindings);
@@ -105,13 +107,7 @@ void FilterPushdown::GenerateFilters() {
105
107
  });
106
108
  }
107
109
 
108
- unique_ptr<LogicalOperator> FilterPushdown::FinishPushdown(unique_ptr<LogicalOperator> op) {
109
- // unhandled type, first perform filter pushdown in its children
110
- for (auto &child : op->children) {
111
- FilterPushdown pushdown(optimizer);
112
- child = pushdown.Rewrite(std::move(child));
113
- }
114
- // now push any existing filters
110
+ unique_ptr<LogicalOperator> FilterPushdown::PushFinalFilters(unique_ptr<LogicalOperator> op) {
115
111
  if (filters.empty()) {
116
112
  // no filters to push
117
113
  return op;
@@ -124,6 +120,16 @@ unique_ptr<LogicalOperator> FilterPushdown::FinishPushdown(unique_ptr<LogicalOpe
124
120
  return std::move(filter);
125
121
  }
126
122
 
123
+ unique_ptr<LogicalOperator> FilterPushdown::FinishPushdown(unique_ptr<LogicalOperator> op) {
124
+ // unhandled type, first perform filter pushdown in its children
125
+ for (auto &child : op->children) {
126
+ FilterPushdown pushdown(optimizer);
127
+ child = pushdown.Rewrite(std::move(child));
128
+ }
129
+ // now push any existing filters
130
+ return PushFinalFilters(std::move(op));
131
+ }
132
+
127
133
  void FilterPushdown::Filter::ExtractBindings() {
128
134
  bindings.clear();
129
135
  LogicalJoin::GetExpressionBindings(*filter, bindings);
@@ -6,24 +6,20 @@
6
6
  #include "duckdb/planner/operator/logical_comparison_join.hpp"
7
7
  #include "duckdb/planner/operator/logical_get.hpp"
8
8
  #include "duckdb/storage/data_table.hpp"
9
- #include "duckdb/storage/statistics/numeric_statistics.hpp"
10
9
  #include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp"
11
10
 
11
+ #include <cmath>
12
+
12
13
  namespace duckdb {
13
14
 
14
15
  static TableCatalogEntry *GetCatalogTableEntry(LogicalOperator *op) {
15
- if (op->type == LogicalOperatorType::LOGICAL_GET) {
16
- auto get = (LogicalGet *)op;
17
- TableCatalogEntry *entry = get->GetTable();
18
- return entry;
19
- }
20
- for (auto &child : op->children) {
21
- TableCatalogEntry *entry = GetCatalogTableEntry(child.get());
22
- if (entry != nullptr) {
23
- return entry;
24
- }
16
+ if (!op) {
17
+ return nullptr;
25
18
  }
26
- return nullptr;
19
+ D_ASSERT(op->type == LogicalOperatorType::LOGICAL_GET);
20
+ auto get = (LogicalGet *)op;
21
+ TableCatalogEntry *entry = get->GetTable();
22
+ return entry;
27
23
  }
28
24
 
29
25
  // The filter was made on top of a logical sample or other projection,
@@ -45,8 +41,7 @@ void CardinalityEstimator::AddRelationTdom(FilterInfo *filter_info) {
45
41
  }
46
42
  }
47
43
  auto key = ColumnBinding(filter_info->left_binding.table_index, filter_info->left_binding.column_index);
48
- column_binding_set_t tmp({key});
49
- relations_to_tdoms.emplace_back(RelationsToTDom(tmp));
44
+ relations_to_tdoms.emplace_back(column_binding_set_t({key}));
50
45
  }
51
46
 
52
47
  bool CardinalityEstimator::SingleColumnFilter(FilterInfo *filter_info) {
@@ -99,7 +94,7 @@ void CardinalityEstimator::AddToEquivalenceSets(FilterInfo *filter_info, vector<
99
94
  column_binding_set_t tmp;
100
95
  tmp.insert(filter_info->left_binding);
101
96
  tmp.insert(filter_info->right_binding);
102
- relations_to_tdoms.emplace_back(RelationsToTDom(tmp));
97
+ relations_to_tdoms.emplace_back(tmp);
103
98
  relations_to_tdoms.back().filters.push_back(filter_info);
104
99
  }
105
100
  }
@@ -265,7 +260,7 @@ double CardinalityEstimator::EstimateCardinalityWithSet(JoinRelationSet *new_set
265
260
  // connection to any subgraph in subgraphs. Add a new subgraph, and maybe later there will be
266
261
  // a connection.
267
262
  if (!found_match) {
268
- subgraphs.emplace_back(Subgraph2Denominator());
263
+ subgraphs.emplace_back();
269
264
  auto subgraph = &subgraphs.back();
270
265
  subgraph->relations.insert(filter->left_binding.table_index);
271
266
  subgraph->relations.insert(filter->right_binding.table_index);
@@ -304,23 +299,37 @@ static bool IsLogicalFilter(LogicalOperator *op) {
304
299
  return op->type == LogicalOperatorType::LOGICAL_FILTER;
305
300
  }
306
301
 
307
- static LogicalGet *GetLogicalGet(LogicalOperator *op) {
302
+ static LogicalGet *GetLogicalGet(LogicalOperator *op, idx_t table_index = DConstants::INVALID_INDEX) {
308
303
  LogicalGet *get = nullptr;
309
304
  switch (op->type) {
310
305
  case LogicalOperatorType::LOGICAL_GET:
311
306
  get = (LogicalGet *)op;
312
307
  break;
313
308
  case LogicalOperatorType::LOGICAL_FILTER:
314
- get = GetLogicalGet(op->children.at(0).get());
309
+ get = GetLogicalGet(op->children.at(0).get(), table_index);
315
310
  break;
316
311
  case LogicalOperatorType::LOGICAL_PROJECTION:
317
- get = GetLogicalGet(op->children.at(0).get());
312
+ get = GetLogicalGet(op->children.at(0).get(), table_index);
318
313
  break;
314
+ case LogicalOperatorType::LOGICAL_ASOF_JOIN:
319
315
  case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: {
320
316
  LogicalComparisonJoin *join = (LogicalComparisonJoin *)op;
317
+ // We should never be calling GetLogicalGet without a valid table_index.
318
+ // We are attempting to get the catalog table for a relation (for statistics/cardinality estimation)
319
+ // A logical join means there is a non-reorderable relation in the join plan. This means we need
320
+ // to know the exact table index to return.
321
+ D_ASSERT(table_index != DConstants::INVALID_INDEX);
321
322
  if (join->join_type == JoinType::MARK || join->join_type == JoinType::LEFT) {
322
323
  auto child = join->children.at(0).get();
323
- get = GetLogicalGet(child);
324
+ get = GetLogicalGet(child, table_index);
325
+ if (get && get->table_index == table_index) {
326
+ return get;
327
+ }
328
+ child = join->children.at(1).get();
329
+ get = GetLogicalGet(child, table_index);
330
+ if (get && get->table_index == table_index) {
331
+ return get;
332
+ }
324
333
  }
325
334
  break;
326
335
  }
@@ -370,16 +379,20 @@ void CardinalityEstimator::InitCardinalityEstimatorProps(vector<NodeOp> *node_op
370
379
  if (op->type == LogicalOperatorType::LOGICAL_COMPARISON_JOIN) {
371
380
  auto &join = (LogicalComparisonJoin &)*op;
372
381
  if (join.join_type == JoinType::LEFT) {
373
- // TODO: inspect child operators to get a more accurate cost
374
- // and cardinality estimation. If an base op is a Logical Comparison join
375
- // it is probably a left join, so cost of the larger table is a fine
376
- // estimate
377
- // No need to update a mark join cost because I say so.
382
+ // If a base op is a Logical Comparison join it is probably a left join,
383
+ // so the cost of the larger table is a fine estimate.
384
+ // TODO: provide better estimates for cost of mark joins
385
+ // MARK joins are used for anti and semi joins, so the cost can conceivably be
386
+ // less than the base table cardinality.
378
387
  join_node->SetCost(join_node->GetBaseTableCardinality());
379
388
  }
389
+ } else if (op->type == LogicalOperatorType::LOGICAL_ASOF_JOIN) {
390
+ // AsOf joins have the cardinality of the LHS
391
+ join_node->SetCost(join_node->GetBaseTableCardinality());
380
392
  }
381
- // update cardinality with filters
393
+ // Total domains can be affected by filters. So we update base table cardinality first
382
394
  EstimateBaseTableCardinality(join_node, op);
395
+ // Then update total domains.
383
396
  UpdateTotalDomains(join_node, op);
384
397
  }
385
398
 
@@ -390,74 +403,84 @@ void CardinalityEstimator::InitCardinalityEstimatorProps(vector<NodeOp> *node_op
390
403
  void CardinalityEstimator::UpdateTotalDomains(JoinNode *node, LogicalOperator *op) {
391
404
  auto relation_id = node->set->relations[0];
392
405
  relation_attributes[relation_id].cardinality = node->GetCardinality<double>();
406
+ //! Initialize the distinct count for all columns used in joins with the current relation.
407
+ idx_t distinct_count = node->GetBaseTableCardinality();
393
408
  TableCatalogEntry *catalog_table = nullptr;
394
- auto get = GetLogicalGet(op);
395
- if (get) {
396
- catalog_table = GetCatalogTableEntry(get);
397
- }
398
-
399
- //! Initialize the tdoms for all columns the relation uses in join conditions.
400
- unordered_set<idx_t>::iterator ite;
401
- idx_t count = node->GetBaseTableCardinality();
402
409
 
403
410
  bool direct_filter = false;
411
+ LogicalGet *get = nullptr;
412
+ bool get_updated = true;
404
413
  for (auto &column : relation_attributes[relation_id].columns) {
405
- //! for every column in the relation, get the count via either HLL, or assume it to be
414
+ //! for every column used in a filter in the relation, get the distinct count via HLL, or assume it to be
406
415
  //! the cardinality
407
416
  ColumnBinding key = ColumnBinding(relation_id, column);
417
+ auto actual_binding = relation_column_to_original_column.find(key);
418
+ // each relation has columns that are either projected or used as filters
419
+ // In order to get column statistics we need to make sure the actual binding still
420
+ // refers to the same base table relation, as non-reorderable joins may involve 2+
421
+ // base table relations and therefore the columns may also refer to 2 different
422
+ // base table relations
423
+ if (actual_binding != relation_column_to_original_column.end() &&
424
+ (!get || get->table_index != actual_binding->second.table_index)) {
425
+ get = GetLogicalGet(op, actual_binding->second.table_index);
426
+ get_updated = true;
427
+ } else {
428
+ get_updated = false;
429
+ }
408
430
 
409
- if (catalog_table) {
410
- relation_attributes[relation_id].original_name = catalog_table->name;
411
- // Get HLL stats here
412
- auto actual_binding = relation_column_to_original_column[key];
431
+ if (get_updated) {
432
+ catalog_table = GetCatalogTableEntry(get);
433
+ }
413
434
 
414
- auto base_stats = catalog_table->GetStatistics(context, actual_binding.column_index);
435
+ if (catalog_table && actual_binding != relation_column_to_original_column.end()) {
436
+ // Get HLL stats here
437
+ auto base_stats = catalog_table->GetStatistics(context, actual_binding->second.column_index);
415
438
  if (base_stats) {
416
- count = base_stats->GetDistinctCount();
439
+ distinct_count = base_stats->GetDistinctCount();
417
440
  }
418
441
 
419
- // means you have a direct filter on a column. The count/total domain for the column
442
+ // means you have a direct filter on a column. The distinct_count/total domain for the column
420
443
  // should be decreased to match the predicted total domain matching the filter.
421
444
  // We decrease the total domain for all columns in the equivalence set because filter pushdown
422
445
  // will mean all columns are affected.
423
446
  if (direct_filter) {
424
- count = node->GetCardinality<idx_t>();
447
+ distinct_count = node->GetCardinality<idx_t>();
425
448
  }
426
449
 
427
- // HLL has estimation error, count can't be greater than cardinality of the table before filters
428
- if (count > node->GetBaseTableCardinality()) {
429
- count = node->GetBaseTableCardinality();
450
+ // HLL has estimation error, distinct_count can't be greater than cardinality of the table before filters
451
+ if (distinct_count > node->GetBaseTableCardinality()) {
452
+ distinct_count = node->GetBaseTableCardinality();
430
453
  }
431
454
  } else {
432
- // No HLL. So if we know there is a direct filter, reduce count to cardinality with filter
433
- // otherwise assume the total domain is still the cardinality
455
+ // No HLL. So if we know there is a direct filter, reduce the distinct count to the cardinality
456
+ // with filter effects. Otherwise assume the distinct count is still the cardinality
434
457
  if (direct_filter) {
435
- count = node->GetCardinality<idx_t>();
458
+ distinct_count = node->GetCardinality<idx_t>();
436
459
  } else {
437
- count = node->GetBaseTableCardinality();
460
+ distinct_count = node->GetBaseTableCardinality();
438
461
  }
439
462
  }
440
-
463
+ // Update the relation_to_tdom set with the estimated distinct count (or tdom) calculated above
441
464
  for (auto &relation_to_tdom : relations_to_tdoms) {
442
465
  column_binding_set_t i_set = relation_to_tdom.equivalent_relations;
443
466
  if (i_set.count(key) != 1) {
444
467
  continue;
445
468
  }
446
469
  if (catalog_table) {
447
- if (relation_to_tdom.tdom_hll < count) {
448
- relation_to_tdom.tdom_hll = count;
470
+ if (relation_to_tdom.tdom_hll < distinct_count) {
471
+ relation_to_tdom.tdom_hll = distinct_count;
449
472
  relation_to_tdom.has_tdom_hll = true;
450
473
  }
451
- if (relation_to_tdom.tdom_no_hll > count) {
452
- relation_to_tdom.tdom_no_hll = count;
474
+ if (relation_to_tdom.tdom_no_hll > distinct_count) {
475
+ relation_to_tdom.tdom_no_hll = distinct_count;
453
476
  }
454
477
  } else {
455
478
  // Here we don't have catalog statistics, and the following is how we determine
456
479
  // the tdom
457
480
  // 1. If there is any hll data in the equivalence set, use that
458
481
  // 2. Otherwise, use the table with the smallest cardinality
459
- if (relation_to_tdom.tdom_no_hll > count && !relation_to_tdom.has_tdom_hll) {
460
- relation_to_tdom.tdom_no_hll = count;
482
+ if (relation_to_tdom.tdom_no_hll > distinct_count && !relation_to_tdom.has_tdom_hll) {
483
+ relation_to_tdom.tdom_no_hll = distinct_count;
461
484
  }
462
485
  }
463
486
  break;
@@ -465,9 +488,8 @@ void CardinalityEstimator::UpdateTotalDomains(JoinNode *node, LogicalOperator *o
465
488
  }
466
489
  }
467
490
 
468
- TableFilterSet *CardinalityEstimator::GetTableFilters(LogicalOperator *op) {
469
- // First check table filters
470
- auto get = GetLogicalGet(op);
491
+ TableFilterSet *CardinalityEstimator::GetTableFilters(LogicalOperator *op, idx_t table_index) {
492
+ auto get = GetLogicalGet(op, table_index);
471
493
  return get ? &get->table_filters : nullptr;
472
494
  }
473
495
 
@@ -529,9 +551,10 @@ idx_t CardinalityEstimator::InspectConjunctionOR(idx_t cardinality, idx_t column
529
551
  return cardinality_after_filters;
530
552
  }
531
553
 
532
- idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperator *op, TableFilterSet *table_filters) {
554
+ idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperator *op, TableFilterSet *table_filters,
555
+ idx_t table_index) {
533
556
  idx_t cardinality_after_filters = cardinality;
534
- auto get = GetLogicalGet(op);
557
+ auto get = GetLogicalGet(op, table_index);
535
558
  unique_ptr<BaseStatistics> column_statistics;
536
559
  for (auto &it : table_filters->filters) {
537
560
  column_statistics = nullptr;
@@ -562,17 +585,30 @@ idx_t CardinalityEstimator::InspectTableFilters(idx_t cardinality, LogicalOperat
562
585
 
563
586
  void CardinalityEstimator::EstimateBaseTableCardinality(JoinNode *node, LogicalOperator *op) {
564
587
  auto has_logical_filter = IsLogicalFilter(op);
565
- auto table_filters = GetTableFilters(op);
588
+ D_ASSERT(node->set->count == 1);
589
+ auto relation_id = node->set->relations[0];
566
590
 
567
- auto card_after_filters = node->GetBaseTableCardinality();
568
- if (table_filters) {
569
- double inspect_result = (double)InspectTableFilters(card_after_filters, op, table_filters);
570
- card_after_filters = MinValue(inspect_result, (double)card_after_filters);
571
- }
572
- if (has_logical_filter) {
573
- card_after_filters *= DEFAULT_SELECTIVITY;
591
+ double lowest_card_found = NumericLimits<double>::Maximum();
592
+ for (auto &column : relation_attributes[relation_id].columns) {
593
+ auto card_after_filters = node->GetBaseTableCardinality();
594
+ ColumnBinding key = ColumnBinding(relation_id, column);
595
+ TableFilterSet *table_filters = nullptr;
596
+ auto actual_binding = relation_column_to_original_column.find(key);
597
+ if (actual_binding != relation_column_to_original_column.end()) {
598
+ table_filters = GetTableFilters(op, actual_binding->second.table_index);
599
+ }
600
+
601
+ if (table_filters) {
602
+ double inspect_result =
603
+ (double)InspectTableFilters(card_after_filters, op, table_filters, actual_binding->second.table_index);
604
+ card_after_filters = MinValue(inspect_result, (double)card_after_filters);
605
+ }
606
+ if (has_logical_filter) {
607
+ card_after_filters *= DEFAULT_SELECTIVITY;
608
+ }
609
+ lowest_card_found = MinValue(card_after_filters, lowest_card_found);
574
610
  }
575
- node->SetEstimatedCardinality(card_after_filters);
611
+ node->SetEstimatedCardinality(lowest_card_found);
576
612
  }
577
613
 
578
614
  } // namespace duckdb