duckdb 0.9.3-dev0.0 → 0.9.3-dev12.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/LICENSE +1 -1
- package/binding.gyp +32 -7
- package/package.json +1 -1
- package/src/connection.cpp +6 -6
- package/src/database.cpp +11 -10
- package/src/duckdb/extension/icu/icu-datefunc.cpp +22 -10
- package/src/duckdb/extension/icu/icu-datepart.cpp +42 -22
- package/src/duckdb/extension/icu/icu-datetrunc.cpp +40 -7
- package/src/duckdb/extension/icu/icu-strptime.cpp +14 -8
- package/src/duckdb/extension/icu/icu-table-range.cpp +1 -1
- package/src/duckdb/extension/icu/icu-timezone.cpp +43 -16
- package/src/duckdb/extension/icu/icu_extension.cpp +1 -1
- package/src/duckdb/extension/icu/include/icu-datefunc.hpp +3 -0
- package/src/duckdb/extension/icu/third_party/icu/stubdata/stubdata.cpp +1 -1
- package/src/duckdb/extension/json/buffered_json_reader.cpp +78 -62
- package/src/duckdb/extension/json/include/buffered_json_reader.hpp +11 -7
- package/src/duckdb/extension/json/include/json_common.hpp +0 -14
- package/src/duckdb/extension/json/include/json_deserializer.hpp +1 -0
- package/src/duckdb/extension/json/include/json_functions.hpp +1 -0
- package/src/duckdb/extension/json/include/json_scan.hpp +19 -5
- package/src/duckdb/extension/json/include/json_serializer.hpp +2 -1
- package/src/duckdb/extension/json/include/json_structure.hpp +12 -10
- package/src/duckdb/extension/json/json_common.cpp +1 -0
- package/src/duckdb/extension/json/json_deserializer.cpp +13 -0
- package/src/duckdb/extension/json/json_extension.cpp +3 -3
- package/src/duckdb/extension/json/json_functions/copy_json.cpp +8 -4
- package/src/duckdb/extension/json/json_functions/json_array_length.cpp +1 -1
- package/src/duckdb/extension/json/json_functions/json_contains.cpp +3 -3
- package/src/duckdb/extension/json/json_functions/json_create.cpp +53 -8
- package/src/duckdb/extension/json/json_functions/json_extract.cpp +10 -6
- package/src/duckdb/extension/json/json_functions/json_keys.cpp +1 -1
- package/src/duckdb/extension/json/json_functions/json_merge_patch.cpp +2 -3
- package/src/duckdb/extension/json/json_functions/json_serialize_plan.cpp +210 -0
- package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +22 -19
- package/src/duckdb/extension/json/json_functions/json_structure.cpp +71 -43
- package/src/duckdb/extension/json/json_functions/json_transform.cpp +105 -8
- package/src/duckdb/extension/json/json_functions/json_type.cpp +1 -1
- package/src/duckdb/extension/json/json_functions/json_valid.cpp +1 -1
- package/src/duckdb/extension/json/json_functions/read_json.cpp +43 -18
- package/src/duckdb/extension/json/json_functions/read_json_objects.cpp +1 -1
- package/src/duckdb/extension/json/json_functions.cpp +9 -5
- package/src/duckdb/extension/json/json_scan.cpp +147 -125
- package/src/duckdb/extension/json/json_serializer.cpp +9 -0
- package/src/duckdb/extension/json/serialize_json.cpp +6 -0
- package/src/duckdb/extension/parquet/column_reader.cpp +53 -18
- package/src/duckdb/extension/parquet/column_writer.cpp +29 -6
- package/src/duckdb/extension/parquet/include/column_reader.hpp +0 -1
- package/src/duckdb/extension/parquet/include/decode_utils.hpp +2 -2
- package/src/duckdb/extension/parquet/include/parquet_crypto.hpp +87 -0
- package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +4 -3
- package/src/duckdb/extension/parquet/include/parquet_decimal_utils.hpp +16 -3
- package/src/duckdb/extension/parquet/include/parquet_metadata.hpp +10 -0
- package/src/duckdb/extension/parquet/include/parquet_reader.hpp +34 -6
- package/src/duckdb/extension/parquet/include/parquet_statistics.hpp +3 -2
- package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -0
- package/src/duckdb/extension/parquet/include/parquet_writer.hpp +21 -1
- package/src/duckdb/extension/parquet/parquet_crypto.cpp +370 -0
- package/src/duckdb/extension/parquet/parquet_extension.cpp +254 -24
- package/src/duckdb/extension/parquet/parquet_metadata.cpp +204 -16
- package/src/duckdb/extension/parquet/parquet_reader.cpp +108 -34
- package/src/duckdb/extension/parquet/parquet_statistics.cpp +75 -30
- package/src/duckdb/extension/parquet/parquet_timestamp.cpp +15 -8
- package/src/duckdb/extension/parquet/parquet_writer.cpp +62 -10
- package/src/duckdb/extension/parquet/serialize_parquet.cpp +60 -0
- package/src/duckdb/src/catalog/catalog.cpp +23 -25
- package/src/duckdb/src/catalog/catalog_entry/column_dependency_manager.cpp +1 -0
- package/src/duckdb/src/catalog/catalog_entry/dependency/dependency_dependent_entry.cpp +31 -0
- package/src/duckdb/src/catalog/catalog_entry/dependency/dependency_entry.cpp +44 -0
- package/src/duckdb/src/catalog/catalog_entry/dependency/dependency_subject_entry.cpp +31 -0
- package/src/duckdb/src/catalog/catalog_entry/duck_index_entry.cpp +35 -10
- package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +22 -6
- package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +110 -33
- package/src/duckdb/src/catalog/catalog_entry/index_catalog_entry.cpp +33 -17
- package/src/duckdb/src/catalog/catalog_entry/macro_catalog_entry.cpp +16 -0
- package/src/duckdb/src/catalog/catalog_entry/schema_catalog_entry.cpp +7 -6
- package/src/duckdb/src/catalog/catalog_entry/sequence_catalog_entry.cpp +88 -14
- package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +6 -15
- package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +20 -20
- package/src/duckdb/src/catalog/catalog_entry/view_catalog_entry.cpp +4 -0
- package/src/duckdb/src/catalog/catalog_entry.cpp +29 -0
- package/src/duckdb/src/catalog/catalog_set.cpp +358 -343
- package/src/duckdb/src/catalog/catalog_transaction.cpp +4 -0
- package/src/duckdb/src/catalog/default/default_functions.cpp +13 -4
- package/src/duckdb/src/catalog/default/default_schemas.cpp +5 -1
- package/src/duckdb/src/catalog/default/default_views.cpp +6 -2
- package/src/duckdb/src/catalog/dependency_catalog_set.cpp +51 -0
- package/src/duckdb/src/catalog/dependency_manager.cpp +510 -114
- package/src/duckdb/src/catalog/duck_catalog.cpp +4 -4
- package/src/duckdb/src/common/adbc/adbc.cpp +73 -53
- package/src/duckdb/src/common/adbc/driver_manager.cpp +1101 -268
- package/src/duckdb/src/common/arrow/arrow_wrapper.cpp +20 -9
- package/src/duckdb/src/common/bind_helpers.cpp +1 -0
- package/src/duckdb/src/common/box_renderer.cpp +52 -1
- package/src/duckdb/src/common/compressed_file_system.cpp +1 -0
- package/src/duckdb/src/common/constants.cpp +0 -1
- package/src/duckdb/src/common/enum_util.cpp +522 -107
- package/src/duckdb/src/common/enums/catalog_type.cpp +64 -1
- package/src/duckdb/src/common/enums/compression_type.cpp +14 -0
- package/src/duckdb/src/common/enums/date_part_specifier.cpp +1 -0
- package/src/duckdb/src/common/enums/expression_type.cpp +4 -0
- package/src/duckdb/src/common/enums/file_compression_type.cpp +1 -0
- package/src/duckdb/src/common/enums/join_type.cpp +33 -0
- package/src/duckdb/src/common/enums/logical_operator_type.cpp +5 -3
- package/src/duckdb/src/common/enums/optimizer_type.cpp +9 -1
- package/src/duckdb/src/common/enums/physical_operator_type.cpp +8 -4
- package/src/duckdb/src/common/enums/statement_type.cpp +2 -2
- package/src/duckdb/src/common/error_data.cpp +113 -0
- package/src/duckdb/src/common/exception/binder_exception.cpp +47 -0
- package/src/duckdb/src/common/exception/catalog_exception.cpp +55 -0
- package/src/duckdb/src/common/exception/parser_exception.cpp +19 -0
- package/src/duckdb/src/common/exception.cpp +110 -121
- package/src/duckdb/src/common/exception_format_value.cpp +9 -1
- package/src/duckdb/src/common/extra_type_info.cpp +48 -0
- package/src/duckdb/src/common/file_system.cpp +12 -7
- package/src/duckdb/src/common/gzip_file_system.cpp +18 -18
- package/src/duckdb/src/common/hive_partitioning.cpp +5 -1
- package/src/duckdb/src/common/http_state.cpp +20 -3
- package/src/duckdb/src/common/local_file_system.cpp +214 -15
- package/src/duckdb/src/common/multi_file_reader.cpp +20 -7
- package/src/duckdb/src/common/operator/cast_operators.cpp +397 -414
- package/src/duckdb/src/common/operator/convert_to_string.cpp +4 -0
- package/src/duckdb/src/common/operator/string_cast.cpp +5 -0
- package/src/duckdb/src/common/progress_bar/progress_bar.cpp +61 -12
- package/src/duckdb/src/common/progress_bar/terminal_progress_bar_display.cpp +13 -4
- package/src/duckdb/src/common/radix_partitioning.cpp +1 -1
- package/src/duckdb/src/common/row_operations/row_aggregate.cpp +2 -1
- package/src/duckdb/src/common/row_operations/row_gather.cpp +7 -1
- package/src/duckdb/src/common/row_operations/row_heap_gather.cpp +78 -12
- package/src/duckdb/src/common/row_operations/row_heap_scatter.cpp +222 -61
- package/src/duckdb/src/common/row_operations/row_matcher.cpp +6 -1
- package/src/duckdb/src/common/row_operations/row_radix_scatter.cpp +51 -0
- package/src/duckdb/src/common/row_operations/row_scatter.cpp +8 -1
- package/src/duckdb/src/common/serializer/binary_deserializer.cpp +6 -0
- package/src/duckdb/src/common/serializer/binary_serializer.cpp +5 -0
- package/src/duckdb/src/common/serializer/serializer.cpp +19 -0
- package/src/duckdb/src/common/sort/comparators.cpp +126 -0
- package/src/duckdb/src/common/sort/partition_state.cpp +17 -17
- package/src/duckdb/src/common/sort/radix_sort.cpp +2 -1
- package/src/duckdb/src/common/sort/sort_state.cpp +10 -5
- package/src/duckdb/src/common/sort/sorted_block.cpp +7 -6
- package/src/duckdb/src/common/string_util.cpp +302 -24
- package/src/duckdb/src/common/tree_renderer.cpp +8 -6
- package/src/duckdb/src/common/types/cast_helpers.cpp +6 -0
- package/src/duckdb/src/common/types/column/column_data_allocator.cpp +1 -1
- package/src/duckdb/src/common/types/column/column_data_collection.cpp +58 -0
- package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +8 -1
- package/src/duckdb/src/common/types/data_chunk.cpp +9 -0
- package/src/duckdb/src/common/types/date.cpp +2 -2
- package/src/duckdb/src/common/types/hash.cpp +9 -1
- package/src/duckdb/src/common/types/hugeint.cpp +229 -51
- package/src/duckdb/src/common/types/hyperloglog.cpp +10 -3
- package/src/duckdb/src/common/types/interval.cpp +67 -12
- package/src/duckdb/src/common/types/list_segment.cpp +98 -4
- package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +11 -1
- package/src/duckdb/src/common/types/row/row_data_collection.cpp +1 -1
- package/src/duckdb/src/common/types/row/row_data_collection_scanner.cpp +2 -2
- package/src/duckdb/src/common/types/row/tuple_data_allocator.cpp +3 -2
- package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +63 -3
- package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +331 -127
- package/src/duckdb/src/common/types/time.cpp +47 -75
- package/src/duckdb/src/common/types/timestamp.cpp +16 -3
- package/src/duckdb/src/common/types/uhugeint.cpp +746 -0
- package/src/duckdb/src/common/types/validity_mask.cpp +6 -2
- package/src/duckdb/src/common/types/value.cpp +183 -27
- package/src/duckdb/src/common/types/vector.cpp +331 -30
- package/src/duckdb/src/common/types/vector_buffer.cpp +29 -1
- package/src/duckdb/src/common/types/vector_cache.cpp +22 -1
- package/src/duckdb/src/common/types.cpp +606 -90
- package/src/duckdb/src/common/value_operations/comparison_operations.cpp +21 -1
- package/src/duckdb/src/common/vector_operations/comparison_operators.cpp +5 -0
- package/src/duckdb/src/common/vector_operations/generators.cpp +2 -2
- package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +131 -2
- package/src/duckdb/src/common/vector_operations/vector_copy.cpp +26 -4
- package/src/duckdb/src/common/vector_operations/vector_hash.cpp +41 -0
- package/src/duckdb/src/common/vector_operations/vector_storage.cpp +7 -0
- package/src/duckdb/src/common/virtual_file_system.cpp +0 -1
- package/src/duckdb/src/core_functions/aggregate/distributive/approx_count.cpp +2 -1
- package/src/duckdb/src/core_functions/aggregate/distributive/arg_min_max.cpp +144 -56
- package/src/duckdb/src/core_functions/aggregate/distributive/bitagg.cpp +2 -0
- package/src/duckdb/src/core_functions/aggregate/distributive/bitstring_agg.cpp +27 -0
- package/src/duckdb/src/core_functions/aggregate/distributive/entropy.cpp +4 -3
- package/src/duckdb/src/core_functions/aggregate/distributive/kurtosis.cpp +25 -5
- package/src/duckdb/src/core_functions/aggregate/distributive/minmax.cpp +100 -3
- package/src/duckdb/src/core_functions/aggregate/distributive/string_agg.cpp +2 -1
- package/src/duckdb/src/core_functions/aggregate/holistic/approximate_quantile.cpp +9 -1
- package/src/duckdb/src/core_functions/aggregate/holistic/mode.cpp +83 -52
- package/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp +485 -289
- package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +3 -3
- package/src/duckdb/src/core_functions/aggregate/nested/histogram.cpp +24 -26
- package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +34 -37
- package/src/duckdb/src/core_functions/function_list.cpp +30 -1
- package/src/duckdb/src/core_functions/lambda_functions.cpp +416 -0
- package/src/duckdb/src/core_functions/scalar/array/array_functions.cpp +294 -0
- package/src/duckdb/src/core_functions/scalar/array/array_value.cpp +87 -0
- package/src/duckdb/src/core_functions/scalar/blob/create_sort_key.cpp +686 -0
- package/src/duckdb/src/core_functions/scalar/blob/encode.cpp +1 -0
- package/src/duckdb/src/core_functions/scalar/date/current.cpp +3 -3
- package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +295 -20
- package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +1 -0
- package/src/duckdb/src/core_functions/scalar/date/strftime.cpp +8 -7
- package/src/duckdb/src/core_functions/scalar/date/to_interval.cpp +84 -23
- package/src/duckdb/src/core_functions/scalar/generic/error.cpp +4 -4
- package/src/duckdb/src/core_functions/scalar/generic/least.cpp +7 -8
- package/src/duckdb/src/core_functions/scalar/generic/stats.cpp +1 -1
- package/src/duckdb/src/core_functions/scalar/generic/system_functions.cpp +17 -6
- package/src/duckdb/src/core_functions/scalar/list/array_slice.cpp +8 -0
- package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +28 -14
- package/src/duckdb/src/core_functions/scalar/list/list_filter.cpp +49 -0
- package/src/duckdb/src/core_functions/scalar/list/list_reduce.cpp +230 -0
- package/src/duckdb/src/core_functions/scalar/list/list_sort.cpp +85 -16
- package/src/duckdb/src/core_functions/scalar/list/list_transform.cpp +41 -0
- package/src/duckdb/src/core_functions/scalar/list/list_value.cpp +21 -2
- package/src/duckdb/src/core_functions/scalar/map/map.cpp +6 -5
- package/src/duckdb/src/core_functions/scalar/map/map_entries.cpp +2 -2
- package/src/duckdb/src/core_functions/scalar/map/map_from_entries.cpp +1 -2
- package/src/duckdb/src/core_functions/scalar/math/numeric.cpp +24 -4
- package/src/duckdb/src/core_functions/scalar/operators/bitwise.cpp +6 -0
- package/src/duckdb/src/core_functions/scalar/random/random.cpp +2 -2
- package/src/duckdb/src/core_functions/scalar/random/setseed.cpp +2 -2
- package/src/duckdb/src/core_functions/scalar/secret/which_secret.cpp +28 -0
- package/src/duckdb/src/core_functions/scalar/string/bar.cpp +9 -4
- package/src/duckdb/src/core_functions/scalar/string/format_bytes.cpp +7 -2
- package/src/duckdb/src/core_functions/scalar/string/hex.cpp +63 -4
- package/src/duckdb/src/core_functions/scalar/string/pad.cpp +2 -2
- package/src/duckdb/src/core_functions/scalar/string/parse_path.cpp +348 -0
- package/src/duckdb/src/core_functions/scalar/string/regexp_escape.cpp +22 -0
- package/src/duckdb/src/core_functions/scalar/string/string_split.cpp +6 -5
- package/src/duckdb/src/core_functions/scalar/struct/struct_insert.cpp +3 -3
- package/src/duckdb/src/core_functions/scalar/struct/struct_pack.cpp +1 -1
- package/src/duckdb/src/execution/aggregate_hashtable.cpp +9 -2
- package/src/duckdb/src/execution/column_binding_resolver.cpp +44 -10
- package/src/duckdb/src/execution/expression_executor/execute_between.cpp +4 -0
- package/src/duckdb/src/execution/expression_executor/execute_case.cpp +4 -0
- package/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +4 -0
- package/src/duckdb/src/execution/expression_executor.cpp +2 -1
- package/src/duckdb/src/execution/index/art/art.cpp +202 -53
- package/src/duckdb/src/execution/index/art/art_key.cpp +20 -27
- package/src/duckdb/src/execution/index/fixed_size_allocator.cpp +52 -17
- package/src/duckdb/src/execution/index/fixed_size_buffer.cpp +14 -8
- package/src/duckdb/src/execution/index/index_type_set.cpp +32 -0
- package/src/duckdb/src/execution/index/unknown_index.cpp +65 -0
- package/src/duckdb/src/execution/join_hashtable.cpp +151 -174
- package/src/duckdb/src/execution/nested_loop_join/nested_loop_join_inner.cpp +4 -0
- package/src/duckdb/src/execution/nested_loop_join/nested_loop_join_mark.cpp +4 -0
- package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +2 -1
- package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +82 -36
- package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +58 -32
- package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +35 -19
- package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer.cpp +90 -0
- package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_buffer_manager.cpp +124 -0
- package/src/duckdb/src/execution/operator/csv_scanner/buffer_manager/csv_file_handle.cpp +97 -0
- package/src/duckdb/src/execution/operator/csv_scanner/scanner/base_scanner.cpp +71 -0
- package/src/duckdb/src/execution/operator/csv_scanner/scanner/column_count_scanner.cpp +98 -0
- package/src/duckdb/src/execution/operator/csv_scanner/scanner/scanner_boundary.cpp +105 -0
- package/src/duckdb/src/execution/operator/csv_scanner/scanner/skip_scanner.cpp +63 -0
- package/src/duckdb/src/execution/operator/csv_scanner/scanner/string_value_scanner.cpp +1091 -0
- package/src/duckdb/src/execution/operator/csv_scanner/sniffer/csv_sniffer.cpp +124 -26
- package/src/duckdb/src/execution/operator/csv_scanner/sniffer/dialect_detection.cpp +117 -129
- package/src/duckdb/src/execution/operator/csv_scanner/sniffer/header_detection.cpp +46 -22
- package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_detection.cpp +83 -199
- package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_refinement.cpp +21 -122
- package/src/duckdb/src/execution/operator/csv_scanner/sniffer/type_replacement.cpp +18 -17
- package/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine.cpp +22 -0
- package/src/duckdb/src/execution/operator/csv_scanner/state_machine/csv_state_machine_cache.cpp +201 -0
- package/src/duckdb/src/execution/operator/csv_scanner/table_function/csv_file_scanner.cpp +221 -0
- package/src/duckdb/src/execution/operator/csv_scanner/table_function/global_csv_state.cpp +204 -0
- package/src/duckdb/src/execution/operator/csv_scanner/util/csv_error.cpp +186 -0
- package/src/duckdb/src/execution/operator/csv_scanner/util/csv_reader_options.cpp +532 -0
- package/src/duckdb/src/execution/operator/helper/physical_buffered_collector.cpp +85 -0
- package/src/duckdb/src/execution/operator/helper/physical_create_secret.cpp +21 -0
- package/src/duckdb/src/execution/operator/helper/physical_materialized_collector.cpp +1 -1
- package/src/duckdb/src/execution/operator/helper/physical_pragma.cpp +2 -2
- package/src/duckdb/src/execution/operator/helper/physical_reservoir_sample.cpp +34 -9
- package/src/duckdb/src/execution/operator/helper/physical_result_collector.cpp +10 -0
- package/src/duckdb/src/execution/operator/helper/physical_transaction.cpp +1 -0
- package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +25 -10
- package/src/duckdb/src/execution/operator/join/perfect_hash_join_executor.cpp +7 -8
- package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +1 -1
- package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +5 -2
- package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -1
- package/src/duckdb/src/execution/operator/join/physical_delim_join.cpp +5 -127
- package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +221 -61
- package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +18 -21
- package/src/duckdb/src/execution/operator/join/physical_join.cpp +10 -5
- package/src/duckdb/src/execution/operator/join/physical_left_delim_join.cpp +137 -0
- package/src/duckdb/src/execution/operator/join/physical_nested_loop_join.cpp +11 -4
- package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +2 -2
- package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +19 -4
- package/src/duckdb/src/execution/operator/join/physical_right_delim_join.cpp +121 -0
- package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +3 -2
- package/src/duckdb/src/execution/operator/persistent/physical_copy_database.cpp +59 -0
- package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +132 -92
- package/src/duckdb/src/execution/operator/persistent/physical_export.cpp +54 -54
- package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -1
- package/src/duckdb/src/execution/operator/projection/physical_unnest.cpp +4 -0
- package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +21 -3
- package/src/duckdb/src/execution/operator/schema/physical_alter.cpp +1 -0
- package/src/duckdb/src/execution/operator/schema/physical_attach.cpp +61 -43
- package/src/duckdb/src/execution/operator/schema/physical_create_art_index.cpp +15 -13
- package/src/duckdb/src/execution/operator/schema/physical_create_schema.cpp +1 -0
- package/src/duckdb/src/execution/operator/schema/physical_drop.cpp +10 -0
- package/src/duckdb/src/execution/operator/set/physical_cte.cpp +44 -90
- package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +3 -0
- package/src/duckdb/src/execution/operator/set/physical_union.cpp +8 -4
- package/src/duckdb/src/execution/physical_operator.cpp +3 -1
- package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +30 -143
- package/src/duckdb/src/execution/physical_plan/plan_copy_database.cpp +12 -0
- package/src/duckdb/src/execution/physical_plan/plan_copy_to_file.cpp +11 -4
- package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +8 -8
- package/src/duckdb/src/execution/physical_plan/plan_create_secret.cpp +11 -0
- package/src/duckdb/src/execution/physical_plan/plan_create_table.cpp +9 -8
- package/src/duckdb/src/execution/physical_plan/plan_cte.cpp +5 -3
- package/src/duckdb/src/execution/physical_plan/plan_delim_join.cpp +15 -6
- package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +1 -0
- package/src/duckdb/src/execution/physical_plan/plan_pragma.cpp +1 -1
- package/src/duckdb/src/execution/physical_plan/plan_recursive_cte.cpp +3 -1
- package/src/duckdb/src/execution/physical_plan/plan_set_operation.cpp +90 -12
- package/src/duckdb/src/execution/physical_plan/plan_window.cpp +67 -22
- package/src/duckdb/src/execution/physical_plan_generator.cpp +6 -3
- package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +163 -32
- package/src/duckdb/src/execution/reservoir_sample.cpp +112 -32
- package/src/duckdb/src/execution/window_executor.cpp +291 -26
- package/src/duckdb/src/execution/window_segment_tree.cpp +958 -114
- package/src/duckdb/src/function/aggregate/distributive/count.cpp +18 -16
- package/src/duckdb/src/function/aggregate/distributive/first.cpp +11 -4
- package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +303 -131
- package/src/duckdb/src/function/cast/array_casts.cpp +226 -0
- package/src/duckdb/src/function/cast/bit_cast.cpp +2 -0
- package/src/duckdb/src/function/cast/cast_function_set.cpp +13 -2
- package/src/duckdb/src/function/cast/decimal_cast.cpp +2 -0
- package/src/duckdb/src/function/cast/default_casts.cpp +4 -1
- package/src/duckdb/src/function/cast/list_casts.cpp +151 -6
- package/src/duckdb/src/function/cast/numeric_casts.cpp +4 -0
- package/src/duckdb/src/function/cast/string_cast.cpp +95 -5
- package/src/duckdb/src/function/cast/struct_cast.cpp +53 -19
- package/src/duckdb/src/function/cast/time_casts.cpp +23 -1
- package/src/duckdb/src/function/cast/union/from_struct.cpp +1 -0
- package/src/duckdb/src/function/cast/union_casts.cpp +4 -3
- package/src/duckdb/src/function/cast/vector_cast_helpers.cpp +8 -4
- package/src/duckdb/src/function/cast_rules.cpp +197 -31
- package/src/duckdb/src/function/compression_config.cpp +4 -0
- package/src/duckdb/src/function/function.cpp +15 -9
- package/src/duckdb/src/function/function_binder.cpp +80 -29
- package/src/duckdb/src/function/function_set.cpp +6 -6
- package/src/duckdb/src/function/pragma/pragma_functions.cpp +10 -8
- package/src/duckdb/src/function/pragma/pragma_queries.cpp +34 -38
- package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +12 -0
- package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +10 -1
- package/src/duckdb/src/function/scalar/list/list_concat.cpp +11 -1
- package/src/duckdb/src/function/scalar/list/list_extract.cpp +14 -3
- package/src/duckdb/src/function/scalar/list/list_resize.cpp +4 -0
- package/src/duckdb/src/function/scalar/list/list_select.cpp +176 -0
- package/src/duckdb/src/function/scalar/list/list_zip.cpp +165 -0
- package/src/duckdb/src/function/scalar/nested_functions.cpp +33 -0
- package/src/duckdb/src/function/scalar/operators/add.cpp +53 -6
- package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +48 -14
- package/src/duckdb/src/function/scalar/operators/multiply.cpp +9 -1
- package/src/duckdb/src/function/scalar/operators/subtract.cpp +19 -4
- package/src/duckdb/src/function/scalar/sequence/nextval.cpp +28 -55
- package/src/duckdb/src/function/scalar/strftime_format.cpp +242 -19
- package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -2
- package/src/duckdb/src/function/scalar/string/concat.cpp +16 -6
- package/src/duckdb/src/function/scalar/string/length.cpp +124 -24
- package/src/duckdb/src/function/scalar/string/regexp.cpp +27 -27
- package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +64 -15
- package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +4 -3
- package/src/duckdb/src/function/scalar_function.cpp +8 -7
- package/src/duckdb/src/function/table/arrow/arrow_duck_schema.cpp +12 -0
- package/src/duckdb/src/function/table/arrow.cpp +20 -27
- package/src/duckdb/src/function/table/arrow_conversion.cpp +433 -150
- package/src/duckdb/src/function/table/copy_csv.cpp +62 -62
- package/src/duckdb/src/function/table/range.cpp +6 -3
- package/src/duckdb/src/function/table/read_csv.cpp +107 -759
- package/src/duckdb/src/function/table/read_file.cpp +242 -0
- package/src/duckdb/src/function/table/sniff_csv.cpp +275 -0
- package/src/duckdb/src/function/table/system/duckdb_columns.cpp +15 -3
- package/src/duckdb/src/function/table/system/duckdb_databases.cpp +5 -0
- package/src/duckdb/src/function/table/system/duckdb_dependencies.cpp +9 -13
- package/src/duckdb/src/function/table/system/duckdb_functions.cpp +67 -14
- package/src/duckdb/src/function/table/system/duckdb_indexes.cpp +12 -15
- package/src/duckdb/src/function/table/system/duckdb_memory.cpp +63 -0
- package/src/duckdb/src/function/table/system/duckdb_optimizers.cpp +57 -0
- package/src/duckdb/src/function/table/system/duckdb_schemas.cpp +5 -0
- package/src/duckdb/src/function/table/system/duckdb_secrets.cpp +128 -0
- package/src/duckdb/src/function/table/system/duckdb_sequences.cpp +12 -6
- package/src/duckdb/src/function/table/system/duckdb_settings.cpp +0 -1
- package/src/duckdb/src/function/table/system/duckdb_tables.cpp +5 -0
- package/src/duckdb/src/function/table/system/duckdb_types.cpp +6 -0
- package/src/duckdb/src/function/table/system/duckdb_views.cpp +5 -0
- package/src/duckdb/src/function/table/system/pragma_table_info.cpp +166 -64
- package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -1
- package/src/duckdb/src/function/table/system_functions.cpp +3 -2
- package/src/duckdb/src/function/table/table_scan.cpp +50 -110
- package/src/duckdb/src/function/table/version/pragma_version.cpp +4 -44
- package/src/duckdb/src/function/table_function.cpp +2 -2
- package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +4 -3
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/dependency/dependency_dependent_entry.hpp +27 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/dependency/dependency_entry.hpp +66 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/dependency/dependency_subject_entry.hpp +27 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_index_entry.hpp +25 -5
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_schema_entry.hpp +3 -1
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +2 -1
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/index_catalog_entry.hpp +19 -5
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/scalar_macro_catalog_entry.hpp +2 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/schema_catalog_entry.hpp +1 -1
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/sequence_catalog_entry.hpp +26 -11
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_catalog_entry.hpp +1 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_macro_catalog_entry.hpp +2 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/type_catalog_entry.hpp +1 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/view_catalog_entry.hpp +2 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry.hpp +15 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_set.hpp +41 -49
- package/src/duckdb/src/include/duckdb/catalog/catalog_transaction.hpp +1 -0
- package/src/duckdb/src/include/duckdb/catalog/default/builtin_types/types.hpp +3 -1
- package/src/duckdb/src/include/duckdb/catalog/dependency.hpp +120 -8
- package/src/duckdb/src/include/duckdb/catalog/dependency_catalog_set.hpp +32 -0
- package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +2 -0
- package/src/duckdb/src/include/duckdb/catalog/dependency_manager.hpp +92 -12
- package/src/duckdb/src/include/duckdb/catalog/standard_entry.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/adbc/adbc-init.hpp +4 -2
- package/src/duckdb/src/include/duckdb/common/adbc/adbc.h +1153 -12
- package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +6 -6
- package/src/duckdb/src/include/duckdb/common/adbc/driver_manager.h +0 -2
- package/src/duckdb/src/include/duckdb/common/adbc/options.h +64 -0
- package/src/duckdb/src/include/duckdb/common/adbc/single_batch_array_stream.hpp +8 -0
- package/src/duckdb/src/include/duckdb/common/arrow/arrow.hpp +25 -6
- package/src/duckdb/src/include/duckdb/common/arrow/arrow_wrapper.hpp +3 -3
- package/src/duckdb/src/include/duckdb/common/arrow/result_arrow_wrapper.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/bit_utils.hpp +30 -0
- package/src/duckdb/src/include/duckdb/common/bitpacking.hpp +6 -6
- package/src/duckdb/src/include/duckdb/common/case_insensitive_map.hpp +10 -0
- package/src/duckdb/src/include/duckdb/common/constants.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/enum_util.hpp +75 -19
- package/src/duckdb/src/include/duckdb/common/enums/catalog_type.hpp +11 -1
- package/src/duckdb/src/include/duckdb/common/enums/compression_type.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/index_constraint_type.hpp +35 -0
- package/src/duckdb/src/include/duckdb/common/enums/join_type.hpp +16 -3
- package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +6 -5
- package/src/duckdb/src/include/duckdb/common/enums/memory_tag.hpp +32 -0
- package/src/duckdb/src/include/duckdb/common/enums/on_create_conflict.hpp +26 -0
- package/src/duckdb/src/include/duckdb/common/enums/optimizer_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/pending_execution_result.hpp +7 -1
- package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +9 -3
- package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +6 -5
- package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +3 -2
- package/src/duckdb/src/include/duckdb/common/enums/wal_type.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/error_data.hpp +72 -0
- package/src/duckdb/src/include/duckdb/common/exception/binder_exception.hpp +47 -0
- package/src/duckdb/src/include/duckdb/common/exception/catalog_exception.hpp +39 -0
- package/src/duckdb/src/include/duckdb/common/exception/conversion_exception.hpp +27 -0
- package/src/duckdb/src/include/duckdb/common/exception/http_exception.hpp +62 -0
- package/src/duckdb/src/include/duckdb/common/exception/list.hpp +6 -0
- package/src/duckdb/src/include/duckdb/common/exception/parser_exception.hpp +29 -0
- package/src/duckdb/src/include/duckdb/common/exception/transaction_exception.hpp +25 -0
- package/src/duckdb/src/include/duckdb/common/exception.hpp +52 -166
- package/src/duckdb/src/include/duckdb/common/exception_format_value.hpp +7 -4
- package/src/duckdb/src/include/duckdb/common/extra_type_info.hpp +53 -1
- package/src/duckdb/src/include/duckdb/common/helper.hpp +13 -3
- package/src/duckdb/src/include/duckdb/common/http_state.hpp +18 -4
- package/src/duckdb/src/include/duckdb/common/hugeint.hpp +5 -1
- package/src/duckdb/src/include/duckdb/common/limits.hpp +19 -1
- package/src/duckdb/src/include/duckdb/common/local_file_system.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +7 -2
- package/src/duckdb/src/include/duckdb/common/numeric_utils.hpp +16 -3
- package/src/duckdb/src/include/duckdb/common/operator/add.hpp +13 -2
- package/src/duckdb/src/include/duckdb/common/operator/cast_operators.hpp +114 -5
- package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +0 -4
- package/src/duckdb/src/include/duckdb/common/operator/convert_to_string.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/operator/decimal_cast_operators.hpp +29 -0
- package/src/duckdb/src/include/duckdb/common/operator/double_cast_operator.hpp +52 -0
- package/src/duckdb/src/include/duckdb/common/operator/integer_cast_operator.hpp +459 -0
- package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/operator/numeric_cast.hpp +136 -0
- package/src/duckdb/src/include/duckdb/common/operator/string_cast.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/operator/subtract.hpp +7 -1
- package/src/duckdb/src/include/duckdb/common/optional_idx.hpp +7 -5
- package/src/duckdb/src/include/duckdb/common/platform.h +53 -0
- package/src/duckdb/src/include/duckdb/common/progress_bar/display/terminal_progress_bar_display.hpp +5 -5
- package/src/duckdb/src/include/duckdb/common/progress_bar/progress_bar.hpp +22 -6
- package/src/duckdb/src/include/duckdb/common/radix.hpp +6 -0
- package/src/duckdb/src/include/duckdb/common/row_operations/row_operations.hpp +20 -6
- package/src/duckdb/src/include/duckdb/common/serializer/binary_deserializer.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/serializer/binary_serializer.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp +43 -4
- package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/serializer/serializer.hpp +15 -0
- package/src/duckdb/src/include/duckdb/common/sort/comparators.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +12 -2
- package/src/duckdb/src/include/duckdb/common/sort/sort.hpp +81 -0
- package/src/duckdb/src/include/duckdb/common/sort/sorted_block.hpp +0 -78
- package/src/duckdb/src/include/duckdb/common/string_util.hpp +23 -1
- package/src/duckdb/src/include/duckdb/common/type_util.hpp +5 -1
- package/src/duckdb/src/include/duckdb/common/types/cast_helpers.hpp +26 -3
- package/src/duckdb/src/include/duckdb/common/types/conflict_manager.hpp +8 -0
- package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/types/date.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/types/datetime.hpp +5 -3
- package/src/duckdb/src/include/duckdb/common/types/hash.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/types/hugeint.hpp +81 -15
- package/src/duckdb/src/include/duckdb/common/types/interval.hpp +57 -29
- package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +4 -2
- package/src/duckdb/src/include/duckdb/common/types/row/row_data_collection.hpp +2 -2
- package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +26 -22
- package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +7 -0
- package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +7 -5
- package/src/duckdb/src/include/duckdb/common/types/time.hpp +6 -2
- package/src/duckdb/src/include/duckdb/common/types/timestamp.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/types/uhugeint.hpp +216 -0
- package/src/duckdb/src/include/duckdb/common/types/validity_mask.hpp +18 -10
- package/src/duckdb/src/include/duckdb/common/types/value.hpp +31 -0
- package/src/duckdb/src/include/duckdb/common/types/vector.hpp +18 -2
- package/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp +22 -1
- package/src/duckdb/src/include/duckdb/common/types.hpp +151 -49
- package/src/duckdb/src/include/duckdb/common/uhugeint.hpp +81 -0
- package/src/duckdb/src/include/duckdb/common/vector_operations/aggregate_executor.hpp +70 -6
- package/src/duckdb/src/include/duckdb/common/vector_size.hpp +6 -6
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp +29 -2
- package/src/duckdb/src/include/duckdb/core_functions/lambda_functions.hpp +131 -0
- package/src/duckdb/src/include/duckdb/core_functions/scalar/array_functions.hpp +69 -0
- package/src/duckdb/src/include/duckdb/core_functions/scalar/blob_functions.hpp +9 -0
- package/src/duckdb/src/include/duckdb/core_functions/scalar/date_functions.hpp +40 -4
- package/src/duckdb/src/include/duckdb/core_functions/scalar/list_functions.hpp +42 -0
- package/src/duckdb/src/include/duckdb/core_functions/scalar/secret_functions.hpp +27 -0
- package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +56 -2
- package/src/duckdb/src/include/duckdb/core_functions/to_interval.hpp +29 -0
- package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/executor.hpp +11 -13
- package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +34 -19
- package/src/duckdb/src/include/duckdb/execution/index/fixed_size_allocator.hpp +18 -14
- package/src/duckdb/src/include/duckdb/execution/index/fixed_size_buffer.hpp +2 -1
- package/src/duckdb/src/include/duckdb/execution/index/index_type.hpp +57 -0
- package/src/duckdb/src/include/duckdb/execution/index/index_type_set.hpp +29 -0
- package/src/duckdb/src/include/duckdb/execution/index/unknown_index.hpp +65 -0
- package/src/duckdb/src/include/duckdb/execution/join_hashtable.hpp +35 -24
- package/src/duckdb/src/include/duckdb/execution/merge_sort_tree.hpp +630 -0
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_hash_aggregate.hpp +2 -0
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_window.hpp +3 -2
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/buffer_manager/csv_buffer.hpp +103 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/buffer_manager/csv_buffer_manager.hpp +74 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/buffer_manager/csv_file_handle.hpp +60 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/options/csv_option.hpp +155 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/options/csv_reader_options.hpp +163 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/options/state_machine_options.hpp +35 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner/base_scanner.hpp +228 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner/column_count_scanner.hpp +70 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner/scanner_boundary.hpp +93 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner/skip_scanner.hpp +60 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/scanner/string_value_scanner.hpp +197 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/sniffer/csv_sniffer.hpp +189 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/sniffer/quote_rules.hpp +21 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/state_machine/csv_state.hpp +30 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/state_machine/csv_state_machine.hpp +99 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/state_machine/csv_state_machine_cache.hpp +87 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/table_function/csv_file_scanner.hpp +70 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/table_function/global_csv_state.hpp +80 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/util/csv_casting.hpp +137 -0
- package/src/duckdb/src/include/duckdb/execution/operator/csv_scanner/util/csv_error.hpp +104 -0
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_batch_collector.hpp +0 -4
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_buffered_collector.hpp +37 -0
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_create_secret.hpp +38 -0
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_pragma.hpp +4 -7
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_reservoir_sample.hpp +6 -2
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_blockwise_nl_join.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_delim_join.hpp +5 -18
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_hash_join.hpp +14 -5
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_iejoin.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_join.hpp +2 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_left_delim_join.hpp +37 -0
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_nested_loop_join.hpp +1 -2
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_piecewise_merge_join.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_range_join.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_right_delim_join.hpp +37 -0
- package/src/duckdb/src/include/duckdb/execution/operator/order/physical_order.hpp +0 -1
- package/src/duckdb/src/include/duckdb/execution/operator/order/physical_top_n.hpp +0 -1
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_copy_database.hpp +35 -0
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_copy_to_file.hpp +8 -3
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_export.hpp +14 -0
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +1 -4
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_expression_scan.hpp +0 -1
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_cte.hpp +17 -12
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +4 -0
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_union.hpp +3 -1
- package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +2 -1
- package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +6 -2
- package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +3 -1
- package/src/duckdb/src/include/duckdb/execution/reservoir_sample.hpp +32 -18
- package/src/duckdb/src/include/duckdb/execution/task_error_manager.hpp +57 -0
- package/src/duckdb/src/include/duckdb/execution/window_executor.hpp +2 -0
- package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +101 -19
- package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +46 -14
- package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +6 -2
- package/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +1 -0
- package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +26 -1
- package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +3 -0
- package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +1 -0
- package/src/duckdb/src/include/duckdb/function/cast/vector_cast_helpers.hpp +7 -1
- package/src/duckdb/src/include/duckdb/function/compression/compression.hpp +10 -0
- package/src/duckdb/src/include/duckdb/function/copy_function.hpp +16 -4
- package/src/duckdb/src/include/duckdb/function/function.hpp +12 -7
- package/src/duckdb/src/include/duckdb/function/function_binder.hpp +15 -12
- package/src/duckdb/src/include/duckdb/function/function_serialization.hpp +4 -3
- package/src/duckdb/src/include/duckdb/function/macro_function.hpp +3 -3
- package/src/duckdb/src/include/duckdb/function/pragma/pragma_functions.hpp +4 -1
- package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +3 -0
- package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +21 -1
- package/src/duckdb/src/include/duckdb/function/scalar/sequence_functions.hpp +22 -0
- package/src/duckdb/src/include/duckdb/function/scalar/strftime_format.hpp +16 -2
- package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +22 -8
- package/src/duckdb/src/include/duckdb/function/table/arrow/arrow_duck_schema.hpp +6 -0
- package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +35 -3
- package/src/duckdb/src/include/duckdb/function/table/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/function/table/range.hpp +12 -0
- package/src/duckdb/src/include/duckdb/function/table/read_csv.hpp +14 -16
- package/src/duckdb/src/include/duckdb/function/table/system_functions.hpp +12 -8
- package/src/duckdb/src/include/duckdb/function/table/table_scan.hpp +0 -2
- package/src/duckdb/src/include/duckdb/function/table_function.hpp +8 -3
- package/src/duckdb/src/include/duckdb/main/appender.hpp +3 -1
- package/src/duckdb/src/include/duckdb/main/attached_database.hpp +3 -2
- package/src/duckdb/src/include/duckdb/main/buffered_data/buffered_data.hpp +89 -0
- package/src/duckdb/src/include/duckdb/main/buffered_data/simple_buffered_data.hpp +53 -0
- package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -1
- package/src/duckdb/src/include/duckdb/main/capi/cast/generic.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/chunk_scan_state/query_result.hpp +4 -4
- package/src/duckdb/src/include/duckdb/main/chunk_scan_state.hpp +3 -3
- package/src/duckdb/src/include/duckdb/main/client_config.hpp +8 -10
- package/src/duckdb/src/include/duckdb/main/client_context.hpp +22 -23
- package/src/duckdb/src/include/duckdb/main/client_context_state.hpp +37 -0
- package/src/duckdb/src/include/duckdb/main/client_data.hpp +1 -7
- package/src/duckdb/src/include/duckdb/main/config.hpp +24 -7
- package/src/duckdb/src/include/duckdb/main/connection.hpp +8 -1
- package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +17 -26
- package/src/duckdb/src/include/duckdb/main/database.hpp +4 -2
- package/src/duckdb/src/include/duckdb/main/database_manager.hpp +39 -7
- package/src/duckdb/src/include/duckdb/main/database_path_and_type.hpp +5 -4
- package/src/duckdb/src/include/duckdb/main/error_manager.hpp +4 -1
- package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +203 -197
- package/src/duckdb/src/include/duckdb/main/extension_helper.hpp +42 -16
- package/src/duckdb/src/include/duckdb/main/extension_util.hpp +8 -1
- package/src/duckdb/src/include/duckdb/main/materialized_query_result.hpp +1 -1
- package/src/duckdb/src/include/duckdb/main/pending_query_result.hpp +5 -2
- package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +4 -4
- package/src/duckdb/src/include/duckdb/main/prepared_statement_data.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/query_profiler.hpp +0 -32
- package/src/duckdb/src/include/duckdb/main/query_result.hpp +13 -12
- package/src/duckdb/src/include/duckdb/main/relation/read_csv_relation.hpp +6 -6
- package/src/duckdb/src/include/duckdb/main/relation/setop_relation.hpp +3 -1
- package/src/duckdb/src/include/duckdb/main/secret/secret.hpp +206 -0
- package/src/duckdb/src/include/duckdb/main/secret/secret_manager.hpp +211 -0
- package/src/duckdb/src/include/duckdb/main/secret/secret_storage.hpp +164 -0
- package/src/duckdb/src/include/duckdb/main/settings.hpp +52 -13
- package/src/duckdb/src/include/duckdb/main/stream_query_result.hpp +9 -1
- package/src/duckdb/src/include/duckdb/optimizer/deliminator.hpp +4 -1
- package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/join_node.hpp +1 -1
- package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +2 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph_manager.hpp +3 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/relation_statistics_helper.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parallel/event.hpp +2 -2
- package/src/duckdb/src/include/duckdb/parallel/meta_pipeline.hpp +14 -22
- package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +20 -0
- package/src/duckdb/src/include/duckdb/parallel/pipeline_executor.hpp +3 -5
- package/src/duckdb/src/include/duckdb/parallel/task.hpp +7 -0
- package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +10 -4
- package/src/duckdb/src/include/duckdb/parser/base_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/column_definition.hpp +8 -1
- package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +11 -4
- package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +16 -9
- package/src/duckdb/src/include/duckdb/parser/expression/lambdaref_expression.hpp +47 -0
- package/src/duckdb/src/include/duckdb/parser/expression/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +29 -2
- package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +2 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +47 -2
- package/src/duckdb/src/include/duckdb/parser/parsed_data/attach_info.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/bound_pragma_info.hpp +29 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/comment_on_info.hpp +45 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_index_info.hpp +21 -22
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_info.hpp +5 -11
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_schema_info.hpp +23 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_secret_info.hpp +47 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_info.hpp +3 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_type_info.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_view_info.hpp +4 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/drop_info.hpp +6 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/extra_drop_info.hpp +66 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/parse_info.hpp +3 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/pragma_info.hpp +8 -4
- package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +1 -3
- package/src/duckdb/src/include/duckdb/parser/parser_extension.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/qualified_name.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parser/query_error_context.hpp +5 -22
- package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/statement/copy_database_statement.hpp +40 -0
- package/src/duckdb/src/include/duckdb/parser/statement/list.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parser/statement/set_statement.hpp +4 -3
- package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -2
- package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/showref.hpp +47 -0
- package/src/duckdb/src/include/duckdb/parser/tableref.hpp +2 -1
- package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -1
- package/src/duckdb/src/include/duckdb/parser/transformer.hpp +20 -3
- package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +5 -1
- package/src/duckdb/src/include/duckdb/planner/binder.hpp +24 -27
- package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_cast_expression.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_comparison_expression.hpp +4 -1
- package/src/duckdb/src/include/duckdb/planner/expression/bound_function_expression.hpp +2 -1
- package/src/duckdb/src/include/duckdb/planner/expression/bound_lambda_expression.hpp +4 -2
- package/src/duckdb/src/include/duckdb/planner/expression/bound_lambdaref_expression.hpp +5 -6
- package/src/duckdb/src/include/duckdb/planner/expression/bound_window_expression.hpp +11 -0
- package/src/duckdb/src/include/duckdb/planner/expression.hpp +2 -1
- package/src/duckdb/src/include/duckdb/planner/expression_binder/column_alias_binder.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/expression_binder/index_binder.hpp +3 -2
- package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +2 -1
- package/src/duckdb/src/include/duckdb/planner/expression_binder/table_function_binder.hpp +2 -1
- package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +65 -22
- package/src/duckdb/src/include/duckdb/planner/filter/struct_filter.hpp +41 -0
- package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +2 -1
- package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +2 -1
- package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +2 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_copy_database.hpp +45 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_copy_to_file.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_create_secret.hpp +43 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +3 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_pragma.hpp +5 -10
- package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +2 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_set_operation.hpp +11 -4
- package/src/duckdb/src/include/duckdb/planner/parsed_data/bound_create_table_info.hpp +3 -3
- package/src/duckdb/src/include/duckdb/planner/pragma_handler.hpp +1 -1
- package/src/duckdb/src/include/duckdb/planner/query_node/bound_set_operation_node.hpp +2 -0
- package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_cte_scan.hpp +29 -0
- package/src/duckdb/src/include/duckdb/planner/table_binding.hpp +9 -7
- package/src/duckdb/src/include/duckdb/planner/table_filter.hpp +2 -1
- package/src/duckdb/src/include/duckdb/planner/tableref/bound_dummytableref.hpp +3 -2
- package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +9 -5
- package/src/duckdb/src/include/duckdb/storage/buffer/buffer_pool.hpp +23 -6
- package/src/duckdb/src/include/duckdb/storage/buffer/temporary_file_information.hpp +7 -0
- package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +11 -4
- package/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp +0 -3
- package/src/duckdb/src/include/duckdb/storage/checkpoint/string_checkpoint_state.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +7 -7
- package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/compression/alp/algorithm/alp.hpp +408 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_analyze.hpp +173 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_compress.hpp +283 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_constants.hpp +134 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_fetch.hpp +42 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_scan.hpp +244 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alp/alp_utils.hpp +103 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alprd/algorithm/alprd.hpp +235 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_analyze.hpp +134 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_compress.hpp +301 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_constants.hpp +35 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_fetch.hpp +41 -0
- package/src/duckdb/src/include/duckdb/storage/compression/alprd/alprd_scan.hpp +252 -0
- package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_analyze.hpp +7 -103
- package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +5 -234
- package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_analyze.hpp +7 -107
- package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +5 -184
- package/src/duckdb/src/include/duckdb/storage/data_table.hpp +12 -17
- package/src/duckdb/src/include/duckdb/storage/database_size.hpp +1 -0
- package/src/duckdb/src/include/duckdb/storage/index.hpp +40 -42
- package/src/duckdb/src/include/duckdb/storage/index_storage_info.hpp +77 -0
- package/src/duckdb/src/include/duckdb/storage/metadata/metadata_manager.hpp +6 -2
- package/src/duckdb/src/include/duckdb/storage/object_cache.hpp +0 -1
- package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +12 -6
- package/src/duckdb/src/include/duckdb/storage/segment/uncompressed.hpp +8 -3
- package/src/duckdb/src/include/duckdb/storage/standard_buffer_manager.hpp +17 -17
- package/src/duckdb/src/include/duckdb/storage/statistics/array_stats.hpp +40 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +12 -3
- package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +3 -0
- package/src/duckdb/src/include/duckdb/storage/storage_extension.hpp +3 -2
- package/src/duckdb/src/include/duckdb/storage/storage_info.hpp +49 -24
- package/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +8 -4
- package/src/duckdb/src/include/duckdb/storage/table/array_column_data.hpp +67 -0
- package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +3 -3
- package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +1 -0
- package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +1 -2
- package/src/duckdb/src/include/duckdb/storage/table/data_table_info.hpp +8 -3
- package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +4 -2
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +7 -0
- package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +12 -1
- package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table/struct_column_data.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table/table_index_list.hpp +16 -12
- package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +4 -0
- package/src/duckdb/src/include/duckdb/storage/table_storage_info.hpp +6 -9
- package/src/duckdb/src/include/duckdb/storage/temporary_memory_manager.hpp +119 -0
- package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +13 -55
- package/src/duckdb/src/include/duckdb/transaction/duck_transaction.hpp +1 -1
- package/src/duckdb/src/include/duckdb/transaction/duck_transaction_manager.hpp +4 -5
- package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -2
- package/src/duckdb/src/include/duckdb/transaction/meta_transaction.hpp +6 -3
- package/src/duckdb/src/include/duckdb/transaction/transaction_context.hpp +4 -4
- package/src/duckdb/src/include/duckdb/transaction/transaction_manager.hpp +3 -3
- package/src/duckdb/src/include/duckdb/verification/fetch_row_verifier.hpp +25 -0
- package/src/duckdb/src/include/duckdb/verification/statement_verifier.hpp +5 -0
- package/src/duckdb/src/include/duckdb.h +571 -143
- package/src/duckdb/src/main/appender.cpp +17 -2
- package/src/duckdb/src/main/attached_database.cpp +24 -12
- package/src/duckdb/src/main/buffered_data/simple_buffered_data.cpp +96 -0
- package/src/duckdb/src/main/capi/appender-c.cpp +42 -3
- package/src/duckdb/src/main/capi/arrow-c.cpp +32 -9
- package/src/duckdb/src/main/capi/datetime-c.cpp +22 -0
- package/src/duckdb/src/main/capi/duckdb-c.cpp +14 -4
- package/src/duckdb/src/main/capi/duckdb_value-c.cpp +66 -2
- package/src/duckdb/src/main/capi/helper-c.cpp +76 -2
- package/src/duckdb/src/main/capi/hugeint-c.cpp +23 -0
- package/src/duckdb/src/main/capi/logical_types-c.cpp +27 -3
- package/src/duckdb/src/main/capi/pending-c.cpp +43 -9
- package/src/duckdb/src/main/capi/prepared-c.cpp +38 -2
- package/src/duckdb/src/main/capi/result-c.cpp +54 -3
- package/src/duckdb/src/main/capi/table_function-c.cpp +4 -4
- package/src/duckdb/src/main/capi/value-c.cpp +10 -0
- package/src/duckdb/src/main/chunk_scan_state/query_result.cpp +3 -3
- package/src/duckdb/src/main/client_context.cpp +259 -250
- package/src/duckdb/src/main/client_data.cpp +0 -1
- package/src/duckdb/src/main/client_verify.cpp +26 -8
- package/src/duckdb/src/main/config.cpp +34 -13
- package/src/duckdb/src/main/connection.cpp +27 -6
- package/src/duckdb/src/main/connection_manager.cpp +54 -0
- package/src/duckdb/src/main/database.cpp +44 -39
- package/src/duckdb/src/main/database_manager.cpp +106 -8
- package/src/duckdb/src/main/database_path_and_type.cpp +27 -8
- package/src/duckdb/src/main/db_instance_cache.cpp +4 -4
- package/src/duckdb/src/main/error_manager.cpp +12 -3
- package/src/duckdb/src/main/extension/extension_alias.cpp +2 -2
- package/src/duckdb/src/main/extension/extension_helper.cpp +15 -16
- package/src/duckdb/src/main/extension/extension_install.cpp +33 -24
- package/src/duckdb/src/main/extension/extension_load.cpp +22 -21
- package/src/duckdb/src/main/extension/extension_util.cpp +12 -0
- package/src/duckdb/src/main/materialized_query_result.cpp +1 -1
- package/src/duckdb/src/main/pending_query_result.cpp +25 -8
- package/src/duckdb/src/main/prepared_statement.cpp +5 -5
- package/src/duckdb/src/main/prepared_statement_data.cpp +8 -1
- package/src/duckdb/src/main/query_profiler.cpp +11 -11
- package/src/duckdb/src/main/query_result.cpp +32 -6
- package/src/duckdb/src/main/relation/cross_product_relation.cpp +1 -1
- package/src/duckdb/src/main/relation/join_relation.cpp +2 -2
- package/src/duckdb/src/main/relation/read_csv_relation.cpp +38 -32
- package/src/duckdb/src/main/relation/setop_relation.cpp +5 -3
- package/src/duckdb/src/main/relation.cpp +5 -5
- package/src/duckdb/src/main/secret/secret.cpp +135 -0
- package/src/duckdb/src/main/secret/secret_manager.cpp +634 -0
- package/src/duckdb/src/main/secret/secret_storage.cpp +233 -0
- package/src/duckdb/src/main/settings/settings.cpp +133 -38
- package/src/duckdb/src/main/stream_query_result.cpp +53 -14
- package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +6 -0
- package/src/duckdb/src/optimizer/cse_optimizer.cpp +1 -1
- package/src/duckdb/src/optimizer/deliminator.cpp +136 -14
- package/src/duckdb/src/optimizer/filter_combiner.cpp +72 -26
- package/src/duckdb/src/optimizer/filter_pushdown.cpp +3 -0
- package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +2 -1
- package/src/duckdb/src/optimizer/join_order/cost_model.cpp +0 -1
- package/src/duckdb/src/optimizer/join_order/join_node.cpp +4 -0
- package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +3 -6
- package/src/duckdb/src/optimizer/join_order/join_relation_set.cpp +20 -0
- package/src/duckdb/src/optimizer/join_order/query_graph_manager.cpp +71 -40
- package/src/duckdb/src/optimizer/join_order/relation_manager.cpp +12 -3
- package/src/duckdb/src/optimizer/join_order/relation_statistics_helper.cpp +77 -3
- package/src/duckdb/src/optimizer/pushdown/pushdown_projection.cpp +7 -7
- package/src/duckdb/src/optimizer/pushdown/pushdown_semi_anti_join.cpp +56 -0
- package/src/duckdb/src/optimizer/remove_unused_columns.cpp +21 -0
- package/src/duckdb/src/optimizer/rule/date_part_simplification.cpp +2 -2
- package/src/duckdb/src/optimizer/rule/move_constants.cpp +15 -10
- package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +70 -0
- package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +17 -5
- package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +1 -0
- package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +1 -0
- package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +1 -2
- package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +22 -9
- package/src/duckdb/src/optimizer/statistics/operator/propagate_window.cpp +28 -4
- package/src/duckdb/src/optimizer/unnest_rewriter.cpp +12 -7
- package/src/duckdb/src/parallel/event.cpp +2 -2
- package/src/duckdb/src/parallel/executor.cpp +114 -81
- package/src/duckdb/src/parallel/executor_task.cpp +2 -4
- package/src/duckdb/src/parallel/meta_pipeline.cpp +28 -29
- package/src/duckdb/src/parallel/pipeline.cpp +41 -41
- package/src/duckdb/src/parallel/pipeline_event.cpp +2 -4
- package/src/duckdb/src/parallel/pipeline_executor.cpp +13 -75
- package/src/duckdb/src/parallel/task_scheduler.cpp +22 -13
- package/src/duckdb/src/parser/column_definition.cpp +22 -4
- package/src/duckdb/src/parser/column_list.cpp +2 -1
- package/src/duckdb/src/parser/expression/function_expression.cpp +1 -1
- package/src/duckdb/src/parser/expression/lambda_expression.cpp +51 -0
- package/src/duckdb/src/parser/expression/lambdaref_expression.cpp +59 -0
- package/src/duckdb/src/parser/expression/window_expression.cpp +9 -1
- package/src/duckdb/src/parser/parsed_data/alter_table_info.cpp +40 -0
- package/src/duckdb/src/parser/parsed_data/attach_info.cpp +1 -0
- package/src/duckdb/src/parser/parsed_data/comment_on_info.cpp +19 -0
- package/src/duckdb/src/parser/parsed_data/create_index_info.cpp +11 -9
- package/src/duckdb/src/parser/parsed_data/create_info.cpp +1 -0
- package/src/duckdb/src/parser/parsed_data/create_secret_info.cpp +22 -0
- package/src/duckdb/src/parser/parsed_data/create_table_info.cpp +17 -0
- package/src/duckdb/src/parser/parsed_data/create_type_info.cpp +19 -0
- package/src/duckdb/src/parser/parsed_data/create_view_info.cpp +13 -9
- package/src/duckdb/src/parser/parsed_data/drop_info.cpp +8 -9
- package/src/duckdb/src/parser/parsed_data/extra_drop_info.cpp +16 -0
- package/src/duckdb/src/parser/parsed_expression_iterator.cpp +3 -1
- package/src/duckdb/src/parser/parser.cpp +14 -8
- package/src/duckdb/src/parser/query_error_context.cpp +12 -13
- package/src/duckdb/src/parser/query_node/select_node.cpp +5 -1
- package/src/duckdb/src/parser/query_node/set_operation_node.cpp +8 -13
- package/src/duckdb/src/parser/statement/copy_database_statement.cpp +41 -0
- package/src/duckdb/src/parser/statement/set_statement.cpp +5 -1
- package/src/duckdb/src/parser/tableref/basetableref.cpp +1 -0
- package/src/duckdb/src/parser/tableref/showref.cpp +47 -0
- package/src/duckdb/src/parser/transform/constraint/transform_constraint.cpp +6 -2
- package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -0
- package/src/duckdb/src/parser/transform/expression/transform_boolean_test.cpp +30 -15
- package/src/duckdb/src/parser/transform/expression/transform_case.cpp +1 -0
- package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +3 -2
- package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +34 -4
- package/src/duckdb/src/parser/transform/expression/transform_function.cpp +26 -12
- package/src/duckdb/src/parser/transform/expression/transform_grouping_function.cpp +1 -1
- package/src/duckdb/src/parser/transform/expression/transform_interval.cpp +34 -5
- package/src/duckdb/src/parser/transform/expression/transform_is_null.cpp +3 -1
- package/src/duckdb/src/parser/transform/expression/transform_lambda.cpp +3 -1
- package/src/duckdb/src/parser/transform/expression/transform_multi_assign_reference.cpp +3 -3
- package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +3 -3
- package/src/duckdb/src/parser/transform/expression/transform_positional_reference.cpp +1 -1
- package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +13 -13
- package/src/duckdb/src/parser/transform/helpers/nodetype_to_string.cpp +2 -0
- package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +1 -1
- package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +32 -1
- package/src/duckdb/src/parser/transform/statement/transform_alter_table.cpp +1 -1
- package/src/duckdb/src/parser/transform/statement/transform_attach.cpp +1 -0
- package/src/duckdb/src/parser/transform/statement/transform_comment_on.cpp +108 -0
- package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +45 -37
- package/src/duckdb/src/parser/transform/statement/transform_copy_database.cpp +29 -0
- package/src/duckdb/src/parser/transform/statement/transform_create_index.cpp +5 -14
- package/src/duckdb/src/parser/transform/statement/transform_create_table.cpp +0 -1
- package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +1 -1
- package/src/duckdb/src/parser/transform/statement/transform_drop.cpp +25 -6
- package/src/duckdb/src/parser/transform/statement/transform_import.cpp +2 -1
- package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +6 -14
- package/src/duckdb/src/parser/transform/statement/transform_secret.cpp +103 -0
- package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -1
- package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +4 -8
- package/src/duckdb/src/parser/transform/statement/transform_set.cpp +18 -5
- package/src/duckdb/src/parser/transform/statement/transform_show.cpp +14 -41
- package/src/duckdb/src/parser/transform/statement/transform_show_select.cpp +13 -6
- package/src/duckdb/src/parser/transform/statement/transform_use.cpp +3 -1
- package/src/duckdb/src/parser/transform/tableref/transform_base_tableref.cpp +1 -1
- package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +1 -2
- package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +6 -5
- package/src/duckdb/src/parser/transform/tableref/transform_table_function.cpp +1 -1
- package/src/duckdb/src/parser/transformer.cpp +22 -0
- package/src/duckdb/src/planner/bind_context.cpp +23 -14
- package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +15 -14
- package/src/duckdb/src/planner/binder/expression/bind_between_expression.cpp +20 -9
- package/src/duckdb/src/planner/binder/expression/bind_case_expression.cpp +12 -7
- package/src/duckdb/src/planner/binder/expression/bind_cast_expression.cpp +4 -4
- package/src/duckdb/src/planner/binder/expression/bind_collate_expression.cpp +3 -3
- package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +279 -195
- package/src/duckdb/src/planner/binder/expression/bind_comparison_expression.cpp +103 -17
- package/src/duckdb/src/planner/binder/expression/bind_conjunction_expression.cpp +3 -3
- package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +91 -68
- package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +116 -84
- package/src/duckdb/src/planner/binder/expression/bind_macro_expression.cpp +85 -15
- package/src/duckdb/src/planner/binder/expression/bind_operator_expression.cpp +68 -31
- package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +7 -7
- package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +11 -7
- package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +42 -19
- package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +38 -16
- package/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +16 -7
- package/src/duckdb/src/planner/binder/query_node/bind_recursive_cte_node.cpp +3 -0
- package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +83 -12
- package/src/duckdb/src/planner/binder/query_node/bind_setop_node.cpp +28 -37
- package/src/duckdb/src/planner/binder/query_node/bind_table_macro_node.cpp +3 -4
- package/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +2 -2
- package/src/duckdb/src/planner/binder/query_node/plan_recursive_cte_node.cpp +3 -3
- package/src/duckdb/src/planner/binder/query_node/plan_setop.cpp +7 -5
- package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +10 -0
- package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +48 -50
- package/src/duckdb/src/planner/binder/statement/bind_copy_database.cpp +187 -0
- package/src/duckdb/src/planner/binder/statement/bind_create.cpp +38 -22
- package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +8 -15
- package/src/duckdb/src/planner/binder/statement/bind_drop.cpp +6 -1
- package/src/duckdb/src/planner/binder/statement/bind_export.cpp +2 -2
- package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -10
- package/src/duckdb/src/planner/binder/statement/bind_pragma.cpp +37 -13
- package/src/duckdb/src/planner/binder/statement/bind_set.cpp +8 -2
- package/src/duckdb/src/planner/binder/statement/bind_simple.cpp +2 -0
- package/src/duckdb/src/planner/binder/statement/bind_summarize.cpp +29 -14
- package/src/duckdb/src/planner/binder/statement/bind_vacuum.cpp +1 -1
- package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +16 -6
- package/src/duckdb/src/planner/binder/tableref/bind_expressionlistref.cpp +11 -4
- package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +1 -1
- package/src/duckdb/src/planner/binder/tableref/bind_named_parameters.cpp +2 -2
- package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +18 -17
- package/src/duckdb/src/planner/binder/tableref/bind_showref.cpp +85 -0
- package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -17
- package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -9
- package/src/duckdb/src/planner/binder.cpp +31 -26
- package/src/duckdb/src/planner/bound_result_modifier.cpp +24 -0
- package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +1 -1
- package/src/duckdb/src/planner/expression/bound_cast_expression.cpp +10 -1
- package/src/duckdb/src/planner/expression/bound_function_expression.cpp +20 -4
- package/src/duckdb/src/planner/expression/bound_lambdaref_expression.cpp +9 -10
- package/src/duckdb/src/planner/expression/bound_window_expression.cpp +65 -3
- package/src/duckdb/src/planner/expression.cpp +15 -5
- package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +5 -6
- package/src/duckdb/src/planner/expression_binder/check_binder.cpp +9 -8
- package/src/duckdb/src/planner/expression_binder/column_alias_binder.cpp +10 -7
- package/src/duckdb/src/planner/expression_binder/having_binder.cpp +9 -4
- package/src/duckdb/src/planner/expression_binder/index_binder.cpp +0 -25
- package/src/duckdb/src/planner/expression_binder/order_binder.cpp +8 -11
- package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -2
- package/src/duckdb/src/planner/expression_binder/table_function_binder.cpp +15 -8
- package/src/duckdb/src/planner/expression_binder/where_binder.cpp +3 -4
- package/src/duckdb/src/planner/expression_binder.cpp +51 -25
- package/src/duckdb/src/planner/expression_iterator.cpp +2 -1
- package/src/duckdb/src/planner/filter/constant_filter.cpp +1 -0
- package/src/duckdb/src/planner/filter/struct_filter.cpp +33 -0
- package/src/duckdb/src/planner/joinside.cpp +1 -1
- package/src/duckdb/src/planner/logical_operator.cpp +2 -1
- package/src/duckdb/src/planner/operator/logical_copy_database.cpp +32 -0
- package/src/duckdb/src/planner/operator/logical_copy_to_file.cpp +13 -4
- package/src/duckdb/src/planner/operator/logical_create_table.cpp +2 -0
- package/src/duckdb/src/planner/operator/logical_get.cpp +4 -1
- package/src/duckdb/src/planner/operator/logical_join.cpp +8 -0
- package/src/duckdb/src/planner/planner.cpp +24 -23
- package/src/duckdb/src/planner/pragma_handler.cpp +10 -19
- package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +99 -6
- package/src/duckdb/src/planner/subquery/rewrite_cte_scan.cpp +36 -0
- package/src/duckdb/src/planner/table_binding.cpp +14 -12
- package/src/duckdb/src/storage/buffer/block_handle.cpp +12 -10
- package/src/duckdb/src/storage/buffer/block_manager.cpp +1 -1
- package/src/duckdb/src/storage/buffer/buffer_pool.cpp +25 -9
- package/src/duckdb/src/storage/buffer/buffer_pool_reservation.cpp +4 -3
- package/src/duckdb/src/storage/buffer_manager.cpp +14 -3
- package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +0 -8
- package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +15 -7
- package/src/duckdb/src/storage/checkpoint/write_overflow_strings_to_disk.cpp +1 -1
- package/src/duckdb/src/storage/checkpoint_manager.cpp +94 -41
- package/src/duckdb/src/storage/compression/alp/alp.cpp +57 -0
- package/src/duckdb/src/storage/compression/alp/alp_constants.cpp +13 -0
- package/src/duckdb/src/storage/compression/alprd.cpp +57 -0
- package/src/duckdb/src/storage/compression/bitpacking.cpp +86 -55
- package/src/duckdb/src/storage/compression/bitpacking_hugeint.cpp +41 -41
- package/src/duckdb/src/storage/compression/dictionary_compression.cpp +1 -3
- package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +2 -0
- package/src/duckdb/src/storage/compression/fsst.cpp +4 -4
- package/src/duckdb/src/storage/compression/numeric_constant.cpp +3 -0
- package/src/duckdb/src/storage/compression/rle.cpp +6 -4
- package/src/duckdb/src/storage/compression/string_uncompressed.cpp +7 -7
- package/src/duckdb/src/storage/compression/uncompressed.cpp +1 -0
- package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +6 -6
- package/src/duckdb/src/storage/data_table.cpp +32 -96
- package/src/duckdb/src/storage/index.cpp +23 -11
- package/src/duckdb/src/storage/local_storage.cpp +36 -19
- package/src/duckdb/src/storage/metadata/metadata_manager.cpp +2 -2
- package/src/duckdb/src/storage/partial_block_manager.cpp +1 -1
- package/src/duckdb/src/storage/serialization/serialize_create_info.cpp +9 -4
- package/src/duckdb/src/storage/serialization/serialize_expression.cpp +3 -3
- package/src/duckdb/src/storage/serialization/serialize_extra_drop_info.cpp +42 -0
- package/src/duckdb/src/storage/serialization/serialize_logical_operator.cpp +7 -17
- package/src/duckdb/src/storage/serialization/serialize_macro_function.cpp +2 -2
- package/src/duckdb/src/storage/serialization/serialize_nodes.cpp +84 -77
- package/src/duckdb/src/storage/serialization/serialize_parse_info.cpp +63 -4
- package/src/duckdb/src/storage/serialization/serialize_parsed_expression.cpp +23 -0
- package/src/duckdb/src/storage/serialization/serialize_query_node.cpp +2 -0
- package/src/duckdb/src/storage/serialization/serialize_storage.cpp +35 -0
- package/src/duckdb/src/storage/serialization/serialize_table_filter.cpp +19 -0
- package/src/duckdb/src/storage/serialization/serialize_tableref.cpp +22 -1
- package/src/duckdb/src/storage/serialization/serialize_types.cpp +50 -0
- package/src/duckdb/src/storage/single_file_block_manager.cpp +46 -7
- package/src/duckdb/src/storage/standard_buffer_manager.cpp +57 -28
- package/src/duckdb/src/storage/statistics/array_stats.cpp +131 -0
- package/src/duckdb/src/storage/statistics/base_statistics.cpp +62 -4
- package/src/duckdb/src/storage/statistics/column_statistics.cpp +1 -0
- package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +3 -1
- package/src/duckdb/src/storage/statistics/numeric_stats.cpp +21 -0
- package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +5 -0
- package/src/duckdb/src/storage/statistics/string_stats.cpp +2 -2
- package/src/duckdb/src/storage/storage_info.cpp +1 -1
- package/src/duckdb/src/storage/storage_manager.cpp +47 -22
- package/src/duckdb/src/storage/table/array_column_data.cpp +241 -0
- package/src/duckdb/src/storage/table/chunk_info.cpp +2 -1
- package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +3 -1
- package/src/duckdb/src/storage/table/column_data.cpp +41 -18
- package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +12 -3
- package/src/duckdb/src/storage/table/column_segment.cpp +40 -6
- package/src/duckdb/src/storage/table/list_column_data.cpp +18 -15
- package/src/duckdb/src/storage/table/row_group.cpp +73 -21
- package/src/duckdb/src/storage/table/row_group_collection.cpp +395 -20
- package/src/duckdb/src/storage/table/row_version_manager.cpp +2 -1
- package/src/duckdb/src/storage/table/scan_state.cpp +4 -0
- package/src/duckdb/src/storage/table/standard_column_data.cpp +11 -5
- package/src/duckdb/src/storage/table/struct_column_data.cpp +30 -10
- package/src/duckdb/src/storage/table/table_statistics.cpp +7 -1
- package/src/duckdb/src/storage/table/update_segment.cpp +18 -2
- package/src/duckdb/src/storage/table_index_list.cpp +73 -7
- package/src/duckdb/src/storage/temporary_memory_manager.cpp +148 -0
- package/src/duckdb/src/storage/wal_replay.cpp +329 -152
- package/src/duckdb/src/storage/write_ahead_log.cpp +157 -137
- package/src/duckdb/src/transaction/cleanup_state.cpp +3 -2
- package/src/duckdb/src/transaction/commit_state.cpp +89 -63
- package/src/duckdb/src/transaction/duck_transaction.cpp +5 -3
- package/src/duckdb/src/transaction/duck_transaction_manager.cpp +26 -54
- package/src/duckdb/src/transaction/meta_transaction.cpp +37 -23
- package/src/duckdb/src/transaction/transaction_context.cpp +23 -4
- package/src/duckdb/src/transaction/undo_buffer.cpp +16 -2
- package/src/duckdb/src/verification/fetch_row_verifier.cpp +13 -0
- package/src/duckdb/src/verification/prepared_statement_verifier.cpp +5 -7
- package/src/duckdb/src/verification/statement_verifier.cpp +6 -5
- package/src/duckdb/third_party/fast_float/fast_float/fast_float.h +100 -29
- package/src/duckdb/third_party/fmt/include/fmt/format-inl.h +1 -1
- package/src/duckdb/third_party/fmt/include/fmt/format.h +4 -2
- package/src/duckdb/third_party/fmt/include/fmt/printf.h +5 -5
- package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +4 -0
- package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +82 -21
- package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +551 -1004
- package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +17 -3
- package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24861 -23465
- package/src/duckdb/third_party/libpg_query/src_backend_parser_scan.cpp +420 -389
- package/src/duckdb/third_party/mbedtls/include/mbedtls/aes.h +640 -1
- package/src/duckdb/third_party/mbedtls/include/mbedtls/aes_alt.h +1 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/aria.h +358 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/aria_alt.h +1 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/camellia.h +316 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/camellia_alt.h +1 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/ccm.h +1 -1
- package/src/duckdb/third_party/mbedtls/include/mbedtls/ccm_alt.h +1 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/chacha20.h +1 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/chachapoly.h +1 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/cipher.h +124 -124
- package/src/duckdb/third_party/mbedtls/include/mbedtls/cmac.h +1 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/entropy.h +293 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/gcm.h +383 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/gcm_alt.h +1 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/mbedtls_config.h +9 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/nist_kw.h +1 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls/timing.h +1 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls_wrapper.hpp +35 -6
- package/src/duckdb/third_party/mbedtls/library/aes.cpp +2171 -0
- package/src/duckdb/third_party/mbedtls/library/aesni.h +1 -0
- package/src/duckdb/third_party/mbedtls/library/aria.cpp +1058 -0
- package/src/duckdb/third_party/mbedtls/library/camellia.cpp +1087 -0
- package/src/duckdb/third_party/mbedtls/library/cipher.cpp +1633 -0
- package/src/duckdb/third_party/mbedtls/library/cipher_wrap.cpp +2270 -0
- package/src/duckdb/third_party/mbedtls/library/cipher_wrap.h +146 -0
- package/src/duckdb/third_party/mbedtls/library/entropy.cpp +701 -0
- package/src/duckdb/third_party/mbedtls/library/entropy_poll.cpp +237 -0
- package/src/duckdb/third_party/mbedtls/library/entropy_poll.h +76 -0
- package/src/duckdb/third_party/mbedtls/library/gcm.cpp +1161 -0
- package/src/duckdb/third_party/mbedtls/library/padlock.h +1 -0
- package/src/duckdb/third_party/mbedtls/mbedtls_wrapper.cpp +132 -24
- package/src/duckdb/third_party/pcg/pcg_uint128.hpp +1 -1
- package/src/duckdb/third_party/skiplist/HeadNode.h +934 -0
- package/src/duckdb/third_party/skiplist/IntegrityEnums.h +62 -0
- package/src/duckdb/third_party/skiplist/Node.h +641 -0
- package/src/duckdb/third_party/skiplist/NodeRefs.h +251 -0
- package/src/duckdb/third_party/skiplist/RollingMedian.h +202 -0
- package/src/duckdb/third_party/skiplist/SkipList.cpp +40 -0
- package/src/duckdb/third_party/skiplist/SkipList.h +549 -0
- package/src/duckdb/third_party/thrift/thrift/thrift-config.h +1 -1
- package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
- package/src/duckdb/ub_src_catalog.cpp +3 -1
- package/src/duckdb/ub_src_catalog_catalog_entry_dependency.cpp +6 -0
- package/src/duckdb/ub_src_common.cpp +1 -1
- package/src/duckdb/ub_src_common_exception.cpp +6 -0
- package/src/duckdb/ub_src_common_types.cpp +2 -2
- package/src/duckdb/ub_src_core_functions.cpp +2 -0
- package/src/duckdb/ub_src_core_functions_scalar_array.cpp +4 -0
- package/src/duckdb/ub_src_core_functions_scalar_blob.cpp +2 -0
- package/src/duckdb/ub_src_core_functions_scalar_list.cpp +7 -3
- package/src/duckdb/ub_src_core_functions_scalar_secret.cpp +2 -0
- package/src/duckdb/ub_src_core_functions_scalar_string.cpp +4 -0
- package/src/duckdb/ub_src_execution_index.cpp +4 -0
- package/src/duckdb/ub_src_execution_operator_csv_scanner_buffer_manager.cpp +6 -0
- package/src/duckdb/ub_src_execution_operator_csv_scanner_scanner.cpp +10 -0
- package/src/duckdb/ub_src_execution_operator_csv_scanner_state_machine.cpp +4 -0
- package/src/duckdb/ub_src_execution_operator_csv_scanner_table_function.cpp +4 -0
- package/src/duckdb/ub_src_execution_operator_csv_scanner_util.cpp +4 -0
- package/src/duckdb/ub_src_execution_operator_helper.cpp +4 -0
- package/src/duckdb/ub_src_execution_operator_join.cpp +4 -2
- package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
- package/src/duckdb/ub_src_execution_physical_plan.cpp +4 -2
- package/src/duckdb/ub_src_function_cast.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar_list.cpp +4 -0
- package/src/duckdb/ub_src_function_table.cpp +4 -4
- package/src/duckdb/ub_src_function_table_system.cpp +6 -0
- package/src/duckdb/ub_src_main.cpp +2 -0
- package/src/duckdb/ub_src_main_buffered_data.cpp +2 -0
- package/src/duckdb/ub_src_main_secret.cpp +6 -0
- package/src/duckdb/ub_src_optimizer_pushdown.cpp +2 -0
- package/src/duckdb/ub_src_parser_expression.cpp +2 -0
- package/src/duckdb/ub_src_parser_parsed_data.cpp +6 -0
- package/src/duckdb/ub_src_parser_statement.cpp +2 -2
- package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
- package/src/duckdb/ub_src_parser_transform_statement.cpp +6 -0
- package/src/duckdb/ub_src_planner_binder_statement.cpp +2 -2
- package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
- package/src/duckdb/ub_src_planner_filter.cpp +2 -0
- package/src/duckdb/ub_src_planner_operator.cpp +2 -0
- package/src/duckdb/ub_src_planner_subquery.cpp +2 -0
- package/src/duckdb/ub_src_storage.cpp +2 -0
- package/src/duckdb/ub_src_storage_compression.cpp +2 -0
- package/src/duckdb/ub_src_storage_compression_alp.cpp +4 -0
- package/src/duckdb/ub_src_storage_serialization.cpp +2 -0
- package/src/duckdb/ub_src_storage_statistics.cpp +2 -0
- package/src/duckdb/ub_src_storage_table.cpp +2 -0
- package/src/duckdb_node.hpp +1 -1
- package/src/statement.cpp +18 -8
- package/src/utils.cpp +1 -15
- package/test/columns.test.ts +2 -1
- package/test/test_all_types.test.ts +9 -4
@@ -3,7 +3,11 @@
|
|
3
3
|
#include "duckdb/common/algorithm.hpp"
|
4
4
|
#include "duckdb/common/helper.hpp"
|
5
5
|
#include "duckdb/common/vector_operations/vector_operations.hpp"
|
6
|
+
#include "duckdb/execution/merge_sort_tree.hpp"
|
7
|
+
#include "duckdb/planner/expression/bound_constant_expression.hpp"
|
8
|
+
#include "duckdb/execution/window_executor.hpp"
|
6
9
|
|
10
|
+
#include <numeric>
|
7
11
|
#include <utility>
|
8
12
|
|
9
13
|
namespace duckdb {
|
@@ -14,9 +18,10 @@ namespace duckdb {
|
|
14
18
|
WindowAggregatorState::WindowAggregatorState() : allocator(Allocator::DefaultAllocator()) {
|
15
19
|
}
|
16
20
|
|
17
|
-
WindowAggregator::WindowAggregator(AggregateObject aggr, const LogicalType &result_type_p,
|
21
|
+
WindowAggregator::WindowAggregator(AggregateObject aggr, const LogicalType &result_type_p,
|
22
|
+
const WindowExcludeMode exclude_mode_p, idx_t partition_count_p)
|
18
23
|
: aggr(std::move(aggr)), result_type(result_type_p), partition_count(partition_count_p),
|
19
|
-
state_size(aggr.function.state_size()), filter_pos(0) {
|
24
|
+
state_size(aggr.function.state_size()), filter_pos(0), exclude_mode(exclude_mode_p) {
|
20
25
|
}
|
21
26
|
|
22
27
|
WindowAggregator::~WindowAggregator() {
|
@@ -43,15 +48,16 @@ void WindowAggregator::Sink(DataChunk &payload_chunk, SelectionVector *filter_se
|
|
43
48
|
}
|
44
49
|
}
|
45
50
|
|
46
|
-
void WindowAggregator::Finalize() {
|
51
|
+
void WindowAggregator::Finalize(const FrameStats &stats) {
|
47
52
|
}
|
48
53
|
|
49
54
|
//===--------------------------------------------------------------------===//
|
50
55
|
// WindowConstantAggregate
|
51
56
|
//===--------------------------------------------------------------------===//
|
52
57
|
WindowConstantAggregator::WindowConstantAggregator(AggregateObject aggr, const LogicalType &result_type,
|
53
|
-
const ValidityMask &partition_mask,
|
54
|
-
|
58
|
+
const ValidityMask &partition_mask,
|
59
|
+
const WindowExcludeMode exclude_mode_p, const idx_t count)
|
60
|
+
: WindowAggregator(std::move(aggr), result_type, exclude_mode_p, count), partition(0), row(0), state(state_size),
|
55
61
|
statep(Value::POINTER(CastPointerToValue(state.data()))),
|
56
62
|
statef(Value::POINTER(CastPointerToValue(state.data()))) {
|
57
63
|
|
@@ -180,7 +186,7 @@ void WindowConstantAggregator::Sink(DataChunk &payload_chunk, SelectionVector *f
|
|
180
186
|
}
|
181
187
|
}
|
182
188
|
|
183
|
-
void WindowConstantAggregator::Finalize() {
|
189
|
+
void WindowConstantAggregator::Finalize(const FrameStats &stats) {
|
184
190
|
AggegateFinal(*results, partition++);
|
185
191
|
}
|
186
192
|
|
@@ -203,8 +209,9 @@ unique_ptr<WindowAggregatorState> WindowConstantAggregator::GetLocalState() cons
|
|
203
209
|
return make_uniq<WindowConstantAggregatorState>();
|
204
210
|
}
|
205
211
|
|
206
|
-
void WindowConstantAggregator::Evaluate(WindowAggregatorState &lstate, const
|
207
|
-
|
212
|
+
void WindowConstantAggregator::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &target,
|
213
|
+
idx_t count, idx_t row_idx) const {
|
214
|
+
auto begins = FlatVector::GetData<const idx_t>(bounds.data[WINDOW_BEGIN]);
|
208
215
|
// Chunk up the constants and copy them one at a time
|
209
216
|
auto &lcstate = lstate.Cast<WindowConstantAggregatorState>();
|
210
217
|
idx_t matched = 0;
|
@@ -234,8 +241,9 @@ void WindowConstantAggregator::Evaluate(WindowAggregatorState &lstate, const idx
|
|
234
241
|
//===--------------------------------------------------------------------===//
|
235
242
|
// WindowCustomAggregator
|
236
243
|
//===--------------------------------------------------------------------===//
|
237
|
-
WindowCustomAggregator::WindowCustomAggregator(AggregateObject aggr, const LogicalType &result_type,
|
238
|
-
|
244
|
+
WindowCustomAggregator::WindowCustomAggregator(AggregateObject aggr, const LogicalType &result_type,
|
245
|
+
const WindowExcludeMode exclude_mode_p, idx_t count)
|
246
|
+
: WindowAggregator(std::move(aggr), result_type, exclude_mode_p, count) {
|
239
247
|
}
|
240
248
|
|
241
249
|
WindowCustomAggregator::~WindowCustomAggregator() {
|
@@ -243,27 +251,45 @@ WindowCustomAggregator::~WindowCustomAggregator() {
|
|
243
251
|
|
244
252
|
class WindowCustomAggregatorState : public WindowAggregatorState {
|
245
253
|
public:
|
246
|
-
|
254
|
+
WindowCustomAggregatorState(const AggregateObject &aggr, const WindowExcludeMode exclude_mode);
|
247
255
|
~WindowCustomAggregatorState() override;
|
248
256
|
|
249
257
|
public:
|
250
258
|
//! The aggregate function
|
251
259
|
const AggregateObject &aggr;
|
252
|
-
//! The aggregate function
|
253
|
-
DataChunk &inputs;
|
254
260
|
//! Data pointer that contains a single state, shared by all the custom evaluators
|
255
261
|
vector<data_t> state;
|
256
262
|
//! Reused result state container for the window functions
|
257
263
|
Vector statef;
|
258
264
|
//! The frame boundaries, used for the window functions
|
259
|
-
|
265
|
+
SubFrames frames;
|
260
266
|
};
|
261
267
|
|
262
|
-
|
263
|
-
|
264
|
-
|
268
|
+
static void InitSubFrames(SubFrames &frames, const WindowExcludeMode exclude_mode) {
|
269
|
+
idx_t nframes = 0;
|
270
|
+
switch (exclude_mode) {
|
271
|
+
case WindowExcludeMode::NO_OTHER:
|
272
|
+
nframes = 1;
|
273
|
+
break;
|
274
|
+
case WindowExcludeMode::TIES:
|
275
|
+
nframes = 3;
|
276
|
+
break;
|
277
|
+
case WindowExcludeMode::CURRENT_ROW:
|
278
|
+
case WindowExcludeMode::GROUP:
|
279
|
+
nframes = 2;
|
280
|
+
break;
|
281
|
+
}
|
282
|
+
frames.resize(nframes, {0, 0});
|
283
|
+
}
|
284
|
+
|
285
|
+
WindowCustomAggregatorState::WindowCustomAggregatorState(const AggregateObject &aggr,
|
286
|
+
const WindowExcludeMode exclude_mode)
|
287
|
+
: aggr(aggr), state(aggr.function.state_size()), statef(Value::POINTER(CastPointerToValue(state.data()))),
|
288
|
+
frames(3, {0, 0}) {
|
265
289
|
// if we have a frame-by-frame method, share the single state
|
266
290
|
aggr.function.initialize(state.data());
|
291
|
+
|
292
|
+
InitSubFrames(frames, exclude_mode);
|
267
293
|
}
|
268
294
|
|
269
295
|
WindowCustomAggregatorState::~WindowCustomAggregatorState() {
|
@@ -273,45 +299,314 @@ WindowCustomAggregatorState::~WindowCustomAggregatorState() {
|
|
273
299
|
}
|
274
300
|
}
|
275
301
|
|
302
|
+
void WindowCustomAggregator::Finalize(const FrameStats &stats) {
|
303
|
+
WindowAggregator::Finalize(stats);
|
304
|
+
partition_input =
|
305
|
+
make_uniq<WindowPartitionInput>(inputs.data.data(), inputs.ColumnCount(), inputs.size(), filter_mask, stats);
|
306
|
+
|
307
|
+
if (aggr.function.window_init) {
|
308
|
+
gstate = GetLocalState();
|
309
|
+
auto &gcstate = gstate->Cast<WindowCustomAggregatorState>();
|
310
|
+
|
311
|
+
AggregateInputData aggr_input_data(aggr.GetFunctionData(), gcstate.allocator);
|
312
|
+
aggr.function.window_init(aggr_input_data, *partition_input, gcstate.state.data());
|
313
|
+
}
|
314
|
+
}
|
315
|
+
|
276
316
|
unique_ptr<WindowAggregatorState> WindowCustomAggregator::GetLocalState() const {
|
277
|
-
return make_uniq<WindowCustomAggregatorState>(aggr,
|
317
|
+
return make_uniq<WindowCustomAggregatorState>(aggr, exclude_mode);
|
278
318
|
}
|
279
319
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
auto
|
284
|
-
auto
|
285
|
-
auto
|
286
|
-
auto
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
if (
|
291
|
-
|
292
|
-
|
320
|
+
template <typename OP>
|
321
|
+
static void EvaluateSubFrames(const DataChunk &bounds, const WindowExcludeMode exclude_mode, idx_t count, idx_t row_idx,
|
322
|
+
SubFrames &frames, OP operation) {
|
323
|
+
auto begins = FlatVector::GetData<const idx_t>(bounds.data[WINDOW_BEGIN]);
|
324
|
+
auto ends = FlatVector::GetData<const idx_t>(bounds.data[WINDOW_END]);
|
325
|
+
auto peer_begin = FlatVector::GetData<const idx_t>(bounds.data[PEER_BEGIN]);
|
326
|
+
auto peer_end = FlatVector::GetData<const idx_t>(bounds.data[PEER_END]);
|
327
|
+
|
328
|
+
for (idx_t i = 0, cur_row = row_idx; i < count; ++i, ++cur_row) {
|
329
|
+
idx_t nframes = 0;
|
330
|
+
if (exclude_mode == WindowExcludeMode::NO_OTHER) {
|
331
|
+
auto begin = begins[i];
|
332
|
+
auto end = ends[i];
|
333
|
+
frames[nframes++] = FrameBounds(begin, end);
|
334
|
+
} else {
|
335
|
+
// The frame_exclusion option allows rows around the current row to be excluded from the frame,
|
336
|
+
// even if they would be included according to the frame start and frame end options.
|
337
|
+
// EXCLUDE CURRENT ROW excludes the current row from the frame.
|
338
|
+
// EXCLUDE GROUP excludes the current row and its ordering peers from the frame.
|
339
|
+
// EXCLUDE TIES excludes any peers of the current row from the frame, but not the current row itself.
|
340
|
+
// EXCLUDE NO OTHERS simply specifies explicitly the default behavior
|
341
|
+
// of not excluding the current row or its peers.
|
342
|
+
// https://www.postgresql.org/docs/current/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS
|
343
|
+
//
|
344
|
+
// For the sake of the client, we make some guarantees about the subframes:
|
345
|
+
// * They are in order left-to-right
|
346
|
+
// * They do not intersect
|
347
|
+
// * start <= end
|
348
|
+
// * The number is always the same
|
349
|
+
//
|
350
|
+
// Since we always have peer_begin <= cur_row < cur_row + 1 <= peer_end
|
351
|
+
// this is not too hard to arrange, but it may be that some subframes are contiguous,
|
352
|
+
// and some are empty.
|
353
|
+
|
354
|
+
// WindowExcludePart::LEFT
|
355
|
+
auto begin = begins[i];
|
356
|
+
auto end = (exclude_mode == WindowExcludeMode::CURRENT_ROW) ? cur_row : peer_begin[i];
|
357
|
+
end = MaxValue(begin, end);
|
358
|
+
frames[nframes++] = FrameBounds(begin, end);
|
359
|
+
|
360
|
+
// with EXCLUDE TIES, in addition to the frame part right of the peer group's end,
|
361
|
+
// we also need to consider the current row
|
362
|
+
if (exclude_mode == WindowExcludeMode::TIES) {
|
363
|
+
frames[nframes++] = FrameBounds(cur_row, cur_row + 1);
|
364
|
+
}
|
365
|
+
|
366
|
+
// WindowExcludePart::RIGHT
|
367
|
+
end = ends[i];
|
368
|
+
begin = (exclude_mode == WindowExcludeMode::CURRENT_ROW) ? (cur_row + 1) : peer_end[i];
|
369
|
+
begin = MinValue(begin, end);
|
370
|
+
frames[nframes++] = FrameBounds(begin, end);
|
293
371
|
}
|
294
372
|
|
295
|
-
|
296
|
-
|
297
|
-
|
373
|
+
operation(i);
|
374
|
+
}
|
375
|
+
}
|
298
376
|
|
377
|
+
void WindowCustomAggregator::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &result,
|
378
|
+
idx_t count, idx_t row_idx) const {
|
379
|
+
auto &lcstate = lstate.Cast<WindowCustomAggregatorState>();
|
380
|
+
auto &frames = lcstate.frames;
|
381
|
+
const_data_ptr_t gstate_p = nullptr;
|
382
|
+
if (gstate) {
|
383
|
+
auto &gcstate = gstate->Cast<WindowCustomAggregatorState>();
|
384
|
+
gstate_p = gcstate.state.data();
|
385
|
+
}
|
386
|
+
|
387
|
+
EvaluateSubFrames(bounds, exclude_mode, count, row_idx, frames, [&](idx_t i) {
|
299
388
|
// Extract the range
|
300
389
|
AggregateInputData aggr_input_data(aggr.GetFunctionData(), lstate.allocator);
|
301
|
-
aggr.function.window(
|
302
|
-
|
390
|
+
aggr.function.window(aggr_input_data, *partition_input, gstate_p, lcstate.state.data(), frames, result, i);
|
391
|
+
});
|
392
|
+
}
|
393
|
+
|
394
|
+
//===--------------------------------------------------------------------===//
|
395
|
+
// WindowNaiveAggregator
|
396
|
+
//===--------------------------------------------------------------------===//
|
397
|
+
WindowNaiveAggregator::WindowNaiveAggregator(AggregateObject aggr, const LogicalType &result_type,
|
398
|
+
const WindowExcludeMode exclude_mode_p, idx_t partition_count)
|
399
|
+
: WindowAggregator(std::move(aggr), result_type, exclude_mode_p, partition_count) {
|
400
|
+
}
|
401
|
+
|
402
|
+
WindowNaiveAggregator::~WindowNaiveAggregator() {
|
403
|
+
}
|
404
|
+
|
405
|
+
class WindowNaiveState : public WindowAggregatorState {
|
406
|
+
public:
|
407
|
+
struct HashRow {
|
408
|
+
explicit HashRow(WindowNaiveState &state) : state(state) {
|
409
|
+
}
|
410
|
+
|
411
|
+
size_t operator()(const idx_t &i) const {
|
412
|
+
return state.Hash(i);
|
413
|
+
}
|
414
|
+
|
415
|
+
WindowNaiveState &state;
|
416
|
+
};
|
417
|
+
|
418
|
+
struct EqualRow {
|
419
|
+
explicit EqualRow(WindowNaiveState &state) : state(state) {
|
420
|
+
}
|
421
|
+
|
422
|
+
bool operator()(const idx_t &lhs, const idx_t &rhs) const {
|
423
|
+
return state.KeyEqual(lhs, rhs);
|
424
|
+
}
|
425
|
+
|
426
|
+
WindowNaiveState &state;
|
427
|
+
};
|
428
|
+
|
429
|
+
using RowSet = std::unordered_set<idx_t, HashRow, EqualRow>;
|
430
|
+
|
431
|
+
explicit WindowNaiveState(const WindowNaiveAggregator &gstate);
|
432
|
+
|
433
|
+
void Evaluate(const DataChunk &bounds, Vector &result, idx_t count, idx_t row_idx);
|
434
|
+
|
435
|
+
protected:
|
436
|
+
//! Flush the accumulated intermediate states into the result states
|
437
|
+
void FlushStates();
|
438
|
+
|
439
|
+
//! Hashes a value for the hash table
|
440
|
+
size_t Hash(idx_t rid);
|
441
|
+
//! Compares two values for the hash table
|
442
|
+
bool KeyEqual(const idx_t &lhs, const idx_t &rhs);
|
443
|
+
|
444
|
+
//! The global state
|
445
|
+
const WindowNaiveAggregator &gstate;
|
446
|
+
//! Data pointer that contains a vector of states, used for row aggregation
|
447
|
+
vector<data_t> state;
|
448
|
+
//! Reused result state container for the aggregate
|
449
|
+
Vector statef;
|
450
|
+
//! A vector of pointers to "state", used for buffering intermediate aggregates
|
451
|
+
Vector statep;
|
452
|
+
//! Input data chunk, used for leaf segment aggregation
|
453
|
+
DataChunk leaves;
|
454
|
+
//! The rows beging updated.
|
455
|
+
SelectionVector update_sel;
|
456
|
+
//! Count of buffered values
|
457
|
+
idx_t flush_count;
|
458
|
+
//! The frame boundaries, used for EXCLUDE
|
459
|
+
SubFrames frames;
|
460
|
+
//! The optional hash table used for DISTINCT
|
461
|
+
Vector hashes;
|
462
|
+
HashRow hash_row;
|
463
|
+
EqualRow equal_row;
|
464
|
+
RowSet row_set;
|
465
|
+
};
|
466
|
+
|
467
|
+
WindowNaiveState::WindowNaiveState(const WindowNaiveAggregator &gstate)
|
468
|
+
: gstate(gstate), state(gstate.state_size * STANDARD_VECTOR_SIZE), statef(LogicalType::POINTER),
|
469
|
+
statep((LogicalType::POINTER)), flush_count(0), hashes(LogicalType::HASH), hash_row(*this), equal_row(*this),
|
470
|
+
row_set(STANDARD_VECTOR_SIZE, hash_row, equal_row) {
|
471
|
+
InitSubFrames(frames, gstate.exclude_mode);
|
472
|
+
|
473
|
+
auto &inputs = const_cast<DataChunk &>(gstate.GetInputs());
|
474
|
+
if (inputs.ColumnCount() > 0) {
|
475
|
+
leaves.Initialize(Allocator::DefaultAllocator(), inputs.GetTypes());
|
476
|
+
}
|
477
|
+
|
478
|
+
update_sel.Initialize();
|
479
|
+
|
480
|
+
// Build the finalise vector that just points to the result states
|
481
|
+
data_ptr_t state_ptr = state.data();
|
482
|
+
D_ASSERT(statef.GetVectorType() == VectorType::FLAT_VECTOR);
|
483
|
+
statef.SetVectorType(VectorType::CONSTANT_VECTOR);
|
484
|
+
statef.Flatten(STANDARD_VECTOR_SIZE);
|
485
|
+
auto fdata = FlatVector::GetData<data_ptr_t>(statef);
|
486
|
+
for (idx_t i = 0; i < STANDARD_VECTOR_SIZE; ++i) {
|
487
|
+
fdata[i] = state_ptr;
|
488
|
+
state_ptr += gstate.state_size;
|
303
489
|
}
|
304
490
|
}
|
305
491
|
|
492
|
+
void WindowNaiveState::FlushStates() {
|
493
|
+
if (!flush_count) {
|
494
|
+
return;
|
495
|
+
}
|
496
|
+
|
497
|
+
auto &inputs = const_cast<DataChunk &>(gstate.GetInputs());
|
498
|
+
leaves.Reference(inputs);
|
499
|
+
leaves.Slice(update_sel, flush_count);
|
500
|
+
|
501
|
+
auto &aggr = gstate.aggr;
|
502
|
+
AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
|
503
|
+
aggr.function.update(leaves.data.data(), aggr_input_data, leaves.ColumnCount(), statep, flush_count);
|
504
|
+
|
505
|
+
flush_count = 0;
|
506
|
+
}
|
507
|
+
|
508
|
+
size_t WindowNaiveState::Hash(idx_t rid) {
|
509
|
+
auto &inputs = const_cast<DataChunk &>(gstate.GetInputs());
|
510
|
+
leaves.Reference(inputs);
|
511
|
+
|
512
|
+
sel_t s = rid;
|
513
|
+
SelectionVector sel(&s);
|
514
|
+
leaves.Slice(sel, 1);
|
515
|
+
leaves.Hash(hashes);
|
516
|
+
|
517
|
+
return *FlatVector::GetData<hash_t>(hashes);
|
518
|
+
}
|
519
|
+
|
520
|
+
bool WindowNaiveState::KeyEqual(const idx_t &lhs, const idx_t &rhs) {
|
521
|
+
auto &inputs = const_cast<DataChunk &>(gstate.GetInputs());
|
522
|
+
|
523
|
+
sel_t l = lhs;
|
524
|
+
SelectionVector lsel(&l);
|
525
|
+
|
526
|
+
sel_t r = rhs;
|
527
|
+
SelectionVector rsel(&r);
|
528
|
+
|
529
|
+
sel_t f = 0;
|
530
|
+
SelectionVector fsel(&f);
|
531
|
+
|
532
|
+
for (auto &input : inputs.data) {
|
533
|
+
Vector left(input, lsel, 1);
|
534
|
+
Vector right(input, rsel, 1);
|
535
|
+
if (!VectorOperations::NotDistinctFrom(left, right, nullptr, 1, nullptr, &fsel)) {
|
536
|
+
return false;
|
537
|
+
}
|
538
|
+
}
|
539
|
+
|
540
|
+
return true;
|
541
|
+
}
|
542
|
+
|
543
|
+
void WindowNaiveState::Evaluate(const DataChunk &bounds, Vector &result, idx_t count, idx_t row_idx) {
|
544
|
+
auto &aggr = gstate.aggr;
|
545
|
+
auto &filter_mask = gstate.GetFilterMask();
|
546
|
+
|
547
|
+
auto fdata = FlatVector::GetData<data_ptr_t>(statef);
|
548
|
+
auto pdata = FlatVector::GetData<data_ptr_t>(statep);
|
549
|
+
|
550
|
+
EvaluateSubFrames(bounds, gstate.exclude_mode, count, row_idx, frames, [&](idx_t rid) {
|
551
|
+
auto agg_state = fdata[rid];
|
552
|
+
aggr.function.initialize(agg_state);
|
553
|
+
|
554
|
+
// Just update the aggregate with the unfiltered input rows
|
555
|
+
row_set.clear();
|
556
|
+
for (const auto &frame : frames) {
|
557
|
+
for (auto f = frame.start; f < frame.end; ++f) {
|
558
|
+
if (!filter_mask.RowIsValid(f)) {
|
559
|
+
continue;
|
560
|
+
}
|
561
|
+
|
562
|
+
// Filter out duplicates
|
563
|
+
if (aggr.IsDistinct() && !row_set.insert(f).second) {
|
564
|
+
continue;
|
565
|
+
}
|
566
|
+
|
567
|
+
pdata[flush_count] = agg_state;
|
568
|
+
update_sel[flush_count++] = f;
|
569
|
+
if (flush_count >= STANDARD_VECTOR_SIZE) {
|
570
|
+
FlushStates();
|
571
|
+
}
|
572
|
+
}
|
573
|
+
}
|
574
|
+
});
|
575
|
+
|
576
|
+
// Flush the final states
|
577
|
+
FlushStates();
|
578
|
+
|
579
|
+
// Finalise the result aggregates and write to the result
|
580
|
+
AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
|
581
|
+
aggr.function.finalize(statef, aggr_input_data, result, count, 0);
|
582
|
+
|
583
|
+
// Destruct the result aggregates
|
584
|
+
if (aggr.function.destructor) {
|
585
|
+
aggr.function.destructor(statef, aggr_input_data, count);
|
586
|
+
}
|
587
|
+
}
|
588
|
+
|
589
|
+
unique_ptr<WindowAggregatorState> WindowNaiveAggregator::GetLocalState() const {
|
590
|
+
return make_uniq<WindowNaiveState>(*this);
|
591
|
+
}
|
592
|
+
|
593
|
+
void WindowNaiveAggregator::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &result,
|
594
|
+
idx_t count, idx_t row_idx) const {
|
595
|
+
auto &ldstate = lstate.Cast<WindowNaiveState>();
|
596
|
+
ldstate.Evaluate(bounds, result, count, row_idx);
|
597
|
+
}
|
598
|
+
|
306
599
|
//===--------------------------------------------------------------------===//
|
307
600
|
// WindowSegmentTree
|
308
601
|
//===--------------------------------------------------------------------===//
|
309
|
-
WindowSegmentTree::WindowSegmentTree(AggregateObject aggr, const LogicalType &result_type,
|
310
|
-
|
311
|
-
: WindowAggregator(std::move(aggr), result_type, count), internal_nodes(0), mode(mode_p) {
|
602
|
+
WindowSegmentTree::WindowSegmentTree(AggregateObject aggr, const LogicalType &result_type, WindowAggregationMode mode_p,
|
603
|
+
const WindowExcludeMode exclude_mode_p, idx_t count)
|
604
|
+
: WindowAggregator(std::move(aggr), result_type, exclude_mode_p, count), internal_nodes(0), mode(mode_p) {
|
312
605
|
}
|
313
606
|
|
314
|
-
void WindowSegmentTree::Finalize() {
|
607
|
+
void WindowSegmentTree::Finalize(const FrameStats &stats) {
|
608
|
+
WindowAggregator::Finalize(stats);
|
609
|
+
|
315
610
|
gstate = GetLocalState();
|
316
611
|
if (inputs.ColumnCount() > 0) {
|
317
612
|
if (aggr.function.combine && UseCombineAPI()) {
|
@@ -342,27 +637,56 @@ WindowSegmentTree::~WindowSegmentTree() {
|
|
342
637
|
}
|
343
638
|
}
|
344
639
|
|
345
|
-
class
|
640
|
+
class WindowSegmentTreePart {
|
346
641
|
public:
|
347
|
-
|
348
|
-
|
642
|
+
//! Right side nodes need to be cached and processed in reverse order
|
643
|
+
using RightEntry = std::pair<idx_t, idx_t>;
|
644
|
+
|
645
|
+
enum FramePart : uint8_t { FULL = 0, LEFT = 1, RIGHT = 2 };
|
646
|
+
|
647
|
+
WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, DataChunk &inputs,
|
648
|
+
const ValidityMask &filter_mask);
|
649
|
+
~WindowSegmentTreePart();
|
650
|
+
|
651
|
+
unique_ptr<WindowSegmentTreePart> Copy() const {
|
652
|
+
return make_uniq<WindowSegmentTreePart>(allocator, aggr, inputs, filter_mask);
|
653
|
+
}
|
349
654
|
|
350
655
|
void FlushStates(bool combining);
|
351
656
|
void ExtractFrame(idx_t begin, idx_t end, data_ptr_t current_state);
|
352
657
|
void WindowSegmentValue(const WindowSegmentTree &tree, idx_t l_idx, idx_t begin, idx_t end,
|
353
658
|
data_ptr_t current_state);
|
659
|
+
//! Writes result and calls destructors
|
354
660
|
void Finalize(Vector &result, idx_t count);
|
355
661
|
|
662
|
+
void Combine(WindowSegmentTreePart &other, idx_t count);
|
663
|
+
|
664
|
+
void Evaluate(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends, Vector &result, idx_t count,
|
665
|
+
idx_t row_idx, FramePart frame_part);
|
666
|
+
|
667
|
+
protected:
|
668
|
+
//! Initialises the accumulation state vector (statef)
|
669
|
+
void Initialize(idx_t count);
|
670
|
+
//! Accumulate upper tree levels
|
671
|
+
void EvaluateUpperLevels(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends, idx_t count,
|
672
|
+
idx_t row_idx, FramePart frame_part);
|
673
|
+
void EvaluateLeaves(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends, idx_t count,
|
674
|
+
idx_t row_idx, FramePart frame_part, FramePart leaf_part);
|
675
|
+
|
356
676
|
public:
|
677
|
+
//! Allocator for aggregates
|
678
|
+
ArenaAllocator &allocator;
|
357
679
|
//! The aggregate function
|
358
680
|
const AggregateObject &aggr;
|
359
|
-
//!
|
681
|
+
//! Order insensitive aggregate (we can optimise internal combines)
|
682
|
+
const bool order_insensitive;
|
683
|
+
//! The partition arguments
|
360
684
|
DataChunk &inputs;
|
361
685
|
//! The filtered rows in inputs
|
362
686
|
const ValidityMask &filter_mask;
|
363
687
|
//! The size of a single aggregate state
|
364
688
|
const idx_t state_size;
|
365
|
-
//! Data pointer that contains a
|
689
|
+
//! Data pointer that contains a vector of states, used for intermediate window segment aggregation
|
366
690
|
vector<data_t> state;
|
367
691
|
//! Input data chunk, used for leaf segment aggregation
|
368
692
|
DataChunk leaves;
|
@@ -376,13 +700,34 @@ public:
|
|
376
700
|
Vector statef;
|
377
701
|
//! Count of buffered values
|
378
702
|
idx_t flush_count;
|
703
|
+
//! Cache of right side tree ranges for ordered aggregates
|
704
|
+
vector<RightEntry> right_stack;
|
379
705
|
};
|
380
706
|
|
381
|
-
WindowSegmentTreeState
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
707
|
+
class WindowSegmentTreeState : public WindowAggregatorState {
|
708
|
+
public:
|
709
|
+
WindowSegmentTreeState(const AggregateObject &aggr, DataChunk &inputs, const ValidityMask &filter_mask)
|
710
|
+
: aggr(aggr), inputs(inputs), filter_mask(filter_mask), part(allocator, aggr, inputs, filter_mask) {
|
711
|
+
}
|
712
|
+
|
713
|
+
//! The aggregate function
|
714
|
+
const AggregateObject &aggr;
|
715
|
+
//! The aggregate function
|
716
|
+
DataChunk &inputs;
|
717
|
+
//! The filtered rows in inputs
|
718
|
+
const ValidityMask &filter_mask;
|
719
|
+
//! The left (default) segment tree part
|
720
|
+
WindowSegmentTreePart part;
|
721
|
+
//! The right segment tree part (for EXCLUDE)
|
722
|
+
unique_ptr<WindowSegmentTreePart> right_part;
|
723
|
+
};
|
724
|
+
|
725
|
+
WindowSegmentTreePart::WindowSegmentTreePart(ArenaAllocator &allocator, const AggregateObject &aggr, DataChunk &inputs,
|
726
|
+
const ValidityMask &filter_mask)
|
727
|
+
: allocator(allocator), aggr(aggr),
|
728
|
+
order_insensitive(aggr.function.order_dependent == AggregateOrderDependent::NOT_ORDER_DEPENDENT), inputs(inputs),
|
729
|
+
filter_mask(filter_mask), state_size(aggr.function.state_size()), state(state_size * STANDARD_VECTOR_SIZE),
|
730
|
+
statep(LogicalType::POINTER), statel(LogicalType::POINTER), statef(LogicalType::POINTER), flush_count(0) {
|
386
731
|
if (inputs.ColumnCount() > 0) {
|
387
732
|
leaves.Initialize(Allocator::DefaultAllocator(), inputs.GetTypes());
|
388
733
|
filter_sel.Initialize();
|
@@ -400,14 +745,14 @@ WindowSegmentTreeState::WindowSegmentTreeState(const AggregateObject &aggr, Data
|
|
400
745
|
}
|
401
746
|
}
|
402
747
|
|
403
|
-
|
748
|
+
WindowSegmentTreePart::~WindowSegmentTreePart() {
|
404
749
|
}
|
405
750
|
|
406
751
|
unique_ptr<WindowAggregatorState> WindowSegmentTree::GetLocalState() const {
|
407
752
|
return make_uniq<WindowSegmentTreeState>(aggr, const_cast<DataChunk &>(inputs), filter_mask);
|
408
753
|
}
|
409
754
|
|
410
|
-
void
|
755
|
+
void WindowSegmentTreePart::FlushStates(bool combining) {
|
411
756
|
if (!flush_count) {
|
412
757
|
return;
|
413
758
|
}
|
@@ -425,7 +770,12 @@ void WindowSegmentTreeState::FlushStates(bool combining) {
|
|
425
770
|
flush_count = 0;
|
426
771
|
}
|
427
772
|
|
428
|
-
void
|
773
|
+
void WindowSegmentTreePart::Combine(WindowSegmentTreePart &other, idx_t count) {
|
774
|
+
AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
|
775
|
+
aggr.function.combine(other.statef, statef, aggr_input_data, count);
|
776
|
+
}
|
777
|
+
|
778
|
+
void WindowSegmentTreePart::ExtractFrame(idx_t begin, idx_t end, data_ptr_t state_ptr) {
|
429
779
|
const auto count = end - begin;
|
430
780
|
|
431
781
|
// If we are not filtering,
|
@@ -453,8 +803,8 @@ void WindowSegmentTreeState::ExtractFrame(idx_t begin, idx_t end, data_ptr_t sta
|
|
453
803
|
}
|
454
804
|
}
|
455
805
|
|
456
|
-
void
|
457
|
-
|
806
|
+
void WindowSegmentTreePart::WindowSegmentValue(const WindowSegmentTree &tree, idx_t l_idx, idx_t begin, idx_t end,
|
807
|
+
data_ptr_t state_ptr) {
|
458
808
|
D_ASSERT(begin <= end);
|
459
809
|
if (begin == end || inputs.ColumnCount() == 0) {
|
460
810
|
return;
|
@@ -479,8 +829,8 @@ void WindowSegmentTreeState::WindowSegmentValue(const WindowSegmentTree &tree, i
|
|
479
829
|
}
|
480
830
|
}
|
481
831
|
}
|
482
|
-
void
|
483
|
-
// Finalise the result aggregates
|
832
|
+
void WindowSegmentTreePart::Finalize(Vector &result, idx_t count) {
|
833
|
+
// Finalise the result aggregates and write to result if write_result is set
|
484
834
|
AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
|
485
835
|
aggr.function.finalize(statef, aggr_input_data, result, count, 0);
|
486
836
|
|
@@ -494,7 +844,7 @@ void WindowSegmentTree::ConstructTree() {
|
|
494
844
|
D_ASSERT(inputs.ColumnCount() > 0);
|
495
845
|
|
496
846
|
// Use a temporary scan state to build the tree
|
497
|
-
auto >state = gstate->Cast<WindowSegmentTreeState>();
|
847
|
+
auto >state = gstate->Cast<WindowSegmentTreeState>().part;
|
498
848
|
|
499
849
|
// compute space required to store internal nodes of segment tree
|
500
850
|
internal_nodes = 0;
|
@@ -533,51 +883,110 @@ void WindowSegmentTree::ConstructTree() {
|
|
533
883
|
}
|
534
884
|
}
|
535
885
|
|
536
|
-
void WindowSegmentTree::Evaluate(WindowAggregatorState &lstate, const
|
537
|
-
idx_t
|
886
|
+
void WindowSegmentTree::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &result, idx_t count,
|
887
|
+
idx_t row_idx) const {
|
888
|
+
|
538
889
|
auto <state = lstate.Cast<WindowSegmentTreeState>();
|
539
|
-
|
540
|
-
auto
|
890
|
+
auto window_begin = FlatVector::GetData<const idx_t>(bounds.data[WINDOW_BEGIN]);
|
891
|
+
auto window_end = FlatVector::GetData<const idx_t>(bounds.data[WINDOW_END]);
|
892
|
+
auto peer_begin = FlatVector::GetData<const idx_t>(bounds.data[PEER_BEGIN]);
|
893
|
+
auto peer_end = FlatVector::GetData<const idx_t>(bounds.data[PEER_END]);
|
894
|
+
|
895
|
+
auto &part = ltstate.part;
|
896
|
+
if (exclude_mode != WindowExcludeMode::NO_OTHER) {
|
897
|
+
// 1. evaluate the tree left of the excluded part
|
898
|
+
part.Evaluate(*this, window_begin, peer_begin, result, count, row_idx, WindowSegmentTreePart::LEFT);
|
899
|
+
|
900
|
+
// 2. set up a second state for the right of the excluded part
|
901
|
+
if (!ltstate.right_part) {
|
902
|
+
ltstate.right_part = part.Copy();
|
903
|
+
}
|
904
|
+
auto &right_part = *ltstate.right_part;
|
905
|
+
|
906
|
+
// 3. evaluate the tree right of the excluded part
|
907
|
+
right_part.Evaluate(*this, peer_end, window_end, result, count, row_idx, WindowSegmentTreePart::RIGHT);
|
908
|
+
|
909
|
+
// 4. combine the buffer state into the Segment Tree State
|
910
|
+
part.Combine(right_part, count);
|
911
|
+
} else {
|
912
|
+
part.Evaluate(*this, window_begin, window_end, result, count, row_idx, WindowSegmentTreePart::FULL);
|
913
|
+
}
|
914
|
+
|
915
|
+
part.Finalize(result, count);
|
916
|
+
}
|
917
|
+
|
918
|
+
void WindowSegmentTreePart::Evaluate(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends,
|
919
|
+
Vector &result, idx_t count, idx_t row_idx, FramePart frame_part) {
|
920
|
+
D_ASSERT(aggr.function.combine && tree.UseCombineAPI());
|
921
|
+
|
922
|
+
Initialize(count);
|
923
|
+
|
924
|
+
if (order_insensitive) {
|
925
|
+
// First pass: aggregate the segment tree nodes with sharing
|
926
|
+
EvaluateUpperLevels(tree, begins, ends, count, row_idx, frame_part);
|
927
|
+
|
928
|
+
// Second pass: aggregate the ragged leaves
|
929
|
+
EvaluateLeaves(tree, begins, ends, count, row_idx, frame_part, FramePart::FULL);
|
930
|
+
} else {
|
931
|
+
// Evaluate leaves in order
|
932
|
+
EvaluateLeaves(tree, begins, ends, count, row_idx, frame_part, FramePart::LEFT);
|
933
|
+
EvaluateUpperLevels(tree, begins, ends, count, row_idx, frame_part);
|
934
|
+
EvaluateLeaves(tree, begins, ends, count, row_idx, frame_part, FramePart::RIGHT);
|
935
|
+
}
|
936
|
+
}
|
937
|
+
|
938
|
+
void WindowSegmentTreePart::Initialize(idx_t count) {
|
939
|
+
auto fdata = FlatVector::GetData<data_ptr_t>(statef);
|
940
|
+
for (idx_t rid = 0; rid < count; ++rid) {
|
941
|
+
auto state_ptr = fdata[rid];
|
942
|
+
aggr.function.initialize(state_ptr);
|
943
|
+
}
|
944
|
+
}
|
945
|
+
|
946
|
+
void WindowSegmentTreePart::EvaluateUpperLevels(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends,
|
947
|
+
idx_t count, idx_t row_idx, FramePart frame_part) {
|
948
|
+
auto fdata = FlatVector::GetData<data_ptr_t>(statef);
|
949
|
+
|
950
|
+
const auto exclude_mode = tree.exclude_mode;
|
951
|
+
const bool begin_on_curr_row = frame_part == FramePart::RIGHT && exclude_mode == WindowExcludeMode::CURRENT_ROW;
|
952
|
+
const bool end_on_curr_row = frame_part == FramePart::LEFT && exclude_mode == WindowExcludeMode::CURRENT_ROW;
|
953
|
+
|
954
|
+
const auto max_level = tree.levels_flat_start.size() + 1;
|
955
|
+
right_stack.resize(max_level, {0, 0});
|
541
956
|
|
542
|
-
// First pass: aggregate the segment tree nodes
|
543
957
|
// Share adjacent identical states
|
544
958
|
// We do this first because we want to share only tree aggregations
|
545
959
|
idx_t prev_begin = 1;
|
546
960
|
idx_t prev_end = 0;
|
547
|
-
auto ldata = FlatVector::GetData<data_ptr_t>(
|
548
|
-
auto pdata = FlatVector::GetData<data_ptr_t>(
|
961
|
+
auto ldata = FlatVector::GetData<data_ptr_t>(statel);
|
962
|
+
auto pdata = FlatVector::GetData<data_ptr_t>(statep);
|
549
963
|
data_ptr_t prev_state = nullptr;
|
550
|
-
for (idx_t rid = 0; rid < count; ++rid) {
|
964
|
+
for (idx_t rid = 0, cur_row = row_idx; rid < count; ++rid, ++cur_row) {
|
551
965
|
auto state_ptr = fdata[rid];
|
552
|
-
aggr.function.initialize(state_ptr);
|
553
|
-
|
554
|
-
if (cant_combine) {
|
555
|
-
// Make sure we initialise all states
|
556
|
-
continue;
|
557
|
-
}
|
558
966
|
|
559
|
-
auto begin = begins[rid];
|
560
|
-
auto end = ends[rid];
|
967
|
+
auto begin = begin_on_curr_row ? cur_row + 1 : begins[rid];
|
968
|
+
auto end = end_on_curr_row ? cur_row : ends[rid];
|
561
969
|
if (begin >= end) {
|
562
970
|
continue;
|
563
971
|
}
|
564
972
|
|
565
973
|
// Skip level 0
|
566
974
|
idx_t l_idx = 0;
|
567
|
-
|
568
|
-
|
569
|
-
idx_t
|
975
|
+
idx_t right_max = 0;
|
976
|
+
for (; l_idx < max_level; l_idx++) {
|
977
|
+
idx_t parent_begin = begin / tree.TREE_FANOUT;
|
978
|
+
idx_t parent_end = end / tree.TREE_FANOUT;
|
570
979
|
if (prev_state && l_idx == 1 && begin == prev_begin && end == prev_end) {
|
571
980
|
// Just combine the previous top level result
|
572
|
-
ldata[
|
573
|
-
pdata[
|
574
|
-
if (++
|
575
|
-
|
981
|
+
ldata[flush_count] = prev_state;
|
982
|
+
pdata[flush_count] = state_ptr;
|
983
|
+
if (++flush_count >= STANDARD_VECTOR_SIZE) {
|
984
|
+
FlushStates(true);
|
576
985
|
}
|
577
986
|
break;
|
578
987
|
}
|
579
988
|
|
580
|
-
if (l_idx == 1) {
|
989
|
+
if (order_insensitive && l_idx == 1) {
|
581
990
|
prev_state = state_ptr;
|
582
991
|
prev_begin = begin;
|
583
992
|
prev_end = end;
|
@@ -585,72 +994,507 @@ void WindowSegmentTree::Evaluate(WindowAggregatorState &lstate, const idx_t *beg
|
|
585
994
|
|
586
995
|
if (parent_begin == parent_end) {
|
587
996
|
if (l_idx) {
|
588
|
-
|
997
|
+
WindowSegmentValue(tree, l_idx, begin, end, state_ptr);
|
589
998
|
}
|
590
999
|
break;
|
591
1000
|
}
|
592
|
-
idx_t group_begin = parent_begin * TREE_FANOUT;
|
1001
|
+
idx_t group_begin = parent_begin * tree.TREE_FANOUT;
|
593
1002
|
if (begin != group_begin) {
|
594
1003
|
if (l_idx) {
|
595
|
-
|
1004
|
+
WindowSegmentValue(tree, l_idx, begin, group_begin + tree.TREE_FANOUT, state_ptr);
|
596
1005
|
}
|
597
1006
|
parent_begin++;
|
598
1007
|
}
|
599
|
-
idx_t group_end = parent_end * TREE_FANOUT;
|
1008
|
+
idx_t group_end = parent_end * tree.TREE_FANOUT;
|
600
1009
|
if (end != group_end) {
|
601
1010
|
if (l_idx) {
|
602
|
-
|
1011
|
+
if (order_insensitive) {
|
1012
|
+
WindowSegmentValue(tree, l_idx, group_end, end, state_ptr);
|
1013
|
+
} else {
|
1014
|
+
right_stack[l_idx] = {group_end, end};
|
1015
|
+
right_max = l_idx;
|
1016
|
+
}
|
603
1017
|
}
|
604
1018
|
}
|
605
1019
|
begin = parent_begin;
|
606
1020
|
end = parent_end;
|
607
1021
|
}
|
1022
|
+
|
1023
|
+
// Flush the right side values from left to right for order_sensitive aggregates
|
1024
|
+
// As we go up the tree, the right side ranges move left,
|
1025
|
+
// so we just cache them in a fixed size, preallocated array.
|
1026
|
+
// Then we can just reverse scan the array and append the cached ranges.
|
1027
|
+
for (l_idx = right_max; l_idx > 0; --l_idx) {
|
1028
|
+
auto &right_entry = right_stack[l_idx];
|
1029
|
+
const auto group_end = right_entry.first;
|
1030
|
+
const auto end = right_entry.second;
|
1031
|
+
if (end) {
|
1032
|
+
WindowSegmentValue(tree, l_idx, group_end, end, state_ptr);
|
1033
|
+
right_entry = {0, 0};
|
1034
|
+
}
|
1035
|
+
}
|
608
1036
|
}
|
609
|
-
|
1037
|
+
FlushStates(true);
|
1038
|
+
}
|
610
1039
|
|
611
|
-
|
612
|
-
|
613
|
-
|
1040
|
+
void WindowSegmentTreePart::EvaluateLeaves(const WindowSegmentTree &tree, const idx_t *begins, const idx_t *ends,
|
1041
|
+
idx_t count, idx_t row_idx, FramePart frame_part, FramePart leaf_part) {
|
1042
|
+
|
1043
|
+
auto fdata = FlatVector::GetData<data_ptr_t>(statef);
|
1044
|
+
|
1045
|
+
// For order-sensitive aggregates, we have to process the ragged leaves in two pieces.
|
1046
|
+
// The left side have to be added before the main tree followed by the ragged right sides.
|
1047
|
+
// The current row is the leftmost value of the right hand side.
|
1048
|
+
const bool compute_left = leaf_part != FramePart::RIGHT;
|
1049
|
+
const bool compute_right = leaf_part != FramePart::LEFT;
|
1050
|
+
const auto exclude_mode = tree.exclude_mode;
|
1051
|
+
const bool begin_on_curr_row = frame_part == FramePart::RIGHT && exclude_mode == WindowExcludeMode::CURRENT_ROW;
|
1052
|
+
const bool end_on_curr_row = frame_part == FramePart::LEFT && exclude_mode == WindowExcludeMode::CURRENT_ROW;
|
1053
|
+
// with EXCLUDE TIES, in addition to the frame part right of the peer group's end, we also need to consider the
|
1054
|
+
// current row
|
1055
|
+
const bool add_curr_row = compute_left && frame_part == FramePart::RIGHT && exclude_mode == WindowExcludeMode::TIES;
|
1056
|
+
|
1057
|
+
for (idx_t rid = 0, cur_row = row_idx; rid < count; ++rid, ++cur_row) {
|
614
1058
|
auto state_ptr = fdata[rid];
|
615
1059
|
|
616
|
-
const auto begin = begins[rid];
|
617
|
-
const auto end = ends[rid];
|
1060
|
+
const auto begin = begin_on_curr_row ? cur_row + 1 : begins[rid];
|
1061
|
+
const auto end = end_on_curr_row ? cur_row : ends[rid];
|
1062
|
+
if (add_curr_row) {
|
1063
|
+
WindowSegmentValue(tree, 0, cur_row, cur_row + 1, state_ptr);
|
1064
|
+
}
|
618
1065
|
if (begin >= end) {
|
619
1066
|
continue;
|
620
1067
|
}
|
621
1068
|
|
622
|
-
|
623
|
-
idx_t
|
624
|
-
|
625
|
-
|
626
|
-
|
1069
|
+
idx_t parent_begin = begin / tree.TREE_FANOUT;
|
1070
|
+
idx_t parent_end = end / tree.TREE_FANOUT;
|
1071
|
+
if (parent_begin == parent_end) {
|
1072
|
+
if (compute_left) {
|
1073
|
+
WindowSegmentValue(tree, 0, begin, end, state_ptr);
|
1074
|
+
}
|
627
1075
|
continue;
|
628
1076
|
}
|
629
1077
|
|
630
|
-
idx_t group_begin = parent_begin * TREE_FANOUT;
|
631
|
-
if (begin != group_begin) {
|
632
|
-
|
633
|
-
parent_begin++;
|
1078
|
+
idx_t group_begin = parent_begin * tree.TREE_FANOUT;
|
1079
|
+
if (begin != group_begin && compute_left) {
|
1080
|
+
WindowSegmentValue(tree, 0, begin, group_begin + tree.TREE_FANOUT, state_ptr);
|
634
1081
|
}
|
635
|
-
idx_t group_end = parent_end * TREE_FANOUT;
|
636
|
-
if (end != group_end) {
|
637
|
-
|
1082
|
+
idx_t group_end = parent_end * tree.TREE_FANOUT;
|
1083
|
+
if (end != group_end && compute_right) {
|
1084
|
+
WindowSegmentValue(tree, 0, group_end, end, state_ptr);
|
638
1085
|
}
|
639
1086
|
}
|
640
|
-
|
1087
|
+
FlushStates(false);
|
1088
|
+
}
|
641
1089
|
|
642
|
-
|
1090
|
+
//===--------------------------------------------------------------------===//
|
1091
|
+
// WindowDistinctAggregator
|
1092
|
+
//===--------------------------------------------------------------------===//
|
1093
|
+
WindowDistinctAggregator::WindowDistinctAggregator(AggregateObject aggr, const LogicalType &result_type,
|
1094
|
+
const WindowExcludeMode exclude_mode_p, idx_t count,
|
1095
|
+
ClientContext &context)
|
1096
|
+
: WindowAggregator(std::move(aggr), result_type, exclude_mode_p, count), context(context),
|
1097
|
+
allocator(Allocator::DefaultAllocator()) {
|
1098
|
+
|
1099
|
+
payload_types.emplace_back(LogicalType::UBIGINT);
|
1100
|
+
payload_chunk.Initialize(Allocator::DefaultAllocator(), payload_types);
|
1101
|
+
}
|
643
1102
|
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
1103
|
+
WindowDistinctAggregator::~WindowDistinctAggregator() {
|
1104
|
+
if (!aggr.function.destructor) {
|
1105
|
+
// nothing to destroy
|
1106
|
+
return;
|
1107
|
+
}
|
1108
|
+
AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
|
1109
|
+
// call the destructor for all the intermediate states
|
1110
|
+
data_ptr_t address_data[STANDARD_VECTOR_SIZE];
|
1111
|
+
Vector addresses(LogicalType::POINTER, data_ptr_cast(address_data));
|
1112
|
+
idx_t count = 0;
|
1113
|
+
for (idx_t i = 0; i < internal_nodes; i++) {
|
1114
|
+
address_data[count++] = data_ptr_t(levels_flat_native.get() + i * state_size);
|
1115
|
+
if (count == STANDARD_VECTOR_SIZE) {
|
1116
|
+
aggr.function.destructor(addresses, aggr_input_data, count);
|
1117
|
+
count = 0;
|
1118
|
+
}
|
1119
|
+
}
|
1120
|
+
if (count > 0) {
|
1121
|
+
aggr.function.destructor(addresses, aggr_input_data, count);
|
1122
|
+
}
|
1123
|
+
}
|
649
1124
|
|
650
|
-
|
651
|
-
|
1125
|
+
void WindowDistinctAggregator::Sink(DataChunk &arg_chunk, SelectionVector *filter_sel, idx_t filtered) {
|
1126
|
+
WindowAggregator::Sink(arg_chunk, filter_sel, filtered);
|
1127
|
+
|
1128
|
+
// We sort the arguments and use the partition index as a tie-breaker.
|
1129
|
+
// TODO: Use a hash table?
|
1130
|
+
if (!global_sort) {
|
1131
|
+
// 1: functionComputePrevIdcs(𝑖𝑛)
|
1132
|
+
// 2: sorted ← []
|
1133
|
+
vector<LogicalType> sort_types;
|
1134
|
+
for (const auto &col : arg_chunk.data) {
|
1135
|
+
sort_types.emplace_back(col.GetType());
|
1136
|
+
}
|
1137
|
+
|
1138
|
+
for (const auto &type : payload_types) {
|
1139
|
+
sort_types.emplace_back(type);
|
1140
|
+
}
|
1141
|
+
|
1142
|
+
vector<BoundOrderByNode> orders;
|
1143
|
+
for (const auto &type : sort_types) {
|
1144
|
+
auto expr = make_uniq<BoundConstantExpression>(Value(type));
|
1145
|
+
orders.emplace_back(BoundOrderByNode(OrderType::ASCENDING, OrderByNullType::NULLS_FIRST, std::move(expr)));
|
1146
|
+
}
|
1147
|
+
|
1148
|
+
RowLayout payload_layout;
|
1149
|
+
payload_layout.Initialize(payload_types);
|
1150
|
+
|
1151
|
+
global_sort = make_uniq<GlobalSortState>(BufferManager::GetBufferManager(context), orders, payload_layout);
|
1152
|
+
local_sort.Initialize(*global_sort, global_sort->buffer_manager);
|
1153
|
+
|
1154
|
+
sort_chunk.Initialize(Allocator::DefaultAllocator(), sort_types);
|
1155
|
+
sort_chunk.data.back().Reference(payload_chunk.data[0]);
|
1156
|
+
payload_pos = 0;
|
1157
|
+
memory_per_thread = PhysicalOperator::GetMaxThreadMemory(context);
|
1158
|
+
}
|
1159
|
+
|
1160
|
+
// 3: for i ← 0 to in.size do
|
1161
|
+
// 4: sorted[i] ← (in[i], i)
|
1162
|
+
const auto count = arg_chunk.size();
|
1163
|
+
auto payload_data = FlatVector::GetData<idx_t>(payload_chunk.data[0]);
|
1164
|
+
std::iota(payload_data, payload_data + count, payload_pos);
|
1165
|
+
payload_pos += count;
|
1166
|
+
|
1167
|
+
for (column_t c = 0; c < arg_chunk.ColumnCount(); ++c) {
|
1168
|
+
sort_chunk.data[c].Reference(arg_chunk.data[c]);
|
1169
|
+
}
|
1170
|
+
sort_chunk.SetCardinality(arg_chunk);
|
1171
|
+
payload_chunk.SetCardinality(sort_chunk);
|
1172
|
+
|
1173
|
+
// Apply FILTER clause, if any
|
1174
|
+
if (filter_sel) {
|
1175
|
+
sort_chunk.Slice(*filter_sel, filtered);
|
1176
|
+
payload_chunk.Slice(*filter_sel, filtered);
|
1177
|
+
}
|
1178
|
+
|
1179
|
+
local_sort.SinkChunk(sort_chunk, payload_chunk);
|
1180
|
+
|
1181
|
+
if (local_sort.SizeInBytes() > memory_per_thread) {
|
1182
|
+
local_sort.Sort(*global_sort, true);
|
1183
|
+
}
|
1184
|
+
}
|
1185
|
+
|
1186
|
+
class WindowDistinctAggregator::DistinctSortTree : public MergeSortTree<idx_t, idx_t> {
|
1187
|
+
public:
|
1188
|
+
// prev_idx, input_idx
|
1189
|
+
using ZippedTuple = std::tuple<idx_t, idx_t>;
|
1190
|
+
using ZippedElements = vector<ZippedTuple>;
|
1191
|
+
|
1192
|
+
DistinctSortTree(ZippedElements &&prev_idcs, WindowDistinctAggregator &wda);
|
1193
|
+
};
|
1194
|
+
|
1195
|
+
void WindowDistinctAggregator::Finalize(const FrameStats &stats) {
|
1196
|
+
// 5: Sort sorted lexicographically increasing
|
1197
|
+
global_sort->AddLocalState(local_sort);
|
1198
|
+
global_sort->PrepareMergePhase();
|
1199
|
+
while (global_sort->sorted_blocks.size() > 1) {
|
1200
|
+
global_sort->InitializeMergeRound();
|
1201
|
+
MergeSorter merge_sorter(*global_sort, global_sort->buffer_manager);
|
1202
|
+
merge_sorter.PerformInMergeRound();
|
1203
|
+
global_sort->CompleteMergeRound(true);
|
1204
|
+
}
|
1205
|
+
|
1206
|
+
DataChunk scan_chunk;
|
1207
|
+
scan_chunk.Initialize(Allocator::DefaultAllocator(), payload_types);
|
1208
|
+
|
1209
|
+
auto scanner = make_uniq<PayloadScanner>(*global_sort);
|
1210
|
+
const auto in_size = scanner->Remaining();
|
1211
|
+
scanner->Scan(scan_chunk);
|
1212
|
+
idx_t scan_idx = 0;
|
1213
|
+
|
1214
|
+
// 6: prevIdcs ← []
|
1215
|
+
// 7: prevIdcs[0] ← “-”
|
1216
|
+
const auto count = inputs.size();
|
1217
|
+
using ZippedTuple = DistinctSortTree::ZippedTuple;
|
1218
|
+
DistinctSortTree::ZippedElements prev_idcs;
|
1219
|
+
prev_idcs.resize(count);
|
1220
|
+
|
1221
|
+
// To handle FILTER clauses we make the missing elements
|
1222
|
+
// point to themselves so they won't be counted.
|
1223
|
+
if (in_size < count) {
|
1224
|
+
for (idx_t i = 0; i < count; ++i) {
|
1225
|
+
prev_idcs[i] = ZippedTuple(i + 1, i);
|
1226
|
+
}
|
1227
|
+
}
|
1228
|
+
|
1229
|
+
auto *input_idx = FlatVector::GetData<idx_t>(scan_chunk.data[0]);
|
1230
|
+
auto i = input_idx[scan_idx++];
|
1231
|
+
prev_idcs[i] = ZippedTuple(0, i);
|
1232
|
+
|
1233
|
+
SBIterator curr(*global_sort, ExpressionType::COMPARE_LESSTHAN);
|
1234
|
+
SBIterator prev(*global_sort, ExpressionType::COMPARE_LESSTHAN);
|
1235
|
+
auto prefix_layout = global_sort->sort_layout.GetPrefixComparisonLayout(sort_chunk.ColumnCount() - 1);
|
1236
|
+
|
1237
|
+
// 8: for i ← 1 to in.size do
|
1238
|
+
for (++curr; curr.GetIndex() < in_size; ++curr, ++prev) {
|
1239
|
+
// Scan second one chunk at a time
|
1240
|
+
// Note the scan is one behind the iterators
|
1241
|
+
if (scan_idx >= scan_chunk.size()) {
|
1242
|
+
scan_chunk.Reset();
|
1243
|
+
scanner->Scan(scan_chunk);
|
1244
|
+
scan_idx = 0;
|
1245
|
+
input_idx = FlatVector::GetData<idx_t>(scan_chunk.data[0]);
|
1246
|
+
}
|
1247
|
+
auto second = i;
|
1248
|
+
i = input_idx[scan_idx++];
|
1249
|
+
|
1250
|
+
int lt = 0;
|
1251
|
+
if (prefix_layout.all_constant) {
|
1252
|
+
lt = FastMemcmp(prev.entry_ptr, curr.entry_ptr, prefix_layout.comparison_size);
|
1253
|
+
} else {
|
1254
|
+
lt = Comparators::CompareTuple(prev.scan, curr.scan, prev.entry_ptr, curr.entry_ptr, prefix_layout,
|
1255
|
+
prev.external);
|
1256
|
+
}
|
1257
|
+
|
1258
|
+
// 9: if sorted[i].first == sorted[i-1].first then
|
1259
|
+
// 10: prevIdcs[i] ← sorted[i-1].second
|
1260
|
+
// 11: else
|
1261
|
+
// 12: prevIdcs[i] ← “-”
|
1262
|
+
if (!lt) {
|
1263
|
+
prev_idcs[i] = ZippedTuple(second + 1, i);
|
1264
|
+
} else {
|
1265
|
+
prev_idcs[i] = ZippedTuple(0, i);
|
1266
|
+
}
|
1267
|
+
}
|
1268
|
+
// 13: return prevIdcs
|
1269
|
+
|
1270
|
+
merge_sort_tree = make_uniq<DistinctSortTree>(std::move(prev_idcs), *this);
|
1271
|
+
}
|
1272
|
+
|
1273
|
+
WindowDistinctAggregator::DistinctSortTree::DistinctSortTree(ZippedElements &&prev_idcs,
|
1274
|
+
WindowDistinctAggregator &wda) {
|
1275
|
+
auto &inputs = wda.inputs;
|
1276
|
+
auto &aggr = wda.aggr;
|
1277
|
+
auto &allocator = wda.allocator;
|
1278
|
+
const auto state_size = wda.state_size;
|
1279
|
+
auto &internal_nodes = wda.internal_nodes;
|
1280
|
+
auto &levels_flat_native = wda.levels_flat_native;
|
1281
|
+
auto &levels_flat_start = wda.levels_flat_start;
|
1282
|
+
|
1283
|
+
//! Input data chunk, used for leaf segment aggregation
|
1284
|
+
DataChunk leaves;
|
1285
|
+
leaves.Initialize(Allocator::DefaultAllocator(), inputs.GetTypes());
|
1286
|
+
SelectionVector sel;
|
1287
|
+
sel.Initialize();
|
1288
|
+
|
1289
|
+
AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
|
1290
|
+
|
1291
|
+
//! The states to update
|
1292
|
+
Vector update_v(LogicalType::POINTER);
|
1293
|
+
auto updates = FlatVector::GetData<data_ptr_t>(update_v);
|
1294
|
+
idx_t nupdate = 0;
|
1295
|
+
|
1296
|
+
Vector source_v(LogicalType::POINTER);
|
1297
|
+
auto sources = FlatVector::GetData<data_ptr_t>(source_v);
|
1298
|
+
Vector target_v(LogicalType::POINTER);
|
1299
|
+
auto targets = FlatVector::GetData<data_ptr_t>(target_v);
|
1300
|
+
idx_t ncombine = 0;
|
1301
|
+
|
1302
|
+
// compute space required to store aggregation states of merge sort tree
|
1303
|
+
// this is one aggregate state per entry per level
|
1304
|
+
MergeSortTree<ZippedTuple> zipped_tree(std::move(prev_idcs));
|
1305
|
+
internal_nodes = 0;
|
1306
|
+
for (idx_t level_nr = 0; level_nr < zipped_tree.tree.size(); ++level_nr) {
|
1307
|
+
internal_nodes += zipped_tree.tree[level_nr].first.size();
|
1308
|
+
}
|
1309
|
+
levels_flat_native = make_unsafe_uniq_array<data_t>(internal_nodes * state_size);
|
1310
|
+
levels_flat_start.push_back(0);
|
1311
|
+
idx_t levels_flat_offset = 0;
|
1312
|
+
|
1313
|
+
// Walk the distinct value tree building the intermediate aggregates
|
1314
|
+
tree.reserve(zipped_tree.tree.size());
|
1315
|
+
idx_t level_width = 1;
|
1316
|
+
for (idx_t level_nr = 0; level_nr < zipped_tree.tree.size(); ++level_nr) {
|
1317
|
+
auto &zipped_level = zipped_tree.tree[level_nr].first;
|
1318
|
+
vector<ElementType> level;
|
1319
|
+
level.reserve(zipped_level.size());
|
1320
|
+
|
1321
|
+
for (idx_t i = 0; i < zipped_level.size(); i += level_width) {
|
1322
|
+
// Reset the combine state
|
1323
|
+
data_ptr_t prev_state = nullptr;
|
1324
|
+
auto next_limit = MinValue<idx_t>(zipped_level.size(), i + level_width);
|
1325
|
+
for (auto j = i; j < next_limit; ++j) {
|
1326
|
+
// Initialise the next aggregate
|
1327
|
+
auto curr_state = levels_flat_native.get() + (levels_flat_offset++ * state_size);
|
1328
|
+
aggr.function.initialize(curr_state);
|
1329
|
+
|
1330
|
+
// Update this state (if it matches)
|
1331
|
+
const auto prev_idx = std::get<0>(zipped_level[j]);
|
1332
|
+
level.emplace_back(prev_idx);
|
1333
|
+
if (prev_idx < i + 1) {
|
1334
|
+
updates[nupdate] = curr_state;
|
1335
|
+
// input_idx
|
1336
|
+
sel[nupdate] = std::get<1>(zipped_level[j]);
|
1337
|
+
++nupdate;
|
1338
|
+
}
|
1339
|
+
|
1340
|
+
// Merge the previous state (if any)
|
1341
|
+
if (prev_state) {
|
1342
|
+
sources[ncombine] = prev_state;
|
1343
|
+
targets[ncombine] = curr_state;
|
1344
|
+
++ncombine;
|
1345
|
+
}
|
1346
|
+
prev_state = curr_state;
|
1347
|
+
|
1348
|
+
// Flush the states if one is maxed out.
|
1349
|
+
if (MaxValue<idx_t>(ncombine, nupdate) >= STANDARD_VECTOR_SIZE) {
|
1350
|
+
// Push the updates first so they propagate
|
1351
|
+
leaves.Reference(inputs);
|
1352
|
+
leaves.Slice(sel, nupdate);
|
1353
|
+
aggr.function.update(leaves.data.data(), aggr_input_data, leaves.ColumnCount(), update_v, nupdate);
|
1354
|
+
nupdate = 0;
|
1355
|
+
|
1356
|
+
// Combine the states sequentially
|
1357
|
+
aggr.function.combine(source_v, target_v, aggr_input_data, ncombine);
|
1358
|
+
ncombine = 0;
|
1359
|
+
}
|
1360
|
+
}
|
652
1361
|
}
|
1362
|
+
|
1363
|
+
tree.emplace_back(std::move(level), std::move(zipped_tree.tree[level_nr].second));
|
1364
|
+
|
1365
|
+
levels_flat_start.push_back(levels_flat_offset);
|
1366
|
+
level_width *= FANOUT;
|
1367
|
+
}
|
1368
|
+
|
1369
|
+
// Flush any remaining states
|
1370
|
+
if (ncombine || nupdate) {
|
1371
|
+
// Push the updates
|
1372
|
+
leaves.Reference(inputs);
|
1373
|
+
leaves.Slice(sel, nupdate);
|
1374
|
+
aggr.function.update(leaves.data.data(), aggr_input_data, leaves.ColumnCount(), update_v, nupdate);
|
1375
|
+
nupdate = 0;
|
1376
|
+
|
1377
|
+
// Combine the states sequentially
|
1378
|
+
aggr.function.combine(source_v, target_v, aggr_input_data, ncombine);
|
1379
|
+
ncombine = 0;
|
1380
|
+
}
|
1381
|
+
}
|
1382
|
+
|
1383
|
+
class WindowDistinctState : public WindowAggregatorState {
|
1384
|
+
public:
|
1385
|
+
WindowDistinctState(const AggregateObject &aggr, DataChunk &inputs, const WindowDistinctAggregator &tree);
|
1386
|
+
|
1387
|
+
void Evaluate(const DataChunk &bounds, Vector &result, idx_t count, idx_t row_idx);
|
1388
|
+
|
1389
|
+
protected:
|
1390
|
+
//! Flush the accumulated intermediate states into the result states
|
1391
|
+
void FlushStates();
|
1392
|
+
|
1393
|
+
//! The aggregate function
|
1394
|
+
const AggregateObject &aggr;
|
1395
|
+
//! The aggregate function
|
1396
|
+
DataChunk &inputs;
|
1397
|
+
//! The merge sort tree data
|
1398
|
+
const WindowDistinctAggregator &tree;
|
1399
|
+
//! The size of a single aggregate state
|
1400
|
+
const idx_t state_size;
|
1401
|
+
//! Data pointer that contains a vector of states, used for row aggregation
|
1402
|
+
vector<data_t> state;
|
1403
|
+
//! Reused result state container for the window functions
|
1404
|
+
Vector statef;
|
1405
|
+
//! A vector of pointers to "state", used for buffering intermediate aggregates
|
1406
|
+
Vector statep;
|
1407
|
+
//! Reused state pointers for combining tree elements
|
1408
|
+
Vector statel;
|
1409
|
+
//! Count of buffered values
|
1410
|
+
idx_t flush_count;
|
1411
|
+
//! The frame boundaries, used for the window functions
|
1412
|
+
SubFrames frames;
|
1413
|
+
};
|
1414
|
+
|
1415
|
+
WindowDistinctState::WindowDistinctState(const AggregateObject &aggr, DataChunk &inputs,
|
1416
|
+
const WindowDistinctAggregator &tree)
|
1417
|
+
: aggr(aggr), inputs(inputs), tree(tree), state_size(aggr.function.state_size()),
|
1418
|
+
state((state_size * STANDARD_VECTOR_SIZE)), statef(LogicalType::POINTER), statep(LogicalType::POINTER),
|
1419
|
+
statel(LogicalType::POINTER), flush_count(0) {
|
1420
|
+
InitSubFrames(frames, tree.exclude_mode);
|
1421
|
+
|
1422
|
+
// Build the finalise vector that just points to the result states
|
1423
|
+
data_ptr_t state_ptr = state.data();
|
1424
|
+
D_ASSERT(statef.GetVectorType() == VectorType::FLAT_VECTOR);
|
1425
|
+
statef.SetVectorType(VectorType::CONSTANT_VECTOR);
|
1426
|
+
statef.Flatten(STANDARD_VECTOR_SIZE);
|
1427
|
+
auto fdata = FlatVector::GetData<data_ptr_t>(statef);
|
1428
|
+
for (idx_t i = 0; i < STANDARD_VECTOR_SIZE; ++i) {
|
1429
|
+
fdata[i] = state_ptr;
|
1430
|
+
state_ptr += state_size;
|
1431
|
+
}
|
1432
|
+
}
|
1433
|
+
|
1434
|
+
void WindowDistinctState::FlushStates() {
|
1435
|
+
if (!flush_count) {
|
1436
|
+
return;
|
653
1437
|
}
|
1438
|
+
|
1439
|
+
AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
|
1440
|
+
statel.Verify(flush_count);
|
1441
|
+
aggr.function.combine(statel, statep, aggr_input_data, flush_count);
|
1442
|
+
|
1443
|
+
flush_count = 0;
|
1444
|
+
}
|
1445
|
+
|
1446
|
+
void WindowDistinctState::Evaluate(const DataChunk &bounds, Vector &result, idx_t count, idx_t row_idx) {
|
1447
|
+
auto fdata = FlatVector::GetData<data_ptr_t>(statef);
|
1448
|
+
auto ldata = FlatVector::GetData<data_ptr_t>(statel);
|
1449
|
+
auto pdata = FlatVector::GetData<data_ptr_t>(statep);
|
1450
|
+
|
1451
|
+
const auto &merge_sort_tree = *tree.merge_sort_tree;
|
1452
|
+
const auto running_aggs = tree.levels_flat_native.get();
|
1453
|
+
|
1454
|
+
EvaluateSubFrames(bounds, tree.exclude_mode, count, row_idx, frames, [&](idx_t rid) {
|
1455
|
+
auto agg_state = fdata[rid];
|
1456
|
+
aggr.function.initialize(agg_state);
|
1457
|
+
|
1458
|
+
// TODO: Extend AggregateLowerBound to handle subframes, just like SelectNth.
|
1459
|
+
const auto lower = frames[0].start;
|
1460
|
+
const auto upper = frames[0].end;
|
1461
|
+
merge_sort_tree.AggregateLowerBound(lower, upper, lower + 1,
|
1462
|
+
[&](idx_t level, const idx_t run_begin, const idx_t run_pos) {
|
1463
|
+
if (run_pos != run_begin) {
|
1464
|
+
// Find the source aggregate
|
1465
|
+
// Buffer a merge of the indicated state into the current state
|
1466
|
+
const auto agg_idx = tree.levels_flat_start[level] + run_pos - 1;
|
1467
|
+
const auto running_agg = running_aggs + agg_idx * state_size;
|
1468
|
+
pdata[flush_count] = agg_state;
|
1469
|
+
ldata[flush_count++] = running_agg;
|
1470
|
+
if (flush_count >= STANDARD_VECTOR_SIZE) {
|
1471
|
+
FlushStates();
|
1472
|
+
}
|
1473
|
+
}
|
1474
|
+
});
|
1475
|
+
});
|
1476
|
+
|
1477
|
+
// Flush the final states
|
1478
|
+
FlushStates();
|
1479
|
+
|
1480
|
+
// Finalise the result aggregates and write to the result
|
1481
|
+
AggregateInputData aggr_input_data(aggr.GetFunctionData(), allocator);
|
1482
|
+
aggr.function.finalize(statef, aggr_input_data, result, count, 0);
|
1483
|
+
|
1484
|
+
// Destruct the result aggregates
|
1485
|
+
if (aggr.function.destructor) {
|
1486
|
+
aggr.function.destructor(statef, aggr_input_data, count);
|
1487
|
+
}
|
1488
|
+
}
|
1489
|
+
|
1490
|
+
unique_ptr<WindowAggregatorState> WindowDistinctAggregator::GetLocalState() const {
|
1491
|
+
return make_uniq<WindowDistinctState>(aggr, const_cast<DataChunk &>(inputs), *this);
|
1492
|
+
}
|
1493
|
+
|
1494
|
+
void WindowDistinctAggregator::Evaluate(WindowAggregatorState &lstate, const DataChunk &bounds, Vector &result,
|
1495
|
+
idx_t count, idx_t row_idx) const {
|
1496
|
+
auto &ldstate = lstate.Cast<WindowDistinctState>();
|
1497
|
+
ldstate.Evaluate(bounds, result, count, row_idx);
|
654
1498
|
}
|
655
1499
|
|
656
1500
|
} // namespace duckdb
|