duckdb 0.8.2-dev1.0 → 0.8.2-dev1182.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.
- package/binding.gyp +16 -14
- package/binding.gyp.in +1 -1
- package/configure.py +1 -1
- package/duckdb_extension_config.cmake +10 -0
- package/lib/duckdb.d.ts +59 -0
- package/lib/duckdb.js +21 -0
- package/package.json +1 -1
- package/src/duckdb/extension/icu/icu-dateadd.cpp +2 -2
- package/src/duckdb/extension/icu/icu-datefunc.cpp +1 -1
- package/src/duckdb/extension/icu/icu-datepart.cpp +2 -2
- package/src/duckdb/extension/icu/icu-datesub.cpp +2 -2
- package/src/duckdb/extension/icu/icu-datetrunc.cpp +1 -1
- package/src/duckdb/extension/icu/icu-list-range.cpp +1 -1
- package/src/duckdb/extension/icu/icu-makedate.cpp +7 -0
- package/src/duckdb/extension/icu/icu-strptime.cpp +4 -4
- package/src/duckdb/extension/icu/icu-table-range.cpp +5 -5
- package/src/duckdb/extension/icu/icu-timebucket.cpp +16 -16
- package/src/duckdb/extension/icu/icu-timezone.cpp +8 -8
- package/src/duckdb/extension/icu/{icu-extension.cpp → icu_extension.cpp} +29 -34
- package/src/duckdb/extension/icu/include/{icu-extension.hpp → icu_extension.hpp} +2 -2
- package/src/duckdb/extension/json/include/json_common.hpp +47 -231
- package/src/duckdb/extension/json/include/json_executors.hpp +49 -13
- package/src/duckdb/extension/json/include/{json-extension.hpp → json_extension.hpp} +2 -2
- package/src/duckdb/extension/json/include/json_functions.hpp +2 -1
- package/src/duckdb/extension/json/json_common.cpp +272 -40
- package/src/duckdb/extension/json/{json-extension.cpp → json_extension.cpp} +4 -4
- package/src/duckdb/extension/json/json_functions/json_structure.cpp +1 -1
- package/src/duckdb/extension/json/json_functions/json_transform.cpp +17 -37
- package/src/duckdb/extension/json/json_functions/json_type.cpp +1 -1
- package/src/duckdb/extension/json/json_functions.cpp +24 -24
- package/src/duckdb/extension/json/json_scan.cpp +3 -6
- package/src/duckdb/extension/parquet/column_reader.cpp +19 -21
- package/src/duckdb/extension/parquet/column_writer.cpp +77 -61
- package/src/duckdb/extension/parquet/include/cast_column_reader.hpp +2 -2
- package/src/duckdb/extension/parquet/include/column_reader.hpp +14 -16
- package/src/duckdb/extension/parquet/include/column_writer.hpp +9 -7
- package/src/duckdb/extension/parquet/include/list_column_reader.hpp +2 -2
- package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +3 -3
- package/src/duckdb/extension/parquet/include/parquet_decimal_utils.hpp +3 -3
- package/src/duckdb/extension/parquet/include/parquet_file_metadata_cache.hpp +2 -2
- package/src/duckdb/extension/parquet/include/parquet_statistics.hpp +2 -2
- package/src/duckdb/extension/parquet/include/parquet_support.hpp +9 -11
- package/src/duckdb/extension/parquet/include/parquet_writer.hpp +24 -5
- package/src/duckdb/extension/parquet/include/string_column_reader.hpp +1 -1
- package/src/duckdb/extension/parquet/include/struct_column_reader.hpp +2 -3
- package/src/duckdb/extension/parquet/include/zstd_file_system.hpp +2 -2
- package/src/duckdb/extension/parquet/{parquet-extension.cpp → parquet_extension.cpp} +190 -19
- package/src/duckdb/extension/parquet/parquet_reader.cpp +5 -5
- package/src/duckdb/extension/parquet/parquet_statistics.cpp +7 -6
- package/src/duckdb/extension/parquet/parquet_writer.cpp +79 -16
- package/src/duckdb/extension/parquet/zstd_file_system.cpp +2 -2
- package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +1 -1
- package/src/duckdb/src/catalog/default/default_functions.cpp +16 -0
- package/src/duckdb/src/common/adbc/adbc.cpp +75 -10
- package/src/duckdb/src/common/adbc/driver_manager.cpp +6 -11
- package/src/duckdb/src/common/allocator.cpp +16 -4
- package/src/duckdb/src/common/arrow/arrow_appender.cpp +5 -10
- package/src/duckdb/src/common/arrow/arrow_wrapper.cpp +0 -12
- package/src/duckdb/src/common/assert.cpp +3 -0
- package/src/duckdb/src/common/enum_util.cpp +42 -5
- package/src/duckdb/src/common/enums/logical_operator_type.cpp +4 -0
- package/src/duckdb/src/common/enums/optimizer_type.cpp +2 -0
- package/src/duckdb/src/common/enums/physical_operator_type.cpp +4 -0
- package/src/duckdb/src/common/file_system.cpp +15 -0
- package/src/duckdb/src/common/local_file_system.cpp +1 -1
- package/src/duckdb/src/common/multi_file_reader.cpp +181 -18
- package/src/duckdb/src/common/radix_partitioning.cpp +27 -9
- package/src/duckdb/src/common/row_operations/row_external.cpp +1 -1
- package/src/duckdb/src/common/sort/merge_sorter.cpp +9 -16
- package/src/duckdb/src/common/sort/partition_state.cpp +44 -11
- package/src/duckdb/src/common/types/batched_data_collection.cpp +7 -2
- package/src/duckdb/src/common/types/column/column_data_allocator.cpp +9 -6
- package/src/duckdb/src/common/types/column/column_data_collection.cpp +17 -2
- package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +15 -6
- package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +2 -2
- package/src/duckdb/src/common/types/data_chunk.cpp +2 -2
- package/src/duckdb/src/common/types/date.cpp +9 -0
- package/src/duckdb/src/common/types/list_segment.cpp +24 -74
- package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +3 -9
- package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +2 -0
- package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +2 -2
- package/src/duckdb/src/common/types/validity_mask.cpp +33 -0
- package/src/duckdb/src/common/types/vector.cpp +15 -14
- package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +6 -4
- package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +2 -2
- package/src/duckdb/src/core_functions/aggregate/regression/regr_avg.cpp +4 -4
- package/src/duckdb/src/core_functions/aggregate/regression/regr_intercept.cpp +4 -4
- package/src/duckdb/src/core_functions/aggregate/regression/regr_r2.cpp +5 -4
- package/src/duckdb/src/core_functions/aggregate/regression/regr_sxx_syy.cpp +8 -8
- package/src/duckdb/src/core_functions/aggregate/regression/regr_sxy.cpp +4 -3
- package/src/duckdb/src/core_functions/function_list.cpp +4 -2
- package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +208 -42
- package/src/duckdb/src/core_functions/scalar/date/epoch.cpp +0 -17
- package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +19 -4
- package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +4 -2
- package/src/duckdb/src/execution/aggregate_hashtable.cpp +34 -18
- package/src/duckdb/src/execution/index/art/art.cpp +149 -139
- package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +1 -1
- package/src/duckdb/src/execution/index/art/iterator.cpp +129 -207
- package/src/duckdb/src/execution/index/art/leaf.cpp +8 -37
- package/src/duckdb/src/execution/index/art/node.cpp +113 -120
- package/src/duckdb/src/execution/index/art/node16.cpp +1 -10
- package/src/duckdb/src/execution/index/art/node256.cpp +1 -9
- package/src/duckdb/src/execution/index/art/node4.cpp +12 -13
- package/src/duckdb/src/execution/index/art/node48.cpp +1 -11
- package/src/duckdb/src/execution/index/art/prefix.cpp +228 -350
- package/src/duckdb/src/execution/join_hashtable.cpp +4 -4
- package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +1 -0
- package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +8 -3
- package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +32 -22
- package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +512 -300
- package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +4 -3
- package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +5 -5
- package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +413 -282
- package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -1
- package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +21 -10
- package/src/duckdb/src/execution/operator/join/physical_join.cpp +1 -1
- package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +22 -3
- package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +100 -13
- package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +20 -0
- package/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp +48 -0
- package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +2 -3
- package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +6 -4
- package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +3 -2
- package/src/duckdb/src/execution/operator/persistent/physical_fixed_batch_copy.cpp +3 -3
- package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +2 -1
- package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +19 -0
- package/src/duckdb/src/execution/operator/set/physical_cte.cpp +160 -0
- package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +15 -5
- package/src/duckdb/src/execution/partitionable_hashtable.cpp +41 -6
- package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +30 -5
- package/src/duckdb/src/execution/physical_operator.cpp +17 -14
- package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +43 -10
- package/src/duckdb/src/execution/physical_plan/plan_cte.cpp +33 -0
- package/src/duckdb/src/execution/physical_plan/plan_recursive_cte.cpp +25 -4
- package/src/duckdb/src/execution/physical_plan_generator.cpp +4 -0
- package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +290 -43
- package/src/duckdb/src/execution/window_segment_tree.cpp +286 -129
- package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +2 -1
- package/src/duckdb/src/function/function.cpp +2 -0
- package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +212 -0
- package/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +249 -0
- package/src/duckdb/src/function/scalar/compressed_materialization_functions.cpp +29 -0
- package/src/duckdb/src/function/scalar/list/list_resize.cpp +162 -0
- package/src/duckdb/src/function/scalar/nested_functions.cpp +1 -0
- package/src/duckdb/src/function/scalar/string/like.cpp +12 -4
- package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +12 -5
- package/src/duckdb/src/function/table/copy_csv.cpp +8 -1
- package/src/duckdb/src/function/table/read_csv.cpp +100 -17
- package/src/duckdb/src/function/table/system/test_all_types.cpp +38 -18
- package/src/duckdb/src/function/table/table_scan.cpp +9 -0
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/allocator.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/bswap.hpp +42 -0
- package/src/duckdb/src/include/duckdb/common/enum_util.hpp +8 -0
- package/src/duckdb/src/include/duckdb/common/enums/cte_materialize.hpp +21 -0
- package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/optimizer_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +6 -4
- package/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +10 -42
- package/src/duckdb/src/include/duckdb/common/mutex.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/radix.hpp +9 -20
- package/src/duckdb/src/include/duckdb/common/radix_partitioning.hpp +6 -21
- package/src/duckdb/src/include/duckdb/common/row_operations/row_operations.hpp +3 -3
- package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +13 -0
- package/src/duckdb/src/include/duckdb/common/types/batched_data_collection.hpp +3 -1
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +6 -1
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_scan_states.hpp +3 -1
- package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/types/date.hpp +7 -5
- package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +6 -8
- package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +0 -1
- package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +9 -0
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/corr.hpp +4 -4
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/covar.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +1 -0
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_slope.hpp +3 -3
- package/src/duckdb/src/include/duckdb/core_functions/scalar/date_functions.hpp +24 -6
- package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +21 -3
- package/src/duckdb/src/include/duckdb/execution/executor.hpp +3 -0
- package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +4 -5
- package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +31 -27
- package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +6 -14
- package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +4 -10
- package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +3 -6
- package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +3 -6
- package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +5 -8
- package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +3 -6
- package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +63 -52
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +2 -10
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_line_info.hpp +4 -3
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +8 -1
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp +36 -0
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/parallel_csv_reader.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +10 -0
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_cte.hpp +62 -0
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +8 -2
- package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
- package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +3 -0
- package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +3 -0
- package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +10 -3
- package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +51 -40
- package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +1 -1
- package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +2 -2
- package/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +1 -0
- package/src/duckdb/src/include/duckdb/function/scalar/compressed_materialization_functions.hpp +49 -0
- package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +1 -1
- package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +5 -0
- package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +2 -0
- package/src/duckdb/src/include/duckdb/function/table/system_functions.hpp +1 -1
- package/src/duckdb/src/include/duckdb/main/client_config.hpp +3 -0
- package/src/duckdb/src/include/duckdb/main/config.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/settings.hpp +21 -1
- package/src/duckdb/src/include/duckdb/optimizer/column_binding_replacer.hpp +47 -0
- package/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp +132 -0
- package/src/duckdb/src/include/duckdb/optimizer/deliminator.hpp +13 -16
- package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +3 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/estimated_properties.hpp +10 -1
- package/src/duckdb/src/include/duckdb/optimizer/join_order/join_order_optimizer.hpp +1 -1
- package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +1 -1
- package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp +3 -0
- package/src/duckdb/src/include/duckdb/optimizer/matcher/set_matcher.hpp +13 -0
- package/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp +3 -0
- package/src/duckdb/src/include/duckdb/optimizer/remove_duplicate_groups.hpp +40 -0
- package/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp +11 -3
- package/src/duckdb/src/include/duckdb/optimizer/topn_optimizer.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/cte_node.hpp +54 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/query_node.hpp +2 -1
- package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/transformer.hpp +15 -8
- package/src/duckdb/src/include/duckdb/planner/binder.hpp +8 -5
- package/src/duckdb/src/include/duckdb/planner/bound_tokens.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/expression_binder/lateral_binder.hpp +0 -2
- package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +2 -1
- package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -5
- package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +7 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_dependent_join.hpp +43 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp +49 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +5 -4
- package/src/duckdb/src/include/duckdb/planner/query_node/bound_cte_node.hpp +44 -0
- package/src/duckdb/src/include/duckdb/planner/query_node/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/subquery/has_correlated_expressions.hpp +4 -1
- package/src/duckdb/src/include/duckdb/planner/subquery/recursive_dependent_join_planner.hpp +31 -0
- package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_correlated_expressions.hpp +8 -2
- package/src/duckdb/src/include/duckdb/planner/tableref/bound_cteref.hpp +5 -2
- package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +3 -3
- package/src/duckdb/src/include/duckdb/storage/data_table.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/object_cache.hpp +22 -0
- package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +2 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +4 -0
- package/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +3 -0
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +3 -2
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +1 -3
- package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -3
- package/src/duckdb/src/include/duckdb.h +28 -0
- package/src/duckdb/src/main/capi/arrow-c.cpp +155 -1
- package/src/duckdb/src/main/config.cpp +2 -0
- package/src/duckdb/src/main/extension/extension_helper.cpp +106 -99
- package/src/duckdb/src/main/settings/settings.cpp +40 -18
- package/src/duckdb/src/optimizer/column_binding_replacer.cpp +43 -0
- package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -2
- package/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp +140 -0
- package/src/duckdb/src/optimizer/compressed_materialization/compress_distinct.cpp +42 -0
- package/src/duckdb/src/optimizer/compressed_materialization/compress_order.cpp +65 -0
- package/src/duckdb/src/optimizer/compressed_materialization.cpp +478 -0
- package/src/duckdb/src/optimizer/deliminator.cpp +176 -321
- package/src/duckdb/src/optimizer/filter_pushdown.cpp +9 -0
- package/src/duckdb/src/optimizer/join_order/estimated_properties.cpp +7 -0
- package/src/duckdb/src/optimizer/join_order/join_node.cpp +2 -2
- package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +113 -82
- package/src/duckdb/src/optimizer/join_order/join_relation_set.cpp +2 -6
- package/src/duckdb/src/optimizer/join_order/query_graph.cpp +22 -14
- package/src/duckdb/src/optimizer/optimizer.cpp +51 -14
- package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +5 -5
- package/src/duckdb/src/optimizer/pushdown/pushdown_get.cpp +0 -1
- package/src/duckdb/src/optimizer/remove_duplicate_groups.cpp +127 -0
- package/src/duckdb/src/optimizer/remove_unused_columns.cpp +4 -0
- package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +154 -15
- package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +65 -8
- package/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp +1 -1
- package/src/duckdb/src/optimizer/statistics_propagator.cpp +7 -5
- package/src/duckdb/src/optimizer/topn_optimizer.cpp +20 -10
- package/src/duckdb/src/parallel/executor.cpp +15 -0
- package/src/duckdb/src/parallel/pipeline_executor.cpp +7 -6
- package/src/duckdb/src/parallel/task_scheduler.cpp +11 -2
- package/src/duckdb/src/parser/common_table_expression_info.cpp +2 -0
- package/src/duckdb/src/parser/expression/lambda_expression.cpp +1 -1
- package/src/duckdb/src/parser/parsed_expression_iterator.cpp +7 -0
- package/src/duckdb/src/parser/query_node/cte_node.cpp +75 -0
- package/src/duckdb/src/parser/query_node.cpp +18 -1
- package/src/duckdb/src/parser/tableref/joinref.cpp +3 -0
- package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +55 -3
- package/src/duckdb/src/parser/transform/expression/transform_expression.cpp +2 -0
- package/src/duckdb/src/parser/transform/expression/transform_multi_assign_reference.cpp +44 -0
- package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +19 -1
- package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +13 -0
- package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +6 -1
- package/src/duckdb/src/parser/transform/statement/transform_insert.cpp +6 -1
- package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +7 -2
- package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +14 -11
- package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +11 -2
- package/src/duckdb/src/parser/transform/statement/transform_update.cpp +6 -1
- package/src/duckdb/src/parser/transformer.cpp +15 -0
- package/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +64 -0
- package/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +26 -0
- package/src/duckdb/src/planner/binder/query_node/plan_recursive_cte_node.cpp +5 -5
- package/src/duckdb/src/planner/binder/query_node/plan_setop.cpp +4 -4
- package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +32 -29
- package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +11 -2
- package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +32 -5
- package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +116 -50
- package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -1
- package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -26
- package/src/duckdb/src/planner/binder/tableref/plan_subqueryref.cpp +3 -3
- package/src/duckdb/src/planner/binder.cpp +5 -0
- package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +4 -31
- package/src/duckdb/src/planner/expression_binder.cpp +3 -0
- package/src/duckdb/src/planner/expression_iterator.cpp +6 -0
- package/src/duckdb/src/planner/logical_operator.cpp +5 -0
- package/src/duckdb/src/planner/logical_operator_visitor.cpp +2 -0
- package/src/duckdb/src/planner/operator/logical_cteref.cpp +3 -1
- package/src/duckdb/src/planner/operator/logical_dependent_join.cpp +26 -0
- package/src/duckdb/src/planner/operator/logical_materialized_cte.cpp +21 -0
- package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +90 -38
- package/src/duckdb/src/planner/subquery/has_correlated_expressions.cpp +22 -7
- package/src/duckdb/src/planner/subquery/rewrite_correlated_expressions.cpp +65 -7
- package/src/duckdb/src/storage/arena_allocator.cpp +1 -2
- package/src/duckdb/src/storage/buffer/block_manager.cpp +3 -0
- package/src/duckdb/src/storage/checkpoint_manager.cpp +3 -0
- package/src/duckdb/src/storage/data_table.cpp +1 -1
- package/src/duckdb/src/storage/local_storage.cpp +3 -3
- package/src/duckdb/src/storage/single_file_block_manager.cpp +23 -0
- package/src/duckdb/src/storage/statistics/string_stats.cpp +21 -2
- package/src/duckdb/src/storage/storage_info.cpp +1 -1
- package/src/duckdb/src/storage/storage_manager.cpp +7 -2
- package/src/duckdb/src/storage/table/chunk_info.cpp +17 -0
- package/src/duckdb/src/storage/table/row_group.cpp +25 -9
- package/src/duckdb/src/storage/table/row_group_collection.cpp +19 -18
- package/src/duckdb/third_party/concurrentqueue/concurrentqueue.h +2 -2
- package/src/duckdb/third_party/concurrentqueue/lightweightsemaphore.h +76 -0
- package/src/duckdb/third_party/fast_float/fast_float/fast_float.h +2 -0
- package/src/duckdb/third_party/httplib/httplib.hpp +10 -1
- package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +9 -0
- package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +2 -1
- package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +12487 -12331
- package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +5 -5
- package/src/duckdb/ub_src_execution_index_art.cpp +0 -2
- package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
- package/src/duckdb/ub_src_execution_operator_set.cpp +2 -0
- package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar_compressed_materialization.cpp +4 -0
- package/src/duckdb/ub_src_function_scalar_list.cpp +2 -0
- package/src/duckdb/ub_src_optimizer.cpp +6 -0
- package/src/duckdb/ub_src_optimizer_compressed_materialization.cpp +6 -0
- package/src/duckdb/ub_src_optimizer_statistics_expression.cpp +0 -2
- package/src/duckdb/ub_src_parser_query_node.cpp +2 -0
- package/src/duckdb/ub_src_parser_transform_expression.cpp +2 -0
- package/src/duckdb/ub_src_planner_binder_query_node.cpp +4 -0
- package/src/duckdb/ub_src_planner_operator.cpp +4 -0
- package/src/duckdb_node.hpp +1 -0
- package/src/statement.cpp +103 -4
- package/test/columns.test.ts +243 -0
- package/test/test_all_types.test.ts +233 -0
- package/tsconfig.json +1 -0
- package/src/duckdb/src/execution/index/art/prefix_segment.cpp +0 -42
- package/src/duckdb/src/include/duckdb/execution/index/art/prefix_segment.hpp +0 -40
- package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +0 -118
- /package/src/duckdb/extension/parquet/include/{parquet-extension.hpp → parquet_extension.hpp} +0 -0
@@ -1,15 +1,15 @@
|
|
1
|
+
#include "duckdb/execution/index/art/node.hpp"
|
2
|
+
|
1
3
|
#include "duckdb/common/limits.hpp"
|
2
4
|
#include "duckdb/common/swap.hpp"
|
3
5
|
#include "duckdb/execution/index/art/art.hpp"
|
4
|
-
#include "duckdb/execution/index/art/leaf.hpp"
|
5
|
-
#include "duckdb/execution/index/art/leaf_segment.hpp"
|
6
|
-
#include "duckdb/execution/index/art/node.hpp"
|
7
|
-
#include "duckdb/execution/index/art/node16.hpp"
|
8
6
|
#include "duckdb/execution/index/art/node256.hpp"
|
9
|
-
#include "duckdb/execution/index/art/node4.hpp"
|
10
7
|
#include "duckdb/execution/index/art/node48.hpp"
|
8
|
+
#include "duckdb/execution/index/art/node16.hpp"
|
9
|
+
#include "duckdb/execution/index/art/node4.hpp"
|
10
|
+
#include "duckdb/execution/index/art/leaf.hpp"
|
11
|
+
#include "duckdb/execution/index/art/leaf_segment.hpp"
|
11
12
|
#include "duckdb/execution/index/art/prefix.hpp"
|
12
|
-
#include "duckdb/execution/index/art/prefix_segment.hpp"
|
13
13
|
#include "duckdb/storage/meta_block_reader.hpp"
|
14
14
|
#include "duckdb/storage/meta_block_writer.hpp"
|
15
15
|
#include "duckdb/storage/table_io_manager.hpp"
|
@@ -28,13 +28,9 @@ Node::Node(MetaBlockReader &reader) : SwizzleablePointer(reader) {
|
|
28
28
|
|
29
29
|
void Node::New(ART &art, Node &node, const NType type) {
|
30
30
|
|
31
|
+
// NOTE: leaves and prefixes should not pass through this function
|
32
|
+
|
31
33
|
switch (type) {
|
32
|
-
case NType::PREFIX_SEGMENT:
|
33
|
-
PrefixSegment::New(art, node);
|
34
|
-
break;
|
35
|
-
case NType::LEAF_SEGMENT:
|
36
|
-
LeafSegment::New(art, node);
|
37
|
-
break;
|
38
34
|
case NType::NODE_4:
|
39
35
|
Node4::New(art, node);
|
40
36
|
break;
|
@@ -55,20 +51,18 @@ void Node::New(ART &art, Node &node, const NType type) {
|
|
55
51
|
void Node::Free(ART &art, Node &node) {
|
56
52
|
|
57
53
|
// recursively free all nodes that are in-memory, and skip swizzled and empty nodes
|
58
|
-
|
59
54
|
if (!node.IsSet()) {
|
60
55
|
return;
|
61
56
|
}
|
62
57
|
|
63
58
|
if (!node.IsSwizzled()) {
|
64
59
|
|
60
|
+
// free the children of the nodes
|
65
61
|
auto type = node.DecodeARTNodeType();
|
66
|
-
if (type != NType::PREFIX_SEGMENT && type != NType::LEAF_SEGMENT) {
|
67
|
-
node.GetPrefix(art).Free(art);
|
68
|
-
}
|
69
|
-
|
70
|
-
// free the prefixes and children of the nodes
|
71
62
|
switch (type) {
|
63
|
+
case NType::PREFIX:
|
64
|
+
Prefix::Free(art, node);
|
65
|
+
break;
|
72
66
|
case NType::LEAF_SEGMENT:
|
73
67
|
LeafSegment::Free(art, node);
|
74
68
|
break;
|
@@ -87,8 +81,6 @@ void Node::Free(ART &art, Node &node) {
|
|
87
81
|
case NType::NODE_256:
|
88
82
|
Node256::Free(art, node);
|
89
83
|
break;
|
90
|
-
default:
|
91
|
-
break;
|
92
84
|
}
|
93
85
|
|
94
86
|
Node::GetAllocator(art, type).Free(node);
|
@@ -140,11 +132,11 @@ void Node::InsertChild(ART &art, Node &node, const uint8_t byte, const Node chil
|
|
140
132
|
// Deletes
|
141
133
|
//===--------------------------------------------------------------------===//
|
142
134
|
|
143
|
-
void Node::DeleteChild(ART &art, Node &node, const uint8_t byte) {
|
135
|
+
void Node::DeleteChild(ART &art, Node &node, Node &prefix, const uint8_t byte) {
|
144
136
|
|
145
137
|
switch (node.DecodeARTNodeType()) {
|
146
138
|
case NType::NODE_4:
|
147
|
-
return Node4::DeleteChild(art, node, byte);
|
139
|
+
return Node4::DeleteChild(art, node, prefix, byte);
|
148
140
|
case NType::NODE_16:
|
149
141
|
return Node16::DeleteChild(art, node, byte);
|
150
142
|
case NType::NODE_48:
|
@@ -227,12 +219,13 @@ BlockPointer Node::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
227
219
|
if (!IsSet()) {
|
228
220
|
return {(block_id_t)DConstants::INVALID_INDEX, 0};
|
229
221
|
}
|
230
|
-
|
231
222
|
if (IsSwizzled()) {
|
232
223
|
Deserialize(art);
|
233
224
|
}
|
234
225
|
|
235
226
|
switch (DecodeARTNodeType()) {
|
227
|
+
case NType::PREFIX:
|
228
|
+
return Prefix::Get(art, *this).Serialize(art, writer);
|
236
229
|
case NType::LEAF:
|
237
230
|
return Leaf::Get(art, *this).Serialize(art, writer);
|
238
231
|
case NType::NODE_4:
|
@@ -260,16 +253,18 @@ void Node::Deserialize(ART &art) {
|
|
260
253
|
type = (uint8_t)decoded_type;
|
261
254
|
|
262
255
|
switch (decoded_type) {
|
256
|
+
case NType::PREFIX:
|
257
|
+
return Prefix::Get(art, *this).Deserialize(reader);
|
263
258
|
case NType::LEAF:
|
264
259
|
return Leaf::Get(art, *this).Deserialize(art, reader);
|
265
260
|
case NType::NODE_4:
|
266
|
-
return Node4::Get(art, *this).Deserialize(
|
261
|
+
return Node4::Get(art, *this).Deserialize(reader);
|
267
262
|
case NType::NODE_16:
|
268
|
-
return Node16::Get(art, *this).Deserialize(
|
263
|
+
return Node16::Get(art, *this).Deserialize(reader);
|
269
264
|
case NType::NODE_48:
|
270
|
-
return Node48::Get(art, *this).Deserialize(
|
265
|
+
return Node48::Get(art, *this).Deserialize(reader);
|
271
266
|
case NType::NODE_256:
|
272
|
-
return Node256::Get(art, *this).Deserialize(
|
267
|
+
return Node256::Get(art, *this).Deserialize(reader);
|
273
268
|
default:
|
274
269
|
throw InternalException("Invalid node type for Deserialize.");
|
275
270
|
}
|
@@ -291,13 +286,19 @@ string Node::VerifyAndToString(ART &art, const bool only_verify) {
|
|
291
286
|
auto str = Leaf::Get(art, *this).VerifyAndToString(art, only_verify);
|
292
287
|
return only_verify ? "" : "\n" + str;
|
293
288
|
}
|
289
|
+
if (type == NType::PREFIX) {
|
290
|
+
auto str = Prefix::Get(art, *this).VerifyAndToString(art, only_verify);
|
291
|
+
return only_verify ? "" : "\n" + str;
|
292
|
+
}
|
294
293
|
|
295
294
|
string str = "Node" + to_string(GetCapacity()) + ": [";
|
296
295
|
|
297
296
|
idx_t child_count = 0;
|
298
297
|
uint8_t byte = 0;
|
299
298
|
auto child = GetNextChild(art, byte, false);
|
299
|
+
|
300
300
|
while (child) {
|
301
|
+
|
301
302
|
child_count++;
|
302
303
|
if (child->IsSwizzled()) {
|
303
304
|
if (!only_verify) {
|
@@ -309,6 +310,7 @@ string Node::VerifyAndToString(ART &art, const bool only_verify) {
|
|
309
310
|
break;
|
310
311
|
}
|
311
312
|
}
|
313
|
+
|
312
314
|
byte++;
|
313
315
|
child = GetNextChild(art, byte, false);
|
314
316
|
}
|
@@ -337,28 +339,6 @@ idx_t Node::GetCapacity() const {
|
|
337
339
|
}
|
338
340
|
}
|
339
341
|
|
340
|
-
Prefix &Node::GetPrefix(ART &art) {
|
341
|
-
|
342
|
-
if (IsSwizzled()) {
|
343
|
-
Deserialize(art);
|
344
|
-
}
|
345
|
-
|
346
|
-
switch (DecodeARTNodeType()) {
|
347
|
-
case NType::LEAF:
|
348
|
-
return Leaf::Get(art, *this).prefix;
|
349
|
-
case NType::NODE_4:
|
350
|
-
return Node4::Get(art, *this).prefix;
|
351
|
-
case NType::NODE_16:
|
352
|
-
return Node16::Get(art, *this).prefix;
|
353
|
-
case NType::NODE_48:
|
354
|
-
return Node48::Get(art, *this).prefix;
|
355
|
-
case NType::NODE_256:
|
356
|
-
return Node256::Get(art, *this).prefix;
|
357
|
-
default:
|
358
|
-
throw InternalException("Invalid node type for GetPrefix.");
|
359
|
-
}
|
360
|
-
}
|
361
|
-
|
362
342
|
NType Node::GetARTNodeTypeByCount(const idx_t count) {
|
363
343
|
|
364
344
|
if (count <= NODE_4_CAPACITY) {
|
@@ -381,22 +361,14 @@ FixedSizeAllocator &Node::GetAllocator(const ART &art, NType type) {
|
|
381
361
|
|
382
362
|
void Node::InitializeMerge(ART &art, const ARTFlags &flags) {
|
383
363
|
|
384
|
-
|
385
|
-
|
386
|
-
}
|
387
|
-
|
388
|
-
if (IsSwizzled()) {
|
389
|
-
Deserialize(art);
|
390
|
-
}
|
391
|
-
|
392
|
-
// if not all prefixes are inlined
|
393
|
-
if (flags.merge_buffer_counts[(uint8_t)NType::PREFIX_SEGMENT - 1] != 0) {
|
394
|
-
// initialize prefix segments
|
395
|
-
GetPrefix(art).InitializeMerge(art, flags.merge_buffer_counts[(uint8_t)NType::PREFIX_SEGMENT - 1]);
|
396
|
-
}
|
364
|
+
// the index is fully in memory during CREATE [UNIQUE] INDEX statements
|
365
|
+
D_ASSERT(IsSet() && !IsSwizzled());
|
397
366
|
|
398
367
|
auto type = DecodeARTNodeType();
|
399
368
|
switch (type) {
|
369
|
+
case NType::PREFIX:
|
370
|
+
Prefix::Get(art, *this).InitializeMerge(art, flags);
|
371
|
+
break;
|
400
372
|
case NType::LEAF:
|
401
373
|
// if not all leaves are inlined
|
402
374
|
if (flags.merge_buffer_counts[(uint8_t)NType::LEAF_SEGMENT - 1] != 0) {
|
@@ -434,82 +406,108 @@ bool Node::Merge(ART &art, Node &other) {
|
|
434
406
|
return ResolvePrefixes(art, other);
|
435
407
|
}
|
436
408
|
|
437
|
-
bool
|
409
|
+
bool MergePrefixContainsOtherPrefix(ART &art, reference<Node> &l_node, reference<Node> &r_node,
|
410
|
+
idx_t &mismatch_position) {
|
438
411
|
|
439
|
-
//
|
412
|
+
// r_node's prefix contains l_node's prefix
|
413
|
+
// l_node cannot be a leaf, otherwise the key represented by l_node would be a subset of another key
|
414
|
+
// which is not possible by our construction
|
415
|
+
D_ASSERT(l_node.get().DecodeARTNodeType() != NType::LEAF);
|
440
416
|
|
441
|
-
|
442
|
-
|
417
|
+
// test if the next byte (mismatch_position) in r_node (prefix) exists in l_node
|
418
|
+
auto mismatch_byte = Prefix::GetByte(art, r_node, mismatch_position);
|
419
|
+
auto child_node = l_node.get().GetChild(art, mismatch_byte);
|
443
420
|
|
444
|
-
//
|
445
|
-
|
446
|
-
|
421
|
+
// update the prefix of r_node to only consist of the bytes after mismatch_position
|
422
|
+
Prefix::Reduce(art, r_node, mismatch_position);
|
423
|
+
|
424
|
+
if (!child_node) {
|
425
|
+
// insert r_node as a child of l_node at the empty position
|
426
|
+
Node::InsertChild(art, l_node, mismatch_byte, r_node);
|
427
|
+
r_node.get().Reset();
|
428
|
+
return true;
|
447
429
|
}
|
448
430
|
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
auto &r_prefix = r_node.GetPrefix(art);
|
431
|
+
// recurse
|
432
|
+
return child_node->ResolvePrefixes(art, r_node);
|
433
|
+
}
|
453
434
|
|
454
|
-
|
435
|
+
void MergePrefixesDiffer(ART &art, reference<Node> &l_node, reference<Node> &r_node, idx_t &mismatch_position) {
|
455
436
|
|
456
|
-
//
|
457
|
-
if (mismatch_position == l_prefix.count && l_prefix.count == r_prefix.count) {
|
458
|
-
return MergeInternal(art, r_node);
|
459
|
-
}
|
437
|
+
// create a new node and insert both nodes as children
|
460
438
|
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
D_ASSERT(l_node.DecodeARTNodeType() != NType::LEAF);
|
439
|
+
Node l_child;
|
440
|
+
auto l_byte = Prefix::GetByte(art, l_node, mismatch_position);
|
441
|
+
Prefix::Split(art, l_node, l_child, mismatch_position);
|
442
|
+
Node4::New(art, l_node);
|
466
443
|
|
467
|
-
|
468
|
-
|
469
|
-
|
444
|
+
// insert children
|
445
|
+
Node4::InsertChild(art, l_node, l_byte, l_child);
|
446
|
+
auto r_byte = Prefix::GetByte(art, r_node, mismatch_position);
|
447
|
+
Prefix::Reduce(art, r_node, mismatch_position);
|
448
|
+
Node4::InsertChild(art, l_node, r_byte, r_node);
|
470
449
|
|
471
|
-
|
472
|
-
|
450
|
+
r_node.get().Reset();
|
451
|
+
}
|
473
452
|
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
453
|
+
bool Node::ResolvePrefixes(ART &art, Node &other) {
|
454
|
+
|
455
|
+
// NOTE: we always merge into the left ART
|
456
|
+
|
457
|
+
D_ASSERT(IsSet());
|
458
|
+
D_ASSERT(other.IsSet());
|
480
459
|
|
481
|
-
|
482
|
-
|
460
|
+
// case 1: both nodes have no prefix
|
461
|
+
if (DecodeARTNodeType() != NType::PREFIX && other.DecodeARTNodeType() != NType::PREFIX) {
|
462
|
+
return MergeInternal(art, other);
|
483
463
|
}
|
484
464
|
|
485
|
-
|
465
|
+
reference<Node> l_node(*this);
|
466
|
+
reference<Node> r_node(other);
|
486
467
|
|
487
|
-
|
488
|
-
auto old_l_node = l_node;
|
489
|
-
auto &new_n4 = Node4::New(art, l_node);
|
490
|
-
new_n4.prefix.Initialize(art, l_prefix, mismatch_position);
|
468
|
+
idx_t mismatch_position = DConstants::INVALID_INDEX;
|
491
469
|
|
492
|
-
//
|
493
|
-
|
494
|
-
|
470
|
+
// traverse prefixes
|
471
|
+
if (l_node.get().DecodeARTNodeType() == NType::PREFIX && r_node.get().DecodeARTNodeType() == NType::PREFIX) {
|
472
|
+
|
473
|
+
if (!Prefix::Traverse(art, l_node, r_node, mismatch_position)) {
|
474
|
+
return false;
|
475
|
+
}
|
476
|
+
// we already recurse because the prefixes matched (so far)
|
477
|
+
if (mismatch_position == DConstants::INVALID_INDEX) {
|
478
|
+
return true;
|
479
|
+
}
|
495
480
|
|
496
|
-
|
497
|
-
key_byte = r_prefix.Reduce(art, mismatch_position);
|
498
|
-
Node4::InsertChild(art, l_node, key_byte, r_node);
|
481
|
+
} else {
|
499
482
|
|
500
|
-
|
483
|
+
// l_prefix contains r_prefix
|
484
|
+
if (l_node.get().DecodeARTNodeType() == NType::PREFIX) {
|
485
|
+
swap(*this, other);
|
486
|
+
}
|
487
|
+
mismatch_position = 0;
|
488
|
+
}
|
489
|
+
D_ASSERT(mismatch_position != DConstants::INVALID_INDEX);
|
490
|
+
|
491
|
+
// case 2: one prefix contains the other prefix
|
492
|
+
if (l_node.get().DecodeARTNodeType() != NType::PREFIX && r_node.get().DecodeARTNodeType() == NType::PREFIX) {
|
493
|
+
return MergePrefixContainsOtherPrefix(art, l_node, r_node, mismatch_position);
|
494
|
+
}
|
495
|
+
|
496
|
+
// case 3: prefixes differ at a specific byte
|
497
|
+
MergePrefixesDiffer(art, l_node, r_node, mismatch_position);
|
501
498
|
return true;
|
502
499
|
}
|
503
500
|
|
504
501
|
bool Node::MergeInternal(ART &art, Node &other) {
|
505
502
|
|
506
|
-
D_ASSERT(IsSet());
|
507
|
-
D_ASSERT(
|
503
|
+
D_ASSERT(IsSet() && other.IsSet());
|
504
|
+
D_ASSERT(DecodeARTNodeType() != NType::PREFIX && DecodeARTNodeType() != NType::LEAF_SEGMENT);
|
505
|
+
D_ASSERT(other.DecodeARTNodeType() != NType::PREFIX && other.DecodeARTNodeType() != NType::LEAF_SEGMENT);
|
508
506
|
|
509
507
|
// always try to merge the smaller node into the bigger node
|
510
508
|
// because maybe there is enough free space in the bigger node to fit the smaller one
|
511
509
|
// without too much recursion
|
512
|
-
if (
|
510
|
+
if (DecodeARTNodeType() < other.DecodeARTNodeType()) {
|
513
511
|
swap(*this, other);
|
514
512
|
}
|
515
513
|
|
@@ -524,7 +522,7 @@ bool Node::MergeInternal(ART &art, Node &other) {
|
|
524
522
|
return false;
|
525
523
|
}
|
526
524
|
|
527
|
-
Leaf::Get(art,
|
525
|
+
Leaf::Get(art, l_node).Merge(art, r_node);
|
528
526
|
return true;
|
529
527
|
}
|
530
528
|
|
@@ -567,22 +565,17 @@ void Node::Vacuum(ART &art, Node &node, const ARTFlags &flags) {
|
|
567
565
|
return;
|
568
566
|
}
|
569
567
|
|
570
|
-
// possibly vacuum prefix segments, if not all prefixes are inlined
|
571
|
-
bool needs_vacuum = flags.vacuum_flags[(uint8_t)NType::PREFIX_SEGMENT - 1];
|
572
|
-
if (needs_vacuum) {
|
573
|
-
// vacuum prefix segments
|
574
|
-
node.GetPrefix(art).Vacuum(art);
|
575
|
-
}
|
576
|
-
|
577
568
|
auto type = node.DecodeARTNodeType();
|
578
569
|
auto &allocator = Node::GetAllocator(art, type);
|
579
|
-
needs_vacuum = flags.vacuum_flags[node.type - 1] && allocator.NeedsVacuum(node);
|
570
|
+
auto needs_vacuum = flags.vacuum_flags[node.type - 1] && allocator.NeedsVacuum(node);
|
580
571
|
if (needs_vacuum) {
|
581
572
|
node.SetPtr(allocator.VacuumPointer(node));
|
582
573
|
node.type = (uint8_t)type;
|
583
574
|
}
|
584
575
|
|
585
576
|
switch (type) {
|
577
|
+
case NType::PREFIX:
|
578
|
+
return Prefix::Get(art, node).Vacuum(art, flags);
|
586
579
|
case NType::LEAF: {
|
587
580
|
// possibly vacuum leaf segments, if not all leaves are inlined
|
588
581
|
if (flags.vacuum_flags[(uint8_t)NType::LEAF_SEGMENT - 1]) {
|
@@ -1,7 +1,5 @@
|
|
1
1
|
#include "duckdb/execution/index/art/node16.hpp"
|
2
2
|
|
3
|
-
#include "duckdb/execution/index/art/art.hpp"
|
4
|
-
#include "duckdb/execution/index/art/node.hpp"
|
5
3
|
#include "duckdb/execution/index/art/node4.hpp"
|
6
4
|
#include "duckdb/execution/index/art/node48.hpp"
|
7
5
|
#include "duckdb/storage/meta_block_reader.hpp"
|
@@ -16,7 +14,6 @@ Node16 &Node16::New(ART &art, Node &node) {
|
|
16
14
|
auto &n16 = Node16::Get(art, node);
|
17
15
|
|
18
16
|
n16.count = 0;
|
19
|
-
n16.prefix.Initialize();
|
20
17
|
return n16;
|
21
18
|
}
|
22
19
|
|
@@ -39,8 +36,6 @@ Node16 &Node16::GrowNode4(ART &art, Node &node16, Node &node4) {
|
|
39
36
|
auto &n16 = Node16::New(art, node16);
|
40
37
|
|
41
38
|
n16.count = n4.count;
|
42
|
-
n16.prefix.Move(n4.prefix);
|
43
|
-
|
44
39
|
for (idx_t i = 0; i < n4.count; i++) {
|
45
40
|
n16.key[i] = n4.key[i];
|
46
41
|
n16.children[i] = n4.children[i];
|
@@ -57,8 +52,6 @@ Node16 &Node16::ShrinkNode48(ART &art, Node &node16, Node &node48) {
|
|
57
52
|
auto &n48 = Node48::Get(art, node48);
|
58
53
|
|
59
54
|
n16.count = 0;
|
60
|
-
n16.prefix.Move(n48.prefix);
|
61
|
-
|
62
55
|
for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
|
63
56
|
D_ASSERT(n16.count <= Node::NODE_16_CAPACITY);
|
64
57
|
if (n48.child_index[i] != Node::EMPTY_MARKER) {
|
@@ -195,7 +188,6 @@ BlockPointer Node16::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
195
188
|
auto block_pointer = writer.GetBlockPointer();
|
196
189
|
writer.Write(NType::NODE_16);
|
197
190
|
writer.Write<uint8_t>(count);
|
198
|
-
prefix.Serialize(art, writer);
|
199
191
|
|
200
192
|
// write key values
|
201
193
|
for (idx_t i = 0; i < Node::NODE_16_CAPACITY; i++) {
|
@@ -211,10 +203,9 @@ BlockPointer Node16::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
211
203
|
return block_pointer;
|
212
204
|
}
|
213
205
|
|
214
|
-
void Node16::Deserialize(
|
206
|
+
void Node16::Deserialize(MetaBlockReader &reader) {
|
215
207
|
|
216
208
|
count = reader.Read<uint8_t>();
|
217
|
-
prefix.Deserialize(art, reader);
|
218
209
|
|
219
210
|
// read key values
|
220
211
|
for (idx_t i = 0; i < Node::NODE_16_CAPACITY; i++) {
|
@@ -1,7 +1,5 @@
|
|
1
1
|
#include "duckdb/execution/index/art/node256.hpp"
|
2
2
|
|
3
|
-
#include "duckdb/execution/index/art/art.hpp"
|
4
|
-
#include "duckdb/execution/index/art/node.hpp"
|
5
3
|
#include "duckdb/execution/index/art/node48.hpp"
|
6
4
|
#include "duckdb/storage/meta_block_reader.hpp"
|
7
5
|
#include "duckdb/storage/meta_block_writer.hpp"
|
@@ -15,8 +13,6 @@ Node256 &Node256::New(ART &art, Node &node) {
|
|
15
13
|
auto &n256 = Node256::Get(art, node);
|
16
14
|
|
17
15
|
n256.count = 0;
|
18
|
-
n256.prefix.Initialize();
|
19
|
-
|
20
16
|
for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
|
21
17
|
n256.children[i].Reset();
|
22
18
|
}
|
@@ -49,8 +45,6 @@ Node256 &Node256::GrowNode48(ART &art, Node &node256, Node &node48) {
|
|
49
45
|
auto &n256 = Node256::New(art, node256);
|
50
46
|
|
51
47
|
n256.count = n48.count;
|
52
|
-
n256.prefix.Move(n48.prefix);
|
53
|
-
|
54
48
|
for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
|
55
49
|
if (n48.child_index[i] != Node::EMPTY_MARKER) {
|
56
50
|
n256.children[i] = n48.children[n48.child_index[i]];
|
@@ -127,7 +121,6 @@ BlockPointer Node256::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
127
121
|
auto block_pointer = writer.GetBlockPointer();
|
128
122
|
writer.Write(NType::NODE_256);
|
129
123
|
writer.Write<uint16_t>(count);
|
130
|
-
prefix.Serialize(art, writer);
|
131
124
|
|
132
125
|
// write child block pointers
|
133
126
|
for (auto &child_block_pointer : child_block_pointers) {
|
@@ -138,10 +131,9 @@ BlockPointer Node256::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
138
131
|
return block_pointer;
|
139
132
|
}
|
140
133
|
|
141
|
-
void Node256::Deserialize(
|
134
|
+
void Node256::Deserialize(MetaBlockReader &reader) {
|
142
135
|
|
143
136
|
count = reader.Read<uint16_t>();
|
144
|
-
prefix.Deserialize(art, reader);
|
145
137
|
|
146
138
|
// read child block pointers
|
147
139
|
for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
|
@@ -1,7 +1,6 @@
|
|
1
1
|
#include "duckdb/execution/index/art/node4.hpp"
|
2
2
|
|
3
|
-
#include "duckdb/execution/index/art/
|
4
|
-
#include "duckdb/execution/index/art/node.hpp"
|
3
|
+
#include "duckdb/execution/index/art/prefix.hpp"
|
5
4
|
#include "duckdb/execution/index/art/node16.hpp"
|
6
5
|
#include "duckdb/storage/meta_block_reader.hpp"
|
7
6
|
#include "duckdb/storage/meta_block_writer.hpp"
|
@@ -15,7 +14,6 @@ Node4 &Node4::New(ART &art, Node &node) {
|
|
15
14
|
auto &n4 = Node4::Get(art, node);
|
16
15
|
|
17
16
|
n4.count = 0;
|
18
|
-
n4.prefix.Initialize();
|
19
17
|
return n4;
|
20
18
|
}
|
21
19
|
|
@@ -39,8 +37,6 @@ Node4 &Node4::ShrinkNode16(ART &art, Node &node4, Node &node16) {
|
|
39
37
|
|
40
38
|
D_ASSERT(n16.count <= Node::NODE_4_CAPACITY);
|
41
39
|
n4.count = n16.count;
|
42
|
-
n4.prefix.Move(n16.prefix);
|
43
|
-
|
44
40
|
for (idx_t i = 0; i < n16.count; i++) {
|
45
41
|
n4.key[i] = n16.key[i];
|
46
42
|
n4.children[i] = n16.children[i];
|
@@ -94,7 +90,7 @@ void Node4::InsertChild(ART &art, Node &node, const uint8_t byte, const Node chi
|
|
94
90
|
}
|
95
91
|
}
|
96
92
|
|
97
|
-
void Node4::DeleteChild(ART &art, Node &node, const uint8_t byte) {
|
93
|
+
void Node4::DeleteChild(ART &art, Node &node, Node &prefix, const uint8_t byte) {
|
98
94
|
|
99
95
|
D_ASSERT(node.IsSet());
|
100
96
|
D_ASSERT(!node.IsSwizzled());
|
@@ -123,13 +119,18 @@ void Node4::DeleteChild(ART &art, Node &node, const uint8_t byte) {
|
|
123
119
|
// this is a one way node, compress
|
124
120
|
if (n4.count == 1) {
|
125
121
|
|
122
|
+
// we need to keep track of the old node pointer
|
123
|
+
// because Concatenate() might overwrite that pointer while appending bytes to
|
124
|
+
// the prefix (and by doing so overwriting the subsequent node with
|
125
|
+
// new prefix nodes)
|
126
|
+
auto old_n4_node = node;
|
127
|
+
|
126
128
|
// get only child and concatenate prefixes
|
127
129
|
auto child = *n4.GetChild(n4.key[0]);
|
128
|
-
|
129
|
-
n4.count--;
|
130
|
+
Prefix::Concatenate(art, prefix, n4.key[0], child);
|
130
131
|
|
131
|
-
|
132
|
-
|
132
|
+
n4.count--;
|
133
|
+
Node::Free(art, old_n4_node);
|
133
134
|
}
|
134
135
|
}
|
135
136
|
|
@@ -180,7 +181,6 @@ BlockPointer Node4::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
180
181
|
auto block_pointer = writer.GetBlockPointer();
|
181
182
|
writer.Write(NType::NODE_4);
|
182
183
|
writer.Write<uint8_t>(count);
|
183
|
-
prefix.Serialize(art, writer);
|
184
184
|
|
185
185
|
// write key values
|
186
186
|
for (idx_t i = 0; i < Node::NODE_4_CAPACITY; i++) {
|
@@ -196,10 +196,9 @@ BlockPointer Node4::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
196
196
|
return block_pointer;
|
197
197
|
}
|
198
198
|
|
199
|
-
void Node4::Deserialize(
|
199
|
+
void Node4::Deserialize(MetaBlockReader &reader) {
|
200
200
|
|
201
201
|
count = reader.Read<uint8_t>();
|
202
|
-
prefix.Deserialize(art, reader);
|
203
202
|
|
204
203
|
// read key values
|
205
204
|
for (idx_t i = 0; i < Node::NODE_4_CAPACITY; i++) {
|
@@ -1,7 +1,5 @@
|
|
1
1
|
#include "duckdb/execution/index/art/node48.hpp"
|
2
2
|
|
3
|
-
#include "duckdb/execution/index/art/art.hpp"
|
4
|
-
#include "duckdb/execution/index/art/node.hpp"
|
5
3
|
#include "duckdb/execution/index/art/node16.hpp"
|
6
4
|
#include "duckdb/execution/index/art/node256.hpp"
|
7
5
|
#include "duckdb/storage/meta_block_reader.hpp"
|
@@ -16,8 +14,6 @@ Node48 &Node48::New(ART &art, Node &node) {
|
|
16
14
|
auto &n48 = Node48::Get(art, node);
|
17
15
|
|
18
16
|
n48.count = 0;
|
19
|
-
n48.prefix.Initialize();
|
20
|
-
|
21
17
|
for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
|
22
18
|
n48.child_index[i] = Node::EMPTY_MARKER;
|
23
19
|
}
|
@@ -55,8 +51,6 @@ Node48 &Node48::GrowNode16(ART &art, Node &node48, Node &node16) {
|
|
55
51
|
auto &n48 = Node48::New(art, node48);
|
56
52
|
|
57
53
|
n48.count = n16.count;
|
58
|
-
n48.prefix.Move(n16.prefix);
|
59
|
-
|
60
54
|
for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
|
61
55
|
n48.child_index[i] = Node::EMPTY_MARKER;
|
62
56
|
}
|
@@ -82,8 +76,6 @@ Node48 &Node48::ShrinkNode256(ART &art, Node &node48, Node &node256) {
|
|
82
76
|
auto &n256 = Node256::Get(art, node256);
|
83
77
|
|
84
78
|
n48.count = 0;
|
85
|
-
n48.prefix.Move(n256.prefix);
|
86
|
-
|
87
79
|
for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
|
88
80
|
D_ASSERT(n48.count <= Node::NODE_48_CAPACITY);
|
89
81
|
if (n256.children[i].IsSet()) {
|
@@ -188,7 +180,6 @@ BlockPointer Node48::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
188
180
|
auto block_pointer = writer.GetBlockPointer();
|
189
181
|
writer.Write(NType::NODE_48);
|
190
182
|
writer.Write<uint8_t>(count);
|
191
|
-
prefix.Serialize(art, writer);
|
192
183
|
|
193
184
|
// write key values
|
194
185
|
for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
|
@@ -204,10 +195,9 @@ BlockPointer Node48::Serialize(ART &art, MetaBlockWriter &writer) {
|
|
204
195
|
return block_pointer;
|
205
196
|
}
|
206
197
|
|
207
|
-
void Node48::Deserialize(
|
198
|
+
void Node48::Deserialize(MetaBlockReader &reader) {
|
208
199
|
|
209
200
|
count = reader.Read<uint8_t>();
|
210
|
-
prefix.Deserialize(art, reader);
|
211
201
|
|
212
202
|
// read key values
|
213
203
|
for (idx_t i = 0; i < Node::NODE_256_CAPACITY; i++) {
|