duckdb 0.7.2-dev12.0 → 0.7.2-dev1238.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.gyp +12 -7
- package/lib/duckdb.d.ts +55 -2
- package/lib/duckdb.js +20 -1
- package/package.json +1 -1
- package/src/connection.cpp +1 -2
- package/src/database.cpp +1 -1
- package/src/duckdb/extension/icu/icu-extension.cpp +4 -0
- package/src/duckdb/extension/icu/icu-list-range.cpp +207 -0
- package/src/duckdb/extension/icu/icu-table-range.cpp +194 -0
- package/src/duckdb/extension/icu/include/icu-list-range.hpp +17 -0
- package/src/duckdb/extension/icu/include/icu-table-range.hpp +17 -0
- package/src/duckdb/extension/icu/third_party/icu/stubdata/stubdata.cpp +1 -1
- package/src/duckdb/extension/json/include/json_common.hpp +1 -0
- package/src/duckdb/extension/json/include/json_functions.hpp +2 -0
- package/src/duckdb/extension/json/include/json_serializer.hpp +77 -0
- package/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +147 -0
- package/src/duckdb/extension/json/json_functions/read_json.cpp +6 -5
- package/src/duckdb/extension/json/json_functions.cpp +12 -4
- package/src/duckdb/extension/json/json_scan.cpp +2 -2
- package/src/duckdb/extension/json/json_serializer.cpp +217 -0
- package/src/duckdb/extension/parquet/column_reader.cpp +94 -15
- package/src/duckdb/extension/parquet/column_writer.cpp +0 -1
- package/src/duckdb/extension/parquet/include/column_reader.hpp +1 -2
- package/src/duckdb/extension/parquet/include/decode_utils.hpp +5 -4
- package/src/duckdb/extension/parquet/include/generated_column_reader.hpp +1 -11
- package/src/duckdb/extension/parquet/include/parquet_timestamp.hpp +2 -1
- package/src/duckdb/extension/parquet/parquet-extension.cpp +14 -3
- package/src/duckdb/extension/parquet/parquet_reader.cpp +6 -1
- package/src/duckdb/extension/parquet/parquet_statistics.cpp +49 -36
- package/src/duckdb/extension/parquet/parquet_timestamp.cpp +16 -6
- package/src/duckdb/src/catalog/catalog.cpp +34 -5
- package/src/duckdb/src/catalog/catalog_entry/duck_schema_entry.cpp +4 -0
- package/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +2 -21
- package/src/duckdb/src/catalog/catalog_entry/scalar_function_catalog_entry.cpp +7 -6
- package/src/duckdb/src/catalog/catalog_entry/table_catalog_entry.cpp +3 -3
- package/src/duckdb/src/catalog/catalog_entry/table_function_catalog_entry.cpp +20 -1
- package/src/duckdb/src/catalog/catalog_entry/type_catalog_entry.cpp +8 -2
- package/src/duckdb/src/catalog/catalog_set.cpp +1 -0
- package/src/duckdb/src/catalog/default/default_functions.cpp +3 -0
- package/src/duckdb/src/catalog/dependency_list.cpp +12 -0
- package/src/duckdb/src/catalog/duck_catalog.cpp +34 -7
- package/src/duckdb/src/common/arrow/arrow_appender.cpp +48 -4
- package/src/duckdb/src/common/arrow/arrow_converter.cpp +1 -1
- package/src/duckdb/src/common/box_renderer.cpp +109 -23
- package/src/duckdb/src/common/enums/expression_type.cpp +8 -222
- package/src/duckdb/src/common/enums/join_type.cpp +3 -22
- package/src/duckdb/src/common/enums/logical_operator_type.cpp +2 -0
- package/src/duckdb/src/common/enums/statement_type.cpp +2 -0
- package/src/duckdb/src/common/exception.cpp +15 -1
- package/src/duckdb/src/common/field_writer.cpp +1 -0
- package/src/duckdb/src/common/hive_partitioning.cpp +3 -1
- package/src/duckdb/src/common/local_file_system.cpp +64 -7
- package/src/duckdb/src/common/operator/cast_operators.cpp +1 -1
- package/src/duckdb/src/common/preserved_error.cpp +7 -5
- package/src/duckdb/src/common/progress_bar/progress_bar.cpp +7 -0
- package/src/duckdb/src/common/serializer/buffered_deserializer.cpp +4 -0
- package/src/duckdb/src/common/serializer/buffered_file_reader.cpp +15 -2
- package/src/duckdb/src/common/serializer/enum_serializer.cpp +1176 -0
- package/src/duckdb/src/common/sort/comparators.cpp +14 -5
- package/src/duckdb/src/common/sort/sort_state.cpp +5 -7
- package/src/duckdb/src/common/sort/sorted_block.cpp +0 -1
- package/src/duckdb/src/common/string_util.cpp +18 -1
- package/src/duckdb/src/common/types/bit.cpp +166 -87
- package/src/duckdb/src/common/types/blob.cpp +1 -1
- package/src/duckdb/src/common/types/chunk_collection.cpp +2 -2
- package/src/duckdb/src/common/types/column_data_collection.cpp +39 -2
- package/src/duckdb/src/common/types/column_data_collection_segment.cpp +12 -10
- package/src/duckdb/src/common/types/data_chunk.cpp +1 -1
- package/src/duckdb/src/common/types/interval.cpp +0 -41
- package/src/duckdb/src/common/types/list_segment.cpp +658 -0
- package/src/duckdb/src/common/types/string_heap.cpp +1 -1
- package/src/duckdb/src/common/types/string_type.cpp +1 -1
- package/src/duckdb/src/common/types/time.cpp +13 -0
- package/src/duckdb/src/common/types/validity_mask.cpp +24 -7
- package/src/duckdb/src/common/types/value.cpp +320 -154
- package/src/duckdb/src/common/types/vector.cpp +158 -134
- package/src/duckdb/src/common/types.cpp +313 -153
- package/src/duckdb/src/common/value_operations/comparison_operations.cpp +14 -22
- package/src/duckdb/src/common/vector_operations/comparison_operators.cpp +10 -10
- package/src/duckdb/src/common/vector_operations/is_distinct_from.cpp +11 -10
- package/src/duckdb/src/common/vector_operations/vector_cast.cpp +2 -1
- package/src/duckdb/src/execution/aggregate_hashtable.cpp +98 -74
- package/src/duckdb/src/execution/column_binding_resolver.cpp +21 -5
- package/src/duckdb/src/execution/expression_executor/execute_cast.cpp +2 -1
- package/src/duckdb/src/execution/expression_executor/execute_comparison.cpp +2 -2
- package/src/duckdb/src/execution/index/art/art.cpp +19 -5
- package/src/duckdb/src/execution/join_hashtable.cpp +3 -1
- package/src/duckdb/src/execution/operator/aggregate/physical_hash_aggregate.cpp +1 -1
- package/src/duckdb/src/execution/operator/aggregate/physical_perfecthash_aggregate.cpp +4 -5
- package/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +117 -26
- package/src/duckdb/src/execution/operator/helper/physical_limit.cpp +3 -0
- package/src/duckdb/src/execution/operator/helper/physical_vacuum.cpp +5 -3
- package/src/duckdb/src/execution/operator/join/physical_blockwise_nl_join.cpp +64 -17
- package/src/duckdb/src/execution/operator/join/physical_hash_join.cpp +2 -0
- package/src/duckdb/src/execution/operator/join/physical_iejoin.cpp +2 -2
- package/src/duckdb/src/execution/operator/join/physical_index_join.cpp +13 -4
- package/src/duckdb/src/execution/operator/join/physical_join.cpp +0 -3
- package/src/duckdb/src/execution/operator/join/physical_piecewise_merge_join.cpp +6 -11
- package/src/duckdb/src/execution/operator/join/physical_range_join.cpp +3 -1
- package/src/duckdb/src/execution/operator/persistent/base_csv_reader.cpp +11 -4
- package/src/duckdb/src/execution/operator/persistent/buffered_csv_reader.cpp +24 -19
- package/src/duckdb/src/execution/operator/persistent/csv_reader_options.cpp +3 -0
- package/src/duckdb/src/execution/operator/persistent/physical_batch_insert.cpp +2 -1
- package/src/duckdb/src/execution/operator/persistent/physical_copy_to_file.cpp +2 -2
- package/src/duckdb/src/execution/operator/persistent/physical_delete.cpp +1 -3
- package/src/duckdb/src/execution/operator/persistent/physical_insert.cpp +1 -0
- package/src/duckdb/src/execution/operator/projection/physical_projection.cpp +34 -0
- package/src/duckdb/src/execution/operator/scan/physical_positional_scan.cpp +20 -5
- package/src/duckdb/src/execution/operator/schema/physical_create_type.cpp +20 -40
- package/src/duckdb/src/execution/operator/set/physical_recursive_cte.cpp +2 -5
- package/src/duckdb/src/execution/partitionable_hashtable.cpp +20 -5
- package/src/duckdb/src/execution/physical_plan/plan_aggregate.cpp +22 -16
- package/src/duckdb/src/execution/physical_plan/plan_asof_join.cpp +97 -0
- package/src/duckdb/src/execution/physical_plan/plan_comparison_join.cpp +95 -47
- package/src/duckdb/src/execution/physical_plan/plan_create_index.cpp +2 -1
- package/src/duckdb/src/execution/physical_plan/plan_distinct.cpp +5 -8
- package/src/duckdb/src/execution/physical_plan/plan_positional_join.cpp +14 -5
- package/src/duckdb/src/execution/physical_plan_generator.cpp +3 -0
- package/src/duckdb/src/execution/radix_partitioned_hashtable.cpp +23 -15
- package/src/duckdb/src/execution/window_segment_tree.cpp +173 -1
- package/src/duckdb/src/function/aggregate/algebraic/avg.cpp +0 -6
- package/src/duckdb/src/function/aggregate/distributive/bitagg.cpp +99 -95
- package/src/duckdb/src/function/aggregate/distributive/bitstring_agg.cpp +269 -0
- package/src/duckdb/src/function/aggregate/distributive/bool.cpp +2 -0
- package/src/duckdb/src/function/aggregate/distributive/count.cpp +3 -4
- package/src/duckdb/src/function/aggregate/distributive/first.cpp +1 -0
- package/src/duckdb/src/function/aggregate/distributive/minmax.cpp +2 -0
- package/src/duckdb/src/function/aggregate/distributive/sum.cpp +19 -16
- package/src/duckdb/src/function/aggregate/distributive_functions.cpp +1 -0
- package/src/duckdb/src/function/aggregate/holistic/approximate_quantile.cpp +5 -2
- package/src/duckdb/src/function/aggregate/holistic/mode.cpp +1 -1
- package/src/duckdb/src/function/aggregate/holistic/quantile.cpp +16 -1
- package/src/duckdb/src/function/aggregate/nested/list.cpp +6 -712
- package/src/duckdb/src/function/aggregate/sorted_aggregate_function.cpp +138 -45
- package/src/duckdb/src/function/cast/bit_cast.cpp +0 -2
- package/src/duckdb/src/function/cast/blob_cast.cpp +0 -1
- package/src/duckdb/src/function/cast/cast_function_set.cpp +1 -1
- package/src/duckdb/src/function/cast/enum_casts.cpp +25 -3
- package/src/duckdb/src/function/cast/list_casts.cpp +17 -4
- package/src/duckdb/src/function/cast/map_cast.cpp +5 -2
- package/src/duckdb/src/function/cast/string_cast.cpp +36 -10
- package/src/duckdb/src/function/cast/struct_cast.cpp +24 -4
- package/src/duckdb/src/function/cast/time_casts.cpp +2 -2
- package/src/duckdb/src/function/cast/union_casts.cpp +33 -7
- package/src/duckdb/src/function/cast_rules.cpp +9 -4
- package/src/duckdb/src/function/function_binder.cpp +1 -8
- package/src/duckdb/src/function/pragma/pragma_queries.cpp +24 -1
- package/src/duckdb/src/function/scalar/bit/bitstring.cpp +100 -0
- package/src/duckdb/src/function/scalar/date/current.cpp +0 -2
- package/src/duckdb/src/function/scalar/date/date_diff.cpp +0 -1
- package/src/duckdb/src/function/scalar/date/date_part.cpp +18 -26
- package/src/duckdb/src/function/scalar/date/date_sub.cpp +0 -1
- package/src/duckdb/src/function/scalar/date/date_trunc.cpp +10 -14
- package/src/duckdb/src/function/scalar/generic/stats.cpp +2 -4
- package/src/duckdb/src/function/scalar/list/contains_or_position.cpp +4 -146
- package/src/duckdb/src/function/scalar/list/flatten.cpp +5 -12
- package/src/duckdb/src/function/scalar/list/list_aggregates.cpp +1 -1
- package/src/duckdb/src/function/scalar/list/list_concat.cpp +8 -12
- package/src/duckdb/src/function/scalar/list/list_extract.cpp +5 -12
- package/src/duckdb/src/function/scalar/list/list_lambdas.cpp +7 -3
- package/src/duckdb/src/function/scalar/list/list_sort.cpp +25 -18
- package/src/duckdb/src/function/scalar/list/list_value.cpp +6 -10
- package/src/duckdb/src/function/scalar/map/map.cpp +47 -1
- package/src/duckdb/src/function/scalar/map/map_entries.cpp +61 -0
- package/src/duckdb/src/function/scalar/map/map_extract.cpp +68 -26
- package/src/duckdb/src/function/scalar/map/map_keys_values.cpp +97 -0
- package/src/duckdb/src/function/scalar/math/numeric.cpp +101 -17
- package/src/duckdb/src/function/scalar/math_functions.cpp +3 -0
- package/src/duckdb/src/function/scalar/nested_functions.cpp +3 -0
- package/src/duckdb/src/function/scalar/operators/add.cpp +0 -9
- package/src/duckdb/src/function/scalar/operators/arithmetic.cpp +29 -48
- package/src/duckdb/src/function/scalar/operators/bitwise.cpp +0 -63
- package/src/duckdb/src/function/scalar/operators/multiply.cpp +5 -6
- package/src/duckdb/src/function/scalar/operators/subtract.cpp +0 -6
- package/src/duckdb/src/function/scalar/string/caseconvert.cpp +2 -6
- package/src/duckdb/src/function/scalar/string/hex.cpp +201 -0
- package/src/duckdb/src/function/scalar/string/instr.cpp +2 -6
- package/src/duckdb/src/function/scalar/string/length.cpp +2 -6
- package/src/duckdb/src/function/scalar/string/like.cpp +2 -6
- package/src/duckdb/src/function/scalar/string/regexp/regexp_extract_all.cpp +243 -0
- package/src/duckdb/src/function/scalar/string/regexp/regexp_util.cpp +79 -0
- package/src/duckdb/src/function/scalar/string/regexp.cpp +21 -80
- package/src/duckdb/src/function/scalar/string/substring.cpp +2 -6
- package/src/duckdb/src/function/scalar/string_functions.cpp +2 -0
- package/src/duckdb/src/function/scalar/struct/struct_extract.cpp +5 -10
- package/src/duckdb/src/function/scalar/struct/struct_insert.cpp +11 -14
- package/src/duckdb/src/function/scalar/struct/struct_pack.cpp +6 -7
- package/src/duckdb/src/function/table/arrow.cpp +5 -2
- package/src/duckdb/src/function/table/arrow_conversion.cpp +25 -1
- package/src/duckdb/src/function/table/checkpoint.cpp +5 -1
- package/src/duckdb/src/function/table/read_csv.cpp +60 -0
- package/src/duckdb/src/function/table/system/duckdb_constraints.cpp +2 -2
- package/src/duckdb/src/function/table/system/test_all_types.cpp +2 -2
- package/src/duckdb/src/function/table/table_scan.cpp +9 -12
- package/src/duckdb/src/function/table/version/pragma_version.cpp +2 -2
- package/src/duckdb/src/function/table_function.cpp +30 -11
- package/src/duckdb/src/include/duckdb/catalog/catalog.hpp +6 -0
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/duck_table_entry.hpp +1 -1
- package/src/duckdb/src/include/duckdb/catalog/catalog_entry/table_function_catalog_entry.hpp +6 -8
- package/src/duckdb/src/include/duckdb/catalog/dependency_list.hpp +3 -0
- package/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/box_renderer.hpp +8 -2
- package/src/duckdb/src/include/duckdb/common/constants.hpp +0 -19
- package/src/duckdb/src/include/duckdb/common/enums/aggregate_handling.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/expression_type.hpp +2 -3
- package/src/duckdb/src/include/duckdb/common/enums/joinref_type.hpp +7 -4
- package/src/duckdb/src/include/duckdb/common/enums/logical_operator_type.hpp +1 -0
- package/src/duckdb/src/include/duckdb/common/enums/order_type.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/enums/set_operation_type.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/enums/statement_type.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/enums/tableref_type.hpp +2 -1
- package/src/duckdb/src/include/duckdb/common/exception.hpp +69 -2
- package/src/duckdb/src/include/duckdb/common/field_writer.hpp +12 -4
- package/src/duckdb/src/include/duckdb/common/helper.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/{http_stats.hpp → http_state.hpp} +18 -4
- package/src/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp +45 -149
- package/src/duckdb/src/include/duckdb/common/operator/multiply.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/optional_ptr.hpp +45 -0
- package/src/duckdb/src/include/duckdb/common/preserved_error.hpp +6 -1
- package/src/duckdb/src/include/duckdb/common/progress_bar/progress_bar.hpp +2 -0
- package/src/duckdb/src/include/duckdb/common/serializer/buffered_deserializer.hpp +4 -2
- package/src/duckdb/src/include/duckdb/common/serializer/buffered_file_reader.hpp +8 -2
- package/src/duckdb/src/include/duckdb/common/serializer/enum_serializer.hpp +113 -0
- package/src/duckdb/src/include/duckdb/common/serializer/format_deserializer.hpp +336 -0
- package/src/duckdb/src/include/duckdb/common/serializer/format_serializer.hpp +268 -0
- package/src/duckdb/src/include/duckdb/common/serializer/serialization_traits.hpp +126 -0
- package/src/duckdb/src/include/duckdb/common/serializer.hpp +13 -0
- package/src/duckdb/src/include/duckdb/common/string_util.hpp +27 -0
- package/src/duckdb/src/include/duckdb/common/types/bit.hpp +12 -7
- package/src/duckdb/src/include/duckdb/common/types/interval.hpp +39 -3
- package/src/duckdb/src/include/duckdb/common/types/list_segment.hpp +70 -0
- package/src/duckdb/src/include/duckdb/common/types/string_type.hpp +73 -3
- package/src/duckdb/src/include/duckdb/common/types/time.hpp +3 -0
- package/src/duckdb/src/include/duckdb/common/types/validity_mask.hpp +4 -1
- package/src/duckdb/src/include/duckdb/common/types/value.hpp +17 -48
- package/src/duckdb/src/include/duckdb/common/types/value_map.hpp +1 -1
- package/src/duckdb/src/include/duckdb/common/types/vector.hpp +3 -1
- package/src/duckdb/src/include/duckdb/common/types.hpp +45 -8
- package/src/duckdb/src/include/duckdb/common/vector_operations/unary_executor.hpp +2 -2
- package/src/duckdb/src/include/duckdb/execution/aggregate_hashtable.hpp +35 -20
- package/src/duckdb/src/include/duckdb/execution/index/art/art.hpp +3 -14
- package/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_perfecthash_aggregate.hpp +1 -1
- package/src/duckdb/src/include/duckdb/execution/operator/join/physical_cross_product.hpp +2 -0
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_file_handle.hpp +1 -0
- package/src/duckdb/src/include/duckdb/execution/operator/persistent/csv_reader_options.hpp +10 -0
- package/src/duckdb/src/include/duckdb/execution/operator/projection/physical_projection.hpp +5 -0
- package/src/duckdb/src/include/duckdb/execution/partitionable_hashtable.hpp +5 -1
- package/src/duckdb/src/include/duckdb/execution/physical_plan_generator.hpp +1 -3
- package/src/duckdb/src/include/duckdb/execution/window_segment_tree.hpp +54 -0
- package/src/duckdb/src/include/duckdb/function/aggregate/distributive_functions.hpp +5 -0
- package/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +18 -6
- package/src/duckdb/src/include/duckdb/function/cast/bound_cast_data.hpp +84 -0
- package/src/duckdb/src/include/duckdb/function/cast/cast_function_set.hpp +2 -2
- package/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +28 -64
- package/src/duckdb/src/include/duckdb/function/function_binder.hpp +3 -6
- package/src/duckdb/src/include/duckdb/function/scalar/bit_functions.hpp +4 -0
- package/src/duckdb/src/include/duckdb/function/scalar/list/contains_or_position.hpp +138 -0
- package/src/duckdb/src/include/duckdb/function/scalar/math_functions.hpp +8 -0
- package/src/duckdb/src/include/duckdb/function/scalar/nested_functions.hpp +59 -0
- package/src/duckdb/src/include/duckdb/function/scalar/regexp.hpp +81 -1
- package/src/duckdb/src/include/duckdb/function/scalar/string_functions.hpp +4 -0
- package/src/duckdb/src/include/duckdb/function/scalar_function.hpp +2 -2
- package/src/duckdb/src/include/duckdb/function/table/arrow.hpp +12 -1
- package/src/duckdb/src/include/duckdb/function/table_function.hpp +10 -0
- package/src/duckdb/src/include/duckdb/main/capi/capi_internal.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/client_config.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/client_data.hpp +3 -3
- package/src/duckdb/src/include/duckdb/main/config.hpp +3 -0
- package/src/duckdb/src/include/duckdb/main/connection_manager.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/database.hpp +1 -0
- package/src/duckdb/src/include/duckdb/main/extension_entries.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/prepared_statement.hpp +2 -0
- package/src/duckdb/src/include/duckdb/main/relation/explain_relation.hpp +2 -1
- package/src/duckdb/src/include/duckdb/main/relation.hpp +2 -1
- package/src/duckdb/src/include/duckdb/optimizer/filter_pushdown.hpp +2 -0
- package/src/duckdb/src/include/duckdb/optimizer/join_order/cardinality_estimator.hpp +2 -2
- package/src/duckdb/src/include/duckdb/optimizer/rule/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/optimizer/rule/ordered_aggregate_optimizer.hpp +24 -0
- package/src/duckdb/src/include/duckdb/parser/common_table_expression_info.hpp +4 -0
- package/src/duckdb/src/include/duckdb/parser/expression/between_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/expression/bound_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/case_expression.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/expression/cast_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/collate_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/columnref_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/comparison_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/conjunction_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/constant_expression.hpp +3 -0
- 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 -2
- package/src/duckdb/src/include/duckdb/parser/expression/lambda_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/operator_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/parameter_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/positional_reference_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/star_expression.hpp +4 -2
- package/src/duckdb/src/include/duckdb/parser/expression/subquery_expression.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/expression/window_expression.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_info.hpp +5 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/{alter_function_info.hpp → alter_scalar_function_info.hpp} +13 -13
- package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_function_info.hpp +47 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/alter_table_info.hpp +6 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_data/create_table_function_info.hpp +2 -1
- package/src/duckdb/src/include/duckdb/parser/parsed_data/sample_options.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/parsed_expression.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/recursive_cte_node.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/select_node.hpp +5 -0
- package/src/duckdb/src/include/duckdb/parser/query_node/set_operation_node.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/query_node.hpp +13 -2
- package/src/duckdb/src/include/duckdb/parser/result_modifier.hpp +24 -1
- package/src/duckdb/src/include/duckdb/parser/sql_statement.hpp +2 -1
- package/src/duckdb/src/include/duckdb/parser/statement/multi_statement.hpp +28 -0
- package/src/duckdb/src/include/duckdb/parser/statement/select_statement.hpp +6 -1
- package/src/duckdb/src/include/duckdb/parser/tableref/basetableref.hpp +4 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/emptytableref.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/expressionlistref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/joinref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/pivotref.hpp +87 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/subqueryref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref/table_function_ref.hpp +3 -0
- package/src/duckdb/src/include/duckdb/parser/tableref.hpp +3 -1
- package/src/duckdb/src/include/duckdb/parser/tokens.hpp +2 -0
- package/src/duckdb/src/include/duckdb/parser/transformer.hpp +33 -0
- package/src/duckdb/src/include/duckdb/planner/bind_context.hpp +2 -0
- package/src/duckdb/src/include/duckdb/planner/binder.hpp +15 -4
- package/src/duckdb/src/include/duckdb/planner/bound_result_modifier.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression/bound_aggregate_expression.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/expression_binder/base_select_binder.hpp +64 -0
- package/src/duckdb/src/include/duckdb/planner/expression_binder/having_binder.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/expression_binder/order_binder.hpp +4 -1
- package/src/duckdb/src/include/duckdb/planner/expression_binder/qualify_binder.hpp +2 -2
- package/src/duckdb/src/include/duckdb/planner/expression_binder/select_binder.hpp +9 -38
- package/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +1 -1
- package/src/duckdb/src/include/duckdb/planner/logical_tokens.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/list.hpp +1 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_asof_join.hpp +22 -0
- package/src/duckdb/src/include/duckdb/planner/operator/logical_comparison_join.hpp +5 -2
- package/src/duckdb/src/include/duckdb/planner/operator/logical_distinct.hpp +3 -0
- package/src/duckdb/src/include/duckdb/planner/query_node/bound_select_node.hpp +8 -2
- package/src/duckdb/src/include/duckdb/storage/buffer/block_handle.hpp +2 -0
- package/src/duckdb/src/include/duckdb/storage/buffer_manager.hpp +76 -44
- package/src/duckdb/src/include/duckdb/storage/checkpoint/table_data_writer.hpp +3 -2
- package/src/duckdb/src/include/duckdb/storage/checkpoint_manager.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_compress.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_fetch.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/compression/chimp/chimp_scan.hpp +2 -1
- package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_compress.hpp +2 -2
- package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_fetch.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/compression/patas/patas_scan.hpp +2 -1
- package/src/duckdb/src/include/duckdb/storage/data_pointer.hpp +4 -3
- package/src/duckdb/src/include/duckdb/storage/data_table.hpp +4 -3
- package/src/duckdb/src/include/duckdb/storage/index.hpp +5 -4
- package/src/duckdb/src/include/duckdb/storage/meta_block_reader.hpp +7 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +93 -29
- package/src/duckdb/src/include/duckdb/storage/statistics/column_statistics.hpp +22 -3
- package/src/duckdb/src/include/duckdb/storage/statistics/distinct_statistics.hpp +8 -6
- package/src/duckdb/src/include/duckdb/storage/statistics/list_stats.hpp +41 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/node_statistics.hpp +26 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats.hpp +114 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/numeric_stats_union.hpp +62 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/segment_statistics.hpp +2 -7
- package/src/duckdb/src/include/duckdb/storage/statistics/string_stats.hpp +74 -0
- package/src/duckdb/src/include/duckdb/storage/statistics/struct_stats.hpp +42 -0
- package/src/duckdb/src/include/duckdb/storage/string_uncompressed.hpp +2 -3
- package/src/duckdb/src/include/duckdb/storage/table/column_checkpoint_state.hpp +2 -1
- package/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +21 -7
- package/src/duckdb/src/include/duckdb/storage/table/column_data_checkpointer.hpp +3 -2
- package/src/duckdb/src/include/duckdb/storage/table/column_segment.hpp +5 -6
- package/src/duckdb/src/include/duckdb/storage/table/column_segment_tree.hpp +18 -0
- package/src/duckdb/src/include/duckdb/storage/table/list_column_data.hpp +1 -1
- package/src/duckdb/src/include/duckdb/storage/table/persistent_table_data.hpp +6 -3
- package/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +41 -45
- package/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +23 -7
- package/src/duckdb/src/include/duckdb/storage/table/row_group_segment_tree.hpp +35 -0
- package/src/duckdb/src/include/duckdb/storage/table/scan_state.hpp +21 -29
- package/src/duckdb/src/include/duckdb/storage/table/segment_base.hpp +6 -6
- package/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +281 -26
- package/src/duckdb/src/include/duckdb/storage/table/standard_column_data.hpp +0 -4
- package/src/duckdb/src/include/duckdb/storage/table/table_statistics.hpp +5 -0
- package/src/duckdb/src/include/duckdb/storage/table/update_segment.hpp +0 -1
- package/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +1 -1
- package/src/duckdb/src/include/duckdb/transaction/local_storage.hpp +6 -3
- package/src/duckdb/src/include/duckdb.h +71 -2
- package/src/duckdb/src/include/duckdb.hpp +0 -1
- package/src/duckdb/src/main/capi/pending-c.cpp +16 -3
- package/src/duckdb/src/main/capi/result-c.cpp +27 -1
- package/src/duckdb/src/main/capi/stream-c.cpp +25 -0
- package/src/duckdb/src/main/capi/table_function-c.cpp +23 -0
- package/src/duckdb/src/main/client_context.cpp +38 -34
- package/src/duckdb/src/main/client_data.cpp +7 -6
- package/src/duckdb/src/main/config.cpp +70 -1
- package/src/duckdb/src/main/database.cpp +19 -2
- package/src/duckdb/src/main/extension/extension_install.cpp +7 -2
- package/src/duckdb/src/main/prepared_statement.cpp +4 -0
- package/src/duckdb/src/main/query_profiler.cpp +17 -15
- package/src/duckdb/src/main/relation/explain_relation.cpp +3 -3
- package/src/duckdb/src/main/relation.cpp +3 -2
- package/src/duckdb/src/main/settings/settings.cpp +20 -8
- package/src/duckdb/src/optimizer/column_lifetime_analyzer.cpp +1 -0
- package/src/duckdb/src/optimizer/deliminator.cpp +1 -1
- package/src/duckdb/src/optimizer/filter_combiner.cpp +3 -6
- package/src/duckdb/src/optimizer/filter_pullup.cpp +3 -1
- package/src/duckdb/src/optimizer/filter_pushdown.cpp +14 -8
- package/src/duckdb/src/optimizer/join_order/cardinality_estimator.cpp +107 -71
- package/src/duckdb/src/optimizer/join_order/join_order_optimizer.cpp +32 -12
- package/src/duckdb/src/optimizer/optimizer.cpp +1 -0
- package/src/duckdb/src/optimizer/pullup/pullup_from_left.cpp +2 -2
- package/src/duckdb/src/optimizer/pushdown/pushdown_aggregate.cpp +33 -5
- package/src/duckdb/src/optimizer/pushdown/pushdown_cross_product.cpp +1 -1
- package/src/duckdb/src/optimizer/pushdown/pushdown_inner_join.cpp +3 -0
- package/src/duckdb/src/optimizer/pushdown/pushdown_left_join.cpp +5 -12
- package/src/duckdb/src/optimizer/pushdown/pushdown_mark_join.cpp +2 -2
- package/src/duckdb/src/optimizer/pushdown/pushdown_single_join.cpp +1 -1
- package/src/duckdb/src/optimizer/remove_unused_columns.cpp +1 -0
- package/src/duckdb/src/optimizer/rule/move_constants.cpp +10 -4
- package/src/duckdb/src/optimizer/rule/ordered_aggregate_optimizer.cpp +30 -0
- package/src/duckdb/src/optimizer/rule/regex_optimizations.cpp +9 -2
- package/src/duckdb/src/optimizer/statistics/expression/propagate_aggregate.cpp +9 -3
- package/src/duckdb/src/optimizer/statistics/expression/propagate_and_compress.cpp +6 -7
- package/src/duckdb/src/optimizer/statistics/expression/propagate_cast.cpp +14 -11
- package/src/duckdb/src/optimizer/statistics/expression/propagate_columnref.cpp +1 -1
- package/src/duckdb/src/optimizer/statistics/expression/propagate_comparison.cpp +13 -15
- package/src/duckdb/src/optimizer/statistics/expression/propagate_conjunction.cpp +0 -1
- package/src/duckdb/src/optimizer/statistics/expression/propagate_constant.cpp +3 -75
- package/src/duckdb/src/optimizer/statistics/expression/propagate_function.cpp +7 -2
- package/src/duckdb/src/optimizer/statistics/expression/propagate_operator.cpp +10 -0
- package/src/duckdb/src/optimizer/statistics/operator/propagate_aggregate.cpp +2 -3
- package/src/duckdb/src/optimizer/statistics/operator/propagate_filter.cpp +29 -32
- package/src/duckdb/src/optimizer/statistics/operator/propagate_join.cpp +5 -5
- package/src/duckdb/src/optimizer/statistics/operator/propagate_set_operation.cpp +3 -3
- package/src/duckdb/src/optimizer/statistics_propagator.cpp +2 -1
- package/src/duckdb/src/optimizer/unnest_rewriter.cpp +2 -2
- package/src/duckdb/src/parallel/meta_pipeline.cpp +0 -7
- package/src/duckdb/src/parser/common_table_expression_info.cpp +19 -0
- package/src/duckdb/src/parser/expression/between_expression.cpp +17 -0
- package/src/duckdb/src/parser/expression/case_expression.cpp +28 -0
- package/src/duckdb/src/parser/expression/cast_expression.cpp +17 -0
- package/src/duckdb/src/parser/expression/collate_expression.cpp +16 -0
- package/src/duckdb/src/parser/expression/columnref_expression.cpp +15 -0
- package/src/duckdb/src/parser/expression/comparison_expression.cpp +16 -0
- package/src/duckdb/src/parser/expression/conjunction_expression.cpp +17 -0
- package/src/duckdb/src/parser/expression/constant_expression.cpp +14 -0
- package/src/duckdb/src/parser/expression/default_expression.cpp +7 -0
- package/src/duckdb/src/parser/expression/function_expression.cpp +35 -0
- package/src/duckdb/src/parser/expression/lambda_expression.cpp +16 -0
- package/src/duckdb/src/parser/expression/operator_expression.cpp +15 -0
- package/src/duckdb/src/parser/expression/parameter_expression.cpp +15 -0
- package/src/duckdb/src/parser/expression/positional_reference_expression.cpp +14 -0
- package/src/duckdb/src/parser/expression/star_expression.cpp +26 -6
- package/src/duckdb/src/parser/expression/subquery_expression.cpp +20 -0
- package/src/duckdb/src/parser/expression/window_expression.cpp +43 -0
- package/src/duckdb/src/parser/parsed_data/alter_info.cpp +7 -3
- package/src/duckdb/src/parser/parsed_data/alter_scalar_function_info.cpp +56 -0
- package/src/duckdb/src/parser/parsed_data/alter_table_function_info.cpp +51 -0
- package/src/duckdb/src/parser/parsed_data/create_scalar_function_info.cpp +3 -2
- package/src/duckdb/src/parser/parsed_data/create_table_function_info.cpp +6 -0
- package/src/duckdb/src/parser/parsed_data/sample_options.cpp +22 -10
- package/src/duckdb/src/parser/parsed_expression.cpp +72 -0
- package/src/duckdb/src/parser/parsed_expression_iterator.cpp +15 -1
- package/src/duckdb/src/parser/query_node/recursive_cte_node.cpp +21 -0
- package/src/duckdb/src/parser/query_node/select_node.cpp +31 -0
- package/src/duckdb/src/parser/query_node/set_operation_node.cpp +17 -0
- package/src/duckdb/src/parser/query_node.cpp +51 -1
- package/src/duckdb/src/parser/result_modifier.cpp +78 -0
- package/src/duckdb/src/parser/statement/multi_statement.cpp +18 -0
- package/src/duckdb/src/parser/statement/select_statement.cpp +12 -0
- package/src/duckdb/src/parser/tableref/basetableref.cpp +21 -0
- package/src/duckdb/src/parser/tableref/emptytableref.cpp +4 -0
- package/src/duckdb/src/parser/tableref/expressionlistref.cpp +17 -0
- package/src/duckdb/src/parser/tableref/joinref.cpp +29 -0
- package/src/duckdb/src/parser/tableref/pivotref.cpp +373 -0
- package/src/duckdb/src/parser/tableref/subqueryref.cpp +15 -0
- package/src/duckdb/src/parser/tableref/table_function.cpp +17 -0
- package/src/duckdb/src/parser/tableref.cpp +49 -0
- package/src/duckdb/src/parser/transform/expression/transform_array_access.cpp +11 -0
- package/src/duckdb/src/parser/transform/expression/transform_bool_expr.cpp +1 -1
- package/src/duckdb/src/parser/transform/expression/transform_columnref.cpp +17 -2
- package/src/duckdb/src/parser/transform/expression/transform_function.cpp +85 -42
- package/src/duckdb/src/parser/transform/expression/transform_operator.cpp +1 -1
- package/src/duckdb/src/parser/transform/expression/transform_subquery.cpp +1 -1
- package/src/duckdb/src/parser/transform/helpers/transform_alias.cpp +12 -6
- package/src/duckdb/src/parser/transform/helpers/transform_cte.cpp +24 -0
- package/src/duckdb/src/parser/transform/helpers/transform_groupby.cpp +7 -0
- package/src/duckdb/src/parser/transform/helpers/transform_orderby.cpp +0 -7
- package/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +3 -2
- package/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +4 -0
- package/src/duckdb/src/parser/transform/statement/transform_create_view.cpp +4 -0
- package/src/duckdb/src/parser/transform/statement/transform_pivot_stmt.cpp +179 -0
- package/src/duckdb/src/parser/transform/statement/transform_rename.cpp +3 -4
- package/src/duckdb/src/parser/transform/statement/transform_select.cpp +8 -0
- package/src/duckdb/src/parser/transform/statement/transform_select_node.cpp +2 -3
- package/src/duckdb/src/parser/transform/tableref/transform_join.cpp +12 -1
- package/src/duckdb/src/parser/transform/tableref/transform_pivot.cpp +121 -0
- package/src/duckdb/src/parser/transform/tableref/transform_tableref.cpp +2 -0
- package/src/duckdb/src/parser/transformer.cpp +15 -3
- package/src/duckdb/src/planner/bind_context.cpp +18 -25
- package/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +9 -7
- package/src/duckdb/src/planner/binder/expression/bind_columnref_expression.cpp +4 -3
- package/src/duckdb/src/planner/binder/expression/bind_function_expression.cpp +23 -12
- package/src/duckdb/src/planner/binder/expression/bind_lambda.cpp +3 -2
- package/src/duckdb/src/planner/binder/expression/bind_star_expression.cpp +176 -0
- package/src/duckdb/src/planner/binder/expression/bind_subquery_expression.cpp +4 -0
- package/src/duckdb/src/planner/binder/expression/bind_unnest_expression.cpp +163 -24
- package/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +2 -2
- package/src/duckdb/src/planner/binder/query_node/bind_select_node.cpp +109 -94
- package/src/duckdb/src/planner/binder/query_node/plan_query_node.cpp +11 -0
- package/src/duckdb/src/planner/binder/query_node/plan_select_node.cpp +9 -4
- package/src/duckdb/src/planner/binder/statement/bind_copy.cpp +5 -3
- package/src/duckdb/src/planner/binder/statement/bind_create.cpp +3 -2
- package/src/duckdb/src/planner/binder/statement/bind_create_table.cpp +10 -1
- package/src/duckdb/src/planner/binder/statement/bind_delete.cpp +1 -1
- package/src/duckdb/src/planner/binder/statement/bind_insert.cpp +12 -8
- package/src/duckdb/src/planner/binder/statement/bind_logical_plan.cpp +17 -0
- package/src/duckdb/src/planner/binder/statement/bind_update.cpp +4 -2
- package/src/duckdb/src/planner/binder/tableref/bind_joinref.cpp +19 -3
- package/src/duckdb/src/planner/binder/tableref/bind_pivot.cpp +366 -0
- package/src/duckdb/src/planner/binder/tableref/bind_table_function.cpp +11 -1
- package/src/duckdb/src/planner/binder/tableref/plan_cteref.cpp +1 -0
- package/src/duckdb/src/planner/binder/tableref/plan_joinref.cpp +61 -13
- package/src/duckdb/src/planner/binder.cpp +19 -24
- package/src/duckdb/src/planner/bound_result_modifier.cpp +27 -1
- package/src/duckdb/src/planner/expression/bound_aggregate_expression.cpp +9 -2
- package/src/duckdb/src/planner/expression/bound_expression.cpp +4 -0
- package/src/duckdb/src/planner/expression/bound_window_expression.cpp +1 -1
- package/src/duckdb/src/planner/expression_binder/base_select_binder.cpp +146 -0
- package/src/duckdb/src/planner/expression_binder/having_binder.cpp +6 -3
- package/src/duckdb/src/planner/expression_binder/qualify_binder.cpp +3 -3
- package/src/duckdb/src/planner/expression_binder/select_binder.cpp +1 -132
- package/src/duckdb/src/planner/expression_binder.cpp +10 -3
- package/src/duckdb/src/planner/expression_iterator.cpp +17 -10
- package/src/duckdb/src/planner/filter/constant_filter.cpp +4 -6
- package/src/duckdb/src/planner/logical_operator.cpp +7 -2
- package/src/duckdb/src/planner/logical_operator_visitor.cpp +6 -0
- package/src/duckdb/src/planner/operator/logical_asof_join.cpp +8 -0
- package/src/duckdb/src/planner/operator/logical_distinct.cpp +3 -0
- package/src/duckdb/src/planner/planner.cpp +2 -1
- package/src/duckdb/src/planner/pragma_handler.cpp +10 -2
- package/src/duckdb/src/planner/subquery/flatten_dependent_join.cpp +3 -1
- package/src/duckdb/src/storage/buffer_manager.cpp +44 -46
- package/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +1 -1
- package/src/duckdb/src/storage/checkpoint/table_data_reader.cpp +4 -15
- package/src/duckdb/src/storage/checkpoint/table_data_writer.cpp +10 -4
- package/src/duckdb/src/storage/checkpoint_manager.cpp +9 -3
- package/src/duckdb/src/storage/compression/bitpacking.cpp +29 -25
- package/src/duckdb/src/storage/compression/fixed_size_uncompressed.cpp +45 -46
- package/src/duckdb/src/storage/compression/numeric_constant.cpp +10 -11
- package/src/duckdb/src/storage/compression/patas.cpp +1 -1
- package/src/duckdb/src/storage/compression/rle.cpp +20 -15
- package/src/duckdb/src/storage/compression/validity_uncompressed.cpp +6 -6
- package/src/duckdb/src/storage/data_table.cpp +23 -23
- package/src/duckdb/src/storage/index.cpp +12 -1
- package/src/duckdb/src/storage/local_storage.cpp +27 -23
- package/src/duckdb/src/storage/meta_block_reader.cpp +22 -0
- package/src/duckdb/src/storage/statistics/base_statistics.cpp +373 -128
- package/src/duckdb/src/storage/statistics/column_statistics.cpp +57 -3
- package/src/duckdb/src/storage/statistics/distinct_statistics.cpp +8 -9
- package/src/duckdb/src/storage/statistics/list_stats.cpp +121 -0
- package/src/duckdb/src/storage/statistics/numeric_stats.cpp +591 -0
- package/src/duckdb/src/storage/statistics/numeric_stats_union.cpp +65 -0
- package/src/duckdb/src/storage/statistics/segment_statistics.cpp +2 -11
- package/src/duckdb/src/storage/statistics/string_stats.cpp +273 -0
- package/src/duckdb/src/storage/statistics/struct_stats.cpp +133 -0
- package/src/duckdb/src/storage/storage_info.cpp +2 -2
- package/src/duckdb/src/storage/table/column_checkpoint_state.cpp +4 -10
- package/src/duckdb/src/storage/table/column_data.cpp +118 -62
- package/src/duckdb/src/storage/table/column_data_checkpointer.cpp +10 -9
- package/src/duckdb/src/storage/table/column_segment.cpp +30 -45
- package/src/duckdb/src/storage/table/list_column_data.cpp +50 -71
- package/src/duckdb/src/storage/table/persistent_table_data.cpp +2 -1
- package/src/duckdb/src/storage/table/row_group.cpp +213 -143
- package/src/duckdb/src/storage/table/row_group_collection.cpp +151 -105
- package/src/duckdb/src/storage/table/scan_state.cpp +45 -33
- package/src/duckdb/src/storage/table/standard_column_data.cpp +11 -12
- package/src/duckdb/src/storage/table/struct_column_data.cpp +27 -34
- package/src/duckdb/src/storage/table/table_statistics.cpp +27 -7
- package/src/duckdb/src/storage/table/update_segment.cpp +23 -18
- package/src/duckdb/src/storage/wal_replay.cpp +8 -5
- package/src/duckdb/src/storage/write_ahead_log.cpp +2 -2
- package/src/duckdb/src/transaction/commit_state.cpp +11 -7
- package/src/duckdb/src/verification/deserialized_statement_verifier.cpp +0 -1
- package/src/duckdb/third_party/libpg_query/include/nodes/nodes.hpp +35 -0
- package/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +36 -2
- package/src/duckdb/third_party/libpg_query/include/nodes/primnodes.hpp +3 -3
- package/src/duckdb/third_party/libpg_query/include/parser/gram.hpp +1022 -530
- package/src/duckdb/third_party/libpg_query/include/parser/kwlist.hpp +8 -0
- package/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +24462 -22828
- package/src/duckdb/third_party/re2/re2/re2.cc +9 -0
- package/src/duckdb/third_party/re2/re2/re2.h +2 -0
- package/src/duckdb/ub_extension_icu_third_party_icu_i18n.cpp +4 -4
- package/src/duckdb/ub_extension_json_json_functions.cpp +2 -0
- package/src/duckdb/ub_src_common_serializer.cpp +2 -0
- package/src/duckdb/ub_src_common_types.cpp +2 -0
- package/src/duckdb/ub_src_execution_physical_plan.cpp +2 -0
- package/src/duckdb/ub_src_function_aggregate_distributive.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar_bit.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar_map.cpp +4 -0
- package/src/duckdb/ub_src_function_scalar_string.cpp +2 -0
- package/src/duckdb/ub_src_function_scalar_string_regexp.cpp +4 -0
- package/src/duckdb/ub_src_main_capi.cpp +2 -0
- package/src/duckdb/ub_src_optimizer_rule.cpp +2 -0
- package/src/duckdb/ub_src_parser.cpp +2 -0
- package/src/duckdb/ub_src_parser_parsed_data.cpp +4 -2
- package/src/duckdb/ub_src_parser_statement.cpp +2 -0
- package/src/duckdb/ub_src_parser_tableref.cpp +2 -0
- package/src/duckdb/ub_src_parser_transform_statement.cpp +2 -0
- package/src/duckdb/ub_src_parser_transform_tableref.cpp +2 -0
- package/src/duckdb/ub_src_planner_binder_expression.cpp +2 -0
- package/src/duckdb/ub_src_planner_binder_tableref.cpp +2 -0
- package/src/duckdb/ub_src_planner_expression_binder.cpp +2 -0
- package/src/duckdb/ub_src_planner_operator.cpp +2 -0
- package/src/duckdb/ub_src_storage_statistics.cpp +6 -6
- package/src/duckdb/ub_src_storage_table.cpp +0 -2
- package/src/duckdb_node.hpp +2 -1
- package/src/statement.cpp +5 -5
- package/src/utils.cpp +27 -2
- package/test/extension.test.ts +44 -26
- package/test/syntax_error.test.ts +3 -1
- package/filelist.cache +0 -0
- package/src/duckdb/src/include/duckdb/main/loadable_extension.hpp +0 -59
- package/src/duckdb/src/include/duckdb/storage/statistics/list_statistics.hpp +0 -36
- package/src/duckdb/src/include/duckdb/storage/statistics/numeric_statistics.hpp +0 -75
- package/src/duckdb/src/include/duckdb/storage/statistics/string_statistics.hpp +0 -49
- package/src/duckdb/src/include/duckdb/storage/statistics/struct_statistics.hpp +0 -36
- package/src/duckdb/src/include/duckdb/storage/statistics/validity_statistics.hpp +0 -45
- package/src/duckdb/src/parser/parsed_data/alter_function_info.cpp +0 -55
- package/src/duckdb/src/storage/statistics/list_statistics.cpp +0 -94
- package/src/duckdb/src/storage/statistics/numeric_statistics.cpp +0 -307
- package/src/duckdb/src/storage/statistics/string_statistics.cpp +0 -220
- package/src/duckdb/src/storage/statistics/struct_statistics.cpp +0 -108
- package/src/duckdb/src/storage/statistics/validity_statistics.cpp +0 -91
- package/src/duckdb/src/storage/table/segment_tree.cpp +0 -179
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#include "duckdb/execution/column_binding_resolver.hpp"
|
|
2
2
|
|
|
3
3
|
#include "duckdb/planner/operator/logical_comparison_join.hpp"
|
|
4
|
+
#include "duckdb/planner/operator/logical_any_join.hpp"
|
|
4
5
|
#include "duckdb/planner/operator/logical_create_index.hpp"
|
|
5
6
|
#include "duckdb/planner/operator/logical_delim_join.hpp"
|
|
6
7
|
#include "duckdb/planner/operator/logical_insert.hpp"
|
|
@@ -17,7 +18,10 @@ ColumnBindingResolver::ColumnBindingResolver() {
|
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
void ColumnBindingResolver::VisitOperator(LogicalOperator &op) {
|
|
20
|
-
|
|
21
|
+
switch (op.type) {
|
|
22
|
+
case LogicalOperatorType::LOGICAL_ASOF_JOIN:
|
|
23
|
+
case LogicalOperatorType::LOGICAL_COMPARISON_JOIN:
|
|
24
|
+
case LogicalOperatorType::LOGICAL_DELIM_JOIN: {
|
|
21
25
|
// special case: comparison join
|
|
22
26
|
auto &comp_join = (LogicalComparisonJoin &)op;
|
|
23
27
|
// first get the bindings of the LHS and resolve the LHS expressions
|
|
@@ -40,27 +44,36 @@ void ColumnBindingResolver::VisitOperator(LogicalOperator &op) {
|
|
|
40
44
|
// finally update the bindings with the result bindings of the join
|
|
41
45
|
bindings = op.GetColumnBindings();
|
|
42
46
|
return;
|
|
43
|
-
}
|
|
47
|
+
}
|
|
48
|
+
case LogicalOperatorType::LOGICAL_ANY_JOIN: {
|
|
44
49
|
// ANY join, this join is different because we evaluate the expression on the bindings of BOTH join sides at
|
|
45
50
|
// once i.e. we set the bindings first to the bindings of the entire join, and then resolve the expressions of
|
|
46
51
|
// this operator
|
|
47
52
|
VisitOperatorChildren(op);
|
|
48
53
|
bindings = op.GetColumnBindings();
|
|
54
|
+
auto &any_join = (LogicalAnyJoin &)op;
|
|
55
|
+
if (any_join.join_type == JoinType::SEMI || any_join.join_type == JoinType::ANTI) {
|
|
56
|
+
auto right_bindings = op.children[1]->GetColumnBindings();
|
|
57
|
+
bindings.insert(bindings.end(), right_bindings.begin(), right_bindings.end());
|
|
58
|
+
}
|
|
49
59
|
VisitOperatorExpressions(op);
|
|
50
60
|
return;
|
|
51
|
-
}
|
|
61
|
+
}
|
|
62
|
+
case LogicalOperatorType::LOGICAL_CREATE_INDEX: {
|
|
52
63
|
// CREATE INDEX statement, add the columns of the table with table index 0 to the binding set
|
|
53
64
|
// afterwards bind the expressions of the CREATE INDEX statement
|
|
54
65
|
auto &create_index = (LogicalCreateIndex &)op;
|
|
55
66
|
bindings = LogicalOperator::GenerateColumnBindings(0, create_index.table.GetColumns().LogicalColumnCount());
|
|
56
67
|
VisitOperatorExpressions(op);
|
|
57
68
|
return;
|
|
58
|
-
}
|
|
69
|
+
}
|
|
70
|
+
case LogicalOperatorType::LOGICAL_GET: {
|
|
59
71
|
//! We first need to update the current set of bindings and then visit operator expressions
|
|
60
72
|
bindings = op.GetColumnBindings();
|
|
61
73
|
VisitOperatorExpressions(op);
|
|
62
74
|
return;
|
|
63
|
-
}
|
|
75
|
+
}
|
|
76
|
+
case LogicalOperatorType::LOGICAL_INSERT: {
|
|
64
77
|
//! We want to execute the normal path, but also add a dummy 'excluded' binding if there is a
|
|
65
78
|
// ON CONFLICT DO UPDATE clause
|
|
66
79
|
auto &insert_op = (LogicalInsert &)op;
|
|
@@ -83,6 +96,9 @@ void ColumnBindingResolver::VisitOperator(LogicalOperator &op) {
|
|
|
83
96
|
return;
|
|
84
97
|
}
|
|
85
98
|
}
|
|
99
|
+
default:
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
86
102
|
// general case
|
|
87
103
|
// first visit the children of this operator
|
|
88
104
|
VisitOperatorChildren(op);
|
|
@@ -11,7 +11,8 @@ unique_ptr<ExpressionState> ExpressionExecutor::InitializeState(const BoundCastE
|
|
|
11
11
|
result->AddChild(expr.child.get());
|
|
12
12
|
result->Finalize();
|
|
13
13
|
if (expr.bound_cast.init_local_state) {
|
|
14
|
-
|
|
14
|
+
CastLocalStateParameters parameters(root.executor->GetContext(), expr.bound_cast.cast_data);
|
|
15
|
+
result->local_state = expr.bound_cast.init_local_state(parameters);
|
|
15
16
|
}
|
|
16
17
|
return std::move(result);
|
|
17
18
|
}
|
|
@@ -266,12 +266,12 @@ idx_t VectorOperations::GreaterThanEquals(Vector &left, Vector &right, const Sel
|
|
|
266
266
|
|
|
267
267
|
idx_t VectorOperations::LessThan(Vector &left, Vector &right, const SelectionVector *sel, idx_t count,
|
|
268
268
|
SelectionVector *true_sel, SelectionVector *false_sel) {
|
|
269
|
-
return TemplatedSelectOperation<duckdb::
|
|
269
|
+
return TemplatedSelectOperation<duckdb::GreaterThan>(right, left, sel, count, true_sel, false_sel);
|
|
270
270
|
}
|
|
271
271
|
|
|
272
272
|
idx_t VectorOperations::LessThanEquals(Vector &left, Vector &right, const SelectionVector *sel, idx_t count,
|
|
273
273
|
SelectionVector *true_sel, SelectionVector *false_sel) {
|
|
274
|
-
return TemplatedSelectOperation<duckdb::
|
|
274
|
+
return TemplatedSelectOperation<duckdb::GreaterThanEquals>(right, left, sel, count, true_sel, false_sel);
|
|
275
275
|
}
|
|
276
276
|
|
|
277
277
|
idx_t ExpressionExecutor::Select(const BoundComparisonExpression &expr, ExpressionState *state,
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
#include "duckdb/storage/arena_allocator.hpp"
|
|
7
7
|
#include "duckdb/execution/index/art/art_key.hpp"
|
|
8
8
|
#include "duckdb/common/types/conflict_manager.hpp"
|
|
9
|
+
#include "duckdb/storage/table/scan_state.hpp"
|
|
9
10
|
|
|
10
11
|
#include <algorithm>
|
|
11
12
|
#include <cstring>
|
|
@@ -13,6 +14,18 @@
|
|
|
13
14
|
|
|
14
15
|
namespace duckdb {
|
|
15
16
|
|
|
17
|
+
struct ARTIndexScanState : public IndexScanState {
|
|
18
|
+
|
|
19
|
+
//! Scan predicates (single predicate scan or range scan)
|
|
20
|
+
Value values[2];
|
|
21
|
+
//! Expressions of the scan predicates
|
|
22
|
+
ExpressionType expressions[2];
|
|
23
|
+
bool checked = false;
|
|
24
|
+
//! All scanned row IDs
|
|
25
|
+
vector<row_t> result_ids;
|
|
26
|
+
Iterator iterator;
|
|
27
|
+
};
|
|
28
|
+
|
|
16
29
|
ART::ART(const vector<column_t> &column_ids, TableIOManager &table_io_manager,
|
|
17
30
|
const vector<unique_ptr<Expression>> &unbound_expressions, IndexConstraintType constraint_type,
|
|
18
31
|
AttachedDatabase &db, bool track_memory, idx_t block_id, idx_t block_offset)
|
|
@@ -330,8 +343,7 @@ bool ART::ConstructFromSorted(idx_t count, vector<Key> &keys, Vector &row_identi
|
|
|
330
343
|
//===--------------------------------------------------------------------===//
|
|
331
344
|
// Insert / Verification / Constraint Checking
|
|
332
345
|
//===--------------------------------------------------------------------===//
|
|
333
|
-
|
|
334
|
-
bool ART::Insert(IndexLock &lock, DataChunk &input, Vector &row_ids) {
|
|
346
|
+
PreservedError ART::Insert(IndexLock &lock, DataChunk &input, Vector &row_ids) {
|
|
335
347
|
|
|
336
348
|
D_ASSERT(row_ids.GetType().InternalType() == ROW_TYPE);
|
|
337
349
|
D_ASSERT(logical_types[0] == input.data[0].GetType());
|
|
@@ -375,12 +387,13 @@ bool ART::Insert(IndexLock &lock, DataChunk &input, Vector &row_ids) {
|
|
|
375
387
|
|
|
376
388
|
IncreaseAndVerifyMemorySize(old_memory_size);
|
|
377
389
|
if (failed_index != DConstants::INVALID_INDEX) {
|
|
378
|
-
return
|
|
390
|
+
return PreservedError(ConstraintException("PRIMARY KEY or UNIQUE constraint violated: duplicate key \"%s\"",
|
|
391
|
+
AppendRowError(input, failed_index)));
|
|
379
392
|
}
|
|
380
|
-
return
|
|
393
|
+
return PreservedError();
|
|
381
394
|
}
|
|
382
395
|
|
|
383
|
-
|
|
396
|
+
PreservedError ART::Append(IndexLock &lock, DataChunk &appended_data, Vector &row_identifiers) {
|
|
384
397
|
DataChunk expression_result;
|
|
385
398
|
expression_result.Initialize(Allocator::DefaultAllocator(), logical_types);
|
|
386
399
|
|
|
@@ -654,6 +667,7 @@ bool ART::SearchEqual(Key &key, idx_t max_count, vector<row_t> &result_ids) {
|
|
|
654
667
|
}
|
|
655
668
|
|
|
656
669
|
void ART::SearchEqualJoinNoFetch(Key &key, idx_t &result_size) {
|
|
670
|
+
result_size = 0;
|
|
657
671
|
|
|
658
672
|
// we need to look for a leaf
|
|
659
673
|
auto old_memory_size = memory_size;
|
|
@@ -219,7 +219,9 @@ void JoinHashTable::Build(DataChunk &keys, DataChunk &payload) {
|
|
|
219
219
|
}
|
|
220
220
|
info.correlated_payload.SetCardinality(keys);
|
|
221
221
|
info.correlated_payload.data[0].Reference(keys.data[info.correlated_types.size()]);
|
|
222
|
-
|
|
222
|
+
AggregateHTAppendState append_state;
|
|
223
|
+
info.correlated_counts->AddChunk(append_state, info.group_chunk, info.correlated_payload,
|
|
224
|
+
AggregateType::NON_DISTINCT);
|
|
223
225
|
}
|
|
224
226
|
|
|
225
227
|
// prepare the keys for processing
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
#include "duckdb/catalog/catalog_entry/aggregate_function_catalog_entry.hpp"
|
|
4
4
|
#include "duckdb/common/vector_operations/vector_operations.hpp"
|
|
5
5
|
#include "duckdb/execution/aggregate_hashtable.hpp"
|
|
6
|
-
#include "duckdb/execution/partitionable_hashtable.hpp"
|
|
7
6
|
#include "duckdb/main/client_context.hpp"
|
|
8
7
|
#include "duckdb/parallel/pipeline.hpp"
|
|
9
8
|
#include "duckdb/parallel/task_scheduler.hpp"
|
|
10
9
|
#include "duckdb/parallel/thread_context.hpp"
|
|
11
10
|
#include "duckdb/planner/expression/bound_aggregate_expression.hpp"
|
|
12
11
|
#include "duckdb/planner/expression/bound_constant_expression.hpp"
|
|
12
|
+
#include "duckdb/planner/expression/bound_reference_expression.hpp"
|
|
13
13
|
#include "duckdb/parallel/base_pipeline_event.hpp"
|
|
14
14
|
#include "duckdb/common/atomic.hpp"
|
|
15
15
|
#include "duckdb/execution/operator/aggregate/distinct_aggregate_data.hpp"
|
|
@@ -4,14 +4,13 @@
|
|
|
4
4
|
#include "duckdb/planner/expression/bound_aggregate_expression.hpp"
|
|
5
5
|
#include "duckdb/planner/expression/bound_reference_expression.hpp"
|
|
6
6
|
#include "duckdb/storage/buffer_manager.hpp"
|
|
7
|
-
#include "duckdb/storage/statistics/numeric_statistics.hpp"
|
|
8
7
|
|
|
9
8
|
namespace duckdb {
|
|
10
9
|
|
|
11
10
|
PhysicalPerfectHashAggregate::PhysicalPerfectHashAggregate(ClientContext &context, vector<LogicalType> types_p,
|
|
12
11
|
vector<unique_ptr<Expression>> aggregates_p,
|
|
13
12
|
vector<unique_ptr<Expression>> groups_p,
|
|
14
|
-
vector<unique_ptr<BaseStatistics>> group_stats,
|
|
13
|
+
const vector<unique_ptr<BaseStatistics>> &group_stats,
|
|
15
14
|
vector<idx_t> required_bits_p, idx_t estimated_cardinality)
|
|
16
15
|
: PhysicalOperator(PhysicalOperatorType::PERFECT_HASH_GROUP_BY, std::move(types_p), estimated_cardinality),
|
|
17
16
|
groups(std::move(groups_p)), aggregates(std::move(aggregates_p)), required_bits(std::move(required_bits_p)) {
|
|
@@ -19,9 +18,9 @@ PhysicalPerfectHashAggregate::PhysicalPerfectHashAggregate(ClientContext &contex
|
|
|
19
18
|
group_minima.reserve(group_stats.size());
|
|
20
19
|
for (auto &stats : group_stats) {
|
|
21
20
|
D_ASSERT(stats);
|
|
22
|
-
auto &nstats =
|
|
23
|
-
D_ASSERT(
|
|
24
|
-
group_minima.push_back(
|
|
21
|
+
auto &nstats = *stats;
|
|
22
|
+
D_ASSERT(NumericStats::HasMin(nstats));
|
|
23
|
+
group_minima.push_back(NumericStats::Min(nstats));
|
|
25
24
|
}
|
|
26
25
|
for (auto &expr : groups) {
|
|
27
26
|
group_types.push_back(expr->return_type);
|
|
@@ -111,7 +111,7 @@ public:
|
|
|
111
111
|
orders.emplace_back(OrderType::ASCENDING, OrderByNullType::NULLS_FIRST, pexpr->Copy(), nullptr);
|
|
112
112
|
} else {
|
|
113
113
|
orders.emplace_back(OrderType::ASCENDING, OrderByNullType::NULLS_FIRST, pexpr->Copy(),
|
|
114
|
-
wexpr->partitions_stats[prt_idx]->
|
|
114
|
+
wexpr->partitions_stats[prt_idx]->ToUnique());
|
|
115
115
|
}
|
|
116
116
|
partitions.emplace_back(orders.back().Copy());
|
|
117
117
|
}
|
|
@@ -994,7 +994,10 @@ void WindowBoundariesState::Update(const idx_t row_idx, WindowInputColumn &range
|
|
|
994
994
|
}
|
|
995
995
|
|
|
996
996
|
struct WindowExecutor {
|
|
997
|
-
|
|
997
|
+
static bool IsConstantAggregate(const BoundWindowExpression &wexpr);
|
|
998
|
+
|
|
999
|
+
WindowExecutor(BoundWindowExpression *wexpr, ClientContext &context, const ValidityMask &partition_mask,
|
|
1000
|
+
const idx_t count);
|
|
998
1001
|
|
|
999
1002
|
void Sink(DataChunk &input_chunk, const idx_t input_idx, const idx_t total_count);
|
|
1000
1003
|
void Finalize(WindowAggregationMode mode);
|
|
@@ -1038,9 +1041,67 @@ struct WindowExecutor {
|
|
|
1038
1041
|
// build a segment tree for frame-adhering aggregates
|
|
1039
1042
|
// see http://www.vldb.org/pvldb/vol8/p1058-leis.pdf
|
|
1040
1043
|
unique_ptr<WindowSegmentTree> segment_tree = nullptr;
|
|
1044
|
+
|
|
1045
|
+
// all aggregate values are the same for each partition
|
|
1046
|
+
unique_ptr<WindowConstantAggregate> constant_aggregate = nullptr;
|
|
1041
1047
|
};
|
|
1042
1048
|
|
|
1043
|
-
WindowExecutor::
|
|
1049
|
+
bool WindowExecutor::IsConstantAggregate(const BoundWindowExpression &wexpr) {
|
|
1050
|
+
if (!wexpr.aggregate) {
|
|
1051
|
+
return false;
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
// COUNT(*) is already handled efficiently by segment trees.
|
|
1055
|
+
if (wexpr.children.empty()) {
|
|
1056
|
+
return false;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
/*
|
|
1060
|
+
The default framing option is RANGE UNBOUNDED PRECEDING, which
|
|
1061
|
+
is the same as RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT
|
|
1062
|
+
ROW; it sets the frame to be all rows from the partition start
|
|
1063
|
+
up through the current row's last peer (a row that the window's
|
|
1064
|
+
ORDER BY clause considers equivalent to the current row; all
|
|
1065
|
+
rows are peers if there is no ORDER BY). In general, UNBOUNDED
|
|
1066
|
+
PRECEDING means that the frame starts with the first row of the
|
|
1067
|
+
partition, and similarly UNBOUNDED FOLLOWING means that the
|
|
1068
|
+
frame ends with the last row of the partition, regardless of
|
|
1069
|
+
RANGE, ROWS or GROUPS mode. In ROWS mode, CURRENT ROW means that
|
|
1070
|
+
the frame starts or ends with the current row; but in RANGE or
|
|
1071
|
+
GROUPS mode it means that the frame starts or ends with the
|
|
1072
|
+
current row's first or last peer in the ORDER BY ordering. The
|
|
1073
|
+
offset PRECEDING and offset FOLLOWING options vary in meaning
|
|
1074
|
+
depending on the frame mode.
|
|
1075
|
+
*/
|
|
1076
|
+
switch (wexpr.start) {
|
|
1077
|
+
case WindowBoundary::UNBOUNDED_PRECEDING:
|
|
1078
|
+
break;
|
|
1079
|
+
case WindowBoundary::CURRENT_ROW_RANGE:
|
|
1080
|
+
if (!wexpr.orders.empty()) {
|
|
1081
|
+
return false;
|
|
1082
|
+
}
|
|
1083
|
+
break;
|
|
1084
|
+
default:
|
|
1085
|
+
return false;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
switch (wexpr.end) {
|
|
1089
|
+
case WindowBoundary::UNBOUNDED_FOLLOWING:
|
|
1090
|
+
break;
|
|
1091
|
+
case WindowBoundary::CURRENT_ROW_RANGE:
|
|
1092
|
+
if (!wexpr.orders.empty()) {
|
|
1093
|
+
return false;
|
|
1094
|
+
}
|
|
1095
|
+
break;
|
|
1096
|
+
default:
|
|
1097
|
+
return false;
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
return true;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
WindowExecutor::WindowExecutor(BoundWindowExpression *wexpr, ClientContext &context, const ValidityMask &partition_mask,
|
|
1104
|
+
const idx_t count)
|
|
1044
1105
|
: wexpr(wexpr), bounds(wexpr, count), payload_collection(), payload_executor(context), filter_executor(context),
|
|
1045
1106
|
leadlag_offset(wexpr->offset_expr.get(), context), leadlag_default(wexpr->default_expr.get(), context),
|
|
1046
1107
|
boundary_start(wexpr->start_expr.get(), context), boundary_end(wexpr->end_expr.get(), context),
|
|
@@ -1050,6 +1111,12 @@ WindowExecutor::WindowExecutor(BoundWindowExpression *wexpr, ClientContext &cont
|
|
|
1050
1111
|
{
|
|
1051
1112
|
// TODO we could evaluate those expressions in parallel
|
|
1052
1113
|
|
|
1114
|
+
// Check for constant aggregate
|
|
1115
|
+
if (IsConstantAggregate(*wexpr)) {
|
|
1116
|
+
constant_aggregate = make_unique<WindowConstantAggregate>(*(wexpr->aggregate), wexpr->bind_info.get(),
|
|
1117
|
+
wexpr->return_type, partition_mask, count);
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1053
1120
|
// evaluate the FILTER clause and stuff it into a large mask for compactness and reuse
|
|
1054
1121
|
if (wexpr->filter_expr) {
|
|
1055
1122
|
// Start with all invalid and set the ones that pass
|
|
@@ -1097,11 +1164,25 @@ void WindowExecutor::Sink(DataChunk &input_chunk, const idx_t input_idx, const i
|
|
|
1097
1164
|
|
|
1098
1165
|
const auto count = input_chunk.size();
|
|
1099
1166
|
|
|
1167
|
+
idx_t filtered = 0;
|
|
1168
|
+
SelectionVector *filtering = nullptr;
|
|
1169
|
+
if (wexpr->filter_expr) {
|
|
1170
|
+
filtering = &filter_sel;
|
|
1171
|
+
filtered = filter_executor.SelectExpression(input_chunk, filter_sel);
|
|
1172
|
+
for (idx_t f = 0; f < filtered; ++f) {
|
|
1173
|
+
filter_mask.SetValid(input_idx + filter_sel[f]);
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1100
1177
|
if (!wexpr->children.empty()) {
|
|
1101
1178
|
payload_chunk.Reset();
|
|
1102
1179
|
payload_executor.Execute(input_chunk, payload_chunk);
|
|
1103
1180
|
payload_chunk.Verify();
|
|
1104
|
-
|
|
1181
|
+
if (constant_aggregate) {
|
|
1182
|
+
constant_aggregate->Sink(payload_chunk, filtering, filtered);
|
|
1183
|
+
} else {
|
|
1184
|
+
payload_collection.Append(payload_chunk, true);
|
|
1185
|
+
}
|
|
1105
1186
|
|
|
1106
1187
|
// process payload chunks while they are still piping hot
|
|
1107
1188
|
if (check_nulls) {
|
|
@@ -1130,21 +1211,15 @@ void WindowExecutor::Sink(DataChunk &input_chunk, const idx_t input_idx, const i
|
|
|
1130
1211
|
}
|
|
1131
1212
|
}
|
|
1132
1213
|
|
|
1133
|
-
if (wexpr->filter_expr) {
|
|
1134
|
-
const auto filtered = filter_executor.SelectExpression(input_chunk, filter_sel);
|
|
1135
|
-
for (idx_t f = 0; f < filtered; ++f) {
|
|
1136
|
-
filter_mask.SetValid(input_idx + filter_sel[f]);
|
|
1137
|
-
}
|
|
1138
|
-
}
|
|
1139
|
-
|
|
1140
1214
|
range.Append(input_chunk);
|
|
1141
1215
|
}
|
|
1142
1216
|
|
|
1143
1217
|
void WindowExecutor::Finalize(WindowAggregationMode mode) {
|
|
1144
1218
|
// build a segment tree for frame-adhering aggregates
|
|
1145
1219
|
// see http://www.vldb.org/pvldb/vol8/p1058-leis.pdf
|
|
1146
|
-
|
|
1147
|
-
|
|
1220
|
+
if (constant_aggregate) {
|
|
1221
|
+
constant_aggregate->Finalize();
|
|
1222
|
+
} else if (wexpr->aggregate) {
|
|
1148
1223
|
segment_tree = make_unique<WindowSegmentTree>(*(wexpr->aggregate), wexpr->bind_info.get(), wexpr->return_type,
|
|
1149
1224
|
&payload_collection, filter_mask, mode);
|
|
1150
1225
|
}
|
|
@@ -1184,7 +1259,11 @@ void WindowExecutor::Evaluate(idx_t row_idx, DataChunk &input_chunk, Vector &res
|
|
|
1184
1259
|
|
|
1185
1260
|
switch (wexpr->type) {
|
|
1186
1261
|
case ExpressionType::WINDOW_AGGREGATE: {
|
|
1187
|
-
|
|
1262
|
+
if (constant_aggregate) {
|
|
1263
|
+
constant_aggregate->Compute(result, output_offset, bounds.window_start, bounds.window_end);
|
|
1264
|
+
} else {
|
|
1265
|
+
segment_tree->Compute(result, output_offset, bounds.window_start, bounds.window_end);
|
|
1266
|
+
}
|
|
1188
1267
|
break;
|
|
1189
1268
|
}
|
|
1190
1269
|
case ExpressionType::WINDOW_ROW_NUMBER: {
|
|
@@ -1289,15 +1368,24 @@ void WindowExecutor::Evaluate(idx_t row_idx, DataChunk &input_chunk, Vector &res
|
|
|
1289
1368
|
break;
|
|
1290
1369
|
}
|
|
1291
1370
|
case ExpressionType::WINDOW_FIRST_VALUE: {
|
|
1371
|
+
// Same as NTH_VALUE(..., 1)
|
|
1292
1372
|
idx_t n = 1;
|
|
1293
1373
|
const auto first_idx = FindNextStart(ignore_nulls, bounds.window_start, bounds.window_end, n);
|
|
1294
|
-
|
|
1374
|
+
if (!n) {
|
|
1375
|
+
CopyCell(payload_collection, 0, first_idx, result, output_offset);
|
|
1376
|
+
} else {
|
|
1377
|
+
FlatVector::SetNull(result, output_offset, true);
|
|
1378
|
+
}
|
|
1295
1379
|
break;
|
|
1296
1380
|
}
|
|
1297
1381
|
case ExpressionType::WINDOW_LAST_VALUE: {
|
|
1298
1382
|
idx_t n = 1;
|
|
1299
|
-
|
|
1300
|
-
|
|
1383
|
+
const auto last_idx = FindPrevStart(ignore_nulls, bounds.window_start, bounds.window_end, n);
|
|
1384
|
+
if (!n) {
|
|
1385
|
+
CopyCell(payload_collection, 0, last_idx, result, output_offset);
|
|
1386
|
+
} else {
|
|
1387
|
+
FlatVector::SetNull(result, output_offset, true);
|
|
1388
|
+
}
|
|
1301
1389
|
break;
|
|
1302
1390
|
}
|
|
1303
1391
|
case ExpressionType::WINDOW_NTH_VALUE: {
|
|
@@ -1550,6 +1638,9 @@ TaskExecutionResult WindowMergeTask::ExecuteTask(TaskExecutionMode mode) {
|
|
|
1550
1638
|
size_t sorted = 0;
|
|
1551
1639
|
while (sorted < hash_groups.states.size()) {
|
|
1552
1640
|
// First check if there is an unfinished task for this thread
|
|
1641
|
+
if (executor.HasError()) {
|
|
1642
|
+
return TaskExecutionResult::TASK_ERROR;
|
|
1643
|
+
}
|
|
1553
1644
|
if (!local_state.TaskFinished()) {
|
|
1554
1645
|
local_state.ExecuteTask();
|
|
1555
1646
|
continue;
|
|
@@ -1799,15 +1890,6 @@ void WindowLocalSourceState::GeneratePartition(WindowGlobalSinkState &gstate, co
|
|
|
1799
1890
|
return;
|
|
1800
1891
|
}
|
|
1801
1892
|
|
|
1802
|
-
// Create the executors for each function
|
|
1803
|
-
window_execs.clear();
|
|
1804
|
-
for (idx_t expr_idx = 0; expr_idx < op.select_list.size(); ++expr_idx) {
|
|
1805
|
-
D_ASSERT(op.select_list[expr_idx]->GetExpressionClass() == ExpressionClass::BOUND_WINDOW);
|
|
1806
|
-
auto wexpr = reinterpret_cast<BoundWindowExpression *>(op.select_list[expr_idx].get());
|
|
1807
|
-
auto wexec = make_unique<WindowExecutor>(wexpr, context, count);
|
|
1808
|
-
window_execs.emplace_back(std::move(wexec));
|
|
1809
|
-
}
|
|
1810
|
-
|
|
1811
1893
|
// Initialise masks to false
|
|
1812
1894
|
const auto bit_count = ValidityMask::ValidityMaskSize(count);
|
|
1813
1895
|
partition_bits.clear();
|
|
@@ -1838,6 +1920,15 @@ void WindowLocalSourceState::GeneratePartition(WindowGlobalSinkState &gstate, co
|
|
|
1838
1920
|
return;
|
|
1839
1921
|
}
|
|
1840
1922
|
|
|
1923
|
+
// Create the executors for each function
|
|
1924
|
+
window_execs.clear();
|
|
1925
|
+
for (idx_t expr_idx = 0; expr_idx < op.select_list.size(); ++expr_idx) {
|
|
1926
|
+
D_ASSERT(op.select_list[expr_idx]->GetExpressionClass() == ExpressionClass::BOUND_WINDOW);
|
|
1927
|
+
auto wexpr = reinterpret_cast<BoundWindowExpression *>(op.select_list[expr_idx].get());
|
|
1928
|
+
auto wexec = make_unique<WindowExecutor>(wexpr, context, partition_mask, count);
|
|
1929
|
+
window_execs.emplace_back(std::move(wexec));
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1841
1932
|
// First pass over the input without flushing
|
|
1842
1933
|
// TODO: Factor out the constructor data as global state
|
|
1843
1934
|
scanner = make_unique<RowDataCollectionScanner>(*rows, *heap, layout, external, false);
|
|
@@ -111,6 +111,9 @@ SinkResultType PhysicalLimit::Sink(ExecutionContext &context, GlobalSinkState &g
|
|
|
111
111
|
}
|
|
112
112
|
state.data.Append(input, lstate.batch_index);
|
|
113
113
|
state.current_offset += input.size();
|
|
114
|
+
if (state.current_offset == max_element) {
|
|
115
|
+
return SinkResultType::FINISHED;
|
|
116
|
+
}
|
|
114
117
|
return SinkResultType::NEED_MORE_INPUT;
|
|
115
118
|
}
|
|
116
119
|
|
|
@@ -49,6 +49,9 @@ SinkResultType PhysicalVacuum::Sink(ExecutionContext &context, GlobalSinkState &
|
|
|
49
49
|
D_ASSERT(lstate.column_distinct_stats.size() == info->column_id_map.size());
|
|
50
50
|
|
|
51
51
|
for (idx_t col_idx = 0; col_idx < input.data.size(); col_idx++) {
|
|
52
|
+
if (!DistinctStatistics::TypeIsSupported(input.data[col_idx].GetType())) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
52
55
|
lstate.column_distinct_stats[col_idx]->Update(input.data[col_idx], input.size(), false);
|
|
53
56
|
}
|
|
54
57
|
|
|
@@ -72,9 +75,8 @@ SinkFinalizeType PhysicalVacuum::Finalize(Pipeline &pipeline, Event &event, Clie
|
|
|
72
75
|
|
|
73
76
|
auto table = info->table;
|
|
74
77
|
for (idx_t col_idx = 0; col_idx < sink.column_distinct_stats.size(); col_idx++) {
|
|
75
|
-
table->GetStorage().
|
|
76
|
-
|
|
77
|
-
});
|
|
78
|
+
table->GetStorage().SetDistinct(info->column_id_map.at(col_idx),
|
|
79
|
+
std::move(sink.column_distinct_stats[col_idx]));
|
|
78
80
|
}
|
|
79
81
|
|
|
80
82
|
return SinkFinalizeType::READY;
|
|
@@ -87,11 +87,23 @@ public:
|
|
|
87
87
|
OuterJoinMarker left_outer;
|
|
88
88
|
SelectionVector match_sel;
|
|
89
89
|
ExpressionExecutor executor;
|
|
90
|
+
DataChunk intermediate_chunk;
|
|
90
91
|
};
|
|
91
92
|
|
|
92
93
|
unique_ptr<OperatorState> PhysicalBlockwiseNLJoin::GetOperatorState(ExecutionContext &context) const {
|
|
93
94
|
auto &gstate = (BlockwiseNLJoinGlobalState &)*sink_state;
|
|
94
|
-
|
|
95
|
+
auto result = make_unique<BlockwiseNLJoinState>(context, gstate.right_chunks, *this);
|
|
96
|
+
if (join_type == JoinType::SEMI || join_type == JoinType::ANTI) {
|
|
97
|
+
vector<LogicalType> intermediate_types;
|
|
98
|
+
for (auto &type : children[0]->types) {
|
|
99
|
+
intermediate_types.emplace_back(type);
|
|
100
|
+
}
|
|
101
|
+
for (auto &type : children[1]->types) {
|
|
102
|
+
intermediate_types.emplace_back(type);
|
|
103
|
+
}
|
|
104
|
+
result->intermediate_chunk.Initialize(Allocator::DefaultAllocator(), intermediate_types);
|
|
105
|
+
}
|
|
106
|
+
return std::move(result);
|
|
95
107
|
}
|
|
96
108
|
|
|
97
109
|
OperatorResultType PhysicalBlockwiseNLJoin::ExecuteInternal(ExecutionContext &context, DataChunk &input,
|
|
@@ -111,44 +123,79 @@ OperatorResultType PhysicalBlockwiseNLJoin::ExecuteInternal(ExecutionContext &co
|
|
|
111
123
|
}
|
|
112
124
|
}
|
|
113
125
|
|
|
126
|
+
DataChunk *intermediate_chunk = &chunk;
|
|
127
|
+
if (join_type == JoinType::SEMI || join_type == JoinType::ANTI) {
|
|
128
|
+
intermediate_chunk = &state.intermediate_chunk;
|
|
129
|
+
intermediate_chunk->Reset();
|
|
130
|
+
}
|
|
131
|
+
|
|
114
132
|
// now perform the actual join
|
|
115
|
-
// we perform a cross product, then execute the expression directly on the cross product
|
|
133
|
+
// we perform a cross product, then execute the expression directly on the cross product result
|
|
116
134
|
idx_t result_count = 0;
|
|
135
|
+
bool found_match[STANDARD_VECTOR_SIZE] = {false};
|
|
136
|
+
|
|
117
137
|
do {
|
|
118
|
-
auto result = state.cross_product.Execute(input,
|
|
138
|
+
auto result = state.cross_product.Execute(input, *intermediate_chunk);
|
|
119
139
|
if (result == OperatorResultType::NEED_MORE_INPUT) {
|
|
120
140
|
// exhausted input, have to pull new LHS chunk
|
|
121
141
|
if (state.left_outer.Enabled()) {
|
|
122
142
|
// left join: before we move to the next chunk, see if we need to output any vectors that didn't
|
|
123
143
|
// have a match found
|
|
124
|
-
state.left_outer.ConstructLeftJoinResult(input,
|
|
144
|
+
state.left_outer.ConstructLeftJoinResult(input, *intermediate_chunk);
|
|
125
145
|
state.left_outer.Reset();
|
|
126
146
|
}
|
|
147
|
+
|
|
148
|
+
if (join_type == JoinType::SEMI) {
|
|
149
|
+
PhysicalJoin::ConstructSemiJoinResult(input, chunk, found_match);
|
|
150
|
+
}
|
|
151
|
+
if (join_type == JoinType::ANTI) {
|
|
152
|
+
PhysicalJoin::ConstructAntiJoinResult(input, chunk, found_match);
|
|
153
|
+
}
|
|
154
|
+
|
|
127
155
|
return OperatorResultType::NEED_MORE_INPUT;
|
|
128
156
|
}
|
|
129
157
|
|
|
130
158
|
// now perform the computation
|
|
131
|
-
result_count = state.executor.SelectExpression(
|
|
159
|
+
result_count = state.executor.SelectExpression(*intermediate_chunk, state.match_sel);
|
|
160
|
+
|
|
161
|
+
// handle anti and semi joins with different logic
|
|
132
162
|
if (result_count > 0) {
|
|
133
163
|
// found a match!
|
|
134
|
-
//
|
|
135
|
-
if (
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
164
|
+
// handle anti semi join conditions first
|
|
165
|
+
if (join_type == JoinType::ANTI || join_type == JoinType::SEMI) {
|
|
166
|
+
if (state.cross_product.ScanLHS()) {
|
|
167
|
+
found_match[state.cross_product.PositionInChunk()] = true;
|
|
168
|
+
} else {
|
|
169
|
+
for (idx_t i = 0; i < result_count; i++) {
|
|
170
|
+
found_match[state.match_sel.get_index(i)] = true;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
intermediate_chunk->Reset();
|
|
174
|
+
// trick the loop to continue as semi and anti joins will never produce more output than
|
|
175
|
+
// the LHS cardinality
|
|
176
|
+
result_count = 0;
|
|
140
177
|
} else {
|
|
141
|
-
//
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
178
|
+
// check if the cross product is scanning the LHS or the RHS in its entirety
|
|
179
|
+
if (!state.cross_product.ScanLHS()) {
|
|
180
|
+
// set the match flags in the LHS
|
|
181
|
+
state.left_outer.SetMatches(state.match_sel, result_count);
|
|
182
|
+
// set the match flag in the RHS
|
|
183
|
+
gstate.right_outer.SetMatch(state.cross_product.ScanPosition() +
|
|
184
|
+
state.cross_product.PositionInChunk());
|
|
185
|
+
} else {
|
|
186
|
+
// set the match flag in the LHS
|
|
187
|
+
state.left_outer.SetMatch(state.cross_product.PositionInChunk());
|
|
188
|
+
// set the match flags in the RHS
|
|
189
|
+
gstate.right_outer.SetMatches(state.match_sel, result_count, state.cross_product.ScanPosition());
|
|
190
|
+
}
|
|
191
|
+
intermediate_chunk->Slice(state.match_sel, result_count);
|
|
145
192
|
}
|
|
146
|
-
chunk.Slice(state.match_sel, result_count);
|
|
147
193
|
} else {
|
|
148
194
|
// no result: reset the chunk
|
|
149
|
-
|
|
195
|
+
intermediate_chunk->Reset();
|
|
150
196
|
}
|
|
151
197
|
} while (result_count == 0);
|
|
198
|
+
|
|
152
199
|
return OperatorResultType::HAVE_MORE_OUTPUT;
|
|
153
200
|
}
|
|
154
201
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
#include "duckdb/execution/operator/join/physical_hash_join.hpp"
|
|
2
2
|
|
|
3
|
+
#include "duckdb/planner/expression/bound_aggregate_expression.hpp"
|
|
4
|
+
#include "duckdb/planner/expression/bound_reference_expression.hpp"
|
|
3
5
|
#include "duckdb/common/types/column_data_collection.hpp"
|
|
4
6
|
#include "duckdb/common/vector_operations/vector_operations.hpp"
|
|
5
7
|
#include "duckdb/execution/expression_executor.hpp"
|
|
@@ -386,7 +386,7 @@ IEJoinUnion::IEJoinUnion(ClientContext &context, const PhysicalIEJoin &op, Sorte
|
|
|
386
386
|
// Sort on the first expression
|
|
387
387
|
auto ref = make_unique<BoundReferenceExpression>(order1.expression->return_type, 0);
|
|
388
388
|
vector<BoundOrderByNode> orders;
|
|
389
|
-
orders.emplace_back(
|
|
389
|
+
orders.emplace_back(order1.type, order1.null_order, std::move(ref));
|
|
390
390
|
|
|
391
391
|
l1 = make_unique<SortedTable>(context, orders, payload_layout);
|
|
392
392
|
|
|
@@ -422,7 +422,7 @@ IEJoinUnion::IEJoinUnion(ClientContext &context, const PhysicalIEJoin &op, Sorte
|
|
|
422
422
|
// Sort on the first expression
|
|
423
423
|
orders.clear();
|
|
424
424
|
ref = make_unique<BoundReferenceExpression>(order2.expression->return_type, 0);
|
|
425
|
-
orders.emplace_back(
|
|
425
|
+
orders.emplace_back(order2.type, order2.null_order, std::move(ref));
|
|
426
426
|
|
|
427
427
|
ExpressionExecutor executor(context);
|
|
428
428
|
executor.AddExpression(*orders[0].expression);
|