duckdb 0.8.2-dev33.0 → 0.8.2-dev3300.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/README.md +7 -0
- package/binding.gyp +25 -13
- package/binding.gyp.in +1 -1
- package/configure.py +8 -3
- package/duckdb_extension_config.cmake +10 -0
- package/package.json +1 -1
- package/src/duckdb/extension/icu/icu-dateadd.cpp +2 -2
- package/src/duckdb/extension/icu/icu-datefunc.cpp +10 -1
- package/src/duckdb/extension/icu/icu-datepart.cpp +162 -41
- package/src/duckdb/extension/icu/icu-datesub.cpp +3 -2
- package/src/duckdb/extension/icu/icu-datetrunc.cpp +2 -1
- package/src/duckdb/extension/icu/icu-list-range.cpp +1 -1
- package/src/duckdb/extension/icu/icu-makedate.cpp +19 -6
- package/src/duckdb/extension/icu/icu-strptime.cpp +5 -24
- package/src/duckdb/extension/icu/icu-table-range.cpp +5 -5
- package/src/duckdb/extension/icu/icu-timebucket.cpp +16 -16
- package/src/duckdb/extension/icu/icu-timezone.cpp +8 -8
- package/src/duckdb/extension/icu/icu_extension.cpp +5 -7
- package/src/duckdb/extension/json/buffered_json_reader.cpp +2 -0
- package/src/duckdb/extension/json/include/buffered_json_reader.hpp +5 -19
- package/src/duckdb/extension/json/include/json_common.hpp +47 -231
- package/src/duckdb/extension/json/include/json_deserializer.hpp +1 -1
- package/src/duckdb/extension/json/include/json_enums.hpp +60 -0
- package/src/duckdb/extension/json/include/json_executors.hpp +49 -13
- package/src/duckdb/extension/json/include/json_functions.hpp +2 -1
- package/src/duckdb/extension/json/include/json_scan.hpp +14 -10
- package/src/duckdb/extension/json/include/json_serializer.hpp +1 -1
- package/src/duckdb/extension/json/include/json_transform.hpp +3 -0
- package/src/duckdb/extension/json/json_common.cpp +272 -40
- package/src/duckdb/extension/json/json_deserializer.cpp +16 -14
- package/src/duckdb/extension/json/json_enums.cpp +105 -0
- package/src/duckdb/extension/json/json_functions/json_create.cpp +21 -2
- package/src/duckdb/extension/json/json_functions/json_structure.cpp +1 -1
- package/src/duckdb/extension/json/json_functions/json_transform.cpp +93 -38
- package/src/duckdb/extension/json/json_functions/json_type.cpp +1 -1
- package/src/duckdb/extension/json/json_functions.cpp +26 -25
- package/src/duckdb/extension/json/json_scan.cpp +47 -6
- package/src/duckdb/extension/json/json_serializer.cpp +11 -11
- package/src/duckdb/extension/json/serialize_json.cpp +92 -0
- package/src/duckdb/extension/parquet/column_reader.cpp +37 -25
- package/src/duckdb/extension/parquet/column_writer.cpp +77 -61
- package/src/duckdb/extension/parquet/include/cast_column_reader.hpp +2 -2
- package/src/duckdb/extension/parquet/include/column_reader.hpp +14 -16
- package/src/duckdb/extension/parquet/include/column_writer.hpp +9 -7
- package/src/duckdb/extension/parquet/include/list_column_reader.hpp +2 -2
- package/src/duckdb/extension/parquet/include/parquet_dbp_decoder.hpp +3 -3
- package/src/duckdb/extension/parquet/include/parquet_decimal_utils.hpp +3 -3
- package/src/duckdb/extension/parquet/include/parquet_file_metadata_cache.hpp +2 -2
- package/src/duckdb/extension/parquet/include/parquet_reader.hpp +4 -0
- package/src/duckdb/extension/parquet/include/parquet_statistics.hpp +2 -2
- package/src/duckdb/extension/parquet/include/parquet_support.hpp +9 -11
- package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +1 -0
- package/src/duckdb/extension/parquet/include/parquet_writer.hpp +28 -5
- package/src/duckdb/extension/parquet/include/string_column_reader.hpp +1 -1
- package/src/duckdb/extension/parquet/include/struct_column_reader.hpp +2 -3
- package/src/duckdb/extension/parquet/include/zstd_file_system.hpp +2 -2
- package/src/duckdb/extension/parquet/parquet_extension.cpp +258 -40
- package/src/duckdb/extension/parquet/parquet_reader.cpp +10 -10
- package/src/duckdb/extension/parquet/parquet_statistics.cpp +25 -8
- package/src/duckdb/extension/parquet/parquet_timestamp.cpp +6 -0
- package/src/duckdb/extension/parquet/parquet_writer.cpp +149 -31
- package/src/duckdb/extension/parquet/serialize_parquet.cpp +26 -0
- package/src/duckdb/extension/parquet/zstd_file_system.cpp +2 -2
- package/src/duckdb/src/catalog/catalog.cpp +3 -7
- package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +8 -11
- package/src/duckdb/src/catalog/catalog_entry/index_catalog_entry.cpp +17 -41
- package/src/duckdb/src/catalog/catalog_entry/macro_catalog_entry.cpp +2 -10
- package/src/duckdb/src/catalog/catalog_entry/schema_catalog_entry.cpp +4 -14
- package/src/duckdb/src/catalog/catalog_entry/sequence_catalog_entry.cpp +11 -28
- package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +11 -42
- package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +7 -26
- package/src/duckdb/src/catalog/catalog_entry/view_catalog_entry.cpp +11 -27
- package/src/duckdb/src/catalog/catalog_entry.cpp +25 -1
- package/src/duckdb/src/catalog/catalog_search_path.cpp +5 -4
- package/src/duckdb/src/catalog/catalog_set.cpp +0 -63
- package/src/duckdb/src/catalog/default/default_functions.cpp +21 -0
- package/src/duckdb/src/catalog/dependency_manager.cpp +0 -36
- package/src/duckdb/src/common/adbc/adbc.cpp +541 -171
- package/src/duckdb/src/common/adbc/driver_manager.cpp +92 -39
- package/src/duckdb/src/common/adbc/nanoarrow/allocator.cpp +57 -0
- package/src/duckdb/src/common/adbc/nanoarrow/metadata.cpp +121 -0
- package/src/duckdb/src/common/adbc/nanoarrow/schema.cpp +474 -0
- package/src/duckdb/src/common/adbc/nanoarrow/single_batch_array_stream.cpp +84 -0
- package/src/duckdb/src/common/allocator.cpp +14 -2
- package/src/duckdb/src/common/arrow/appender/bool_data.cpp +44 -0
- package/src/duckdb/src/common/arrow/appender/list_data.cpp +78 -0
- package/src/duckdb/src/common/arrow/appender/map_data.cpp +86 -0
- package/src/duckdb/src/common/arrow/appender/struct_data.cpp +45 -0
- package/src/duckdb/src/common/arrow/appender/union_data.cpp +70 -0
- package/src/duckdb/src/common/arrow/arrow_appender.cpp +95 -666
- package/src/duckdb/src/common/arrow/arrow_converter.cpp +65 -37
- package/src/duckdb/src/common/arrow/arrow_wrapper.cpp +37 -42
- package/src/duckdb/src/common/assert.cpp +3 -0
- package/src/duckdb/src/common/constants.cpp +2 -1
- package/src/duckdb/src/common/enum_util.cpp +4838 -4429
- package/src/duckdb/src/common/enums/date_part_specifier.cpp +2 -0
- package/src/duckdb/src/common/enums/logical_operator_type.cpp +4 -0
- package/src/duckdb/src/common/enums/optimizer_type.cpp +2 -0
- package/src/duckdb/src/common/enums/physical_operator_type.cpp +4 -0
- package/src/duckdb/src/common/exception.cpp +2 -2
- package/src/duckdb/src/common/extra_type_info.cpp +483 -0
- package/src/duckdb/src/common/field_writer.cpp +1 -1
- package/src/duckdb/src/common/file_system.cpp +25 -6
- package/src/duckdb/src/common/filename_pattern.cpp +1 -1
- package/src/duckdb/src/common/gzip_file_system.cpp +7 -12
- package/src/duckdb/src/common/hive_partitioning.cpp +10 -6
- package/src/duckdb/src/common/http_state.cpp +78 -0
- package/src/duckdb/src/common/local_file_system.cpp +36 -28
- package/src/duckdb/src/common/multi_file_reader.cpp +193 -20
- package/src/duckdb/src/common/operator/cast_operators.cpp +92 -1
- package/src/duckdb/src/common/operator/string_cast.cpp +45 -8
- package/src/duckdb/src/common/radix_partitioning.cpp +26 -8
- package/src/duckdb/src/common/re2_regex.cpp +1 -1
- package/src/duckdb/src/common/row_operations/row_external.cpp +1 -1
- package/src/duckdb/src/common/serializer/binary_deserializer.cpp +8 -3
- package/src/duckdb/src/common/serializer/binary_serializer.cpp +14 -9
- package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +0 -9
- package/src/duckdb/src/common/serializer/format_serializer.cpp +15 -0
- package/src/duckdb/src/common/sort/merge_sorter.cpp +9 -16
- package/src/duckdb/src/common/sort/partition_state.cpp +70 -50
- package/src/duckdb/src/common/sort/sort_state.cpp +1 -1
- package/src/duckdb/src/common/sort/sorted_block.cpp +1 -1
- package/src/duckdb/src/common/types/batched_data_collection.cpp +7 -2
- package/src/duckdb/src/common/types/bit.cpp +51 -0
- package/src/duckdb/src/common/types/column/column_data_allocator.cpp +9 -6
- package/src/duckdb/src/common/types/column/column_data_collection.cpp +68 -2
- package/src/duckdb/src/common/types/column/column_data_collection_segment.cpp +20 -6
- package/src/duckdb/src/common/types/column/partitioned_column_data.cpp +2 -2
- package/src/duckdb/src/common/types/data_chunk.cpp +2 -2
- package/src/duckdb/src/common/types/date.cpp +15 -0
- package/src/duckdb/src/common/types/hugeint.cpp +40 -0
- package/src/duckdb/src/common/types/interval.cpp +3 -0
- package/src/duckdb/src/common/types/list_segment.cpp +56 -198
- package/src/duckdb/src/common/types/row/partitioned_tuple_data.cpp +3 -9
- package/src/duckdb/src/common/types/row/row_data_collection_scanner.cpp +35 -5
- package/src/duckdb/src/common/types/row/tuple_data_collection.cpp +2 -0
- package/src/duckdb/src/common/types/row/tuple_data_scatter_gather.cpp +2 -2
- package/src/duckdb/src/common/types/string_heap.cpp +4 -0
- package/src/duckdb/src/common/types/time.cpp +105 -0
- package/src/duckdb/src/common/types/timestamp.cpp +7 -0
- package/src/duckdb/src/common/types/uuid.cpp +2 -2
- package/src/duckdb/src/common/types/validity_mask.cpp +33 -0
- package/src/duckdb/src/common/types/value.cpp +65 -47
- package/src/duckdb/src/common/types/vector.cpp +52 -25
- package/src/duckdb/src/common/types.cpp +38 -724
- package/src/duckdb/src/common/virtual_file_system.cpp +142 -1
- package/src/duckdb/src/core_functions/aggregate/holistic/approximate_quantile.cpp +26 -0
- package/src/duckdb/src/core_functions/aggregate/holistic/mode.cpp +5 -7
- package/src/duckdb/src/core_functions/aggregate/holistic/quantile.cpp +64 -19
- package/src/duckdb/src/core_functions/aggregate/holistic/reservoir_quantile.cpp +30 -0
- package/src/duckdb/src/core_functions/aggregate/nested/histogram.cpp +1 -0
- package/src/duckdb/src/core_functions/aggregate/nested/list.cpp +83 -59
- package/src/duckdb/src/core_functions/aggregate/regression/regr_avg.cpp +4 -4
- package/src/duckdb/src/core_functions/aggregate/regression/regr_intercept.cpp +4 -4
- package/src/duckdb/src/core_functions/aggregate/regression/regr_r2.cpp +5 -4
- package/src/duckdb/src/core_functions/aggregate/regression/regr_sxx_syy.cpp +8 -8
- package/src/duckdb/src/core_functions/aggregate/regression/regr_sxy.cpp +4 -3
- package/src/duckdb/src/core_functions/function_list.cpp +10 -4
- package/src/duckdb/src/core_functions/scalar/date/date_diff.cpp +2 -0
- package/src/duckdb/src/core_functions/scalar/date/date_part.cpp +380 -89
- package/src/duckdb/src/core_functions/scalar/date/date_sub.cpp +2 -0
- package/src/duckdb/src/core_functions/scalar/date/date_trunc.cpp +4 -0
- package/src/duckdb/src/core_functions/scalar/date/epoch.cpp +10 -24
- package/src/duckdb/src/core_functions/scalar/date/make_date.cpp +19 -4
- package/src/duckdb/src/core_functions/scalar/date/strftime.cpp +10 -0
- package/src/duckdb/src/core_functions/scalar/debug/vector_type.cpp +23 -0
- package/src/duckdb/src/core_functions/scalar/list/array_slice.cpp +314 -82
- package/src/duckdb/src/core_functions/scalar/list/list_aggregates.cpp +4 -2
- package/src/duckdb/src/core_functions/scalar/list/list_lambdas.cpp +22 -3
- package/src/duckdb/src/core_functions/scalar/map/map_entries.cpp +2 -2
- package/src/duckdb/src/core_functions/scalar/string/to_base.cpp +66 -0
- package/src/duckdb/src/core_functions/scalar/union/union_tag.cpp +1 -1
- package/src/duckdb/src/execution/aggregate_hashtable.cpp +40 -18
- package/src/duckdb/src/execution/column_binding_resolver.cpp +10 -7
- package/src/duckdb/src/execution/expression_executor/execute_parameter.cpp +2 -2
- package/src/duckdb/src/execution/expression_executor.cpp +1 -1
- package/src/duckdb/src/execution/index/art/art.cpp +219 -259
- package/src/duckdb/src/execution/index/art/art_key.cpp +0 -11
- package/src/duckdb/src/execution/index/art/fixed_size_allocator.cpp +11 -15
- package/src/duckdb/src/execution/index/art/iterator.cpp +130 -214
- package/src/duckdb/src/execution/index/art/leaf.cpp +300 -266
- package/src/duckdb/src/execution/index/art/node.cpp +211 -205
- package/src/duckdb/src/execution/index/art/node16.cpp +10 -19
- package/src/duckdb/src/execution/index/art/node256.cpp +10 -18
- package/src/duckdb/src/execution/index/art/node4.cpp +21 -23
- package/src/duckdb/src/execution/index/art/node48.cpp +10 -20
- package/src/duckdb/src/execution/index/art/prefix.cpp +308 -338
- package/src/duckdb/src/execution/join_hashtable.cpp +4 -4
- package/src/duckdb/src/execution/operator/aggregate/aggregate_object.cpp +1 -0
- package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +14 -11
- package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +6 -4
- package/src/duckdb/src/execution/operator/aggregate/physical_streaming_window.cpp +8 -3
- package/src/duckdb/src/execution/operator/aggregate/physical_ungrouped_aggregate.cpp +46 -34
- package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +332 -1067
- package/src/duckdb/src/execution/operator/filter/physical_filter.cpp +1 -1
- package/src/duckdb/src/execution/operator/helper/physical_batch_collector.cpp +12 -9
- package/src/duckdb/src/execution/operator/helper/physical_explain_analyze.cpp +2 -2
- package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +10 -8
- package/src/duckdb/src/execution/operator/helper/physical_materialized_collector.cpp +7 -5
- package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +7 -5
- package/src/duckdb/src/execution/operator/join/physical_asof_join.cpp +449 -288
- package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +2 -2
- package/src/duckdb/src/execution/operator/join/physical_comparison_join.cpp +1 -2
- package/src/duckdb/src/execution/operator/join/physical_delim_join.cpp +13 -6
- package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +28 -15
- package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +35 -17
- package/src/duckdb/src/execution/operator/join/physical_join.cpp +1 -1
- package/src/duckdb/src/execution/operator/join/physical_nested_loop_join.cpp +7 -4
- package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +31 -10
- package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +41 -5
- package/src/duckdb/src/execution/operator/order/physical_order.cpp +7 -5
- package/src/duckdb/src/execution/operator/order/physical_top_n.cpp +7 -5
- package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +100 -13
- package/src/duckdb/src/execution/operator/persistent/csv_file_handle.cpp +1 -1
- package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +20 -0
- package/src/duckdb/src/execution/operator/persistent/csv_rejects_table.cpp +48 -0
- package/src/duckdb/src/execution/operator/persistent/parallel_csv_reader.cpp +2 -3
- package/src/duckdb/src/execution/operator/persistent/physical_batch_copy_to_file.cpp +14 -10
- package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +11 -9
- package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +9 -7
- package/src/duckdb/src/execution/operator/persistent/physical_fixed_batch_copy.cpp +14 -12
- package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +11 -11
- package/src/duckdb/src/execution/operator/persistent/physical_update.cpp +4 -2
- package/src/duckdb/src/execution/operator/projection/physical_pivot.cpp +2 -1
- package/src/duckdb/src/execution/operator/projection/physical_unnest.cpp +24 -27
- package/src/duckdb/src/execution/operator/scan/physical_column_data_scan.cpp +19 -0
- package/src/duckdb/src/execution/operator/scan/physical_table_scan.cpp +7 -12
- package/src/duckdb/src/execution/operator/schema/physical_attach.cpp +2 -1
- package/src/duckdb/src/execution/operator/schema/physical_create_art_index.cpp +198 -0
- package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +2 -6
- package/src/duckdb/src/execution/operator/set/physical_cte.cpp +160 -0
- package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +15 -5
- package/src/duckdb/src/execution/partitionable_hashtable.cpp +41 -6
- package/src/duckdb/src/execution/perfect_aggregate_hashtable.cpp +37 -6
- package/src/duckdb/src/execution/physical_operator.cpp +20 -16
- package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +43 -10
- package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +57 -35
- package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +32 -15
- package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +45 -34
- package/src/duckdb/src/execution/physical_plan/plan_cte.cpp +33 -0
- package/src/duckdb/src/execution/physical_plan/plan_delim_join.cpp +2 -5
- package/src/duckdb/src/execution/physical_plan/plan_get.cpp +2 -2
- package/src/duckdb/src/execution/physical_plan/plan_recursive_cte.cpp +25 -4
- package/src/duckdb/src/execution/physical_plan_generator.cpp +6 -11
- package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +290 -43
- package/src/duckdb/src/execution/window_executor.cpp +1284 -0
- package/src/duckdb/src/execution/window_segment_tree.cpp +408 -144
- package/src/duckdb/src/function/aggregate/distributive/count.cpp +2 -13
- package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +6 -12
- package/src/duckdb/src/function/cast/bit_cast.cpp +34 -2
- package/src/duckdb/src/function/cast/blob_cast.cpp +3 -0
- package/src/duckdb/src/function/cast/numeric_casts.cpp +2 -0
- package/src/duckdb/src/function/cast/string_cast.cpp +2 -2
- package/src/duckdb/src/function/cast/time_casts.cpp +7 -6
- package/src/duckdb/src/function/function.cpp +3 -1
- package/src/duckdb/src/function/pragma/pragma_queries.cpp +5 -0
- package/src/duckdb/src/function/scalar/compressed_materialization/compress_integral.cpp +212 -0
- package/src/duckdb/src/function/scalar/compressed_materialization/compress_string.cpp +249 -0
- package/src/duckdb/src/function/scalar/compressed_materialization_functions.cpp +29 -0
- package/src/duckdb/src/function/scalar/list/list_resize.cpp +162 -0
- package/src/duckdb/src/function/scalar/nested_functions.cpp +1 -0
- package/src/duckdb/src/function/scalar/operators/add.cpp +9 -0
- package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +6 -3
- package/src/duckdb/src/function/scalar/string/like.cpp +12 -4
- package/src/duckdb/src/function/scalar/system/aggregate_export.cpp +39 -5
- package/src/duckdb/src/function/scalar_function.cpp +5 -20
- package/src/duckdb/src/function/table/arrow/arrow_duck_schema.cpp +57 -0
- package/src/duckdb/src/function/table/arrow.cpp +110 -88
- package/src/duckdb/src/function/table/arrow_conversion.cpp +86 -73
- package/src/duckdb/src/function/table/copy_csv.cpp +8 -1
- package/src/duckdb/src/function/table/read_csv.cpp +124 -21
- package/src/duckdb/src/function/table/system/test_all_types.cpp +48 -21
- package/src/duckdb/src/function/table/system_functions.cpp +1 -0
- package/src/duckdb/src/function/table/table_scan.cpp +44 -0
- package/src/duckdb/src/function/table/version/pragma_version.cpp +49 -2
- package/src/duckdb/src/function/table_function.cpp +4 -3
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/index_catalog_entry.hpp +3 -3
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/macro_catalog_entry.hpp +1 -4
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/schema_catalog_entry.hpp +2 -5
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/sequence_catalog_entry.hpp +1 -6
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_catalog_entry.hpp +2 -13
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/type_catalog_entry.hpp +1 -4
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/view_catalog_entry.hpp +2 -5
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry.hpp +14 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_set.hpp +0 -6
- package/src/duckdb/src/include/duckdb/common/adbc/adbc.h +1 -0
- package/src/duckdb/src/include/duckdb/common/adbc/adbc.hpp +4 -1
- package/src/duckdb/src/include/duckdb/common/adbc/single_batch_array_stream.hpp +16 -0
- package/src/duckdb/src/include/duckdb/common/allocator.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/arrow/appender/append_data.hpp +109 -0
- package/src/duckdb/src/include/duckdb/common/arrow/appender/bool_data.hpp +15 -0
- package/src/duckdb/src/include/duckdb/common/arrow/appender/enum_data.hpp +69 -0
- package/src/duckdb/src/include/duckdb/common/arrow/appender/list.hpp +8 -0
- package/src/duckdb/src/include/duckdb/common/arrow/appender/list_data.hpp +18 -0
- package/src/duckdb/src/include/duckdb/common/arrow/appender/map_data.hpp +18 -0
- package/src/duckdb/src/include/duckdb/common/arrow/appender/scalar_data.hpp +88 -0
- package/src/duckdb/src/include/duckdb/common/arrow/appender/struct_data.hpp +18 -0
- package/src/duckdb/src/include/duckdb/common/arrow/appender/union_data.hpp +21 -0
- package/src/duckdb/src/include/duckdb/common/arrow/appender/varchar_data.hpp +105 -0
- package/src/duckdb/src/include/duckdb/common/arrow/arrow_appender.hpp +9 -4
- package/src/duckdb/src/include/duckdb/common/arrow/arrow_converter.hpp +3 -5
- package/src/duckdb/src/include/duckdb/common/arrow/arrow_wrapper.hpp +5 -3
- package/src/duckdb/src/include/duckdb/common/arrow/nanoarrow/nanoarrow.h +462 -0
- package/src/duckdb/src/include/duckdb/common/arrow/nanoarrow/nanoarrow.hpp +14 -0
- package/src/duckdb/src/include/duckdb/common/arrow/result_arrow_wrapper.hpp +4 -0
- package/src/duckdb/src/include/duckdb/common/assert.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/bitpacking.hpp +70 -55
- package/src/duckdb/src/include/duckdb/common/bswap.hpp +42 -0
- package/src/duckdb/src/include/duckdb/common/case_insensitive_map.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/constants.hpp +4 -0
- package/src/duckdb/src/include/duckdb/common/dl.hpp +3 -1
- package/src/duckdb/src/include/duckdb/common/enum_util.hpp +660 -580
- package/src/duckdb/src/include/duckdb/common/enums/cte_materialize.hpp +21 -0
- package/src/duckdb/src/include/duckdb/common/enums/date_part_specifier.hpp +9 -1
- package/src/duckdb/src/include/duckdb/common/enums/index_type.hpp +4 -3
- package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/operator_result_type.hpp +5 -1
- 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 +1 -1
- package/src/duckdb/src/include/duckdb/common/enums/physical_operator_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/extra_operator_info.hpp +27 -0
- package/src/duckdb/src/include/duckdb/common/extra_type_info.hpp +215 -0
- package/src/duckdb/src/include/duckdb/common/field_writer.hpp +0 -4
- package/src/duckdb/src/include/duckdb/common/file_system.hpp +10 -8
- package/src/duckdb/src/include/duckdb/common/filename_pattern.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/helper.hpp +8 -3
- package/src/duckdb/src/include/duckdb/common/hive_partitioning.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/http_state.hpp +61 -28
- package/src/duckdb/src/include/duckdb/common/hugeint.hpp +15 -0
- package/src/duckdb/src/include/duckdb/common/index_vector.hpp +12 -0
- package/src/duckdb/src/include/duckdb/common/limits.hpp +52 -149
- package/src/duckdb/src/include/duckdb/common/multi_file_reader.hpp +11 -5
- package/src/duckdb/src/include/duckdb/common/multi_file_reader_options.hpp +12 -42
- package/src/duckdb/src/include/duckdb/common/mutex.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/numeric_utils.hpp +48 -0
- package/src/duckdb/src/include/duckdb/common/opener_file_system.hpp +6 -2
- package/src/duckdb/src/include/duckdb/common/operator/add.hpp +5 -2
- package/src/duckdb/src/include/duckdb/common/operator/cast_operators.hpp +65 -4
- package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +3 -2
- package/src/duckdb/src/include/duckdb/common/operator/numeric_cast.hpp +10 -0
- package/src/duckdb/src/include/duckdb/common/operator/string_cast.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/operator/subtract.hpp +3 -2
- package/src/duckdb/src/include/duckdb/common/radix.hpp +9 -20
- package/src/duckdb/src/include/duckdb/common/radix_partitioning.hpp +6 -21
- package/src/duckdb/src/include/duckdb/common/row_operations/row_operations.hpp +3 -3
- package/src/duckdb/src/include/duckdb/common/serializer/binary_deserializer.hpp +35 -7
- package/src/duckdb/src/include/duckdb/common/serializer/binary_serializer.hpp +14 -6
- package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +0 -4
- package/src/duckdb/src/include/duckdb/common/serializer/deserialization_data.hpp +110 -0
- package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +94 -16
- package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +73 -40
- package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +26 -4
- package/src/duckdb/src/include/duckdb/common/serializer.hpp +0 -7
- package/src/duckdb/src/include/duckdb/common/sort/partition_state.hpp +23 -8
- package/src/duckdb/src/include/duckdb/common/stack_checker.hpp +34 -0
- package/src/duckdb/src/include/duckdb/common/string_util.hpp +11 -0
- package/src/duckdb/src/include/duckdb/common/type_util.hpp +8 -0
- package/src/duckdb/src/include/duckdb/common/typedefs.hpp +8 -0
- package/src/duckdb/src/include/duckdb/common/types/batched_data_collection.hpp +3 -1
- package/src/duckdb/src/include/duckdb/common/types/bit.hpp +81 -0
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_allocator.hpp +11 -1
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection.hpp +12 -1
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_collection_segment.hpp +3 -1
- package/src/duckdb/src/include/duckdb/common/types/column/column_data_scan_states.hpp +3 -1
- package/src/duckdb/src/include/duckdb/common/types/data_chunk.hpp +1 -3
- package/src/duckdb/src/include/duckdb/common/types/date.hpp +9 -5
- package/src/duckdb/src/include/duckdb/common/types/datetime.hpp +46 -3
- package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +11 -15
- package/src/duckdb/src/include/duckdb/common/types/row/partitioned_tuple_data.hpp +5 -2
- package/src/duckdb/src/include/duckdb/common/types/row/row_data_collection_scanner.hpp +5 -1
- package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_collection.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/types/row/tuple_data_states.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/types/string_heap.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +9 -0
- package/src/duckdb/src/include/duckdb/common/types/time.hpp +5 -0
- package/src/duckdb/src/include/duckdb/common/types/timestamp.hpp +16 -10
- package/src/duckdb/src/include/duckdb/common/types/value.hpp +7 -2
- package/src/duckdb/src/include/duckdb/common/types/vector.hpp +7 -0
- package/src/duckdb/src/include/duckdb/common/types.hpp +6 -25
- package/src/duckdb/src/include/duckdb/common/vector_operations/aggregate_executor.hpp +7 -2
- package/src/duckdb/src/include/duckdb/common/virtual_file_system.hpp +40 -97
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/corr.hpp +4 -4
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic/covar.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/algebraic_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/distributive_functions.hpp +4 -2
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/holistic_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/nested_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_count.hpp +1 -0
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression/regr_slope.hpp +3 -3
- package/src/duckdb/src/include/duckdb/core_functions/aggregate/regression_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/bit_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/blob_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/date_functions.hpp +40 -11
- package/src/duckdb/src/include/duckdb/core_functions/scalar/debug_functions.hpp +27 -0
- package/src/duckdb/src/include/duckdb/core_functions/scalar/enum_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/generic_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/list_functions.hpp +7 -5
- package/src/duckdb/src/include/duckdb/core_functions/scalar/map_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/math_functions.hpp +6 -4
- package/src/duckdb/src/include/duckdb/core_functions/scalar/operators_functions.hpp +4 -2
- package/src/duckdb/src/include/duckdb/core_functions/scalar/random_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/string_functions.hpp +12 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/struct_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/core_functions/scalar/union_functions.hpp +3 -1
- package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +21 -3
- package/src/duckdb/src/include/duckdb/execution/executor.hpp +3 -0
- package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +13 -12
- package/src/duckdb/src/include/duckdb/execution/index/art/art_key.hpp +0 -1
- package/src/duckdb/src/include/duckdb/execution/index/art/fixed_size_allocator.hpp +22 -24
- package/src/duckdb/src/include/duckdb/execution/index/art/iterator.hpp +32 -28
- package/src/duckdb/src/include/duckdb/execution/index/art/leaf.hpp +46 -51
- package/src/duckdb/src/include/duckdb/execution/index/art/node.hpp +134 -53
- package/src/duckdb/src/include/duckdb/execution/index/art/node16.hpp +5 -7
- package/src/duckdb/src/include/duckdb/execution/index/art/node256.hpp +5 -7
- package/src/duckdb/src/include/duckdb/execution/index/art/node4.hpp +7 -9
- package/src/duckdb/src/include/duckdb/execution/index/art/node48.hpp +5 -7
- package/src/duckdb/src/include/duckdb/execution/index/art/prefix.hpp +63 -52
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_hash_aggregate.hpp +3 -3
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_ungrouped_aggregate.hpp +3 -3
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_window.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_batch_collector.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_explain_analyze.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_limit.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_materialized_collector.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/helper/physical_vacuum.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_asof_join.hpp +5 -12
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_blockwise_nl_join.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_delim_join.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_hash_join.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_iejoin.hpp +3 -3
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_nested_loop_join.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_piecewise_merge_join.hpp +3 -3
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_range_join.hpp +12 -1
- package/src/duckdb/src/include/duckdb/execution/operator/order/physical_order.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/order/physical_top_n.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/base_csv_reader.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_line_info.hpp +4 -3
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +10 -1
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_rejects_table.hpp +36 -0
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/parallel_csv_reader.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_copy_to_file.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_batch_insert.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_copy_to_file.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_fixed_batch_copy.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_insert.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/physical_update.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_column_data_scan.hpp +10 -0
- package/src/duckdb/src/include/duckdb/execution/operator/scan/physical_table_scan.hpp +5 -5
- package/src/duckdb/src/include/duckdb/execution/operator/schema/{physical_create_index.hpp → physical_create_art_index.hpp} +14 -7
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_cte.hpp +62 -0
- package/src/duckdb/src/include/duckdb/execution/operator/set/physical_recursive_cte.hpp +8 -2
- package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
- package/src/duckdb/src/include/duckdb/execution/perfect_aggregate_hashtable.hpp +4 -2
- package/src/duckdb/src/include/duckdb/execution/physical_operator.hpp +6 -5
- package/src/duckdb/src/include/duckdb/execution/physical_operator_states.hpp +11 -0
- package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +6 -2
- package/src/duckdb/src/include/duckdb/execution/radix_partitioned_hashtable.hpp +10 -3
- package/src/duckdb/src/include/duckdb/execution/window_executor.hpp +313 -0
- package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +79 -63
- package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +12 -4
- package/src/duckdb/src/include/duckdb/function/aggregate_state.hpp +2 -2
- package/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +1 -0
- package/src/duckdb/src/include/duckdb/function/copy_function.hpp +6 -1
- package/src/duckdb/src/include/duckdb/function/function_serialization.hpp +81 -0
- package/src/duckdb/src/include/duckdb/function/macro_function.hpp +3 -0
- package/src/duckdb/src/include/duckdb/function/scalar/compressed_materialization_functions.hpp +49 -0
- package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +1 -1
- package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +5 -0
- package/src/duckdb/src/include/duckdb/function/scalar/strftime_format.hpp +8 -0
- package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +2 -0
- package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +8 -3
- package/src/duckdb/src/include/duckdb/function/scalar_macro_function.hpp +3 -0
- package/src/duckdb/src/include/duckdb/function/table/arrow/arrow_duck_schema.hpp +99 -0
- package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +6 -36
- package/src/duckdb/src/include/duckdb/function/table/read_csv.hpp +7 -0
- package/src/duckdb/src/include/duckdb/function/table/system_functions.hpp +5 -1
- package/src/duckdb/src/include/duckdb/function/table_function.hpp +8 -0
- package/src/duckdb/src/include/duckdb/function/table_macro_function.hpp +3 -0
- package/src/duckdb/src/include/duckdb/function/udf_function.hpp +2 -1
- package/src/duckdb/src/include/duckdb/main/attached_database.hpp +1 -1
- package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +4 -3
- package/src/duckdb/src/include/duckdb/main/chunk_scan_state/query_result.hpp +29 -0
- package/src/duckdb/src/include/duckdb/main/chunk_scan_state.hpp +43 -0
- package/src/duckdb/src/include/duckdb/main/client_config.hpp +5 -2
- package/src/duckdb/src/include/duckdb/main/client_context.hpp +16 -14
- package/src/duckdb/src/include/duckdb/main/client_properties.hpp +25 -0
- package/src/duckdb/src/include/duckdb/main/config.hpp +3 -1
- package/src/duckdb/src/include/duckdb/main/connection.hpp +1 -2
- package/src/duckdb/src/include/duckdb/main/extension/generated_extension_loader.hpp +22 -0
- package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +8 -0
- package/src/duckdb/src/include/duckdb/main/extension_util.hpp +4 -0
- package/src/duckdb/src/include/duckdb/main/pending_query_result.hpp +5 -0
- package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +73 -5
- package/src/duckdb/src/include/duckdb/main/prepared_statement_data.hpp +6 -6
- package/src/duckdb/src/include/duckdb/main/query_result.hpp +2 -27
- package/src/duckdb/src/include/duckdb/main/relation/aggregate_relation.hpp +4 -1
- package/src/duckdb/src/include/duckdb/main/relation/cross_product_relation.hpp +4 -1
- package/src/duckdb/src/include/duckdb/main/relation/join_relation.hpp +5 -2
- package/src/duckdb/src/include/duckdb/main/relation.hpp +4 -2
- package/src/duckdb/src/include/duckdb/main/settings.hpp +41 -11
- package/src/duckdb/src/include/duckdb/optimizer/column_binding_replacer.hpp +47 -0
- package/src/duckdb/src/include/duckdb/optimizer/compressed_materialization.hpp +132 -0
- package/src/duckdb/src/include/duckdb/optimizer/deliminator.hpp +13 -16
- package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +7 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +38 -64
- package/src/duckdb/src/include/duckdb/optimizer/join_order/cost_model.hpp +37 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/estimated_properties.hpp +10 -1
- package/src/duckdb/src/include/duckdb/optimizer/join_order/join_node.hpp +14 -29
- package/src/duckdb/src/include/duckdb/optimizer/join_order/join_order_optimizer.hpp +8 -22
- package/src/duckdb/src/include/duckdb/optimizer/join_order/join_relation.hpp +1 -12
- package/src/duckdb/src/include/duckdb/optimizer/join_order/plan_enumerator.hpp +89 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph.hpp +19 -30
- package/src/duckdb/src/include/duckdb/optimizer/join_order/query_graph_manager.hpp +113 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/relation_manager.hpp +73 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/relation_statistics_helper.hpp +73 -0
- package/src/duckdb/src/include/duckdb/optimizer/matcher/set_matcher.hpp +13 -0
- package/src/duckdb/src/include/duckdb/optimizer/optimizer.hpp +3 -0
- package/src/duckdb/src/include/duckdb/optimizer/remove_duplicate_groups.hpp +40 -0
- package/src/duckdb/src/include/duckdb/optimizer/statistics_propagator.hpp +11 -3
- package/src/duckdb/src/include/duckdb/optimizer/topn_optimizer.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parallel/pipeline.hpp +2 -3
- package/src/duckdb/src/include/duckdb/parallel/pipeline_executor.hpp +3 -2
- package/src/duckdb/src/include/duckdb/parallel/task_scheduler.hpp +9 -1
- package/src/duckdb/src/include/duckdb/parser/column_definition.hpp +6 -5
- package/src/duckdb/src/include/duckdb/parser/column_list.hpp +4 -0
- package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/constraint.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/constraints/check_constraint.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/constraints/foreign_key_constraint.hpp +6 -0
- package/src/duckdb/src/include/duckdb/parser/constraints/not_null_constraint.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/constraints/unique_constraint.hpp +6 -0
- package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +4 -1
- package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +4 -1
- package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +4 -1
- package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +4 -1
- package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +4 -1
- package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +4 -1
- package/src/duckdb/src/include/duckdb/parser/expression/default_expression.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/expression/function_expression.hpp +4 -1
- package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +4 -1
- package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +21 -4
- package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +18 -2
- package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +4 -1
- package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +4 -1
- package/src/duckdb/src/include/duckdb/parser/group_by_node.hpp +11 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +12 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +66 -2
- package/src/duckdb/src/include/duckdb/parser/parsed_data/attach_info.hpp +8 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/copy_info.hpp +8 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_index_info.hpp +9 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_info.hpp +9 -2
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_macro_info.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_schema_info.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_sequence_info.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_info.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_type_info.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_view_info.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/detach_info.hpp +7 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/drop_info.hpp +7 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/exported_table_data.hpp +7 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/load_info.hpp +13 -3
- package/src/duckdb/src/include/duckdb/parser/parsed_data/parse_info.hpp +22 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/pragma_info.hpp +10 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/show_select_info.hpp +7 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/transaction_info.hpp +10 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/vacuum_info.hpp +10 -0
- package/src/duckdb/src/include/duckdb/parser/parser.hpp +4 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/cte_node.hpp +54 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/query_node.hpp +2 -1
- package/src/duckdb/src/include/duckdb/parser/statement/execute_statement.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +1 -1
- package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tokens.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/transformer.hpp +23 -26
- package/src/duckdb/src/include/duckdb/planner/binder.hpp +12 -5
- package/src/duckdb/src/include/duckdb/planner/bound_constraint.hpp +0 -8
- package/src/duckdb/src/include/duckdb/planner/bound_parameter_map.hpp +2 -1
- package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +6 -0
- package/src/duckdb/src/include/duckdb/planner/bound_tokens.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/column_binding.hpp +9 -0
- package/src/duckdb/src/include/duckdb/planner/constraints/bound_unique_constraint.hpp +3 -3
- package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_between_expression.hpp +6 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_case_expression.hpp +6 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_cast_expression.hpp +6 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_columnref_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_comparison_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_conjunction_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_constant_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_default_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_function_expression.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_lambda_expression.hpp +3 -1
- package/src/duckdb/src/include/duckdb/planner/expression/bound_lambdaref_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_operator_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_parameter_data.hpp +24 -6
- package/src/duckdb/src/include/duckdb/planner/expression/bound_parameter_expression.hpp +9 -2
- package/src/duckdb/src/include/duckdb/planner/expression/bound_reference_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_unnest_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_window_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression_binder/lateral_binder.hpp +0 -2
- package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +13 -1
- package/src/duckdb/src/include/duckdb/planner/filter/conjunction_filter.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/filter/constant_filter.hpp +2 -0
- package/src/duckdb/src/include/duckdb/planner/filter/null_filter.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/joinside.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/logical_operator.hpp +3 -2
- package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -2
- package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +3 -3
- package/src/duckdb/src/include/duckdb/planner/operator/logical_aggregate.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_any_join.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_column_data_get.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +12 -7
- package/src/duckdb/src/include/duckdb/planner/operator/logical_copy_to_file.hpp +2 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_create.hpp +9 -6
- package/src/duckdb/src/include/duckdb/planner/operator/logical_create_index.hpp +12 -23
- package/src/duckdb/src/include/duckdb/planner/operator/logical_create_table.hpp +10 -6
- package/src/duckdb/src/include/duckdb/planner/operator/logical_cross_product.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_cteref.hpp +9 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_delete.hpp +7 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_delim_get.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_dependent_join.hpp +43 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +6 -10
- package/src/duckdb/src/include/duckdb/planner/operator/logical_dummy_scan.hpp +2 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_empty_result.hpp +2 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_explain.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_expression_get.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_extension_operator.hpp +8 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_filter.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_get.hpp +11 -1
- package/src/duckdb/src/include/duckdb/planner/operator/logical_insert.hpp +6 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_limit.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_limit_percent.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_materialized_cte.hpp +52 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_order.hpp +7 -35
- package/src/duckdb/src/include/duckdb/planner/operator/logical_pivot.hpp +6 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_positional_join.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_projection.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_recursive_cte.hpp +10 -7
- package/src/duckdb/src/include/duckdb/planner/operator/logical_reset.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_sample.hpp +6 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_set.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_set_operation.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_show.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_simple.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_top_n.hpp +4 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_unnest.hpp +2 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_update.hpp +6 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_window.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/operator_extension.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/planner.hpp +4 -3
- package/src/duckdb/src/include/duckdb/planner/query_node/bound_cte_node.hpp +44 -0
- package/src/duckdb/src/include/duckdb/planner/query_node/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/subquery/flatten_dependent_join.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/subquery/has_correlated_expressions.hpp +4 -1
- package/src/duckdb/src/include/duckdb/planner/subquery/recursive_dependent_join_planner.hpp +31 -0
- package/src/duckdb/src/include/duckdb/planner/subquery/rewrite_correlated_expressions.hpp +8 -2
- package/src/duckdb/src/include/duckdb/planner/table_filter.hpp +7 -1
- package/src/duckdb/src/include/duckdb/planner/tableref/bound_cteref.hpp +5 -2
- package/src/duckdb/src/include/duckdb/planner/tableref/bound_pivotref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/storage/arena_allocator.hpp +2 -1
- package/src/duckdb/src/include/duckdb/storage/block.hpp +27 -4
- package/src/duckdb/src/include/duckdb/storage/block_manager.hpp +11 -11
- package/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp +5 -5
- package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_reader.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -3
- package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +19 -16
- package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/data_table.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/in_memory_block_manager.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/index.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/metadata/metadata_manager.hpp +88 -0
- package/src/duckdb/src/include/duckdb/storage/metadata/metadata_reader.hpp +54 -0
- package/src/duckdb/src/include/duckdb/storage/metadata/metadata_writer.hpp +45 -0
- package/src/duckdb/src/include/duckdb/storage/object_cache.hpp +22 -0
- package/src/duckdb/src/include/duckdb/storage/partial_block_manager.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +8 -5
- package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +4 -0
- package/src/duckdb/src/include/duckdb/storage/storage_info.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/table/chunk_info.hpp +3 -0
- package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +4 -3
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +3 -3
- package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/table/table_index_list.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table_io_manager.hpp +3 -0
- package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +3 -4
- package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +2 -3
- package/src/duckdb/src/include/duckdb/verification/prepared_statement_verifier.hpp +1 -1
- package/src/duckdb/src/include/duckdb.h +86 -1
- package/src/duckdb/src/main/appender.cpp +3 -1
- package/src/duckdb/src/main/attached_database.cpp +2 -2
- package/src/duckdb/src/main/capi/arrow-c.cpp +196 -8
- package/src/duckdb/src/main/capi/duckdb-c.cpp +16 -0
- package/src/duckdb/src/main/capi/duckdb_value-c.cpp +1 -1
- package/src/duckdb/src/main/capi/pending-c.cpp +23 -0
- package/src/duckdb/src/main/capi/prepared-c.cpp +106 -28
- package/src/duckdb/src/main/capi/result-c.cpp +3 -1
- package/src/duckdb/src/main/chunk_scan_state/query_result.cpp +53 -0
- package/src/duckdb/src/main/chunk_scan_state.cpp +48 -0
- package/src/duckdb/src/main/client_context.cpp +42 -19
- package/src/duckdb/src/main/client_verify.cpp +17 -0
- package/src/duckdb/src/main/config.cpp +4 -1
- package/src/duckdb/src/main/database.cpp +2 -11
- package/src/duckdb/src/main/db_instance_cache.cpp +14 -6
- package/src/duckdb/src/main/extension/extension_helper.cpp +107 -88
- package/src/duckdb/src/main/extension/extension_install.cpp +10 -1
- package/src/duckdb/src/main/extension/extension_load.cpp +26 -6
- package/src/duckdb/src/main/extension/extension_util.cpp +16 -0
- package/src/duckdb/src/main/pending_query_result.cpp +9 -1
- package/src/duckdb/src/main/prepared_statement.cpp +38 -11
- package/src/duckdb/src/main/prepared_statement_data.cpp +23 -18
- package/src/duckdb/src/main/query_result.cpp +0 -21
- package/src/duckdb/src/main/relation/aggregate_relation.cpp +20 -10
- package/src/duckdb/src/main/relation/cross_product_relation.cpp +4 -3
- package/src/duckdb/src/main/relation/join_relation.cpp +6 -6
- package/src/duckdb/src/main/relation.cpp +10 -9
- package/src/duckdb/src/main/settings/settings.cpp +79 -33
- package/src/duckdb/src/optimizer/column_binding_replacer.cpp +43 -0
- package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +2 -4
- package/src/duckdb/src/optimizer/compressed_materialization/compress_aggregate.cpp +140 -0
- package/src/duckdb/src/optimizer/compressed_materialization/compress_distinct.cpp +42 -0
- package/src/duckdb/src/optimizer/compressed_materialization/compress_order.cpp +65 -0
- package/src/duckdb/src/optimizer/compressed_materialization.cpp +477 -0
- package/src/duckdb/src/optimizer/deliminator.cpp +180 -323
- package/src/duckdb/src/optimizer/filter_pushdown.cpp +23 -6
- package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +79 -325
- package/src/duckdb/src/optimizer/join_order/cost_model.cpp +19 -0
- package/src/duckdb/src/optimizer/join_order/estimated_properties.cpp +7 -0
- package/src/duckdb/src/optimizer/join_order/join_node.cpp +5 -37
- package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +48 -1047
- package/src/duckdb/src/optimizer/join_order/join_relation_set.cpp +2 -6
- package/src/duckdb/src/optimizer/join_order/plan_enumerator.cpp +552 -0
- package/src/duckdb/src/optimizer/join_order/query_graph.cpp +52 -41
- package/src/duckdb/src/optimizer/join_order/query_graph_manager.cpp +409 -0
- package/src/duckdb/src/optimizer/join_order/relation_manager.cpp +356 -0
- package/src/duckdb/src/optimizer/join_order/relation_statistics_helper.cpp +351 -0
- package/src/duckdb/src/optimizer/optimizer.cpp +49 -14
- package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +5 -5
- package/src/duckdb/src/optimizer/pushdown/pushdown_get.cpp +0 -1
- package/src/duckdb/src/optimizer/pushdown/pushdown_projection.cpp +34 -7
- package/src/duckdb/src/optimizer/remove_duplicate_groups.cpp +127 -0
- package/src/duckdb/src/optimizer/remove_unused_columns.cpp +4 -0
- package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +154 -15
- package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +65 -8
- package/src/duckdb/src/optimizer/statistics/operator/propagate_order.cpp +1 -1
- package/src/duckdb/src/optimizer/statistics_propagator.cpp +7 -5
- package/src/duckdb/src/optimizer/topn_optimizer.cpp +27 -10
- package/src/duckdb/src/optimizer/unnest_rewriter.cpp +3 -5
- package/src/duckdb/src/parallel/executor.cpp +25 -1
- package/src/duckdb/src/parallel/pipeline.cpp +0 -17
- package/src/duckdb/src/parallel/pipeline_executor.cpp +33 -13
- package/src/duckdb/src/parallel/pipeline_finish_event.cpp +55 -1
- package/src/duckdb/src/parallel/task_scheduler.cpp +18 -2
- package/src/duckdb/src/parser/column_definition.cpp +20 -32
- package/src/duckdb/src/parser/column_list.cpp +8 -0
- package/src/duckdb/src/parser/constraints/foreign_key_constraint.cpp +3 -0
- package/src/duckdb/src/parser/constraints/unique_constraint.cpp +3 -0
- package/src/duckdb/src/parser/expression/between_expression.cpp +3 -15
- package/src/duckdb/src/parser/expression/case_expression.cpp +0 -25
- package/src/duckdb/src/parser/expression/cast_expression.cpp +3 -14
- package/src/duckdb/src/parser/expression/collate_expression.cpp +3 -13
- package/src/duckdb/src/parser/expression/columnref_expression.cpp +3 -12
- package/src/duckdb/src/parser/expression/comparison_expression.cpp +3 -13
- package/src/duckdb/src/parser/expression/conjunction_expression.cpp +0 -12
- package/src/duckdb/src/parser/expression/constant_expression.cpp +3 -11
- package/src/duckdb/src/parser/expression/default_expression.cpp +0 -4
- package/src/duckdb/src/parser/expression/function_expression.cpp +3 -32
- package/src/duckdb/src/parser/expression/lambda_expression.cpp +4 -14
- package/src/duckdb/src/parser/expression/operator_expression.cpp +0 -12
- package/src/duckdb/src/parser/expression/parameter_expression.cpp +7 -19
- package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +4 -11
- package/src/duckdb/src/parser/expression/star_expression.cpp +0 -19
- package/src/duckdb/src/parser/expression/subquery_expression.cpp +0 -18
- package/src/duckdb/src/parser/expression/window_expression.cpp +3 -39
- package/src/duckdb/src/parser/parsed_data/alter_info.cpp +5 -2
- package/src/duckdb/src/parser/parsed_data/alter_table_info.cpp +38 -0
- package/src/duckdb/src/parser/parsed_data/create_index_info.cpp +17 -1
- package/src/duckdb/src/parser/parsed_data/create_sequence_info.cpp +2 -0
- package/src/duckdb/src/parser/parsed_data/detach_info.cpp +1 -1
- package/src/duckdb/src/parser/parsed_data/drop_info.cpp +1 -1
- package/src/duckdb/src/parser/parsed_data/sample_options.cpp +0 -18
- package/src/duckdb/src/parser/parsed_data/transaction_info.cpp +4 -1
- package/src/duckdb/src/parser/parsed_data/vacuum_info.cpp +1 -1
- package/src/duckdb/src/parser/parsed_expression.cpp +0 -70
- package/src/duckdb/src/parser/parsed_expression_iterator.cpp +7 -0
- package/src/duckdb/src/parser/parser.cpp +62 -36
- package/src/duckdb/src/parser/query_node/cte_node.cpp +58 -0
- package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +0 -19
- package/src/duckdb/src/parser/query_node/select_node.cpp +0 -29
- package/src/duckdb/src/parser/query_node/set_operation_node.cpp +0 -15
- package/src/duckdb/src/parser/query_node.cpp +15 -47
- package/src/duckdb/src/parser/result_modifier.cpp +0 -87
- package/src/duckdb/src/parser/statement/execute_statement.cpp +2 -2
- package/src/duckdb/src/parser/statement/select_statement.cpp +0 -10
- package/src/duckdb/src/parser/tableref/basetableref.cpp +0 -19
- package/src/duckdb/src/parser/tableref/emptytableref.cpp +0 -4
- package/src/duckdb/src/parser/tableref/expressionlistref.cpp +0 -15
- package/src/duckdb/src/parser/tableref/joinref.cpp +3 -23
- package/src/duckdb/src/parser/tableref/pivotref.cpp +6 -45
- package/src/duckdb/src/parser/tableref/subqueryref.cpp +3 -13
- package/src/duckdb/src/parser/tableref/table_function.cpp +0 -15
- package/src/duckdb/src/parser/tableref.cpp +0 -44
- package/src/duckdb/src/parser/transform/constraint/transform_constraint.cpp +55 -38
- package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +13 -4
- package/src/duckdb/src/parser/transform/expression/transform_constant.cpp +55 -3
- package/src/duckdb/src/parser/transform/expression/transform_expression.cpp +2 -0
- package/src/duckdb/src/parser/transform/expression/transform_function.cpp +3 -0
- package/src/duckdb/src/parser/transform/expression/transform_multi_assign_reference.cpp +44 -0
- package/src/duckdb/src/parser/transform/expression/transform_param_ref.cpp +45 -26
- package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +19 -1
- package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +16 -1
- package/src/duckdb/src/parser/transform/statement/transform_copy.cpp +13 -0
- package/src/duckdb/src/parser/transform/statement/transform_create_index.cpp +32 -17
- package/src/duckdb/src/parser/transform/statement/transform_create_type.cpp +1 -1
- package/src/duckdb/src/parser/transform/statement/transform_delete.cpp +6 -1
- package/src/duckdb/src/parser/transform/statement/transform_insert.cpp +6 -1
- package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +7 -2
- package/src/duckdb/src/parser/transform/statement/transform_pragma.cpp +14 -11
- package/src/duckdb/src/parser/transform/statement/transform_prepare.cpp +28 -6
- package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +11 -2
- package/src/duckdb/src/parser/transform/statement/transform_update.cpp +6 -1
- package/src/duckdb/src/parser/transformer.cpp +44 -25
- package/src/duckdb/src/planner/binder/expression/bind_macro_expression.cpp +5 -3
- package/src/duckdb/src/planner/binder/expression/bind_parameter_expression.cpp +10 -10
- package/src/duckdb/src/planner/binder/query_node/bind_cte_node.cpp +64 -0
- package/src/duckdb/src/planner/binder/query_node/plan_cte_node.cpp +26 -0
- package/src/duckdb/src/planner/binder/query_node/plan_recursive_cte_node.cpp +5 -5
- package/src/duckdb/src/planner/binder/query_node/plan_setop.cpp +4 -4
- package/src/duckdb/src/planner/binder/query_node/plan_subquery.cpp +36 -33
- package/src/duckdb/src/planner/binder/statement/bind_create.cpp +14 -52
- package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +0 -23
- package/src/duckdb/src/planner/binder/statement/bind_execute.cpp +13 -7
- package/src/duckdb/src/planner/binder/statement/bind_export.cpp +29 -4
- package/src/duckdb/src/planner/binder/tableref/bind_basetableref.cpp +24 -5
- package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +32 -5
- package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +116 -50
- package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -1
- package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +67 -31
- package/src/duckdb/src/planner/binder/tableref/plan_subqueryref.cpp +3 -3
- package/src/duckdb/src/planner/binder.cpp +44 -31
- package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +24 -1
- package/src/duckdb/src/planner/expression/bound_between_expression.cpp +4 -0
- package/src/duckdb/src/planner/expression/bound_cast_expression.cpp +13 -8
- package/src/duckdb/src/planner/expression/bound_function_expression.cpp +22 -0
- package/src/duckdb/src/planner/expression/bound_parameter_expression.cpp +28 -20
- package/src/duckdb/src/planner/expression/bound_window_expression.cpp +48 -4
- package/src/duckdb/src/planner/expression_binder/lateral_binder.cpp +4 -31
- package/src/duckdb/src/planner/expression_binder.cpp +23 -0
- package/src/duckdb/src/planner/expression_iterator.cpp +6 -0
- package/src/duckdb/src/planner/logical_operator.cpp +19 -7
- package/src/duckdb/src/planner/logical_operator_visitor.cpp +5 -6
- package/src/duckdb/src/planner/operator/logical_comparison_join.cpp +4 -2
- package/src/duckdb/src/planner/operator/logical_copy_to_file.cpp +8 -0
- package/src/duckdb/src/planner/operator/logical_create.cpp +14 -0
- package/src/duckdb/src/planner/operator/logical_create_index.cpp +36 -7
- package/src/duckdb/src/planner/operator/logical_create_table.cpp +16 -0
- package/src/duckdb/src/planner/operator/logical_cteref.cpp +3 -1
- package/src/duckdb/src/planner/operator/logical_delete.cpp +9 -2
- package/src/duckdb/src/planner/operator/logical_dependent_join.cpp +26 -0
- package/src/duckdb/src/planner/operator/logical_distinct.cpp +13 -0
- package/src/duckdb/src/planner/operator/logical_explain.cpp +1 -1
- package/src/duckdb/src/planner/operator/logical_extension_operator.cpp +39 -0
- package/src/duckdb/src/planner/operator/logical_get.cpp +82 -4
- package/src/duckdb/src/planner/operator/logical_insert.cpp +8 -2
- package/src/duckdb/src/planner/operator/logical_materialized_cte.cpp +22 -0
- package/src/duckdb/src/planner/operator/logical_order.cpp +39 -0
- package/src/duckdb/src/planner/operator/logical_pivot.cpp +3 -0
- package/src/duckdb/src/planner/operator/logical_recursive_cte.cpp +5 -5
- package/src/duckdb/src/planner/operator/logical_sample.cpp +3 -0
- package/src/duckdb/src/planner/operator/logical_update.cpp +8 -2
- package/src/duckdb/src/planner/parsed_data/bound_create_table_info.cpp +4 -2
- package/src/duckdb/src/planner/planner.cpp +18 -7
- package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +90 -38
- package/src/duckdb/src/planner/subquery/has_correlated_expressions.cpp +22 -7
- package/src/duckdb/src/planner/subquery/rewrite_correlated_expressions.cpp +65 -7
- package/src/duckdb/src/storage/arena_allocator.cpp +13 -2
- package/src/duckdb/src/storage/buffer/block_manager.cpp +13 -9
- package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
- package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +3 -4
- package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +7 -7
- package/src/duckdb/src/storage/checkpoint_manager.cpp +74 -69
- package/src/duckdb/src/storage/compression/bitpacking.cpp +87 -63
- package/src/duckdb/src/storage/compression/bitpacking_hugeint.cpp +295 -0
- package/src/duckdb/src/storage/compression/fsst.cpp +1 -1
- package/src/duckdb/src/storage/compression/rle.cpp +52 -13
- package/src/duckdb/src/storage/data_table.cpp +36 -25
- package/src/duckdb/src/storage/index.cpp +4 -26
- package/src/duckdb/src/storage/local_storage.cpp +3 -4
- package/src/duckdb/src/storage/metadata/metadata_manager.cpp +267 -0
- package/src/duckdb/src/storage/metadata/metadata_reader.cpp +80 -0
- package/src/duckdb/src/storage/metadata/metadata_writer.cpp +86 -0
- package/src/duckdb/src/storage/serialization/serialize_constraint.cpp +98 -0
- package/src/duckdb/src/storage/serialization/serialize_create_info.cpp +194 -0
- package/src/duckdb/src/storage/serialization/serialize_expression.cpp +283 -0
- package/src/duckdb/src/storage/serialization/serialize_logical_operator.cpp +762 -0
- package/src/duckdb/src/storage/serialization/serialize_macro_function.cpp +62 -0
- package/src/duckdb/src/storage/serialization/serialize_nodes.cpp +432 -0
- package/src/duckdb/src/storage/serialization/serialize_parse_info.cpp +419 -0
- package/src/duckdb/src/storage/serialization/serialize_parsed_expression.cpp +342 -0
- package/src/duckdb/src/storage/serialization/serialize_query_node.cpp +122 -0
- package/src/duckdb/src/storage/serialization/serialize_result_modifier.cpp +97 -0
- package/src/duckdb/src/storage/serialization/serialize_statement.cpp +22 -0
- package/src/duckdb/src/storage/serialization/serialize_table_filter.cpp +97 -0
- package/src/duckdb/src/storage/serialization/serialize_tableref.cpp +164 -0
- package/src/duckdb/src/storage/serialization/serialize_types.cpp +127 -0
- package/src/duckdb/src/storage/single_file_block_manager.cpp +69 -51
- package/src/duckdb/src/storage/statistics/string_stats.cpp +21 -2
- package/src/duckdb/src/storage/storage_info.cpp +3 -2
- package/src/duckdb/src/storage/storage_manager.cpp +11 -5
- package/src/duckdb/src/storage/table/chunk_info.cpp +17 -0
- package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +3 -3
- package/src/duckdb/src/storage/table/list_column_data.cpp +6 -3
- package/src/duckdb/src/storage/table/persistent_table_data.cpp +1 -2
- package/src/duckdb/src/storage/table/row_group.cpp +34 -19
- package/src/duckdb/src/storage/table/row_group_collection.cpp +23 -19
- package/src/duckdb/src/storage/table/update_segment.cpp +1 -1
- package/src/duckdb/src/storage/table_index_list.cpp +1 -1
- package/src/duckdb/src/storage/wal_replay.cpp +24 -24
- package/src/duckdb/src/storage/write_ahead_log.cpp +3 -2
- package/src/duckdb/src/verification/prepared_statement_verifier.cpp +16 -11
- package/src/duckdb/third_party/concurrentqueue/concurrentqueue.h +2 -2
- package/src/duckdb/third_party/concurrentqueue/lightweightsemaphore.h +5 -2
- package/src/duckdb/third_party/fast_float/fast_float/fast_float.h +2 -0
- package/src/duckdb/third_party/httplib/httplib.hpp +10 -1
- package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +10 -0
- package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +2 -1
- package/src/duckdb/third_party/libpg_query/pg_functions.cpp +13 -0
- package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +11057 -10328
- package/src/duckdb/third_party/libpg_query/src_backend_parser_scansup.cpp +9 -0
- package/src/duckdb/third_party/mbedtls/include/mbedtls_wrapper.hpp +10 -0
- package/src/duckdb/third_party/mbedtls/mbedtls_wrapper.cpp +31 -1
- package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
- package/src/duckdb/ub_src_common.cpp +4 -0
- package/src/duckdb/ub_src_common_adbc_nanoarrow.cpp +8 -0
- package/src/duckdb/ub_src_common_arrow_appender.cpp +10 -0
- package/src/duckdb/ub_src_common_serializer.cpp +2 -0
- package/src/duckdb/ub_src_core_functions_scalar_debug.cpp +2 -0
- package/src/duckdb/ub_src_core_functions_scalar_string.cpp +2 -0
- package/src/duckdb/ub_src_execution.cpp +2 -0
- package/src/duckdb/ub_src_execution_index_art.cpp +0 -6
- package/src/duckdb/ub_src_execution_operator_persistent.cpp +2 -0
- package/src/duckdb/ub_src_execution_operator_schema.cpp +1 -1
- package/src/duckdb/ub_src_execution_operator_set.cpp +2 -0
- package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar_compressed_materialization.cpp +4 -0
- package/src/duckdb/ub_src_function_scalar_list.cpp +2 -0
- package/src/duckdb/ub_src_function_table_arrow.cpp +2 -0
- package/src/duckdb/ub_src_main.cpp +2 -0
- package/src/duckdb/ub_src_main_chunk_scan_state.cpp +2 -0
- package/src/duckdb/ub_src_optimizer.cpp +6 -0
- package/src/duckdb/ub_src_optimizer_compressed_materialization.cpp +6 -0
- package/src/duckdb/ub_src_optimizer_join_order.cpp +10 -0
- package/src/duckdb/ub_src_optimizer_statistics_expression.cpp +0 -2
- package/src/duckdb/ub_src_parser.cpp +0 -2
- package/src/duckdb/ub_src_parser_query_node.cpp +2 -0
- package/src/duckdb/ub_src_parser_transform_expression.cpp +2 -0
- package/src/duckdb/ub_src_planner_binder_query_node.cpp +4 -0
- package/src/duckdb/ub_src_planner_operator.cpp +3 -3
- package/src/duckdb/ub_src_storage.cpp +0 -4
- package/src/duckdb/ub_src_storage_compression.cpp +2 -0
- package/src/duckdb/ub_src_storage_metadata.cpp +6 -0
- package/src/duckdb/ub_src_storage_serialization.cpp +28 -0
- package/src/duckdb_node.hpp +1 -0
- package/src/statement.cpp +10 -5
- package/test/columns.test.ts +25 -3
- package/test/extension.test.ts +1 -1
- package/test/test_all_types.test.ts +234 -0
- package/tsconfig.json +1 -0
- package/src/duckdb/src/execution/index/art/leaf_segment.cpp +0 -52
- package/src/duckdb/src/execution/index/art/prefix_segment.cpp +0 -42
- package/src/duckdb/src/execution/index/art/swizzleable_pointer.cpp +0 -22
- package/src/duckdb/src/execution/operator/schema/physical_create_index.cpp +0 -193
- package/src/duckdb/src/include/duckdb/common/arrow/arrow_options.hpp +0 -25
- package/src/duckdb/src/include/duckdb/execution/index/art/leaf_segment.hpp +0 -38
- package/src/duckdb/src/include/duckdb/execution/index/art/prefix_segment.hpp +0 -40
- package/src/duckdb/src/include/duckdb/execution/index/art/swizzleable_pointer.hpp +0 -58
- package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +0 -27
- package/src/duckdb/src/include/duckdb/planner/operator/logical_delim_join.hpp +0 -32
- package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +0 -49
- package/src/duckdb/src/include/duckdb/storage/meta_block_writer.hpp +0 -50
- package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +0 -118
- package/src/duckdb/src/parser/common_table_expression_info.cpp +0 -19
- package/src/duckdb/src/planner/operator/logical_asof_join.cpp +0 -14
- package/src/duckdb/src/planner/operator/logical_delim_join.cpp +0 -27
- package/src/duckdb/src/storage/meta_block_reader.cpp +0 -78
- package/src/duckdb/src/storage/meta_block_writer.cpp +0 -80
@@ -0,0 +1,1284 @@
|
|
1
|
+
#include "duckdb/execution/window_executor.hpp"
|
2
|
+
|
3
|
+
#include "duckdb/common/operator/add.hpp"
|
4
|
+
#include "duckdb/common/operator/subtract.hpp"
|
5
|
+
|
6
|
+
namespace duckdb {
|
7
|
+
|
8
|
+
static idx_t FindNextStart(const ValidityMask &mask, idx_t l, const idx_t r, idx_t &n) {
|
9
|
+
if (mask.AllValid()) {
|
10
|
+
auto start = MinValue(l + n - 1, r);
|
11
|
+
n -= MinValue(n, r - l);
|
12
|
+
return start;
|
13
|
+
}
|
14
|
+
|
15
|
+
while (l < r) {
|
16
|
+
// If l is aligned with the start of a block, and the block is blank, then skip forward one block.
|
17
|
+
idx_t entry_idx;
|
18
|
+
idx_t shift;
|
19
|
+
mask.GetEntryIndex(l, entry_idx, shift);
|
20
|
+
|
21
|
+
const auto block = mask.GetValidityEntry(entry_idx);
|
22
|
+
if (mask.NoneValid(block) && !shift) {
|
23
|
+
l += ValidityMask::BITS_PER_VALUE;
|
24
|
+
continue;
|
25
|
+
}
|
26
|
+
|
27
|
+
// Loop over the block
|
28
|
+
for (; shift < ValidityMask::BITS_PER_VALUE && l < r; ++shift, ++l) {
|
29
|
+
if (mask.RowIsValid(block, shift) && --n == 0) {
|
30
|
+
return MinValue(l, r);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
// Didn't find a start so return the end of the range
|
36
|
+
return r;
|
37
|
+
}
|
38
|
+
|
39
|
+
static idx_t FindPrevStart(const ValidityMask &mask, const idx_t l, idx_t r, idx_t &n) {
|
40
|
+
if (mask.AllValid()) {
|
41
|
+
auto start = (r <= l + n) ? l : r - n;
|
42
|
+
n -= r - start;
|
43
|
+
return start;
|
44
|
+
}
|
45
|
+
|
46
|
+
while (l < r) {
|
47
|
+
// If r is aligned with the start of a block, and the previous block is blank,
|
48
|
+
// then skip backwards one block.
|
49
|
+
idx_t entry_idx;
|
50
|
+
idx_t shift;
|
51
|
+
mask.GetEntryIndex(r - 1, entry_idx, shift);
|
52
|
+
|
53
|
+
const auto block = mask.GetValidityEntry(entry_idx);
|
54
|
+
if (mask.NoneValid(block) && (shift + 1 == ValidityMask::BITS_PER_VALUE)) {
|
55
|
+
// r is nonzero (> l) and word aligned, so this will not underflow.
|
56
|
+
r -= ValidityMask::BITS_PER_VALUE;
|
57
|
+
continue;
|
58
|
+
}
|
59
|
+
|
60
|
+
// Loop backwards over the block
|
61
|
+
// shift is probing r-1 >= l >= 0
|
62
|
+
for (++shift; shift-- > 0; --r) {
|
63
|
+
if (mask.RowIsValid(block, shift) && --n == 0) {
|
64
|
+
return MaxValue(l, r - 1);
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
// Didn't find a start so return the start of the range
|
70
|
+
return l;
|
71
|
+
}
|
72
|
+
|
73
|
+
template <typename T>
|
74
|
+
static T GetCell(const DataChunk &chunk, idx_t column, idx_t index) {
|
75
|
+
D_ASSERT(chunk.ColumnCount() > column);
|
76
|
+
auto &source = chunk.data[column];
|
77
|
+
const auto data = FlatVector::GetData<T>(source);
|
78
|
+
return data[index];
|
79
|
+
}
|
80
|
+
|
81
|
+
static bool CellIsNull(const DataChunk &chunk, idx_t column, idx_t index) {
|
82
|
+
D_ASSERT(chunk.ColumnCount() > column);
|
83
|
+
auto &source = chunk.data[column];
|
84
|
+
return FlatVector::IsNull(source, index);
|
85
|
+
}
|
86
|
+
|
87
|
+
static void CopyCell(const DataChunk &chunk, idx_t column, idx_t index, Vector &target, idx_t target_offset) {
|
88
|
+
D_ASSERT(chunk.ColumnCount() > column);
|
89
|
+
auto &source = chunk.data[column];
|
90
|
+
VectorOperations::Copy(source, target, index + 1, index, target_offset);
|
91
|
+
}
|
92
|
+
|
93
|
+
//===--------------------------------------------------------------------===//
|
94
|
+
// WindowColumnIterator
|
95
|
+
//===--------------------------------------------------------------------===//
|
96
|
+
template <typename T>
|
97
|
+
struct WindowColumnIterator {
|
98
|
+
using iterator = WindowColumnIterator<T>;
|
99
|
+
using iterator_category = std::random_access_iterator_tag;
|
100
|
+
using difference_type = std::ptrdiff_t;
|
101
|
+
using value_type = T;
|
102
|
+
using reference = T;
|
103
|
+
using pointer = idx_t;
|
104
|
+
|
105
|
+
explicit WindowColumnIterator(const WindowInputColumn &coll_p, pointer pos_p = 0) : coll(&coll_p), pos(pos_p) {
|
106
|
+
}
|
107
|
+
|
108
|
+
// Forward iterator
|
109
|
+
inline reference operator*() const {
|
110
|
+
return coll->GetCell<T>(pos);
|
111
|
+
}
|
112
|
+
inline explicit operator pointer() const {
|
113
|
+
return pos;
|
114
|
+
}
|
115
|
+
|
116
|
+
inline iterator &operator++() {
|
117
|
+
++pos;
|
118
|
+
return *this;
|
119
|
+
}
|
120
|
+
inline iterator operator++(int) {
|
121
|
+
auto result = *this;
|
122
|
+
++(*this);
|
123
|
+
return result;
|
124
|
+
}
|
125
|
+
|
126
|
+
// Bidirectional iterator
|
127
|
+
inline iterator &operator--() {
|
128
|
+
--pos;
|
129
|
+
return *this;
|
130
|
+
}
|
131
|
+
inline iterator operator--(int) {
|
132
|
+
auto result = *this;
|
133
|
+
--(*this);
|
134
|
+
return result;
|
135
|
+
}
|
136
|
+
|
137
|
+
// Random Access
|
138
|
+
inline iterator &operator+=(difference_type n) {
|
139
|
+
pos += n;
|
140
|
+
return *this;
|
141
|
+
}
|
142
|
+
inline iterator &operator-=(difference_type n) {
|
143
|
+
pos -= n;
|
144
|
+
return *this;
|
145
|
+
}
|
146
|
+
|
147
|
+
inline reference operator[](difference_type m) const {
|
148
|
+
return coll->GetCell<T>(pos + m);
|
149
|
+
}
|
150
|
+
|
151
|
+
friend inline iterator &operator+(const iterator &a, difference_type n) {
|
152
|
+
return iterator(a.coll, a.pos + n);
|
153
|
+
}
|
154
|
+
|
155
|
+
friend inline iterator &operator-(const iterator &a, difference_type n) {
|
156
|
+
return iterator(a.coll, a.pos - n);
|
157
|
+
}
|
158
|
+
|
159
|
+
friend inline iterator &operator+(difference_type n, const iterator &a) {
|
160
|
+
return a + n;
|
161
|
+
}
|
162
|
+
friend inline difference_type operator-(const iterator &a, const iterator &b) {
|
163
|
+
return difference_type(a.pos - b.pos);
|
164
|
+
}
|
165
|
+
|
166
|
+
friend inline bool operator==(const iterator &a, const iterator &b) {
|
167
|
+
return a.pos == b.pos;
|
168
|
+
}
|
169
|
+
friend inline bool operator!=(const iterator &a, const iterator &b) {
|
170
|
+
return a.pos != b.pos;
|
171
|
+
}
|
172
|
+
friend inline bool operator<(const iterator &a, const iterator &b) {
|
173
|
+
return a.pos < b.pos;
|
174
|
+
}
|
175
|
+
friend inline bool operator<=(const iterator &a, const iterator &b) {
|
176
|
+
return a.pos <= b.pos;
|
177
|
+
}
|
178
|
+
friend inline bool operator>(const iterator &a, const iterator &b) {
|
179
|
+
return a.pos > b.pos;
|
180
|
+
}
|
181
|
+
friend inline bool operator>=(const iterator &a, const iterator &b) {
|
182
|
+
return a.pos >= b.pos;
|
183
|
+
}
|
184
|
+
|
185
|
+
private:
|
186
|
+
optional_ptr<const WindowInputColumn> coll;
|
187
|
+
pointer pos;
|
188
|
+
};
|
189
|
+
|
190
|
+
template <typename T, typename OP>
|
191
|
+
struct OperationCompare : public std::function<bool(T, T)> {
|
192
|
+
inline bool operator()(const T &lhs, const T &val) const {
|
193
|
+
return OP::template Operation(lhs, val);
|
194
|
+
}
|
195
|
+
};
|
196
|
+
|
197
|
+
template <typename T, typename OP, bool FROM>
|
198
|
+
static idx_t FindTypedRangeBound(const WindowInputColumn &over, const idx_t order_begin, const idx_t order_end,
|
199
|
+
WindowInputExpression &boundary, const idx_t chunk_idx, const FrameBounds &prev) {
|
200
|
+
D_ASSERT(!boundary.CellIsNull(chunk_idx));
|
201
|
+
const auto val = boundary.GetCell<T>(chunk_idx);
|
202
|
+
|
203
|
+
OperationCompare<T, OP> comp;
|
204
|
+
WindowColumnIterator<T> begin(over, order_begin);
|
205
|
+
WindowColumnIterator<T> end(over, order_end);
|
206
|
+
|
207
|
+
if (order_begin < prev.start && prev.start < order_end) {
|
208
|
+
const auto first = over.GetCell<T>(prev.start);
|
209
|
+
if (!comp(val, first)) {
|
210
|
+
// prev.first <= val, so we can start further forward
|
211
|
+
begin += (prev.start - order_begin);
|
212
|
+
}
|
213
|
+
}
|
214
|
+
if (order_begin <= prev.end && prev.end < order_end) {
|
215
|
+
const auto second = over.GetCell<T>(prev.end);
|
216
|
+
if (!comp(second, val)) {
|
217
|
+
// val <= prev.second, so we can end further back
|
218
|
+
// (prev.second is the largest peer)
|
219
|
+
end -= (order_end - prev.end - 1);
|
220
|
+
}
|
221
|
+
}
|
222
|
+
|
223
|
+
if (FROM) {
|
224
|
+
return idx_t(std::lower_bound(begin, end, val, comp));
|
225
|
+
} else {
|
226
|
+
return idx_t(std::upper_bound(begin, end, val, comp));
|
227
|
+
}
|
228
|
+
}
|
229
|
+
|
230
|
+
template <typename OP, bool FROM>
|
231
|
+
static idx_t FindRangeBound(const WindowInputColumn &over, const idx_t order_begin, const idx_t order_end,
|
232
|
+
WindowInputExpression &boundary, const idx_t chunk_idx, const FrameBounds &prev) {
|
233
|
+
D_ASSERT(boundary.chunk.ColumnCount() == 1);
|
234
|
+
D_ASSERT(boundary.chunk.data[0].GetType().InternalType() == over.input_expr.ptype);
|
235
|
+
|
236
|
+
switch (over.input_expr.ptype) {
|
237
|
+
case PhysicalType::INT8:
|
238
|
+
return FindTypedRangeBound<int8_t, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
239
|
+
case PhysicalType::INT16:
|
240
|
+
return FindTypedRangeBound<int16_t, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
241
|
+
case PhysicalType::INT32:
|
242
|
+
return FindTypedRangeBound<int32_t, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
243
|
+
case PhysicalType::INT64:
|
244
|
+
return FindTypedRangeBound<int64_t, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
245
|
+
case PhysicalType::UINT8:
|
246
|
+
return FindTypedRangeBound<uint8_t, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
247
|
+
case PhysicalType::UINT16:
|
248
|
+
return FindTypedRangeBound<uint16_t, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
249
|
+
case PhysicalType::UINT32:
|
250
|
+
return FindTypedRangeBound<uint32_t, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
251
|
+
case PhysicalType::UINT64:
|
252
|
+
return FindTypedRangeBound<uint64_t, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
253
|
+
case PhysicalType::INT128:
|
254
|
+
return FindTypedRangeBound<hugeint_t, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
255
|
+
case PhysicalType::FLOAT:
|
256
|
+
return FindTypedRangeBound<float, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
257
|
+
case PhysicalType::DOUBLE:
|
258
|
+
return FindTypedRangeBound<double, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
259
|
+
case PhysicalType::INTERVAL:
|
260
|
+
return FindTypedRangeBound<interval_t, OP, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
261
|
+
default:
|
262
|
+
throw InternalException("Unsupported column type for RANGE");
|
263
|
+
}
|
264
|
+
}
|
265
|
+
|
266
|
+
template <bool FROM>
|
267
|
+
static idx_t FindOrderedRangeBound(const WindowInputColumn &over, const OrderType range_sense, const idx_t order_begin,
|
268
|
+
const idx_t order_end, WindowInputExpression &boundary, const idx_t chunk_idx,
|
269
|
+
const FrameBounds &prev) {
|
270
|
+
switch (range_sense) {
|
271
|
+
case OrderType::ASCENDING:
|
272
|
+
return FindRangeBound<LessThan, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
273
|
+
case OrderType::DESCENDING:
|
274
|
+
return FindRangeBound<GreaterThan, FROM>(over, order_begin, order_end, boundary, chunk_idx, prev);
|
275
|
+
default:
|
276
|
+
throw InternalException("Unsupported ORDER BY sense for RANGE");
|
277
|
+
}
|
278
|
+
}
|
279
|
+
|
280
|
+
struct WindowBoundariesState {
|
281
|
+
static inline bool IsScalar(const unique_ptr<Expression> &expr) {
|
282
|
+
return expr ? expr->IsScalar() : true;
|
283
|
+
}
|
284
|
+
|
285
|
+
static inline bool BoundaryNeedsPeer(const WindowBoundary &boundary) {
|
286
|
+
switch (boundary) {
|
287
|
+
case WindowBoundary::CURRENT_ROW_RANGE:
|
288
|
+
case WindowBoundary::EXPR_PRECEDING_RANGE:
|
289
|
+
case WindowBoundary::EXPR_FOLLOWING_RANGE:
|
290
|
+
return true;
|
291
|
+
default:
|
292
|
+
return false;
|
293
|
+
}
|
294
|
+
}
|
295
|
+
|
296
|
+
WindowBoundariesState(BoundWindowExpression &wexpr, const idx_t input_size);
|
297
|
+
|
298
|
+
void Update(const idx_t row_idx, const WindowInputColumn &range_collection, const idx_t chunk_idx,
|
299
|
+
WindowInputExpression &boundary_start, WindowInputExpression &boundary_end,
|
300
|
+
const ValidityMask &partition_mask, const ValidityMask &order_mask);
|
301
|
+
|
302
|
+
void Bounds(DataChunk &bounds, idx_t row_idx, const WindowInputColumn &range, const idx_t count,
|
303
|
+
WindowInputExpression &boundary_start, WindowInputExpression &boundary_end,
|
304
|
+
const ValidityMask &partition_mask, const ValidityMask &order_mask);
|
305
|
+
|
306
|
+
// Cached lookups
|
307
|
+
const ExpressionType type;
|
308
|
+
const idx_t input_size;
|
309
|
+
const WindowBoundary start_boundary;
|
310
|
+
const WindowBoundary end_boundary;
|
311
|
+
const size_t partition_count;
|
312
|
+
const size_t order_count;
|
313
|
+
const OrderType range_sense;
|
314
|
+
const bool has_preceding_range;
|
315
|
+
const bool has_following_range;
|
316
|
+
const bool needs_peer;
|
317
|
+
|
318
|
+
idx_t next_pos = 0;
|
319
|
+
idx_t partition_start = 0;
|
320
|
+
idx_t partition_end = 0;
|
321
|
+
idx_t peer_start = 0;
|
322
|
+
idx_t peer_end = 0;
|
323
|
+
idx_t valid_start = 0;
|
324
|
+
idx_t valid_end = 0;
|
325
|
+
int64_t window_start = -1;
|
326
|
+
int64_t window_end = -1;
|
327
|
+
FrameBounds prev;
|
328
|
+
};
|
329
|
+
|
330
|
+
//===--------------------------------------------------------------------===//
|
331
|
+
// WindowBoundariesState
|
332
|
+
//===--------------------------------------------------------------------===//
|
333
|
+
void WindowBoundariesState::Update(const idx_t row_idx, const WindowInputColumn &range_collection,
|
334
|
+
const idx_t chunk_idx, WindowInputExpression &boundary_start,
|
335
|
+
WindowInputExpression &boundary_end, const ValidityMask &partition_mask,
|
336
|
+
const ValidityMask &order_mask) {
|
337
|
+
|
338
|
+
if (partition_count + order_count > 0) {
|
339
|
+
|
340
|
+
// determine partition and peer group boundaries to ultimately figure out window size
|
341
|
+
const auto is_same_partition = !partition_mask.RowIsValidUnsafe(row_idx);
|
342
|
+
const auto is_peer = !order_mask.RowIsValidUnsafe(row_idx);
|
343
|
+
const auto is_jump = (next_pos != row_idx);
|
344
|
+
|
345
|
+
// when the partition changes, recompute the boundaries
|
346
|
+
if (!is_same_partition || is_jump) {
|
347
|
+
partition_start = row_idx;
|
348
|
+
peer_start = row_idx;
|
349
|
+
|
350
|
+
if (is_jump) {
|
351
|
+
// Go back as far as the previous partition start
|
352
|
+
idx_t n = 1;
|
353
|
+
partition_start = FindPrevStart(partition_mask, partition_start, row_idx + 1, n);
|
354
|
+
}
|
355
|
+
|
356
|
+
// find end of partition
|
357
|
+
partition_end = input_size;
|
358
|
+
if (partition_count) {
|
359
|
+
idx_t n = 1;
|
360
|
+
partition_end = FindNextStart(partition_mask, partition_start + 1, input_size, n);
|
361
|
+
}
|
362
|
+
|
363
|
+
// Find valid ordering values for the new partition
|
364
|
+
// so we can exclude NULLs from RANGE expression computations
|
365
|
+
valid_start = partition_start;
|
366
|
+
valid_end = partition_end;
|
367
|
+
|
368
|
+
if ((valid_start < valid_end) && has_preceding_range) {
|
369
|
+
// Exclude any leading NULLs
|
370
|
+
if (range_collection.CellIsNull(valid_start)) {
|
371
|
+
idx_t n = 1;
|
372
|
+
valid_start = FindNextStart(order_mask, valid_start + 1, valid_end, n);
|
373
|
+
}
|
374
|
+
}
|
375
|
+
|
376
|
+
if ((valid_start < valid_end) && has_following_range) {
|
377
|
+
// Exclude any trailing NULLs
|
378
|
+
if (range_collection.CellIsNull(valid_end - 1)) {
|
379
|
+
idx_t n = 1;
|
380
|
+
valid_end = FindPrevStart(order_mask, valid_start, valid_end, n);
|
381
|
+
}
|
382
|
+
|
383
|
+
// Reset range hints
|
384
|
+
prev.start = valid_start;
|
385
|
+
prev.end = valid_end;
|
386
|
+
}
|
387
|
+
} else if (!is_peer) {
|
388
|
+
peer_start = row_idx;
|
389
|
+
}
|
390
|
+
|
391
|
+
if (needs_peer) {
|
392
|
+
peer_end = partition_end;
|
393
|
+
if (order_count) {
|
394
|
+
idx_t n = 1;
|
395
|
+
peer_end = FindNextStart(order_mask, peer_start + 1, partition_end, n);
|
396
|
+
}
|
397
|
+
}
|
398
|
+
|
399
|
+
} else {
|
400
|
+
// OVER()
|
401
|
+
partition_end = input_size;
|
402
|
+
peer_end = partition_end;
|
403
|
+
}
|
404
|
+
next_pos = row_idx + 1;
|
405
|
+
|
406
|
+
// determine window boundaries depending on the type of expression
|
407
|
+
window_start = -1;
|
408
|
+
window_end = -1;
|
409
|
+
|
410
|
+
switch (start_boundary) {
|
411
|
+
case WindowBoundary::UNBOUNDED_PRECEDING:
|
412
|
+
window_start = partition_start;
|
413
|
+
break;
|
414
|
+
case WindowBoundary::CURRENT_ROW_ROWS:
|
415
|
+
window_start = row_idx;
|
416
|
+
break;
|
417
|
+
case WindowBoundary::CURRENT_ROW_RANGE:
|
418
|
+
window_start = peer_start;
|
419
|
+
break;
|
420
|
+
case WindowBoundary::EXPR_PRECEDING_ROWS: {
|
421
|
+
if (!TrySubtractOperator::Operation(int64_t(row_idx), boundary_start.GetCell<int64_t>(chunk_idx),
|
422
|
+
window_start)) {
|
423
|
+
throw OutOfRangeException("Overflow computing ROWS PRECEDING start");
|
424
|
+
}
|
425
|
+
break;
|
426
|
+
}
|
427
|
+
case WindowBoundary::EXPR_FOLLOWING_ROWS: {
|
428
|
+
if (!TryAddOperator::Operation(int64_t(row_idx), boundary_start.GetCell<int64_t>(chunk_idx), window_start)) {
|
429
|
+
throw OutOfRangeException("Overflow computing ROWS FOLLOWING start");
|
430
|
+
}
|
431
|
+
break;
|
432
|
+
}
|
433
|
+
case WindowBoundary::EXPR_PRECEDING_RANGE: {
|
434
|
+
if (boundary_start.CellIsNull(chunk_idx)) {
|
435
|
+
window_start = peer_start;
|
436
|
+
} else {
|
437
|
+
prev.start = FindOrderedRangeBound<true>(range_collection, range_sense, valid_start, row_idx,
|
438
|
+
boundary_start, chunk_idx, prev);
|
439
|
+
window_start = prev.start;
|
440
|
+
}
|
441
|
+
break;
|
442
|
+
}
|
443
|
+
case WindowBoundary::EXPR_FOLLOWING_RANGE: {
|
444
|
+
if (boundary_start.CellIsNull(chunk_idx)) {
|
445
|
+
window_start = peer_start;
|
446
|
+
} else {
|
447
|
+
prev.start = FindOrderedRangeBound<true>(range_collection, range_sense, row_idx, valid_end, boundary_start,
|
448
|
+
chunk_idx, prev);
|
449
|
+
window_start = prev.start;
|
450
|
+
}
|
451
|
+
break;
|
452
|
+
}
|
453
|
+
default:
|
454
|
+
throw InternalException("Unsupported window start boundary");
|
455
|
+
}
|
456
|
+
|
457
|
+
switch (end_boundary) {
|
458
|
+
case WindowBoundary::CURRENT_ROW_ROWS:
|
459
|
+
window_end = row_idx + 1;
|
460
|
+
break;
|
461
|
+
case WindowBoundary::CURRENT_ROW_RANGE:
|
462
|
+
window_end = peer_end;
|
463
|
+
break;
|
464
|
+
case WindowBoundary::UNBOUNDED_FOLLOWING:
|
465
|
+
window_end = partition_end;
|
466
|
+
break;
|
467
|
+
case WindowBoundary::EXPR_PRECEDING_ROWS:
|
468
|
+
if (!TrySubtractOperator::Operation(int64_t(row_idx + 1), boundary_end.GetCell<int64_t>(chunk_idx),
|
469
|
+
window_end)) {
|
470
|
+
throw OutOfRangeException("Overflow computing ROWS PRECEDING end");
|
471
|
+
}
|
472
|
+
break;
|
473
|
+
case WindowBoundary::EXPR_FOLLOWING_ROWS:
|
474
|
+
if (!TryAddOperator::Operation(int64_t(row_idx + 1), boundary_end.GetCell<int64_t>(chunk_idx), window_end)) {
|
475
|
+
throw OutOfRangeException("Overflow computing ROWS FOLLOWING end");
|
476
|
+
}
|
477
|
+
break;
|
478
|
+
case WindowBoundary::EXPR_PRECEDING_RANGE: {
|
479
|
+
if (boundary_end.CellIsNull(chunk_idx)) {
|
480
|
+
window_end = peer_end;
|
481
|
+
} else {
|
482
|
+
prev.end = FindOrderedRangeBound<false>(range_collection, range_sense, valid_start, row_idx, boundary_end,
|
483
|
+
chunk_idx, prev);
|
484
|
+
window_end = prev.end;
|
485
|
+
}
|
486
|
+
break;
|
487
|
+
}
|
488
|
+
case WindowBoundary::EXPR_FOLLOWING_RANGE: {
|
489
|
+
if (boundary_end.CellIsNull(chunk_idx)) {
|
490
|
+
window_end = peer_end;
|
491
|
+
} else {
|
492
|
+
prev.end = FindOrderedRangeBound<false>(range_collection, range_sense, row_idx, valid_end, boundary_end,
|
493
|
+
chunk_idx, prev);
|
494
|
+
window_end = prev.end;
|
495
|
+
}
|
496
|
+
break;
|
497
|
+
}
|
498
|
+
default:
|
499
|
+
throw InternalException("Unsupported window end boundary");
|
500
|
+
}
|
501
|
+
|
502
|
+
// clamp windows to partitions if they should exceed
|
503
|
+
if (window_start < (int64_t)partition_start) {
|
504
|
+
window_start = partition_start;
|
505
|
+
}
|
506
|
+
if (window_start > (int64_t)partition_end) {
|
507
|
+
window_start = partition_end;
|
508
|
+
}
|
509
|
+
if (window_end < (int64_t)partition_start) {
|
510
|
+
window_end = partition_start;
|
511
|
+
}
|
512
|
+
if (window_end > (int64_t)partition_end) {
|
513
|
+
window_end = partition_end;
|
514
|
+
}
|
515
|
+
|
516
|
+
if (window_start < 0 || window_end < 0) {
|
517
|
+
throw InternalException("Failed to compute window boundaries");
|
518
|
+
}
|
519
|
+
}
|
520
|
+
|
521
|
+
static bool HasPrecedingRange(BoundWindowExpression &wexpr) {
|
522
|
+
return (wexpr.start == WindowBoundary::EXPR_PRECEDING_RANGE || wexpr.end == WindowBoundary::EXPR_PRECEDING_RANGE);
|
523
|
+
}
|
524
|
+
|
525
|
+
static bool HasFollowingRange(BoundWindowExpression &wexpr) {
|
526
|
+
return (wexpr.start == WindowBoundary::EXPR_FOLLOWING_RANGE || wexpr.end == WindowBoundary::EXPR_FOLLOWING_RANGE);
|
527
|
+
}
|
528
|
+
|
529
|
+
WindowBoundariesState::WindowBoundariesState(BoundWindowExpression &wexpr, const idx_t input_size)
|
530
|
+
: type(wexpr.type), input_size(input_size), start_boundary(wexpr.start), end_boundary(wexpr.end),
|
531
|
+
partition_count(wexpr.partitions.size()), order_count(wexpr.orders.size()),
|
532
|
+
range_sense(wexpr.orders.empty() ? OrderType::INVALID : wexpr.orders[0].type),
|
533
|
+
has_preceding_range(HasPrecedingRange(wexpr)), has_following_range(HasFollowingRange(wexpr)),
|
534
|
+
needs_peer(BoundaryNeedsPeer(wexpr.end) || wexpr.type == ExpressionType::WINDOW_CUME_DIST) {
|
535
|
+
}
|
536
|
+
|
537
|
+
void WindowBoundariesState::Bounds(DataChunk &bounds, idx_t row_idx, const WindowInputColumn &range, const idx_t count,
|
538
|
+
WindowInputExpression &boundary_start, WindowInputExpression &boundary_end,
|
539
|
+
const ValidityMask &partition_mask, const ValidityMask &order_mask) {
|
540
|
+
bounds.Reset();
|
541
|
+
D_ASSERT(bounds.ColumnCount() == 6);
|
542
|
+
auto partition_begin_data = FlatVector::GetData<idx_t>(bounds.data[PARTITION_BEGIN]);
|
543
|
+
auto partition_end_data = FlatVector::GetData<idx_t>(bounds.data[PARTITION_END]);
|
544
|
+
auto peer_begin_data = FlatVector::GetData<idx_t>(bounds.data[PEER_BEGIN]);
|
545
|
+
auto peer_end_data = FlatVector::GetData<idx_t>(bounds.data[PEER_END]);
|
546
|
+
auto window_begin_data = FlatVector::GetData<int64_t>(bounds.data[WINDOW_BEGIN]);
|
547
|
+
auto window_end_data = FlatVector::GetData<int64_t>(bounds.data[WINDOW_END]);
|
548
|
+
for (idx_t chunk_idx = 0; chunk_idx < count; ++chunk_idx, ++row_idx) {
|
549
|
+
Update(row_idx, range, chunk_idx, boundary_start, boundary_end, partition_mask, order_mask);
|
550
|
+
*partition_begin_data++ = partition_start;
|
551
|
+
*partition_end_data++ = partition_end;
|
552
|
+
if (needs_peer) {
|
553
|
+
*peer_begin_data++ = peer_start;
|
554
|
+
*peer_end_data++ = peer_end;
|
555
|
+
}
|
556
|
+
*window_begin_data++ = window_start;
|
557
|
+
*window_end_data++ = window_end;
|
558
|
+
}
|
559
|
+
bounds.SetCardinality(count);
|
560
|
+
}
|
561
|
+
|
562
|
+
//===--------------------------------------------------------------------===//
|
563
|
+
// WindowExecutorBoundsState
|
564
|
+
//===--------------------------------------------------------------------===//
|
565
|
+
class WindowExecutorBoundsState : public WindowExecutorState {
|
566
|
+
public:
|
567
|
+
WindowExecutorBoundsState(BoundWindowExpression &wexpr, ClientContext &context, const idx_t count,
|
568
|
+
const ValidityMask &partition_mask_p, const ValidityMask &order_mask_p);
|
569
|
+
~WindowExecutorBoundsState() override {
|
570
|
+
}
|
571
|
+
|
572
|
+
virtual void UpdateBounds(idx_t row_idx, DataChunk &input_chunk, const WindowInputColumn &range);
|
573
|
+
|
574
|
+
// Frame management
|
575
|
+
const ValidityMask &partition_mask;
|
576
|
+
const ValidityMask &order_mask;
|
577
|
+
DataChunk bounds;
|
578
|
+
WindowBoundariesState state;
|
579
|
+
|
580
|
+
// evaluate boundaries if present. Parser has checked boundary types.
|
581
|
+
WindowInputExpression boundary_start;
|
582
|
+
WindowInputExpression boundary_end;
|
583
|
+
};
|
584
|
+
|
585
|
+
WindowExecutorBoundsState::WindowExecutorBoundsState(BoundWindowExpression &wexpr, ClientContext &context,
|
586
|
+
const idx_t payload_count, const ValidityMask &partition_mask_p,
|
587
|
+
const ValidityMask &order_mask_p)
|
588
|
+
: partition_mask(partition_mask_p), order_mask(order_mask_p), state(wexpr, payload_count),
|
589
|
+
boundary_start(wexpr.start_expr.get(), context), boundary_end(wexpr.end_expr.get(), context) {
|
590
|
+
vector<LogicalType> bounds_types(6, LogicalType(LogicalTypeId::UBIGINT));
|
591
|
+
bounds.Initialize(Allocator::Get(context), bounds_types);
|
592
|
+
}
|
593
|
+
|
594
|
+
void WindowExecutorBoundsState::UpdateBounds(idx_t row_idx, DataChunk &input_chunk, const WindowInputColumn &range) {
|
595
|
+
// Evaluate the row-level arguments
|
596
|
+
boundary_start.Execute(input_chunk);
|
597
|
+
boundary_end.Execute(input_chunk);
|
598
|
+
|
599
|
+
const auto count = input_chunk.size();
|
600
|
+
bounds.Reset();
|
601
|
+
state.Bounds(bounds, row_idx, range, count, boundary_start, boundary_end, partition_mask, order_mask);
|
602
|
+
}
|
603
|
+
|
604
|
+
//===--------------------------------------------------------------------===//
|
605
|
+
// WindowExecutor
|
606
|
+
//===--------------------------------------------------------------------===//
|
607
|
+
static void PrepareInputExpressions(vector<unique_ptr<Expression>> &exprs, ExpressionExecutor &executor,
|
608
|
+
DataChunk &chunk) {
|
609
|
+
if (exprs.empty()) {
|
610
|
+
return;
|
611
|
+
}
|
612
|
+
|
613
|
+
vector<LogicalType> types;
|
614
|
+
for (idx_t expr_idx = 0; expr_idx < exprs.size(); ++expr_idx) {
|
615
|
+
types.push_back(exprs[expr_idx]->return_type);
|
616
|
+
executor.AddExpression(*exprs[expr_idx]);
|
617
|
+
}
|
618
|
+
|
619
|
+
if (!types.empty()) {
|
620
|
+
auto &allocator = executor.GetAllocator();
|
621
|
+
chunk.Initialize(allocator, types);
|
622
|
+
}
|
623
|
+
}
|
624
|
+
|
625
|
+
WindowExecutor::WindowExecutor(BoundWindowExpression &wexpr, ClientContext &context, const idx_t payload_count,
|
626
|
+
const ValidityMask &partition_mask, const ValidityMask &order_mask)
|
627
|
+
: wexpr(wexpr), context(context), payload_count(payload_count), partition_mask(partition_mask),
|
628
|
+
order_mask(order_mask), payload_collection(), payload_executor(context),
|
629
|
+
range((HasPrecedingRange(wexpr) || HasFollowingRange(wexpr)) ? wexpr.orders[0].expression.get() : nullptr,
|
630
|
+
context, payload_count) {
|
631
|
+
// TODO: child may be a scalar, don't need to materialize the whole collection then
|
632
|
+
|
633
|
+
// evaluate inner expressions of window functions, could be more complex
|
634
|
+
PrepareInputExpressions(wexpr.children, payload_executor, payload_chunk);
|
635
|
+
|
636
|
+
auto types = payload_chunk.GetTypes();
|
637
|
+
if (!types.empty()) {
|
638
|
+
payload_collection.Initialize(Allocator::Get(context), types);
|
639
|
+
}
|
640
|
+
}
|
641
|
+
|
642
|
+
unique_ptr<WindowExecutorState> WindowExecutor::GetExecutorState() const {
|
643
|
+
return make_uniq<WindowExecutorBoundsState>(wexpr, context, payload_count, partition_mask, order_mask);
|
644
|
+
}
|
645
|
+
|
646
|
+
//===--------------------------------------------------------------------===//
|
647
|
+
// WindowAggregateExecutor
|
648
|
+
//===--------------------------------------------------------------------===//
|
649
|
+
bool WindowAggregateExecutor::IsConstantAggregate() {
|
650
|
+
if (!wexpr.aggregate) {
|
651
|
+
return false;
|
652
|
+
}
|
653
|
+
|
654
|
+
// COUNT(*) is already handled efficiently by segment trees.
|
655
|
+
if (wexpr.children.empty()) {
|
656
|
+
return false;
|
657
|
+
}
|
658
|
+
|
659
|
+
/*
|
660
|
+
The default framing option is RANGE UNBOUNDED PRECEDING, which
|
661
|
+
is the same as RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT
|
662
|
+
ROW; it sets the frame to be all rows from the partition start
|
663
|
+
up through the current row's last peer (a row that the window's
|
664
|
+
ORDER BY clause considers equivalent to the current row; all
|
665
|
+
rows are peers if there is no ORDER BY). In general, UNBOUNDED
|
666
|
+
PRECEDING means that the frame starts with the first row of the
|
667
|
+
partition, and similarly UNBOUNDED FOLLOWING means that the
|
668
|
+
frame ends with the last row of the partition, regardless of
|
669
|
+
RANGE, ROWS or GROUPS mode. In ROWS mode, CURRENT ROW means that
|
670
|
+
the frame starts or ends with the current row; but in RANGE or
|
671
|
+
GROUPS mode it means that the frame starts or ends with the
|
672
|
+
current row's first or last peer in the ORDER BY ordering. The
|
673
|
+
offset PRECEDING and offset FOLLOWING options vary in meaning
|
674
|
+
depending on the frame mode.
|
675
|
+
*/
|
676
|
+
switch (wexpr.start) {
|
677
|
+
case WindowBoundary::UNBOUNDED_PRECEDING:
|
678
|
+
break;
|
679
|
+
case WindowBoundary::CURRENT_ROW_RANGE:
|
680
|
+
if (!wexpr.orders.empty()) {
|
681
|
+
return false;
|
682
|
+
}
|
683
|
+
break;
|
684
|
+
default:
|
685
|
+
return false;
|
686
|
+
}
|
687
|
+
|
688
|
+
switch (wexpr.end) {
|
689
|
+
case WindowBoundary::UNBOUNDED_FOLLOWING:
|
690
|
+
break;
|
691
|
+
case WindowBoundary::CURRENT_ROW_RANGE:
|
692
|
+
if (!wexpr.orders.empty()) {
|
693
|
+
return false;
|
694
|
+
}
|
695
|
+
break;
|
696
|
+
default:
|
697
|
+
return false;
|
698
|
+
}
|
699
|
+
|
700
|
+
return true;
|
701
|
+
}
|
702
|
+
|
703
|
+
bool WindowAggregateExecutor::IsCustomAggregate() {
|
704
|
+
if (!wexpr.aggregate) {
|
705
|
+
return false;
|
706
|
+
}
|
707
|
+
|
708
|
+
if (!AggregateObject(wexpr).function.window) {
|
709
|
+
return false;
|
710
|
+
}
|
711
|
+
|
712
|
+
return (mode < WindowAggregationMode::COMBINE);
|
713
|
+
}
|
714
|
+
|
715
|
+
void WindowExecutor::Evaluate(idx_t row_idx, DataChunk &input_chunk, Vector &result,
|
716
|
+
WindowExecutorState &lstate) const {
|
717
|
+
auto &lbstate = lstate.Cast<WindowExecutorBoundsState>();
|
718
|
+
lbstate.UpdateBounds(row_idx, input_chunk, range);
|
719
|
+
|
720
|
+
const auto count = input_chunk.size();
|
721
|
+
EvaluateInternal(lstate, result, count, row_idx);
|
722
|
+
|
723
|
+
result.Verify(count);
|
724
|
+
}
|
725
|
+
|
726
|
+
WindowAggregateExecutor::WindowAggregateExecutor(BoundWindowExpression &wexpr, ClientContext &context,
|
727
|
+
const idx_t count, const ValidityMask &partition_mask,
|
728
|
+
const ValidityMask &order_mask, WindowAggregationMode mode)
|
729
|
+
: WindowExecutor(wexpr, context, count, partition_mask, order_mask), mode(mode), filter_executor(context) {
|
730
|
+
// TODO we could evaluate those expressions in parallel
|
731
|
+
|
732
|
+
// Check for constant aggregate
|
733
|
+
if (IsConstantAggregate()) {
|
734
|
+
aggregator =
|
735
|
+
make_uniq<WindowConstantAggregator>(AggregateObject(wexpr), wexpr.return_type, partition_mask, count);
|
736
|
+
} else if (IsCustomAggregate()) {
|
737
|
+
aggregator = make_uniq<WindowCustomAggregator>(AggregateObject(wexpr), wexpr.return_type, count);
|
738
|
+
} else if (wexpr.aggregate) {
|
739
|
+
// build a segment tree for frame-adhering aggregates
|
740
|
+
// see http://www.vldb.org/pvldb/vol8/p1058-leis.pdf
|
741
|
+
aggregator = make_uniq<WindowSegmentTree>(AggregateObject(wexpr), wexpr.return_type, count, mode);
|
742
|
+
}
|
743
|
+
|
744
|
+
// evaluate the FILTER clause and stuff it into a large mask for compactness and reuse
|
745
|
+
if (wexpr.filter_expr) {
|
746
|
+
filter_executor.AddExpression(*wexpr.filter_expr);
|
747
|
+
filter_sel.Initialize(STANDARD_VECTOR_SIZE);
|
748
|
+
}
|
749
|
+
}
|
750
|
+
|
751
|
+
void WindowAggregateExecutor::Sink(DataChunk &input_chunk, const idx_t input_idx, const idx_t total_count) {
|
752
|
+
idx_t filtered = 0;
|
753
|
+
SelectionVector *filtering = nullptr;
|
754
|
+
if (wexpr.filter_expr) {
|
755
|
+
filtering = &filter_sel;
|
756
|
+
filtered = filter_executor.SelectExpression(input_chunk, filter_sel);
|
757
|
+
}
|
758
|
+
|
759
|
+
if (!wexpr.children.empty()) {
|
760
|
+
payload_chunk.Reset();
|
761
|
+
payload_executor.Execute(input_chunk, payload_chunk);
|
762
|
+
payload_chunk.Verify();
|
763
|
+
} else if (aggregator) {
|
764
|
+
// Zero-argument aggregate (e.g., COUNT(*)
|
765
|
+
payload_chunk.SetCardinality(input_chunk);
|
766
|
+
}
|
767
|
+
|
768
|
+
D_ASSERT(aggregator);
|
769
|
+
aggregator->Sink(payload_chunk, filtering, filtered);
|
770
|
+
|
771
|
+
WindowExecutor::Sink(input_chunk, input_idx, total_count);
|
772
|
+
}
|
773
|
+
|
774
|
+
void WindowAggregateExecutor::Finalize() {
|
775
|
+
D_ASSERT(aggregator);
|
776
|
+
aggregator->Finalize();
|
777
|
+
}
|
778
|
+
|
779
|
+
class WindowAggregateState : public WindowExecutorBoundsState {
|
780
|
+
public:
|
781
|
+
WindowAggregateState(BoundWindowExpression &wexpr, ClientContext &context, const idx_t payload_count,
|
782
|
+
const ValidityMask &partition_mask, const ValidityMask &order_mask,
|
783
|
+
const WindowAggregator &aggregator)
|
784
|
+
: WindowExecutorBoundsState(wexpr, context, payload_count, partition_mask, order_mask),
|
785
|
+
aggregator_state(aggregator.GetLocalState()) {
|
786
|
+
}
|
787
|
+
|
788
|
+
public:
|
789
|
+
unique_ptr<WindowAggregatorState> aggregator_state;
|
790
|
+
|
791
|
+
void NextRank(idx_t partition_begin, idx_t peer_begin, idx_t row_idx);
|
792
|
+
};
|
793
|
+
|
794
|
+
unique_ptr<WindowExecutorState> WindowAggregateExecutor::GetExecutorState() const {
|
795
|
+
return make_uniq<WindowAggregateState>(wexpr, context, payload_count, partition_mask, order_mask, *aggregator);
|
796
|
+
}
|
797
|
+
|
798
|
+
void WindowAggregateExecutor::EvaluateInternal(WindowExecutorState &lstate, Vector &result, idx_t count,
|
799
|
+
idx_t row_idx) const {
|
800
|
+
auto &lastate = lstate.Cast<WindowAggregateState>();
|
801
|
+
D_ASSERT(aggregator);
|
802
|
+
auto window_begin = FlatVector::GetData<const idx_t>(lastate.bounds.data[WINDOW_BEGIN]);
|
803
|
+
auto window_end = FlatVector::GetData<const idx_t>(lastate.bounds.data[WINDOW_END]);
|
804
|
+
aggregator->Evaluate(*lastate.aggregator_state, window_begin, window_end, result, count);
|
805
|
+
}
|
806
|
+
|
807
|
+
//===--------------------------------------------------------------------===//
|
808
|
+
// WindowRowNumberExecutor
|
809
|
+
//===--------------------------------------------------------------------===//
|
810
|
+
WindowRowNumberExecutor::WindowRowNumberExecutor(BoundWindowExpression &wexpr, ClientContext &context,
|
811
|
+
const idx_t payload_count, const ValidityMask &partition_mask,
|
812
|
+
const ValidityMask &order_mask)
|
813
|
+
: WindowExecutor(wexpr, context, payload_count, partition_mask, order_mask) {
|
814
|
+
}
|
815
|
+
|
816
|
+
void WindowRowNumberExecutor::EvaluateInternal(WindowExecutorState &lstate, Vector &result, idx_t count,
|
817
|
+
idx_t row_idx) const {
|
818
|
+
auto &lbstate = lstate.Cast<WindowExecutorBoundsState>();
|
819
|
+
auto partition_begin = FlatVector::GetData<const idx_t>(lbstate.bounds.data[PARTITION_BEGIN]);
|
820
|
+
auto rdata = FlatVector::GetData<int64_t>(result);
|
821
|
+
for (idx_t i = 0; i < count; ++i, ++row_idx) {
|
822
|
+
rdata[i] = row_idx - partition_begin[i] + 1;
|
823
|
+
}
|
824
|
+
}
|
825
|
+
|
826
|
+
//===--------------------------------------------------------------------===//
|
827
|
+
// WindowPeerState
|
828
|
+
//===--------------------------------------------------------------------===//
|
829
|
+
class WindowPeerState : public WindowExecutorBoundsState {
|
830
|
+
public:
|
831
|
+
WindowPeerState(BoundWindowExpression &wexpr, ClientContext &context, const idx_t payload_count,
|
832
|
+
const ValidityMask &partition_mask, const ValidityMask &order_mask)
|
833
|
+
: WindowExecutorBoundsState(wexpr, context, payload_count, partition_mask, order_mask) {
|
834
|
+
}
|
835
|
+
|
836
|
+
public:
|
837
|
+
uint64_t dense_rank = 1;
|
838
|
+
uint64_t rank_equal = 0;
|
839
|
+
uint64_t rank = 1;
|
840
|
+
|
841
|
+
void NextRank(idx_t partition_begin, idx_t peer_begin, idx_t row_idx);
|
842
|
+
};
|
843
|
+
|
844
|
+
void WindowPeerState::NextRank(idx_t partition_begin, idx_t peer_begin, idx_t row_idx) {
|
845
|
+
if (partition_begin == row_idx) {
|
846
|
+
dense_rank = 1;
|
847
|
+
rank = 1;
|
848
|
+
rank_equal = 0;
|
849
|
+
} else if (peer_begin == row_idx) {
|
850
|
+
dense_rank++;
|
851
|
+
rank += rank_equal;
|
852
|
+
rank_equal = 0;
|
853
|
+
}
|
854
|
+
rank_equal++;
|
855
|
+
}
|
856
|
+
|
857
|
+
WindowRankExecutor::WindowRankExecutor(BoundWindowExpression &wexpr, ClientContext &context, const idx_t payload_count,
|
858
|
+
const ValidityMask &partition_mask, const ValidityMask &order_mask)
|
859
|
+
: WindowExecutor(wexpr, context, payload_count, partition_mask, order_mask) {
|
860
|
+
}
|
861
|
+
|
862
|
+
unique_ptr<WindowExecutorState> WindowRankExecutor::GetExecutorState() const {
|
863
|
+
return make_uniq<WindowPeerState>(wexpr, context, payload_count, partition_mask, order_mask);
|
864
|
+
}
|
865
|
+
|
866
|
+
void WindowRankExecutor::EvaluateInternal(WindowExecutorState &lstate, Vector &result, idx_t count,
|
867
|
+
idx_t row_idx) const {
|
868
|
+
auto &lpeer = lstate.Cast<WindowPeerState>();
|
869
|
+
auto partition_begin = FlatVector::GetData<const idx_t>(lpeer.bounds.data[PARTITION_BEGIN]);
|
870
|
+
auto peer_begin = FlatVector::GetData<const idx_t>(lpeer.bounds.data[PEER_BEGIN]);
|
871
|
+
auto rdata = FlatVector::GetData<int64_t>(result);
|
872
|
+
|
873
|
+
// Reset to "previous" row
|
874
|
+
lpeer.rank = (peer_begin[0] - partition_begin[0]) + 1;
|
875
|
+
lpeer.rank_equal = (row_idx - peer_begin[0]);
|
876
|
+
|
877
|
+
for (idx_t i = 0; i < count; ++i, ++row_idx) {
|
878
|
+
lpeer.NextRank(partition_begin[i], peer_begin[i], row_idx);
|
879
|
+
rdata[i] = lpeer.rank;
|
880
|
+
}
|
881
|
+
}
|
882
|
+
|
883
|
+
WindowDenseRankExecutor::WindowDenseRankExecutor(BoundWindowExpression &wexpr, ClientContext &context,
|
884
|
+
const idx_t payload_count, const ValidityMask &partition_mask,
|
885
|
+
const ValidityMask &order_mask)
|
886
|
+
: WindowExecutor(wexpr, context, payload_count, partition_mask, order_mask) {
|
887
|
+
}
|
888
|
+
|
889
|
+
unique_ptr<WindowExecutorState> WindowDenseRankExecutor::GetExecutorState() const {
|
890
|
+
return make_uniq<WindowPeerState>(wexpr, context, payload_count, partition_mask, order_mask);
|
891
|
+
}
|
892
|
+
|
893
|
+
void WindowDenseRankExecutor::EvaluateInternal(WindowExecutorState &lstate, Vector &result, idx_t count,
|
894
|
+
idx_t row_idx) const {
|
895
|
+
auto &lpeer = lstate.Cast<WindowPeerState>();
|
896
|
+
auto partition_begin = FlatVector::GetData<const idx_t>(lpeer.bounds.data[PARTITION_BEGIN]);
|
897
|
+
auto peer_begin = FlatVector::GetData<const idx_t>(lpeer.bounds.data[PEER_BEGIN]);
|
898
|
+
auto rdata = FlatVector::GetData<int64_t>(result);
|
899
|
+
|
900
|
+
// Reset to "previous" row
|
901
|
+
lpeer.rank = (peer_begin[0] - partition_begin[0]) + 1;
|
902
|
+
lpeer.rank_equal = (row_idx - peer_begin[0]);
|
903
|
+
|
904
|
+
// The previous dense rank is the number of order mask bits in [partition_begin, row_idx)
|
905
|
+
lpeer.dense_rank = 0;
|
906
|
+
|
907
|
+
auto order_begin = partition_begin[0];
|
908
|
+
idx_t begin_idx;
|
909
|
+
idx_t begin_offset;
|
910
|
+
order_mask.GetEntryIndex(order_begin, begin_idx, begin_offset);
|
911
|
+
|
912
|
+
auto order_end = row_idx;
|
913
|
+
idx_t end_idx;
|
914
|
+
idx_t end_offset;
|
915
|
+
order_mask.GetEntryIndex(order_end, end_idx, end_offset);
|
916
|
+
|
917
|
+
// If they are in the same entry, just loop
|
918
|
+
if (begin_idx == end_idx) {
|
919
|
+
const auto entry = order_mask.GetValidityEntry(begin_idx);
|
920
|
+
for (; begin_offset < end_offset; ++begin_offset) {
|
921
|
+
lpeer.dense_rank += order_mask.RowIsValid(entry, begin_offset);
|
922
|
+
}
|
923
|
+
} else {
|
924
|
+
// Count the ragged bits at the start of the partition
|
925
|
+
if (begin_offset) {
|
926
|
+
const auto entry = order_mask.GetValidityEntry(begin_idx);
|
927
|
+
for (; begin_offset < order_mask.BITS_PER_VALUE; ++begin_offset) {
|
928
|
+
lpeer.dense_rank += order_mask.RowIsValid(entry, begin_offset);
|
929
|
+
++order_begin;
|
930
|
+
}
|
931
|
+
++begin_idx;
|
932
|
+
}
|
933
|
+
|
934
|
+
// Count the the aligned bits.
|
935
|
+
ValidityMask tail_mask(order_mask.GetData() + begin_idx);
|
936
|
+
lpeer.dense_rank += tail_mask.CountValid(order_end - order_begin);
|
937
|
+
}
|
938
|
+
|
939
|
+
for (idx_t i = 0; i < count; ++i, ++row_idx) {
|
940
|
+
lpeer.NextRank(partition_begin[i], peer_begin[i], row_idx);
|
941
|
+
rdata[i] = lpeer.dense_rank;
|
942
|
+
}
|
943
|
+
}
|
944
|
+
|
945
|
+
WindowPercentRankExecutor::WindowPercentRankExecutor(BoundWindowExpression &wexpr, ClientContext &context,
|
946
|
+
const idx_t payload_count, const ValidityMask &partition_mask,
|
947
|
+
const ValidityMask &order_mask)
|
948
|
+
: WindowExecutor(wexpr, context, payload_count, partition_mask, order_mask) {
|
949
|
+
}
|
950
|
+
|
951
|
+
unique_ptr<WindowExecutorState> WindowPercentRankExecutor::GetExecutorState() const {
|
952
|
+
return make_uniq<WindowPeerState>(wexpr, context, payload_count, partition_mask, order_mask);
|
953
|
+
}
|
954
|
+
|
955
|
+
void WindowPercentRankExecutor::EvaluateInternal(WindowExecutorState &lstate, Vector &result, idx_t count,
|
956
|
+
idx_t row_idx) const {
|
957
|
+
auto &lpeer = lstate.Cast<WindowPeerState>();
|
958
|
+
auto partition_begin = FlatVector::GetData<const idx_t>(lpeer.bounds.data[PARTITION_BEGIN]);
|
959
|
+
auto partition_end = FlatVector::GetData<const idx_t>(lpeer.bounds.data[PARTITION_END]);
|
960
|
+
auto peer_begin = FlatVector::GetData<const idx_t>(lpeer.bounds.data[PEER_BEGIN]);
|
961
|
+
auto rdata = FlatVector::GetData<double>(result);
|
962
|
+
|
963
|
+
// Reset to "previous" row
|
964
|
+
lpeer.rank = (peer_begin[0] - partition_begin[0]) + 1;
|
965
|
+
lpeer.rank_equal = (row_idx - peer_begin[0]);
|
966
|
+
|
967
|
+
for (idx_t i = 0; i < count; ++i, ++row_idx) {
|
968
|
+
lpeer.NextRank(partition_begin[i], peer_begin[i], row_idx);
|
969
|
+
int64_t denom = partition_end[i] - partition_begin[i] - 1;
|
970
|
+
double percent_rank = denom > 0 ? ((double)lpeer.rank - 1) / denom : 0;
|
971
|
+
rdata[i] = percent_rank;
|
972
|
+
}
|
973
|
+
}
|
974
|
+
|
975
|
+
//===--------------------------------------------------------------------===//
|
976
|
+
// WindowCumeDistExecutor
|
977
|
+
//===--------------------------------------------------------------------===//
|
978
|
+
WindowCumeDistExecutor::WindowCumeDistExecutor(BoundWindowExpression &wexpr, ClientContext &context,
|
979
|
+
const idx_t payload_count, const ValidityMask &partition_mask,
|
980
|
+
const ValidityMask &order_mask)
|
981
|
+
: WindowExecutor(wexpr, context, payload_count, partition_mask, order_mask) {
|
982
|
+
}
|
983
|
+
|
984
|
+
void WindowCumeDistExecutor::EvaluateInternal(WindowExecutorState &lstate, Vector &result, idx_t count,
|
985
|
+
idx_t row_idx) const {
|
986
|
+
auto &lbstate = lstate.Cast<WindowExecutorBoundsState>();
|
987
|
+
auto partition_begin = FlatVector::GetData<const idx_t>(lbstate.bounds.data[PARTITION_BEGIN]);
|
988
|
+
auto partition_end = FlatVector::GetData<const idx_t>(lbstate.bounds.data[PARTITION_END]);
|
989
|
+
auto peer_end = FlatVector::GetData<const idx_t>(lbstate.bounds.data[PEER_END]);
|
990
|
+
auto rdata = FlatVector::GetData<double>(result);
|
991
|
+
for (idx_t i = 0; i < count; ++i, ++row_idx) {
|
992
|
+
int64_t denom = partition_end[i] - partition_begin[i];
|
993
|
+
double cume_dist = denom > 0 ? ((double)(peer_end[i] - partition_begin[i])) / denom : 0;
|
994
|
+
rdata[i] = cume_dist;
|
995
|
+
}
|
996
|
+
}
|
997
|
+
|
998
|
+
//===--------------------------------------------------------------------===//
|
999
|
+
// WindowValueExecutor
|
1000
|
+
//===--------------------------------------------------------------------===//
|
1001
|
+
WindowValueExecutor::WindowValueExecutor(BoundWindowExpression &wexpr, ClientContext &context,
|
1002
|
+
const idx_t payload_count, const ValidityMask &partition_mask,
|
1003
|
+
const ValidityMask &order_mask)
|
1004
|
+
: WindowExecutor(wexpr, context, payload_count, partition_mask, order_mask) {
|
1005
|
+
}
|
1006
|
+
|
1007
|
+
WindowNtileExecutor::WindowNtileExecutor(BoundWindowExpression &wexpr, ClientContext &context,
|
1008
|
+
const idx_t payload_count, const ValidityMask &partition_mask,
|
1009
|
+
const ValidityMask &order_mask)
|
1010
|
+
: WindowValueExecutor(wexpr, context, payload_count, partition_mask, order_mask) {
|
1011
|
+
}
|
1012
|
+
|
1013
|
+
void WindowValueExecutor::Sink(DataChunk &input_chunk, const idx_t input_idx, const idx_t total_count) {
|
1014
|
+
// Single pass over the input to produce the global data.
|
1015
|
+
// Vectorisation for the win...
|
1016
|
+
|
1017
|
+
// Set up a validity mask for IGNORE NULLS
|
1018
|
+
bool check_nulls = false;
|
1019
|
+
if (wexpr.ignore_nulls) {
|
1020
|
+
switch (wexpr.type) {
|
1021
|
+
case ExpressionType::WINDOW_LEAD:
|
1022
|
+
case ExpressionType::WINDOW_LAG:
|
1023
|
+
case ExpressionType::WINDOW_FIRST_VALUE:
|
1024
|
+
case ExpressionType::WINDOW_LAST_VALUE:
|
1025
|
+
case ExpressionType::WINDOW_NTH_VALUE:
|
1026
|
+
check_nulls = true;
|
1027
|
+
break;
|
1028
|
+
default:
|
1029
|
+
break;
|
1030
|
+
}
|
1031
|
+
}
|
1032
|
+
|
1033
|
+
if (!wexpr.children.empty()) {
|
1034
|
+
payload_chunk.Reset();
|
1035
|
+
payload_executor.Execute(input_chunk, payload_chunk);
|
1036
|
+
payload_chunk.Verify();
|
1037
|
+
payload_collection.Append(payload_chunk, true);
|
1038
|
+
|
1039
|
+
// process payload chunks while they are still piping hot
|
1040
|
+
if (check_nulls) {
|
1041
|
+
const auto count = input_chunk.size();
|
1042
|
+
|
1043
|
+
UnifiedVectorFormat vdata;
|
1044
|
+
payload_chunk.data[0].ToUnifiedFormat(count, vdata);
|
1045
|
+
if (!vdata.validity.AllValid()) {
|
1046
|
+
// Lazily materialise the contents when we find the first NULL
|
1047
|
+
if (ignore_nulls.AllValid()) {
|
1048
|
+
ignore_nulls.Initialize(total_count);
|
1049
|
+
}
|
1050
|
+
// Write to the current position
|
1051
|
+
if (input_idx % ValidityMask::BITS_PER_VALUE == 0) {
|
1052
|
+
// If we are at the edge of an output entry, just copy the entries
|
1053
|
+
auto dst = ignore_nulls.GetData() + ignore_nulls.EntryCount(input_idx);
|
1054
|
+
auto src = vdata.validity.GetData();
|
1055
|
+
for (auto entry_count = vdata.validity.EntryCount(count); entry_count-- > 0;) {
|
1056
|
+
*dst++ = *src++;
|
1057
|
+
}
|
1058
|
+
} else {
|
1059
|
+
// If not, we have ragged data and need to copy one bit at a time.
|
1060
|
+
for (idx_t i = 0; i < count; ++i) {
|
1061
|
+
ignore_nulls.Set(input_idx + i, vdata.validity.RowIsValid(i));
|
1062
|
+
}
|
1063
|
+
}
|
1064
|
+
}
|
1065
|
+
}
|
1066
|
+
}
|
1067
|
+
|
1068
|
+
WindowExecutor::Sink(input_chunk, input_idx, total_count);
|
1069
|
+
}
|
1070
|
+
|
1071
|
+
void WindowNtileExecutor::EvaluateInternal(WindowExecutorState &lstate, Vector &result, idx_t count,
|
1072
|
+
idx_t row_idx) const {
|
1073
|
+
D_ASSERT(payload_collection.ColumnCount() == 1);
|
1074
|
+
auto &lbstate = lstate.Cast<WindowExecutorBoundsState>();
|
1075
|
+
auto partition_begin = FlatVector::GetData<const idx_t>(lbstate.bounds.data[PARTITION_BEGIN]);
|
1076
|
+
auto partition_end = FlatVector::GetData<const idx_t>(lbstate.bounds.data[PARTITION_END]);
|
1077
|
+
auto rdata = FlatVector::GetData<int64_t>(result);
|
1078
|
+
for (idx_t i = 0; i < count; ++i, ++row_idx) {
|
1079
|
+
if (CellIsNull(payload_collection, 0, row_idx)) {
|
1080
|
+
FlatVector::SetNull(result, i, true);
|
1081
|
+
} else {
|
1082
|
+
auto n_param = GetCell<int64_t>(payload_collection, 0, row_idx);
|
1083
|
+
if (n_param < 1) {
|
1084
|
+
throw InvalidInputException("Argument for ntile must be greater than zero");
|
1085
|
+
}
|
1086
|
+
// With thanks from SQLite's ntileValueFunc()
|
1087
|
+
int64_t n_total = partition_end[i] - partition_begin[i];
|
1088
|
+
if (n_param > n_total) {
|
1089
|
+
// more groups allowed than we have values
|
1090
|
+
// map every entry to a unique group
|
1091
|
+
n_param = n_total;
|
1092
|
+
}
|
1093
|
+
int64_t n_size = (n_total / n_param);
|
1094
|
+
// find the row idx within the group
|
1095
|
+
D_ASSERT(row_idx >= partition_begin[i]);
|
1096
|
+
int64_t adjusted_row_idx = row_idx - partition_begin[i];
|
1097
|
+
// now compute the ntile
|
1098
|
+
int64_t n_large = n_total - n_param * n_size;
|
1099
|
+
int64_t i_small = n_large * (n_size + 1);
|
1100
|
+
int64_t result_ntile;
|
1101
|
+
|
1102
|
+
D_ASSERT((n_large * (n_size + 1) + (n_param - n_large) * n_size) == n_total);
|
1103
|
+
|
1104
|
+
if (adjusted_row_idx < i_small) {
|
1105
|
+
result_ntile = 1 + adjusted_row_idx / (n_size + 1);
|
1106
|
+
} else {
|
1107
|
+
result_ntile = 1 + n_large + (adjusted_row_idx - i_small) / n_size;
|
1108
|
+
}
|
1109
|
+
// result has to be between [1, NTILE]
|
1110
|
+
D_ASSERT(result_ntile >= 1 && result_ntile <= n_param);
|
1111
|
+
rdata[i] = result_ntile;
|
1112
|
+
}
|
1113
|
+
}
|
1114
|
+
}
|
1115
|
+
|
1116
|
+
//===--------------------------------------------------------------------===//
|
1117
|
+
// WindowLeadLagState
|
1118
|
+
//===--------------------------------------------------------------------===//
|
1119
|
+
class WindowLeadLagState : public WindowExecutorBoundsState {
|
1120
|
+
public:
|
1121
|
+
WindowLeadLagState(BoundWindowExpression &wexpr, ClientContext &context, const idx_t payload_count,
|
1122
|
+
const ValidityMask &partition_mask, const ValidityMask &order_mask)
|
1123
|
+
: WindowExecutorBoundsState(wexpr, context, payload_count, partition_mask, order_mask),
|
1124
|
+
leadlag_offset(wexpr.offset_expr.get(), context), leadlag_default(wexpr.default_expr.get(), context) {
|
1125
|
+
}
|
1126
|
+
|
1127
|
+
void UpdateBounds(idx_t row_idx, DataChunk &input_chunk, const WindowInputColumn &range) override;
|
1128
|
+
|
1129
|
+
public:
|
1130
|
+
// LEAD/LAG Evaluation
|
1131
|
+
WindowInputExpression leadlag_offset;
|
1132
|
+
WindowInputExpression leadlag_default;
|
1133
|
+
};
|
1134
|
+
|
1135
|
+
void WindowLeadLagState::UpdateBounds(idx_t row_idx, DataChunk &input_chunk, const WindowInputColumn &range) {
|
1136
|
+
// Evaluate the row-level arguments
|
1137
|
+
leadlag_offset.Execute(input_chunk);
|
1138
|
+
leadlag_default.Execute(input_chunk);
|
1139
|
+
|
1140
|
+
WindowExecutorBoundsState::UpdateBounds(row_idx, input_chunk, range);
|
1141
|
+
}
|
1142
|
+
|
1143
|
+
WindowLeadLagExecutor::WindowLeadLagExecutor(BoundWindowExpression &wexpr, ClientContext &context,
|
1144
|
+
const idx_t payload_count, const ValidityMask &partition_mask,
|
1145
|
+
const ValidityMask &order_mask)
|
1146
|
+
: WindowValueExecutor(wexpr, context, payload_count, partition_mask, order_mask) {
|
1147
|
+
}
|
1148
|
+
|
1149
|
+
unique_ptr<WindowExecutorState> WindowLeadLagExecutor::GetExecutorState() const {
|
1150
|
+
return make_uniq<WindowLeadLagState>(wexpr, context, payload_count, partition_mask, order_mask);
|
1151
|
+
}
|
1152
|
+
|
1153
|
+
void WindowLeadLagExecutor::EvaluateInternal(WindowExecutorState &lstate, Vector &result, idx_t count,
|
1154
|
+
idx_t row_idx) const {
|
1155
|
+
auto &llstate = lstate.Cast<WindowLeadLagState>();
|
1156
|
+
|
1157
|
+
auto partition_begin = FlatVector::GetData<const idx_t>(llstate.bounds.data[PARTITION_BEGIN]);
|
1158
|
+
auto partition_end = FlatVector::GetData<const idx_t>(llstate.bounds.data[PARTITION_END]);
|
1159
|
+
for (idx_t i = 0; i < count; ++i, ++row_idx) {
|
1160
|
+
int64_t offset = 1;
|
1161
|
+
if (wexpr.offset_expr) {
|
1162
|
+
offset = llstate.leadlag_offset.GetCell<int64_t>(i);
|
1163
|
+
}
|
1164
|
+
int64_t val_idx = (int64_t)row_idx;
|
1165
|
+
if (wexpr.type == ExpressionType::WINDOW_LEAD) {
|
1166
|
+
val_idx = AddOperatorOverflowCheck::Operation<int64_t, int64_t, int64_t>(val_idx, offset);
|
1167
|
+
} else {
|
1168
|
+
val_idx = SubtractOperatorOverflowCheck::Operation<int64_t, int64_t, int64_t>(val_idx, offset);
|
1169
|
+
}
|
1170
|
+
|
1171
|
+
idx_t delta = 0;
|
1172
|
+
if (val_idx < (int64_t)row_idx) {
|
1173
|
+
// Count backwards
|
1174
|
+
delta = idx_t(row_idx - val_idx);
|
1175
|
+
val_idx = FindPrevStart(ignore_nulls, partition_begin[i], row_idx, delta);
|
1176
|
+
} else if (val_idx > (int64_t)row_idx) {
|
1177
|
+
delta = idx_t(val_idx - row_idx);
|
1178
|
+
val_idx = FindNextStart(ignore_nulls, row_idx + 1, partition_end[i], delta);
|
1179
|
+
}
|
1180
|
+
// else offset is zero, so don't move.
|
1181
|
+
|
1182
|
+
if (!delta) {
|
1183
|
+
CopyCell(payload_collection, 0, val_idx, result, i);
|
1184
|
+
} else if (wexpr.default_expr) {
|
1185
|
+
llstate.leadlag_default.CopyCell(result, i);
|
1186
|
+
} else {
|
1187
|
+
FlatVector::SetNull(result, i, true);
|
1188
|
+
}
|
1189
|
+
}
|
1190
|
+
}
|
1191
|
+
|
1192
|
+
WindowFirstValueExecutor::WindowFirstValueExecutor(BoundWindowExpression &wexpr, ClientContext &context,
|
1193
|
+
const idx_t payload_count, const ValidityMask &partition_mask,
|
1194
|
+
const ValidityMask &order_mask)
|
1195
|
+
: WindowValueExecutor(wexpr, context, payload_count, partition_mask, order_mask) {
|
1196
|
+
}
|
1197
|
+
|
1198
|
+
void WindowFirstValueExecutor::EvaluateInternal(WindowExecutorState &lstate, Vector &result, idx_t count,
|
1199
|
+
idx_t row_idx) const {
|
1200
|
+
auto &lbstate = lstate.Cast<WindowExecutorBoundsState>();
|
1201
|
+
auto window_begin = FlatVector::GetData<const idx_t>(lbstate.bounds.data[WINDOW_BEGIN]);
|
1202
|
+
auto window_end = FlatVector::GetData<const idx_t>(lbstate.bounds.data[WINDOW_END]);
|
1203
|
+
for (idx_t i = 0; i < count; ++i, ++row_idx) {
|
1204
|
+
if (window_begin[i] >= window_end[i]) {
|
1205
|
+
FlatVector::SetNull(result, i, true);
|
1206
|
+
continue;
|
1207
|
+
}
|
1208
|
+
// Same as NTH_VALUE(..., 1)
|
1209
|
+
idx_t n = 1;
|
1210
|
+
const auto first_idx = FindNextStart(ignore_nulls, window_begin[i], window_end[i], n);
|
1211
|
+
if (!n) {
|
1212
|
+
CopyCell(payload_collection, 0, first_idx, result, i);
|
1213
|
+
} else {
|
1214
|
+
FlatVector::SetNull(result, i, true);
|
1215
|
+
}
|
1216
|
+
}
|
1217
|
+
}
|
1218
|
+
|
1219
|
+
WindowLastValueExecutor::WindowLastValueExecutor(BoundWindowExpression &wexpr, ClientContext &context,
|
1220
|
+
const idx_t payload_count, const ValidityMask &partition_mask,
|
1221
|
+
const ValidityMask &order_mask)
|
1222
|
+
: WindowValueExecutor(wexpr, context, payload_count, partition_mask, order_mask) {
|
1223
|
+
}
|
1224
|
+
|
1225
|
+
void WindowLastValueExecutor::EvaluateInternal(WindowExecutorState &lstate, Vector &result, idx_t count,
|
1226
|
+
idx_t row_idx) const {
|
1227
|
+
auto &lbstate = lstate.Cast<WindowExecutorBoundsState>();
|
1228
|
+
auto window_begin = FlatVector::GetData<const idx_t>(lbstate.bounds.data[WINDOW_BEGIN]);
|
1229
|
+
auto window_end = FlatVector::GetData<const idx_t>(lbstate.bounds.data[WINDOW_END]);
|
1230
|
+
for (idx_t i = 0; i < count; ++i, ++row_idx) {
|
1231
|
+
if (window_begin[i] >= window_end[i]) {
|
1232
|
+
FlatVector::SetNull(result, i, true);
|
1233
|
+
continue;
|
1234
|
+
}
|
1235
|
+
idx_t n = 1;
|
1236
|
+
const auto last_idx = FindPrevStart(ignore_nulls, window_begin[i], window_end[i], n);
|
1237
|
+
if (!n) {
|
1238
|
+
CopyCell(payload_collection, 0, last_idx, result, i);
|
1239
|
+
} else {
|
1240
|
+
FlatVector::SetNull(result, i, true);
|
1241
|
+
}
|
1242
|
+
}
|
1243
|
+
}
|
1244
|
+
|
1245
|
+
WindowNthValueExecutor::WindowNthValueExecutor(BoundWindowExpression &wexpr, ClientContext &context,
|
1246
|
+
const idx_t payload_count, const ValidityMask &partition_mask,
|
1247
|
+
const ValidityMask &order_mask)
|
1248
|
+
: WindowValueExecutor(wexpr, context, payload_count, partition_mask, order_mask) {
|
1249
|
+
}
|
1250
|
+
|
1251
|
+
void WindowNthValueExecutor::EvaluateInternal(WindowExecutorState &lstate, Vector &result, idx_t count,
|
1252
|
+
idx_t row_idx) const {
|
1253
|
+
D_ASSERT(payload_collection.ColumnCount() == 2);
|
1254
|
+
|
1255
|
+
auto &lbstate = lstate.Cast<WindowExecutorBoundsState>();
|
1256
|
+
auto window_begin = FlatVector::GetData<const idx_t>(lbstate.bounds.data[WINDOW_BEGIN]);
|
1257
|
+
auto window_end = FlatVector::GetData<const idx_t>(lbstate.bounds.data[WINDOW_END]);
|
1258
|
+
for (idx_t i = 0; i < count; ++i, ++row_idx) {
|
1259
|
+
if (window_begin[i] >= window_end[i]) {
|
1260
|
+
FlatVector::SetNull(result, i, true);
|
1261
|
+
continue;
|
1262
|
+
}
|
1263
|
+
// Returns value evaluated at the row that is the n'th row of the window frame (counting from 1);
|
1264
|
+
// returns NULL if there is no such row.
|
1265
|
+
if (CellIsNull(payload_collection, 1, row_idx)) {
|
1266
|
+
FlatVector::SetNull(result, i, true);
|
1267
|
+
} else {
|
1268
|
+
auto n_param = GetCell<int64_t>(payload_collection, 1, row_idx);
|
1269
|
+
if (n_param < 1) {
|
1270
|
+
FlatVector::SetNull(result, i, true);
|
1271
|
+
} else {
|
1272
|
+
auto n = idx_t(n_param);
|
1273
|
+
const auto nth_index = FindNextStart(ignore_nulls, window_begin[i], window_end[i], n);
|
1274
|
+
if (!n) {
|
1275
|
+
CopyCell(payload_collection, 0, nth_index, result, i);
|
1276
|
+
} else {
|
1277
|
+
FlatVector::SetNull(result, i, true);
|
1278
|
+
}
|
1279
|
+
}
|
1280
|
+
}
|
1281
|
+
}
|
1282
|
+
}
|
1283
|
+
|
1284
|
+
} // namespace duckdb
|